Browse guides

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#

Code
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 delivered

What Meta sends to your webhook#

json
{
  "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:

json
{
  "status": "failed",
  "errors": [{ "code": 131026, "title": "Message Undeliverable" }]
}

How to parse statuses#

js
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#

Still stuck? Open a support ticket and our team will help.