A webhook sends a message to another system the moment something happens in Run a Call — a new customer, a job completed, an invoice paid, a missed call. You give Run a Call a web address (URL), pick the events you care about, and each event is sent there as JSON. It's how tools like Zapier, Make, n8n or your own software react in real time, without checking back every few minutes.

Note

Only the account owner can create and manage webhook subscriptions. You'll need a URL that can receive web requests — most automation tools give you one (for example a Zapier "Catch Hook" URL).

Looking to start a Run a Call automation from another system instead? See Triggering automations from an inbound webhook.

Open Webhooks

Go to Settings → Integrations and click Manage subscriptions on the Webhooks card.

Click Create subscription

Webhook subscriptions header with the Create subscription button highlighted

Fill in the subscription

FieldWhat to enter
Endpoint URLWhere to send events. Must start with https://.
Label (optional)What it's for, like Slack notifications or Zapier flow.
EventsTick individual events, All for a group, or Select all. At least one is required.

Create webhook subscription dialog with an endpoint URL typed in and event groups listed

Save the signing secret

Click Create subscription. The next screen, Save your signing secret, shows a secret starting with whsec_ — once. Copy it and store it with the receiving system; it's how that system proves an event really came from Run a Call. See Verifying webhook signatures.

Send a test

Open the subscription from the list and click Send test event. Run a Call sends a webhook.test event ("Hello from Run a Call. This is a test event.") to your URL. Check Recent deliveries to see whether it arrived.

Events you can subscribe to

GroupEventWhen it's sent
Customerscustomer.createdA customer is added (in the app, through the API, or by an import)
customer.updatedSomeone changes a customer's contact details, billing address or tags
customer.taggedA tag is added to a customer
customer.mergedTwo customers are merged
Jobsjob.scheduledA job's status becomes Scheduled
job.status_changedA job's status changes
job.completedA job is completed
job.taggedA tag is added to a job
Appointmentsappointment.scheduledA visit is added to a job (including each day of a multi-day job)
appointment.status_changedA visit's status changes (on the way, arrived, in progress…)
appointment.completedA visit is completed
appointment.assignments_changedThe crew on a visit changes
Estimatesestimate.sentAn estimate is sent (every send, including re-sends)
estimate.approvedA customer approves an estimate
Invoicesinvoice.issuedAn invoice is sent for the first time
invoice.updatedAn invoice the customer already has is edited
invoice.paidPayments add up to the invoice total
Paymentspayment.receivedAny payment is recorded against an invoice
Voicevoice.call.completedAn AI receptionist call finishes
voice.followup.createdThe AI receptionist creates a follow-up
Callscall.missedAn incoming call on your line ends unanswered (sent about two minutes later)
Membershipsmembership.createdA customer is enrolled in a membership
membership.renewedA renewal invoice is paid and the membership rolls forward
membership.cancelledA membership is cancelled
membership.suspendedA membership is suspended
membership.reactivatedA suspended membership is reactivated
membership.transferredA membership moves to the new owner of a sold house

The full field-by-field payload for each event is at docs.runacall.com.

What a delivery looks like

Each event is a POST with a JSON body:

{
  "id": "evt_4f1c...",
  "type": "invoice.paid",
  "created_at": "2026-09-16T15:04:05.000Z",
  "organization_id": "…",
  "data": { "...": "the invoice as it is right now" }
}

It also carries these headers: Run-A-Call-Signature (for verification), Run-A-Call-Event-Id, Run-A-Call-Event-Type, and User-Agent: RunACall-Webhooks/1.0. Use the event id to ignore duplicates.

Retries and auto-pause

What happens at your URLWhat Run a Call does
Responds with any 2xx within 10 secondsDelivered.
Errors, times out, or can't be reachedTries again — up to 3 attempts in total, spaced further apart each time.
10 events in a row fail every attemptThe subscription is Auto-paused and the owner gets an email.

While a subscription is paused, events that happen aren't saved up to send later. To get going again: fix the endpoint, click Resume (this also resets the failure count), then click Send test event and check Recent deliveries.

Note

A test event is only delivered to an active subscription — resume first, then test.

Managing a subscription

The subscriptions list shows each Endpoint, how many Events it has, its Last delivery and its Status (Active, Paused or Auto-paused). Click one to open it:

  • Status, Events, Last 7d total and Last 7d errors at the top, and the Subscribed events.
  • Recent deliveries — the last 7 days (up to 100): response code, event, response time and when, plus Recent error messages.
  • Send test event, Rotate secret, Pause / Resume, and Delete.

To change the URL or events, create a new subscription and delete the old one. Deleting stops deliveries immediately; delivery history is kept for 30 days.