Status Webhooks
The four delivery status events Meta sends to your webhook after you send a message — sent, delivered, read, and failed — what each means and how to parse them.
On this page
Every time your bot sends a message, Meta fires status events back to your webhook tracking
that message's journey. These arrive in value.statuses, not value.messages.
The four statuses in order#
You send a message
↓
sent — Meta accepted it and queued it for delivery
↓
delivered — reached the customer's phone (grey double tick ✓✓)
↓
read — customer opened it (blue double tick ✓✓)
If something goes wrong:
failed — could not be deliveredWhat Meta sends to your webhook#
{
"object": "whatsapp_business_account",
"entry": [{ "changes": [{ "value": {
"statuses": [{
"id": "wamid.HBgM...",
"status": "delivered",
"timestamp": "1717000000",
"recipient_id": "919959623255"
}]
}}]}]
}For failed, an errors array is included:
{
"status": "failed",
"errors": [{ "code": 131026, "title": "Message Undeliverable" }]
}How to parse statuses#
if (changes?.statuses) {
const s = changes.statuses[0];
const to = s.recipient_id;
if (s.status === 'sent') console.log(`[STATUS] sent → ${to}`);
if (s.status === 'delivered') console.log(`[STATUS] delivered → ${to}`);
if (s.status === 'read') console.log(`[STATUS] read → ${to}`);
if (s.status === 'failed') console.log(`[STATUS] FAILED → ${to} | ${s.errors?.[0]?.code}`);
return;
}This block must come before the messages check, since a payload has either statuses or
messages — never both.
Frequently asked#
How do I know if my WhatsApp message was delivered?
Meta sends a "status": "delivered" event to your webhook. Parse changes.statuses[0] and
check the status field.
How do I get read receipts?
Meta sends "status": "read" when the customer opens the message. Note: customers can turn
off read receipts — if they do, you never receive the read event.
My message shows as failed — what does the error code mean?
Read statuses[0].errors[0].code. Common codes: 131026 = undeliverable (e.g. number has no WhatsApp, an
outdated app, or the user hasn't accepted the latest terms); 131047 = 24-hour window
closed; 131049 = marketing message not delivered (per-user marketing limit). See
Error handling & codes.
Gotchas & common mistakes#
Was this page helpful?
Still stuck? Open a support ticket and our team will help.