Skip to content
Meta Business PartnerQuick answer inside

How do I track WhatsApp message delivery and read status?

Every message you send through the WhatsApp Business API reports its own lifecycle back to you through status webhooks. As the message moves from your server to Meta and on to the recipient's phone, WhatsApp fires a sequence of events — sent, delivered, read, and sometimes failed — each stamped with the message ID and a Unix timestamp. Track those events, store them against the customer and the campaign, and you stop guessing: you can see real reach (not just how many you dispatched), catch failures within minutes instead of days, and read the early signals that protect your quality rating. Here is exactly how each status is generated and how to turn the raw stream into reporting a business can act on.

Quick answer

Subscribe to WhatsApp status webhooks so every message reports back sent, delivered, read, or failed. Aggregate those events per template and per campaign to see true reach, spot failures early, and protect your quality rating.

What each status actually means

WhatsApp does not just tell you a message left the building — it reports four distinct states, and the difference between them is where the insight lives. Confusing 'sent' with 'delivered' is the single most common reporting mistake, so it pays to be precise about what each ticked box represents.

  • Sent: Meta accepted your message and it is on its way to the recipient. One grey tick. This only confirms your API call worked — it says nothing about the customer.
  • Delivered: the message reached the recipient's device. Two grey ticks. This is your true reach denominator — the number that actually matters for open-rate maths.
  • Read: the recipient opened the chat and the message was displayed. Two blue ticks. Note this only fires if the user has read receipts turned on, so read counts are always a floor, never the full picture.
  • Failed: the message could not be delivered — invalid number, user blocked you, template paused, or a policy or rate issue. The webhook carries an error code and title telling you why.
  • Deleted: if a recipient deletes a message you sent, a status update can reflect that too, which is useful for audit trails.

How the status stream reaches you

Delivery and read tracking is not something you poll for — WhatsApp pushes it. When you configure your WhatsApp Business Account, you subscribe your webhook endpoint to the 'messages' field, and from then on every status change POSTs a JSON payload to your server in near real time. Each payload contains the message ID (id/wamid) you received when you first sent the message, the new status, a timestamp, the recipient's WhatsApp ID, and — for a 'failed' event — an errors array with a numeric code and human-readable title. The job of your platform is to match that incoming ID back to the original send, update the record, and move on. Because statuses arrive out of order and can be retried, your handler should be idempotent: only ever advance a message forward along sent → delivered → read, and never let a late 'sent' overwrite a 'delivered' you already logged. With InfiQ this plumbing is already built — the webhook is registered, verified, and de-duplicated for you, and each status lands against the right contact and campaign automatically.

Turning raw events into campaign analytics

Per-message ticks are only half the value. The other half comes from rolling those events up so you can compare a Diwali broadcast against a re-engagement flow, or one template variant against another. Aggregate on two axes — by template and by campaign — and compute rate metrics rather than raw counts, because a 92% delivery rate on 10,000 sends tells you something a bare '9,200 delivered' does not.

  • Delivery rate = delivered ÷ sent. A sudden dip usually means stale or invalid numbers in your list, or a quality problem throttling your throughput.
  • Read rate = read ÷ delivered. Treat this as directional, since it depends on recipients' read-receipt settings, but big swings between templates are still a real signal about subject lines and timing.
  • Failure rate and reason mix: group failures by error code so 'invalid number' (a data-hygiene fix) is separated from 'template paused' (a content fix) or 're-engagement message limit' (a policy fix).
  • Time-to-delivered: if messages sit in 'sent' for a long time before flipping to 'delivered', you may be hitting messaging-limit throttling on a warming number.
  • Segment by category — marketing, utility, authentication — since delivery and read behaviour, and cost, differ sharply across them.

Why this protects your quality rating and your budget

Status data is not just a vanity dashboard — it is an early-warning system. A climbing failure rate or a falling read rate on marketing sends is often the first visible sign that recipients are ignoring or blocking your messages, which is exactly what drags a number's quality rating from green toward red and, eventually, caps your messaging limit. Watching these curves lets you pause a weak template before Meta does it for you. The numbers matter for cost too: since 1 July 2025 WhatsApp bills per delivered message by category (marketing, utility, authentication), so your 'delivered' count is literally your invoice basis — the free-form 24-hour service window lets you reply to inbound conversations without a per-message charge today (service messages are free until 30 September 2026 and become chargeable from 1 October 2026), but it is a service window, not a billing unit. Reconciling delivered-message counts against your bill is the cleanest way to keep spend honest. InfiQ shows this in transparent ₹ pricing (ex-GST), so what you track and what you are charged line up.

Do this with InfiQ

Talk to InfiQ

Get a straight answer for your setup

Tell us what you’re trying to do — a WhatsApp specialist replies within one working day.

Step 1 of 2
WhatsApp

Protected by invisible spam checks · replies within 1 working day

Frequently asked questions

What is the difference between 'sent' and 'delivered' on WhatsApp?+
'Sent' means Meta accepted your message for delivery — it confirms your API call succeeded, but nothing about the customer. 'Delivered' means the message actually reached the recipient's device. Always use delivered, not sent, as the base for reach and open-rate calculations.
Can I always see whether a customer read my message?+
Not always. The 'read' status only fires when the recipient has read receipts enabled in their WhatsApp settings. If they have turned read receipts off, you will see 'delivered' but never 'read', even though they opened it. So treat read counts as a reliable floor rather than an exact figure.
How do I know why a message failed?+
Every 'failed' status webhook includes an errors array with a numeric code and a short title, such as an invalid number, the user blocking your business, a paused template, or a re-engagement/rate limit. Group these codes in your reporting so you can tell a data-hygiene problem apart from a content or policy problem.
Do I have to build the webhook handling myself?+
No. Connecting, verifying, and securing the webhook, then de-duplicating and ordering the incoming status events, is real engineering work. With InfiQ it is already wired up — each status is matched to the correct contact and campaign automatically, so you get per-message tracking and rolled-up analytics without writing webhook code.
Does the delivered count affect what I pay?+
Yes. Since 1 July 2025 WhatsApp charges per delivered message, priced by category — marketing, utility, or authentication. Your delivered count is effectively your billable count, which is why reconciling delivery analytics against your invoice is good practice. Free-form replies inside the 24-hour service window are free today but become chargeable from 1 October 2026.
How quickly do status updates arrive?+
Status webhooks are pushed in near real time as each state changes, not on a schedule you have to poll. Sent and delivered typically arrive within seconds; read arrives whenever the user opens the chat. This is what makes it possible to spot a spike in failures within minutes of a broadcast going out.
Why would messages stay in 'sent' for a long time before delivering?+
A long gap between 'sent' and 'delivered' often points to messaging-limit throttling — common on a newly warmed number or after a quality-rating dip — where WhatsApp meters how fast your queue drains. Watching time-to-delivered helps you catch throttling before it hurts a time-sensitive campaign.
Can I track delivery and read status per campaign, not just per message?+
Yes, and you should. Aggregate the per-message events by template and by campaign to get delivery rate, read rate, and a failure-reason breakdown. Comparing these rates across variants is how you learn which templates and send times actually perform, rather than looking at raw dispatch counts.

See every tick in one dashboard

Book a demo with InfiQ and watch sent, delivered, read, and failed statuses roll up per campaign automatically — no webhook code, transparent ₹ pricing on Meta's rates, and full BSUID ownership from day one.