Zapier
Connect a Zap to an Offer event and act on it in Slack, a CRM, email or any other app Zapier supports, without writing a receiver.
A Zapier connection is a regular Offer webhook endpoint whose URL is a Zapier Catch Hook. Events are signed, retried and logged like any other endpoint. The difference is the setup: the dashboard creates the endpoint for you and sends a sample event so Zapier can learn its fields.
Recipes
The Webhooks page has four starting points. Each one opens the connect dialog with its event already picked.
| Recipe | Event |
|---|---|
| Post to Slack when an account changes plan | account.plan_changed |
| Email a customer who hits a usage limit | usage.limit_reached |
| Add new accounts to your CRM | account.created |
| Alert sales when usage nears a limit | usage.limit_warning |
You can pick any other event in the dialog. Webhooks lists them all with their payloads.
Connect a Zap
Start a Zap with a Catch Hook
In Zapier, create a Zap whose trigger is Webhooks by Zapier with the Catch Hook event. Leave Pick off a child key empty, then copy the webhook URL Zapier shows you. It looks like
https://hooks.zapier.com/hooks/catch/123456/abcdef/.Open the connect dialog
In the dashboard, open the app and go to Developers → Webhooks. Press Connect Zapier, or one of the recipes.
Paste the URL and pick the event
Paste the Catch Hook URL and choose the event that should trigger the Zap. If the host isn't
zapier.com, the dialog warns you, and the endpoint still works as a regular webhook.Connect and send the sample
Press Connect and send sample. The dashboard creates the endpoint, then sends a test event of the type you picked. Back in Zapier, press Test trigger to pull it in and map its fields to the next step.
If the sample fails, the endpoint is still saved. Check the URL, then send another test from the endpoint's page.
What Zapier receives
Every delivery is a POST with a JSON body. In Zapier, the fields appear under these names, with everything about the account or record inside data. Samples sent from the dashboard also carry "test": true.
{
"id": "evt_…",
"type": "account.plan_changed",
"created_at": "2026-10-06T12:00:00.000Z",
"app_id": "app_…",
"data": { … }
}Requests carry the Standard Webhooks headers webhook-id, webhook-timestamp and webhook-signature. A Catch Hook doesn't check them, but they're there if you later move the endpoint to your own server.
Retries, the log and 410 Gone
A Zapier endpoint goes through the same delivery worker as every other endpoint:
- A delivery succeeds on any
2xxwithin 10 seconds. A redirect counts as a failure. - Failed deliveries are retried after 1 minute, 5 minutes, 30 minutes, 2 hours, 8 hours and 24 hours: 7 attempts in total, then the delivery is marked failed.
- Every attempt is in the endpoint's delivery log with its status code and the start of the response body. You can retry a delivery by hand from there.
- If the URL answers
410 Gone(how Zapier and other services say a hook should stop receiving), the delivery fails at once with no retries, and the endpoint is disabled with the reasonEndpoint returned 410 Gone. Re-enable it once the Zap is live again.
Create one with the API
The dialog calls the webhooks API with source: "zapier". The source only affects the dashboard, which shows the Zapier mark and Zapier-specific help on the endpoint. You can subscribe one endpoint to several events this way, and an app can have up to 25 endpoints.
curl -X POST https://your-api.example.com/apps/$APP_ID/webhooks \
-H "Authorization: Bearer $OFFER_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.zapier.com/hooks/catch/123456/abcdef/",
"events": ["account.plan_changed"],
"source": "zapier",
"description": "Zapier · Plan changed"
}'
# Send a sample so Zapier's "Test trigger" can see the fields
curl -X POST https://your-api.example.com/apps/$APP_ID/webhooks/$WEBHOOK_ID/test \
-H "Authorization: Bearer $OFFER_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "account.plan_changed" }'For managing endpoints and reading the delivery log in the dashboard, see Keys and webhooks.