Skip to main content
Help center

Send to other apps (Zapier, Make)

Send new customers, booked jobs, finished calls and invoices to your other apps through Zapier or Make.

Updated Nov 1, 2026, 9 min read

On this page

Send to other apps tells Zapier or Make about new customers, booked jobs, finished calls and more, and they pass it on to Google Sheets, Slack, Jobber, Housecall Pro and thousands more. Set it up on Settings › Send to other apps (developers call these webhooks).

Owners and Admins only, on Pro, Business or Enterprise. On Starter the page shows an upgrade card and older connections stay paused. Webhooks by Zapier needs a paid Zapier plan (Professional or higher) or trial. Make’s free plan includes webhooks.

What we can send

You pick the moments. They come from every channel, never from sample customers or demo data.

MomentWhen we send itFor example
A new customer reaches outAbout 90 seconds after the first message or call, so the AI has their details. At once for an emergency.Add a row to a Google Sheet
A customer’s details changeWhen a name, phone, email, address, service or preferred time changes. At most once every 2 minutes per customer.Update your sheet or CRM
A customer has an emergencyThe first time a customer is marked as an emergencyText your on-call tech
A customer asks for a personWhen the AI hands over to your team, or a call is transferredPost in your team chat
A job is booked / moved / cancelled / doneWhen a booking is made (or a deposit is paid), its time changes, it’s cancelled, or it’s marked completeCreate the job in Jobber or Housecall Pro
A customer doesn’t show upWhen a booking is marked as a no-showStart a follow-up
A call endsWhen the AI’s call summary is ready, or 5 minutes after the callLog calls in a sheet
An invoice is made / sent / paid / overdueWhen the invoice changesUpdate your bookkeeping

Connect Zapier

  1. In Zapier, make a Zap with the trigger Webhooks by Zapier and the Event Catch Hook. Select Continue twice, leaving Pick off a child key empty. On the Test tab, copy the URL starting https://hooks.zapier.com/.

  2. On Settings › Send to other apps, select Connect an app, Zapier and Next. Paste the URL into Paste the address from Zapier and select Next. If you have several, rename it from Zapier.

  3. Tick the moments you want, select Save and continue, then Send a sample.

    It worked. Zapier got the sample. It’s a made-up customer, Sam Sample.

  4. In Zapier, select Test trigger, add your action and publish the Zap.

