Skip to main content

WhatsApp conversation cost attribution and optimization model

When you connect your own WhatsApp Business Account (WABA) to Devotel Orbit, the conversation charges on that traffic go to Meta, billed directly to your WABA. Orbit is not the billing party for bring-your-own-WABA messaging. What Orbit ships is a mirror of Meta’s conversation economics, built from your own send and delivery records: an estimate of what your WhatsApp traffic costs on Meta, the category and per-day breakdown behind it, and a send-time optimizer that plans a campaign against the same model before it goes out. This page explains how the mirror attributes cost, what it deliberately excludes, and how to read its estimates. The rate numbers themselves live on the WhatsApp pricing guide. Meta revises rates by country and category; this page fixes the model, not the numbers, so it stays correct as rates move.

Two books: Meta’s invoice vs Orbit’s mirror

Two books answer two different questions about the same traffic:
  • Meta’s invoice is the bill. Meta charges your WABA per conversation: a 24-hour window opened by the first message in a category (marketing, utility, authentication, or service), priced at Meta’s per-country, per-category rates. That invoice arrives from Meta and only from Meta.
  • Orbit’s mirror is cost visibility. Orbit reads your outbound WhatsApp messages and their delivery outcomes, applies Meta’s published rate card, and renders the economics you can act on: a per-category cost breakdown, a per-day trend, and an itemized split of Meta passthrough versus Orbit platform fee.
The mirror is an estimate for finance planning, not a second invoice; every estimate carries a disclaimer saying exactly that. Actual charges depend on country, conversation type, and volume on Meta’s side, and the mirror exists so you can see which of those levers moved your cost. Orbit’s own fee on WhatsApp is itemized separately from the Meta passthrough, never blended into one opaque rate. Today the per-message Orbit fee is $0.00: WhatsApp cost is pure Meta passthrough, and the fee line renders as $0.00 next to the passthrough instead of being buried in disclaimer prose. That is today’s posture, shown explicitly so you always see what you pay and to whom.

The four categories and normalization

Meta’s rate card prices four categories: A template’s declared category is a starting point, not the truth: Meta auto-recategorizes templates based on observed content and engagement, so a long-running template can drift from what you submitted it as. The mirror therefore prefers Meta’s own classification, captured from the status webhooks Meta sends, over the send-time template category, and falls back to service when neither is present. That is also why free-form service replies inside the window are tagged correctly even when no template was used. Meta’s reporting enum is wider than the four priced buckets. authentication_international, for example, is a billable per-message charge applied when an authentication template is delivered to an international number; marketing_lite is a lighter marketing tier. Orbit normalizes the wider enum onto the four buckets by prefix: marketing_lite prices as marketing, authentication_international as authentication. Anything not yet seen falls to service, which rates at 0. The floor is deliberate: free entry-point and referral-conversion traffic genuinely is not billed, and an as-yet-unknown category must never be invented into a paid bucket and inflate your estimate.

What counts as billable

The mirror counts a message only when Meta actually put it on the wire and actually billed the conversation. Two gates enforce that, in order:
  1. The sent gate. Failed, undelivered, rejected, and bounced sends never appear on Meta’s invoice, so they never enter your estimate. Rows still in flight (queued, scheduled, sending) do not count either.
  2. The confirmed gate. Meta accepts a WhatsApp send synchronously and reports the delivery outcome later, on a status webhook. A message can therefore sit at “accepted”, carrying a pricing category, and still never arrive: the recipient outside the 24-hour window, an unroutable number, the recipient blocking the business. A business-initiated conversation opens on delivery, and a template that never reaches the recipient opens no conversation and is never billed, so a message only counts toward a priced category once it reaches a delivered-equivalent status. The pre-delivery category still labels a confirmed message’s row; it just cannot be the proof of billing.
Two refinements keep the estimate honest at the edges:
  • Free-window rides. A message Meta marks as not billable, because it rode an already-open conversation window, is not priced at the category rate. A delivered service reply still counts in the free-service total at rate 0 whether or not Meta marked it billable, so your count of actually-sent messages stays complete without ever over-pricing the total.
  • Test traffic. Sends flagged as test-account traffic are excluded from the estimate entirely.
Orbit’s own fee on this traffic is a per-message platform fee rendered as its own line item; today that fee is $0.00, stated as the current posture rather than a promise, so the model stays legible if it ever changes. These exclusions are enforced, not prose: the estimator’s regression suite feeds it a failed utility-template send and asserts the send contributes $0 to every line item, and an accepted-but-undelivered marketing send stranded at “sent” likewise prices nothing.

How Insights prices your WhatsApp traffic

The Insights Meta-pricing read prices your delivered volume at Meta’s published rate card, per country × category. The resolver looks up the destination country’s card with the normalized category, and countries without a card of their own fall back to a default card, so no volume is left unpriceable. Meta shares a per-message cost on some reads and not on others. The mirror applies one rule set:
  • A real, positive per-message cost that Meta returns is preserved verbatim and never overwritten with an estimate.
  • FREE_* pricing types (free entry-point conversations, free customer-service windows) stay $0 regardless of category.
  • Otherwise, when cost is absent or zero against positive volume, the point is priced as volume × the country × category rate.
That third rule fixes the “$0.00 by category" failure class. Meta deprecated sharing the cost metric on the pricing-analytics edge for business solution providers: the edge still returns delivered volume broken down by country × category, but cost comes back absent. Summing an absent cost rendered every category "$0.00” despite real billable volume; pricing the volume Meta does report with Meta’s own card restores a breakdown you can read. A subtler shape appears when the edge is asked for more than one dimension at once: it can return two separate marginal series, one by country (carrying no category) and one by category (carrying no country), instead of a single country × category cross-product. The country series then has no category to price and would render “$0.00 by country”. Orbit detects that shape and reconstructs an estimated cross-product: each category’s billable volume is distributed across destination countries in proportion to each country’s share of total country volume, and every country × category cell is priced at the per-country card. Volume is conserved on both axes, so the by-category totals stay consistent with the rest of the page while by-country now reflects real per-country rates. Read the reconstructed by-country chart as a modeled estimate under a uniform category mix, not as invoice truth.

The cost optimizer

Everything above attributes cost after the fact. The send-time optimizer runs before a campaign goes out and plans against the same model. At the mental-model level it makes three moves:
  1. Cheapest valid category. For each recipient it looks at the categories the same content genuinely qualifies for and picks the cheapest on that recipient’s country card. A reminder that is valid as utility should not ship as marketing.
  2. Sequencing. Authentication and utility sends go out ahead of marketing. They are cheaper, and they open the 24-hour customer-service window; marketing that follows a delivered utility message can ride the already-open window instead of opening a fresh, priced marketing conversation. Recipients already inside an open window are surfaced as zero incremental cost.
  3. Budget guard. The planner walks the sequenced list accumulating estimated spend, and everything past your per-campaign budget is deferred, not dropped, so a single campaign can never overrun its WhatsApp spend cap. The plan reports its savings against the naive send, the same batch priced at each message’s most expensive eligible category, so you can see what the optimization earned.
For a pure marketing blast the optimizer offers a simpler forecast: recipients × the country’s marketing rate. When the target country has no card of its own, the default card is used and the result is flagged so you read it as a rougher approximation. The optimizer recommends; it does not rewrite your templates. Category eligibility stays a compliance question, and a message only rides a cheaper category when the content genuinely qualifies for it, because Meta polices categorization on its side too (see WhatsApp quality and health).

Guardrails

The attribution model tells you what you spent; a set of guardrails bounds what you can spend:

See also