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.

RecipeEvent
Post to Slack when an account changes planaccount.plan_changed
Email a customer who hits a usage limitusage.limit_reached
Add new accounts to your CRMaccount.created
Alert sales when usage nears a limitusage.limit_warning

You can pick any other event in the dialog. Webhooks lists them all with their payloads.

Connect a Zap

  1. 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/.

  2. Open the connect dialog

    In the dashboard, open the app and go to Developers → Webhooks. Press Connect Zapier, or one of the recipes.

  3. 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.

  4. 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.

Delivery body
{
  "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 2xx within 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 reason Endpoint 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.

Create a Zapier endpoint
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" }'
Nothing to deploy. Zapier needs no environment variables or keys on the Offer side. If the API can send webhooks, it can send them to Zapier.

For managing endpoints and reading the delivery log in the dashboard, see Keys and webhooks.