Set up a webhook and the events it sends
Add a URL, tick Webhook on the milestones you want, and test it. Fifteen job events arrive as JSON with a shared-secret header, and each delivery shows in the Delivery Log.
Last updated October 18, 2026
1. Add the webhook
- Open Setup → Notifications and choose the Webhooks tab, then Add webhook.
- Give it a Label and paste the POST URL. For Zapier or Make, this is the URL their webhook trigger gives you ("Webhooks by Zapier" or a Make custom webhook).
- Optionally set a Secret. It's sent with every request as the `X-Webhook-Secret` header, so your side can refuse anything without it.
- Leave Events as `*` for everything, or list the events you want, separated by commas (see the list below). Choose Add webhook.
- Choose Test on its row. You should see "Test OK" with the HTTP status your server returned. Pause or resume a webhook from the same row.
2. Turn on the milestones
A webhook only fires for milestones that are allowed to use it. On the Notification Rules tab, tick the Webhook column for each milestone and recipient row you want sent, and make sure the Webhooks master switch on the Channels tab is on. A milestone ticked for both the customer and the office row posts once per row, so you may receive the same event twice with different `recipient` values.
Events
`created`, `assigned`, `accepted`, `declined`, `released` (a technician sent the job back), `enroute`, `arrived`, `started`, `completed`, `cancelled`, `change_requested`, `change_declined`, `rescheduled`, `delayed` (running late) and `receipt` (payment received). A milestone you add yourself fires as `custom:<id>`; see Add your own milestone.
Payload
A JSON POST with `event`, `recipient`, `bookingId`, `shortId`, `status`, `service`, `tech`, `address`, `scheduledAt`, `trackUrl`, `label`, `message` and `at`. Use `trackUrl` to link the customer's tracking page from your own system.
Good to know
- Every delivery, with the HTTP status your server returned, is on the Delivery Log tab with the channel webhook. Test pings aren't logged. See Check whether a message was sent.
- Failed deliveries aren't retried. If your endpoint was down, pull the jobs you missed from a report or the API; see Exports and integrations.
- Sample jobs never fire webhooks, so test with a real job (your own phone as the customer works well).