Meta WhatsApp Non-Template Message Pricing Change
Initiative owned by the Bifrost team, tracking Qontak's response to Meta's WhatsApp Business
Platform pricing change for non-template messages (source:
https://developers.facebook.com/documentation/business-messaging/whatsapp/pricing/non-template-messages).
From October 1, 2026, previously-free "service" (non-template) messages become billable
per message. This is a direct continuation of the July 2025 Per-Message Pricing (PMP)
migration (PRD, BIF-4331):
the CBP/PMP deduction engine already reads pricing_model / pricing.type / category off
the Meta webhook and bills type=regular messages per unique message id at their category
price + margin. Service is billed at cost — a 0 Qontak margin at launch (pass-through;
see the resolved product decision below and the PRD). Today a service message inside the customer service window arrives as
type=free_customer_service (free); after the switch Meta sends it as type=regular, so the
existing PMP path bills it — the work is mainly (a) seeding a service category price and
(b) verifying the PMP flow bills category=service rather than special-casing it as free.
Out of scope: Meta's new "Meta Business Agent" per-token AI billing (Aug 2026) — Qontak does not use Meta Business Agent, so that dimension does not apply.
Scope Changes
- Backend —
hub_core: verify the PMPtype=regularbranch billscategory=service(remove any "service is always free" special-case) — this is where the deduction engine lives;qontak-billing: confirm/seed theservicerate inv2_wa_conversation_prices(its visible deduction endpoint is the legacy conversation-based path, not the PMP engine);report-worker: verify/fix the MCC export filter so billable service rows appear. - Frontend —
hub,hub-chat: confirm billable service-message usage renders in customer-facing usage/billing reports (per-message "Message ID" reporting already shipped with the July 2025 PMP work — BIF-4332/4626/4616). - Data — new/updated price-catalog rows for the
servicecategory inv2_wa_conversation_prices(per country); theservicemargin is set to 0 (charge at cost) — 0 by default for new CIDs at account creation, and backfilled to 0 for existing CIDs on the release date.
QA Lane
Lane B — keeps a human QA gate. Money-critical billing reconciliation against Meta: after
1 Oct 2026 the PMP path must bill category=service at the seeded rate, and a silent error
(wrong rate, missed rows, or double-billing) directly mischarges customers on ~14–15B IDR/month
of previously-free traffic. No E2E test specs exist for this initiative yet, so the Lane-A entry
bar (100% E2E, spec-mapped) is unmet regardless. Classified by Yoddi, Izzul (QA), 2026-07-06.
Priority
Portfolio-relative rank lives only in the team roadmap ## Priority table (never a per-initiative
field). Set to P2 on 2026-07-06 (immediately after Deduction V2) — see
../delivery/roadmap.md.
Related repos
qontak-billinghub-service(+hub_core— not checked out locally; the webhook parser that derives pricing category/type and forwards deductions needs direct verification)report-workerhubhub-chat
Docs
documentations/impact-analysis.md— per-repo implementation impact analysis (current state, required changes, sequencing, open product question).
Product decision (resolved 2026-07-22)
Will Qontak absorb, pass through 1:1, or bundle the new Meta service-message fee?
Resolved: pass through 1:1 at cost — a 0 Qontak margin at launch. Clients are billed
exactly what Meta charges Qontak, with no markup. The service margin remains a real,
configurable field (default 0): new CIDs inherit 0 at account creation; existing CIDs are
backfilled to 0 on the release date. A non-zero markup can be introduced later without
re-architecting. Other categories' margins are unchanged. See PRD §14 (Key Decisions) and the
PRD §1 problem statement.