Guide · Reporting
Reading campaign results without fooling yourself.
Your first campaign report is a pile of honest numbers — the skill is reading them correctly. This guide explains the sent → delivered → read → replied funnel, how per-message status timelines are built, what the reporting engine guarantees, and the four misreads we see most. It publishes no benchmark percentages, because we have not measured any and will not invent them.
Read the funnel top-down
A WhatsApp business message moves through observable states, each arriving as a signed webhook event: the platform queued it (sent), the handset or server confirmed arrival (delivered), the recipient saw it (read), and the recipient answered (replied). Read it top-down:
- sent → delivered measures reachability — number correctness, handset state, template category behaviour. Big gaps here are a list-quality story.
- delivered → read measures attention — timing, quiet hours, and whether the opening line earns the tap.
- read → replied measures relevance and the clarity of the ask. This is where message content is judged, and it is judged by people, not by a dashboard.
Compare a campaign only against your own earlier campaigns with the same template category and audience shape. Comparing a utility order-update against a marketing broadcast tells you nothing except that they are different messages. And measurement only means something when the send itself was sound — the campaign preflight is what makes these numbers comparable in the first place.
Per-message status timelines
Open any message and you see its whole event history — every status webhook, in the order the platform received it, with the provider’s own timestamp shown and the time we recorded it beneath. Two honest details matter when reading one:
- Out-of-order is normal. Webhooks can arrive after events they logically precede; the timeline preserves arrival order instead of re-sorting it, because a tidied-up history is a rewritten one.
- Empty is an answer. An unknown message id returns an empty history, stated as such — not an error, and not a guess.
What saved reports guarantee
Saved reports are computed by the server, and the numbers you see are the numbers the server produced — columns and rows are rendered exactly as computed, never re-sorted or re-derived in the browser. Definitions are bounded and validated up front: whole-day windows between 1 and 90 days, one to five metrics, at most five filters, and a refusal with the reason if a bound is broken. Estimates and actuals never mix in the same view — a projected cost is labelled as an estimate everywhere it appears.
Four common misreads
- Reading a consent exit as a failure. When a contact withdraws consent and leaves a journey, that is the consent system working exactly as designed. The right response is “good”, not “why did we lose them?”
- Judging a campaign on one number. A high read rate with a low reply rate is a content question; a low delivered rate is a list question. Different diseases, different medicine.
- Comparing against industry benchmarks. We publish none, because we have not measured a population worth benchmarking and refuse to fabricate one. Anyone’s benchmark percentages — including ours someday — deserve to be questioned.
- Over-reading small samples. A pilot campaign’s funnel can swing wildly on a handful of conversations. Trend over several sends before you conclude anything, including from this guide.
What we refuse to publish
Content reviewed October 2026 · owner: Zcode (implementation) · independent factual review: Codex QC, pending.