Skip to main content
Webhooks are configured per application on its Webhooks tab: a URL and a secret, revealed on demand and rotatable. Every delivery is signed, retried with backoff on anything but a 2xx, and logged attempt by attempt in the dashboard.

Events

The envelope

WhatsApp events use the same envelope with the message’s fields under data, plus occurred_at for the time of the status the event announces, and error set only on message.failed. See WhatsApp messages.

Verifying the signature

Every delivery carries three headers: Compute the HMAC over the raw request body, before any JSON parsing, and compare it in constant time:
Reject deliveries whose timestamp is older than a few minutes to close the replay window, and answer 2xx quickly. Do your own work after acknowledging, or the delivery is retried.
Partner-provisioned applications receive partner webhooks instead; client webhooks are not configurable on them yet.