To measure WhatsApp performance accurately, separate Meta message states from your platform's processing states and from metrics derived from customer or team behavior. Give every metric a unit, denominator, time period, and attribution window. For service, define human first response by excluding automation and show answer rate, median, and P90 together; for campaigns, keep sending, delivery, reading, and replying distinct.
The most common measurement problem is not missing data. It is using similar labels for different facts. One dashboard may say a message was “sent” because the provider accepted it, while another uses “sent” when a workflow finishes its send step. Both facts can be useful, but they are not interchangeable.
The three measurement layers
Meta's official WhatsApp Business Platform collection documents Cloud API messages and their related webhook updates. An operations platform such as Wats also tracks queue and processing state, then derives business measures such as reply rate and human first-response time.
Layer | Examples | What it establishes | What it does not establish |
|---|---|---|---|
Meta message states |
| The latest known channel state for a message | That the customer replied or the business goal was met |
Wats internal states |
| Where an item sits in processing or why it never entered sending | That Meta delivered it to a device |
Derived metrics | replied, answer rate, human first response, median, P90 | Customer or team behavior under a stated calculation | The cause without further segmentation and investigation |
sent is not delivered, and read is not replied. Likewise, skipped is not necessarily a Meta failure: an internal eligibility rule may have stopped the attempt before it reached the channel. Preserve the original state, source, and timestamp instead of collapsing the entire journey into “success” or “failure.”
A metric dictionary for messages and campaigns
Agree on these operational definitions before implementing formulas:
attempted: unique send operations that entered the provider-attempt step after eligibility checks.
sent: messages for which the channel recorded acceptance or a
sentstate under your integration; not final delivery.delivered: messages that received a
deliveredupdate.read: messages that received an available
readupdate.failed: attempts ending in a channel failure with a classifiable reason.
replied recipient: a unique recipient who sent an eligible inbound message within the campaign's declared attribution window.
Metric | Recommended formula | Denominator note |
|---|---|---|
Delivery rate |
| Do not use the full list if some items were internally skipped before sending |
Read rate |
| Also expose how many records had a usable status update |
Failure rate |
| Keep channel failures separate from internal skips |
Campaign reply rate |
| Declare and preserve the post-delivery attribution window |
A company may choose another denominator to answer another question, such as replies among read recipients. That is legitimate if the name is explicit and it is not compared with a delivered-based reply rate. Keep units consistent as well: unique recipients should not be divided by message count.
If the campaign foundation still needs work, use the WhatsApp campaigns and Meta templates guide. Check current messaging limits and quality state in WhatsApp Manager rather than baking a permanent threshold into a dashboard or article; the way Meta applies and describes those controls can change.
How should human first response be defined?
Human first-response time measures the team, not the bot. Wats uses this operating definition:
first_human_response_time
= timestamp(first qualifying human outbound after first inbound)
− timestamp(first inbound message)A qualifying response is a manual message or an agent-issued quick reply. Assistant output, workflow automation, campaign messages, and outbound messages sent before the first inbound are excluded. Otherwise an instant welcome automation could turn a real human delay into an apparent response time of zero.
Document timezone, whether elapsed time is calendar time or business-hours time, and when a reopened thread becomes a new measurement episode. If you report business-hours time, retain the raw elapsed timestamps so the calculation remains auditable.
A shared WhatsApp inbox makes assignment and ownership visible, but the metric needs a definition independent of the interface. Reassigning a conversation should not move the first inbound timestamp or erase time already spent waiting.
Why do median, P90, and answer rate belong together?
An arithmetic mean can be pulled sharply by a handful of extremely slow conversations. Use three adjacent views instead:
Metric | Population | Question it answers |
|---|---|---|
Median first response | Conversations with a qualifying human reply | Below what duration do half of replies fall? |
P90 first response | Conversations with a qualifying human reply | At or below what duration do 90% of replies fall? |
Answer rate | All conversations beginning with an inbound message in the period | What share received a qualifying human reply? |
Answer rate is:
answered conversations ÷ conversations with an inbound message × 100For a one-hour service objective:
conversations first answered within 60 minutes
÷ all conversations with an inbound message × 100Unanswered conversations remain in the denominator of the second formula and never enter its numerator. They should not be assigned an invented duration in median or P90; instead, show their count and the answer rate next to the response-time distribution.
Do not label a duration “resolution time” unless the lifecycle records a reliable, consistent closed event. A last reply or an assignment change does not prove that the customer's issue was resolved. Where no trustworthy closure event exists, prioritize first response, backlog, and answer rate.
A hypothetical calculation
Assume a test campaign produced the following values. They are illustrative, not a benchmark:
1,000 eligible unique recipients entered a send attempt.
960 messages reached
sent, 912 reacheddelivered, and 684 reachedread.24 attempts reached
failed; another 16 items stopped internally before an attempt and are outsideattemptedunder this definition.137 unique recipients replied inside the declared attribution window.
Delivery rate is 912 ÷ 960 = 95%; read rate is 684 ÷ 912 = 75%; failure rate is 24 ÷ 1,000 = 2.4%; and reply rate is 137 ÷ 912 ≈ 15.0%. None of these values alone establishes profitability or team quality. That requires the campaign objective, reply classification, and a downstream business event.
Now consider an illustrative service team. Two hundred conversations started with an inbound message, and 170 received a human reply, producing an 85% answer rate. If answered conversations had an 8-minute median and a 47-minute P90, those durations describe only the answered population. The 30 unanswered conversations remain an essential result, not data to hide.
How do you build a dashboard that does not mislead?
Start with four groups instead of a single headline number:
Input volume: inbound conversations, eligible recipients, and send attempts.
Message journey: sent, delivered, read, or failed, including failure reasons.
Customer response: unique recipients replying inside the attribution window.
Team response: answer rate, median, P90, and replies within a target duration.
Then segment by purpose, channel, team, template, and time period. Do not compare a reactivation campaign with customer-requested service messages, or a 24-hour branch with one that operates a limited shift. Annotate changes to definitions and sources; otherwise a measurement change can masquerade as a performance improvement.
Avoid publishing a universal benchmark without a compatible source and method. The most useful baseline is often the company's own performance across comparable periods after definitions are fixed. When exporting states to a warehouse or CRM, retain event, message, and source identifiers; the WhatsApp CRM and ERP integration guide explains how to prevent duplication along that path.
How Wats structures the view
Wats separates internal campaign processing from message states received from Meta and derives replied from an eligible inbound response rather than treating it as a delivery state. Human first response uses manual and agent quick replies while excluding assistant, automation, and campaign output, enabling median, P90, answer rate, and within-target views.
Accuracy still depends on the reporting period, status-event coverage, and segmentation. Permission and assignment choices affect operations but do not redefine a channel state; the WhatsApp team permissions guide separates channel access from conversation ownership.
The practical rule: define before you visualize
Write a compact dictionary containing each metric's name, source, unit, numerator, denominator, period, attribution window, and exclusions. Show raw states beside derived metrics, median beside P90, and answer rate beside distributions built from answered conversations. That structure reveals whether a problem sits in eligibility, delivery, customer interest, or team capacity—instead of making everyone chase one number that explains none of them.

