Description
What is the webhook pricing object?
The webhook pricing object is a small block inside the statuses webhook that tells you how Meta classifies a message you sent for billing. Since per-message pricing replaced conversation-based pricing on 1 July 2025, it carries four fields: pricing_model (PMP for per-message pricing; CBP appears only on webhooks sent before 1 July 2025), type, category and billable.
category is the pricing category: marketing, utility, authentication, authentication-international, service, marketing_lite for messages sent through the Marketing Messages API for WhatsApp (formerly MM Lite), or referral_conversion for free entry point traffic. type says whether the message is charged: regular means billable, free_entry_point means it was delivered inside an open 72-hour free entry point window, and free_customer_service marked the in-window service replies and utility templates that were free until 30 September 2026. Meta's reference limits free_customer_service to messages sent through 30 September 2026, so since 1 October 2026 a service message (a free-form reply inside the customer service window) reports type regular and category service, unless a free entry point window covers it.
The object rides on the sent status and on one of the later delivered or read statuses for the same wamid — not on every status. Meta says billable will be deprecated and recommends reading type and category together. With Graph API v24.0 and later, the old conversation block, described under Webhook Conversation Object (Legacy), is omitted unless the message belongs to a free entry point conversation. Unlike the rate card, which lists what each category costs per market, the pricing object is the per-message signal that tells you which line of the rate card applies.
Key takeaways
- The pricing object on status webhooks shows how Meta bills each message you send:
pricing_model,type,categoryandbillable. typeregularmeans charged at the category's rate;free_entry_pointmeans delivered free inside a free entry point window.- Since 1 October 2026 a service reply reports
typeregularandcategoryservice, because Meta now charges for it. - The object rides on the
sentstatus and on one ofdeliveredorread, so record it once perwamid. - Meta plans to deprecate
billable; build billing reports ontypeandcategoryinstead.
Usage
The webhook pricing object in code
{"id": "wamid.HBgMOTE5ODEyMzQ1Njc4FQIAERgSN0Y2QjA1RTNC","status": "delivered","timestamp": "1760866200","recipient_id": "919812345678","pricing": {"billable": true,"pricing_model": "PMP","type": "regular","category": "service"}}
A service reply delivered after 1 October 2026: charged, so type is regular and category is service.
Properties
The webhook pricing object: key facts and limits
- Location
- statuses[].pricing in messages webhooks
- pricing_model
- PMP (CBP only on webhooks before 1 July 2025)
- type
- regular · free_entry_point · free_customer_service (until 30 Sep 2026)
- category
- marketing, utility, authentication, authentication-international, service, marketing_lite, referral_conversion
- Carried on
- sent, plus one of delivered or read
- billable
- To be deprecated — read type and category
- Service replies (India)
- ₹0.145 per message since 1 October 2026
Mechanics
How does the webhook pricing object work?
step 1 — Read it from status webhooks
Look in
entry[].changes[].value.statuses[].pricing. It appears on thesentstatus and on one laterdeliveredorreadstatus of the samewamid.step 2 — Classify with type and category
typeregularmeans the message is charged at itscategoryrate;free_entry_pointmeans it is not. Treatbillableas a fallback only, since Meta plans to deprecate it.step 3 — Count once per wamid, on delivery
Store the object keyed by
wamidand ignore the second copy. Meta charges delivered messages only, so count a message once it reachesdeliveredorread.step 4 — Multiply by the rate card
Map each category to its rate for the recipient's market — for India on InfiQ's card, ₹0.94, ₹0.19, ₹0.14 and ₹0.145 — to estimate spend before the invoice arrives.
step 5 — Alert on surprises
Flag a template whose category changes,
authentication-internationalon OTPs you expected to be domestic, or a sudden fall infree_entry_pointvolume during an ad campaign.
Why it matters
Why does the webhook pricing object matter?
It is the only per-message billing signal you get in real time. Finance teams use it for billing reconciliation against Meta's invoice, product teams use it to see how much traffic lands as marketing versus utility, and developers use it to catch a template whose template category Meta has changed — a utility template that starts reporting category marketing costs ₹0.94 per delivery in India instead of ₹0.19, and nothing else in the API will warn you as quickly.
Example
Example: Month-end reconciliation at a Chennai fintech
A Chennai fintech sends OTPs, payment receipts and a weekly offer. Its billing job reads the pricing object from each status webhook and writes wamid, category and type to a table, marking rows delivered when the delivered or read status arrives. At month end the table shows 1.8 lakh authentication, 60,000 utility, 25,000 marketing and 9,000 service messages, plus 3,000 free_entry_point replies from a Click-to-WhatsApp campaign that cost nothing. Multiplying by the rate card lands close to the invoice, and the one template that drifted from utility to marketing shows up as its own line.
Caveats
Common mistakes with the webhook pricing object
Counting the object twice
It appears on
sentand again ondeliveredorread. Summing every occurrence doubles your spend estimate; key the record bywamid.Building reports on billable
Meta plans to deprecate
billable. Base reports ontypeandcategorynow so they keep working when the field disappears.Hard-coding the service category as zero cost
Code written before October 2026 often treats
categoryserviceas costless. Since 1 October 2026 service replies and in-window utility templates have been charged, so decide ontype, not on a list of categories.Treating sent as billed
Meta bills delivered messages only. A message that shows pricing on
sentand then fails is not charged, so join the pricing record with the final status.Enums that miss marketing_lite or the hyphen
Messages sent through the Marketing Messages API report
marketing_lite, and the international OTP category is spelledauthentication-internationalhere. A strict enum that only knowsmarketingandauthenticationdrops them.
Questions
Webhook Pricing Object FAQs
- Does the pricing object show the price in rupees?
- No, it shows the pricing model, the category and whether the message is charged — never an amount. Multiply each delivered message by the rate card for the recipient's market to get the cost.
- Why does a service reply now show type regular?
- Because Meta has charged service messages since 1 October 2026. Until 30 September 2026, in-window service replies and utility templates showed
typefree_customer_service; now a charged reply reportsregularwithcategoryservice. - Is the pricing object on every status webhook?
- No, it appears on the
sentstatus and on one ofdeliveredorreadfor the same message, never on both. Store it keyed bywamidso the second copy does not double your totals. - How is the pricing object different from the conversation object?
- The pricing object describes per-message billing; the conversation object described 24-hour conversations under the old model. From Graph API v24.0 the conversation object is omitted unless the message belongs to a free entry point conversation.
- Do messages in a free entry point window cost anything?
- No, they report
typefree_entry_point. Meta left the 72-hour free entry point window unchanged for message delivery when it began charging for service messages on 1 October 2026.
Notes
Best practices for the webhook pricing object
- Store pricing with the template name so category drift per template is easy to see.
- Compare monthly totals per category with Meta's invoice and investigate any gap that keeps recurring.
- Alert when a template's reported category changes — it is the earliest sign of recategorisation.
- Keep CBP-era rows separate: their categories described conversations, not messages.
* Per-message rates for India, ex-GST: marketing, utility and authentication effective 1 July 2026; service messages ₹0.145 since 1 October 2026 (they were ₹0 until 30 September 2026). Volume commitments earn discounts — final rate is confirmed on your account; applicable GST extra. Rates for other countries differ (see the international rate table on /pricing).