← Help center

Webhooks: get notified in your own systems

Webhooks let you receive real-time notifications in your own systems when events happen in Yapper. Combined with the public API, they allow you to connect Yapper to your CRM or custom integration platforms (such as Zapier, Make, n8n, or Paragon) to sync data and automate workflows.

Subscribing to webhooks

Webhook subscriptions are managed programmatically via the public API. There is no dashboard configuration interface.

To manage your webhook subscriptions, use the Bearer-token authorized API routes (requires the yapper-api/webhooks or yapper-api/write scope):

See the full API reference on the website for exact request and response schemas.

Filtering events

When creating or updating a subscription, you can optionally filter events by a specific customer (customer_id) or communication channel (channel, currently whatsapp).

Supported events

Each webhook payload contains a standard envelope with the event ID, the event type, when it was created, and the customer or channel it relates to. Yapper supports the following event types:

Webhook payload structure

Each event is sent as a POST request with a JSON payload in the following format:

{
  "id": "evt_01J...",
  "type": "lifecycle.changed",
  "created_at": "2026-06-03T12:00:00Z",
  "account_id": "acc_123...",
  "customer_id": "cust_456...",
  "channel": "whatsapp",
  "data": {
    "playbook_id": "pb_789...",
    "from_phase_id": "phase_abc...",
    "to_phase_id": "phase_xyz...",
    "trigger_source": "customer"
  }
}

Security and signature verification

Every delivery is signed so you can verify it originates from Yapper: the X-Yapper-Signature header is an HMAC-SHA256 of <timestamp>.<raw body> using your subscription's signing_secret, with the timestamp in X-Yapper-Timestamp. Deliveries also carry X-Yapper-Event-Id, X-Yapper-Event-Type, and the attempt number in X-Yapper-Delivery. Always verify the signature and reject mismatches; the signed timestamp prevents replay attacks.

Delivery retry and auto-disabling

Inbound transitions: updating conversation phases

You can programmatically change a customer's conversation phase from your CRM or external systems by sending an authorized request to the public API:

POST /api/v1alpha1/customers/{customer_id}/lifecycles/{playbook_id}/transition

Loop prevention

To prevent endless synchronization loops (where an API phase transition triggers an outbound webhook event, which triggers another CRM update, and so on), Yapper automatically suppresses the outbound lifecycle.changed webhook event for any transition initiated via this inbound API route.

Replaying past events (Backfill)

If your systems go offline or miss events, you can query past webhook events using the API:

GET /api/v1alpha1/events?since=<event_id>&limit=N