Skip to main content
Webhooks let you push real-time events to any external endpoint. Use them to sync messages to your CRM, trigger automations in n8n/Make/Zapier, or build custom backends.

Create a Webhook Subscription

1

Open your Location

Go to Dashboard → Locations and select the location you want to subscribe to.
2

Open Settings

Click the Settings tab for that location.
3

Create subscription

Scroll to the Webhooks section and click Create subscription.
4

Fill in the form

Complete the Create subscription dialog (see fields below).
5

Save

Click Create subscription to save. If “Send a test ping” is enabled, a dummy event will be POSTed to your endpoint to verify it works.
Create webhook subscription

Subscription Fields

Name (required)

A human-readable label so you can identify the subscription later (e.g., CRM Sync, n8n Inbound Handler).

Target URL

The HTTPS endpoint that will receive event payloads.
Your endpoint must respond with a 2xx status code. Non-2xx responses are treated as failures.

Select events

Pick exactly which events should trigger a webhook. You can mix channels in a single subscription.

WhatsApp

  • Inbound - a WhatsApp message is received
  • Outbound - a WhatsApp message is sent

iMessage

  • Inbound - an iMessage is received
  • Outbound - an iMessage is sent

SMS

  • Inbound - an SMS is received
  • Outbound - an SMS is sent

System

  • Message failed - a message could not be delivered (use this for retry logic or alerting)

Send a test ping after creating

When enabled, the system will POST a dummy event to your Target URL immediately after the subscription is created. Use this to confirm your endpoint is reachable and your handler parses payloads correctly.
Leave this on for the first subscription you create against a new endpoint.
The test ping body is { "type": "test.ping" }. It is not wrapped in the envelope below.

Delivery Format

Every event except the test ping is POSTed as JSON, wrapped in this envelope:

Headers

X-WA-Event-Id matches the eventId in the body.

Event Payloads

The payload object differs by channel and event type. message.media[].type is always one of image, video, audio, document, file, or unknown.

Inbound messages

whatsapp.inbound, imessage.inbound, sms.inbound - fired when a contact sends a message to one of your connected numbers.
transcribedAudio is top-level on WhatsApp, but nested under meta.transcribedAudio on iMessage and SMS.

Outbound messages

whatsapp.outbound, imessage.outbound, sms.outbound - fired when a message is sent from a connected number, either typed on the device or sent by the CRM.

Message failed

message.failed - fired when an outbound message on any channel couldn’t be delivered after retries.
error.code tells you why the send failed. See Error Codes for the full list and what to do about each one.
New codes may be added over time, so treat unrecognised codes as a generic failure rather than assuming a fixed list.

Best Practices

  • Use one subscription per integration. Keeps logs and rotation simple.
  • Verify with the test ping before relying on a subscription in production.
  • Return 2xx quickly - push slow work onto a background queue in your handler.
  • Be idempotent. Webhooks can occasionally be re-delivered.
  • Scope by channel. Don’t subscribe to events you won’t process.

Managing Subscriptions

From the Webhooks section in Location Settings you can:
  • View all active subscriptions, and creation date
  • Delete a subscription you no longer need
  • Create additional subscriptions for separate endpoints

Troubleshooting

  • Confirm your endpoint is publicly reachable (no localhost / private IPs)
  • Check that it accepts POST and returns 2xx
  • Verify firewall/WAF rules aren’t blocking the IP
  • Make sure the subscription wasn’t deleted
  • Confirm the location still has a connected instance for the channel
  • Check your endpoint logs for 5xx responses (failed deliveries are retried a few times, then dropped)
Webhooks are at-least-once. Use the top-level eventId (also sent as the X-WA-Event-Id header) to deduplicate on your side.