What is this?
The Outbound Webhook tab pushes your channel’s messages to a URL you control — your own server, Zapier, Make, or any HTTP endpoint. It is useful for logging, syncing with your CRM, or triggering your own systems. You get two kinds of events:message.received— a message a customer sent to you.message.status— a delivery update (sent, delivered, read or failed) for a message you sent.
This is different from the Outbound Webhook automation step, which calls a URL from inside one flow. This tab covers every message on a channel type.
What can I do here?
- Set one webhook per channel type: WhatsApp, Instagram, Facebook, Telegram, TikTok, or Web Chat
- Sign each request so your server can verify it came from the platform
- Add up to 10 extra headers your server needs
- Turn delivery on or off without removing the webhook
- Send a test and see the response status
- See the Last delivery result — so a failing webhook is easy to spot
- Open What is sent to see the exact payload for any message type or delivery update
How to use it
Set up a webhook
- Open Settings → Outbound Webhook and pick a channel type tab.
- Enter your Webhook URL — it must start with
https://. - Optionally add a Signing secret (at least 16 characters, or click Generate). It is stored encrypted and shown once — copy it before saving. When set, every request carries a signature (see below).
- Use Extra headers (optional) for any custom headers your server needs (up to 10).
- Turn Send messages on or off. Off stops delivery (messages and updates) without removing the configuration.
- Click Save. Use Send a test to check the connection straight away.
What is sent
Each event is aPOST with a JSON body and an event field you can switch on.
A received message (event: "message.received"):
contact.wa_id is the WhatsApp number in digits (WhatsApp only). Switch on message.kind to know what the customer sent:
Not every network sends every kind (Telegram has no read receipts, Instagram has no Flows).
media_url is a public link to the file on the platform’s storage: no API key is needed and it doesn’t expire. If your platform has no file storage, it is null.
A delivery update (event: "message.status") arrives for every message you send:
status.value is sent, delivered, read or failed; on failed, status.error is { code, message } from the network. Each status is posted once, so a message that is sent, delivered and read produces up to three requests. Telegram has no delivery or read receipts, so you won’t get read updates for it. A receiver that only cares about customer messages should ignore events other than message.received.
Verify the signature
If you set a signing secret, each request includes these headers:
Sign the raw request body exactly as received, prepend
<timestamp>., compute HMAC-SHA256 with your secret, and compare. Reject requests whose timestamp is too old.
Remove a webhook
Click Remove webhook at the bottom of the tab. This deletes the URL, secret and headers for that channel type.Troubleshooting / Technical Notes
- The Outbound Webhook tab is missing. The feature isn’t in your plan. Ask your platform admin to add the Outbound Webhook add-on, or upgrade your plan.
- Test request fails. Check the URL starts with
https://, your server is reachable from the internet (public addresses only), and returns a 2xx status. The tab shows the HTTP status and response time. - Messages aren’t arriving. Confirm Send messages is on and the webhook is saved. Last delivery shows the most recent failure reason.
- I only want customer messages. Ignore requests whose
eventis notmessage.received. - Signature verification fails. Sign the raw body exactly as received with the
<timestamp>.prefix, using the secret you saved. A secret is shown once — generate a new one if you lost it. media_urlis null. Your platform has no file storage configured, or the network doesn’t provide a file for that message.