sent, delivered, read, or failed. Use it for delivery tracking, read confirmation, and audit trails.
It is configured per WhatsApp sender, so different senders can point at different endpoints.
Webhook Configuration
To enable read receipts for a sender:- Edit your WhatsApp sender and open the Read Receipts Webhook section
- Enter your Webhook URL and save
- A Signing Secret is generated automatically — use it to verify the signature on each request
whatsapp_message_id returned by the Send Template and Send Free-form endpoints, so you can match every update to the original message.
Request Format
The webhook is sent as a POST request to your configured URL with a JSON body and anX-Signature-256 header.
Payload Structure
The event type. Value:
message_statusNumeric identifier of the message — the same
whatsapp_message_id returned when you sent the message. Use this to correlate the status update with the original send.Provider message identifier for messages sent over Twilio, or
nullProvider message identifier (WhatsApp
wamid) for messages sent over the Meta Cloud API, or nullUnique identifier (UUID) of the conversation the message belongs to, or
nullUnique identifier (UUID) of the assistant connected to the sender, or
nullThe WhatsApp sender the message was sent from
The recipient phone number
The sender phone number
Message direction. Value:
outboundThe new delivery status. Possible values:
sent, delivered, read, failed, undeliveredProvider error code when
status is failed or undelivered, otherwise nullRaw provider error message when the message failed, otherwise
nullHuman-readable description of the error, otherwise
nullISO 8601 timestamp of when the platform recorded the status change, in the WhatsApp number owner’s configured timezone
ISO 8601 timestamp of the carrier’s own event time, in the owner’s configured timezone. Present for messages sent over the Meta Cloud API;
null over Twilio (Twilio’s status callback does not include an event time). Prefer this when present — it is the carrier’s authoritative time.Verifying the Signature
Every request includes anX-Signature-256 header containing an HMAC-SHA256 of the raw request body, keyed with your sender’s Signing Secret:
Retry Behavior
If your endpoint returns a non-2xx status or the request fails, delivery is retried:| Attempt | Delay |
|---|---|
| 1st retry | 30 seconds |
| 2nd retry | 60 seconds |
| 3rd retry | 120 seconds |
Important Notes
- The webhook is configured per sender — each sender can have its own URL and secret.
- Events triggered by the Make test request button in the sender settings include an extra
test: truefield and use placeholder values. Real status updates never includetest. readonly fires if the recipient has read receipts enabled in their WhatsApp privacy settings.deliveredalways fires.- Statuses can arrive out of order or be re-sent by the provider. We only forward genuine forward progress, so you won’t receive a
deliveredafter areadfor the same message — but you should still treat the webhook as the source of truth and de-duplicate bywhatsapp_message_id+status. timestampis always the time the platform recorded the change (in the number owner’s timezone).provider_timestampis the carrier’s authoritative event time when available — prefer it for accuracy, and fall back totimestampwhen it isnull.- Use Regenerate in the sender settings to rotate the signing secret if it is ever exposed.