Connect Make

  1. In Make, start a scenario with the Webhooks app’s Custom webhook. Next to Webhook, select Add, name it, select Save and copy the address (https://hook.us1.make.com/…).

  2. On Settings › Send to other apps, select Connect an app and Make, paste the address and select Next.

  3. Tick the moments you want, select Save and continue, then Send a sample while Make is waiting for data.

    It worked. Make got the sample.

  4. Add your next modules and switch the scenario on.

Caution

Make switches off a webhook that no scenario uses for 5 days, answering “410 Gone”. We then pause the connection and email you.

Ready-made setups

Each starts from a connection with its moment ticked and a sample sent.

New customers into a Google Sheet

  1. Connect with A new customer reaches out, and make a sheet with the columns below.
  2. Zapier: add Google Sheets → Create Spreadsheet Row. Make: add Google Sheets → Add a Row (its fields are under data → lead).
  3. Map each column to its field:
ColumnField
NameData Lead Customer Name
PhoneData Lead Customer Phone
EmailData Lead Customer Email
ServiceData Lead Service Needed
Came in byData Lead Channel
LinkData Lead Dashboard Url

Text your on-call tech on emergencies

  1. Connect with only A customer has an emergency, so routine jobs wake nobody.
  2. Text your tech’s number with SMS by Zapier or a Twilio “send a message” step.
  3. Message: “Emergency: {customer name}, {customer phone}, {service needed}. {dashboard url}”.

Booked jobs into Jobber or Housecall Pro

  1. Connect with A job is booked, and A job is moved and A job is cancelled if wanted.
  2. Add the Jobber or Housecall Pro action that creates a client or job (names differ, so check each app’s Zapier or Make listing).
  3. Map the start from Data Appointment Start (or Data Appointment Start Display, written out in your time zone), the service from Data Appointment Service Type, and the customer from Data Lead Customer name, phone and address.

New customers into Slack, Teams or Google Chat

  1. Connect with A new customer reaches out, plus A customer asks for a person if your team should step in.
  2. Add Slack → Send Channel Message, or a Microsoft Teams or Google Chat message.
  3. Message: “New customer: {customer name} needs {service needed}. {dashboard url}”.

Check it’s working

Open a connection on Settings › Send to other apps. Its top line says how it’s doing.

You seeWhat it means
Working. Last sent 3 min ago.The other app took the last message.
Having trouble since 2:10 PM. We’ll keep trying until Thu.The other app isn’t answering. See If the other app is down.
Paused: it kept failing for 3 days, so we stopped trying.New moments are held. Fix the other app, then select Resume.
Paused: the other app said this address no longer exists.The Zap or Make webhook was deleted or switched off. Paste a new one’s address with Edit, then select Resume.
Turned off. Nothing is being sent.You turned it off. Turn the switch back on.

Activity marks each message Sent, Trying again, Gave up, Queued or Waiting (paused). Details shows What we sent and What they answered. Resend repeats one, and Resend everything that failed repeats all that gave up.

If the other app is down

Nothing is lost. We retry for about 3 days, less and less often, emailing you at most once a day. After that, or once the other app says the address is gone, we pause the connection, hold new moments and email you. Resume sends what was held, up to 3 days old.

Edit, turn off or delete a connection

To turn a connection off without losing it, use the switch on its page, and turn it back on to send again. Edit changes the name, address or moments, never the signing secret. Delete removes it and its activity, not your Zap or scenario.

For developers

Each moment is an HTTPS POST with a JSON body. Any 2xx within 30 seconds counts as received, and redirects aren’t followed. Dedupe on id, which retries and Resend repeat. isTest is true for samples.

lead.created
{
  "id": "6f1c2a8e-0d4b-4f7e-9a51-3c2b7d9e1f04",
  "type": "lead.created",
  "apiVersion": "1.0",
  "occurredAt": "2026-11-04T16:02:11.000Z",
  "isTest": false,
  "businessId": "2b7e…",
  "entityType": "Lead",
  "entityId": "9d3f…",
  "correlationId": null,
  "data": {
    "lead": {
      "id": "9d3f…",
      "createdAt": "2026-11-04T16:00:41.000Z",
      "status": "New",
      "channel": "phone",
      "customer": { "name": "Sam Sample", "phone": "+15555550123", "email": "sam@example.com" },
      "address": { "line": "12 Main St", "city": "Riverside", "state": "CA", "zip": "92501" },
      "serviceNeeded": "Water heater leaking",
      "urgency": "high",
      "isEmergency": false,
      "preferredTime": null,
      "summary": "Water heater in the garage is leaking. Wants someone tomorrow morning.",
      "dashboardUrl": "https://intakenexus.com/dashboard/leads/9d3f…"
    }
  }
}
Event`data` contains
lead.created, lead.emergencylead
lead.updatedlead and changedFields (for example customer.phone, address.zip, serviceNeeded, preferredTime)
appointment.scheduled, .rescheduled, .cancelled, .completed, .no_showappointment (id, status, start, end, startDisplay, timeZone, serviceType, technician, confirmationCode, bookedBy, previousStart, cancelledBy, cancelReason, dashboardUrl) and lead
call.completedcall (id, direction, customerPhone, startedAt, durationSeconds, outcome, summary, actionItems, dashboardUrl) and lead or null. No transcript or recording.
conversation.escalatedescalation (reason, reasonText, channel, dashboardUrl) and lead or null. A website-chat handoff carries no customer details.
invoice.created, .sent, .paid, .overdueThe invoice’s ids, number, amounts and dates. No customer contact details.
HeaderContains
X-Webhook-Signaturet=<unix seconds>,v1=<signature>. For 24 hours after Make a new secret it carries two: t=…,v1=<new>,v1=<old>.
X-Webhook-TimestampThe send time, in Unix seconds
X-Webhook-EventThe event name, for example lead.created
X-Webhook-Delivery-IdThis attempt’s delivery id
X-Webhook-Api-VersionThe payload version, 1.0

The signature is the lowercase hex HMAC-SHA256 of <t>.<raw body>, keyed with the signing secret as UTF-8 text, whsec_ prefix included. Verify the raw body before parsing and reject old timestamps. The secret shows once, when you connect Another app or select Make a new secret under Advanced (for developers).

verify.js
import crypto from 'node:crypto';

// rawBody: the request body exactly as it arrived (a string, BEFORE JSON.parse).
// header:  the X-Webhook-Signature header. secret: your signing secret (whsec_…).
export function isFromIntakeNexus(rawBody, header, secret, toleranceSeconds = 300) {
  const parts = header.split(',');
  const t = parts.find((p) => p.startsWith('t='))?.slice(2);
  const signatures = parts.filter((p) => p.startsWith('v1=')).map((p) => p.slice(3));
  if (!t || signatures.length === 0) return false;
  if (Math.abs(Date.now() / 1000 - Number(t)) > toleranceSeconds) return false;

  const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`, 'utf8').digest('hex');
  // During the 24 hours after "Make a new secret" there are two v1= values: accept either.
  return signatures.some(
    (s) => s.length === expected.length && crypto.timingSafeEqual(Buffer.from(s), Buffer.from(expected)),
  );
}
verify.py
import hashlib
import hmac
import time

def is_from_intakenexus(raw_body: bytes, header: str, secret: str, tolerance_seconds: int = 300):
    parts = header.split(",")
    t = next((p[2:] for p in parts if p.startswith("t=")), None)
    signatures = [p[3:] for p in parts if p.startswith("v1=")]
    if t is None or not signatures:
        return False
    if abs(time.time() - int(t)) > tolerance_seconds:
        return False

    signed = f"{t}.".encode("utf-8") + raw_body
    expected = hmac.new(secret.encode("utf-8"), signed, hashlib.sha256).hexdigest()
    # Two v1= values while a new secret is being swapped in: accept either.
    return any(hmac.compare_digest(s, expected) for s in signatures)

Retries come after about 1 minute, 5 minutes, 30 minutes, 2 hours, 5 hours, 10 hours, 24 hours and 24 hours. A 4xx other than 408 or 429 isn’t retried. A 410 pauses the connection at once.

Troubleshooting

ProblemWhat to do
Sending to other apps is available on ProYou’re on Starter. Move to Pro or higher on the Plans tab of Billing.
The other app said no.Wrong address, or the Zap or scenario is off. Paste the address again with Edit and switch the Zap or scenario on.
We couldn’t reach that address.Part of the address is missing. Copy it again, in full.
We can’t send to that address.It isn’t a public https:// address. Use the one Zapier, Make or your developer gave you.
Zapier never shows the sampleZapier wasn’t waiting, or its plan is free. Select Test trigger, then Send a sample again.
A field is missing in Zapier or MakeIt was empty in the sample. Send that moment’s sample again (in Make, after Detect new values).