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
- What we can send
- Connect Zapier
- Connect Make
- Ready-made setups
- New customers into a Google Sheet
- Text your on-call tech on emergencies
- Booked jobs into Jobber or Housecall Pro
- New customers into Slack, Teams or Google Chat
- Check it’s working
- If the other app is down
- Edit, turn off or delete a connection
- For developers
- Troubleshooting
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.
| Moment | When we send it | For example |
|---|---|---|
| A new customer reaches out | About 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 change | When 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 emergency | The first time a customer is marked as an emergency | Text your on-call tech |
| A customer asks for a person | When the AI hands over to your team, or a call is transferred | Post in your team chat |
| A job is booked / moved / cancelled / done | When a booking is made (or a deposit is paid), its time changes, it’s cancelled, or it’s marked complete | Create the job in Jobber or Housecall Pro |
| A customer doesn’t show up | When a booking is marked as a no-show | Start a follow-up |
| A call ends | When the AI’s call summary is ready, or 5 minutes after the call | Log calls in a sheet |
| An invoice is made / sent / paid / overdue | When the invoice changes | Update your bookkeeping |
Connect Zapier
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/.
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.
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.
In Zapier, select Test trigger, add your action and publish the Zap.
Connect Make
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/…).
On Settings › Send to other apps, select Connect an app and Make, paste the address and select Next.
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.
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
- Connect with A new customer reaches out, and make a sheet with the columns below.
- Zapier: add Google Sheets → Create Spreadsheet Row. Make: add Google Sheets → Add a Row (its fields are under data → lead).
- Map each column to its field:
| Column | Field |
|---|---|
| Name | Data Lead Customer Name |
| Phone | Data Lead Customer Phone |
| Data Lead Customer Email | |
| Service | Data Lead Service Needed |
| Came in by | Data Lead Channel |
| Link | Data Lead Dashboard Url |
Text your on-call tech on emergencies
- Connect with only A customer has an emergency, so routine jobs wake nobody.
- Text your tech’s number with SMS by Zapier or a Twilio “send a message” step.
- Message: “Emergency: {customer name}, {customer phone}, {service needed}. {dashboard url}”.
Booked jobs into Jobber or Housecall Pro
- Connect with A job is booked, and A job is moved and A job is cancelled if wanted.
- Add the Jobber or Housecall Pro action that creates a client or job (names differ, so check each app’s Zapier or Make listing).
- 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
- Connect with A new customer reaches out, plus A customer asks for a person if your team should step in.
- Add Slack → Send Channel Message, or a Microsoft Teams or Google Chat message.
- 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 see | What 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.
{
"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.emergency | lead |
lead.updated | lead and changedFields (for example customer.phone, address.zip, serviceNeeded, preferredTime) |
appointment.scheduled, .rescheduled, .cancelled, .completed, .no_show | appointment (id, status, start, end, startDisplay, timeZone, serviceType, technician, confirmationCode, bookedBy, previousStart, cancelledBy, cancelReason, dashboardUrl) and lead |
call.completed | call (id, direction, customerPhone, startedAt, durationSeconds, outcome, summary, actionItems, dashboardUrl) and lead or null. No transcript or recording. |
conversation.escalated | escalation (reason, reasonText, channel, dashboardUrl) and lead or null. A website-chat handoff carries no customer details. |
invoice.created, .sent, .paid, .overdue | The invoice’s ids, number, amounts and dates. No customer contact details. |
| Header | Contains |
|---|---|
X-Webhook-Signature | t=<unix seconds>,v1=<signature>. For 24 hours after Make a new secret it carries two: t=…,v1=<new>,v1=<old>. |
X-Webhook-Timestamp | The send time, in Unix seconds |
X-Webhook-Event | The event name, for example lead.created |
X-Webhook-Delivery-Id | This attempt’s delivery id |
X-Webhook-Api-Version | The 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).
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)),
);
}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
| Problem | What to do |
|---|---|
| Sending to other apps is available on Pro | You’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 sample | Zapier wasn’t waiting, or its plan is free. Select Test trigger, then Send a sample again. |
| A field is missing in Zapier or Make | It was empty in the sample. Send that moment’s sample again (in Make, after Detect new values). |