01 · Definition
What is a billable message?
A billable message is one Meta charges a business for under per-message pricing, in force since 1 July 2025. The rule has two parts: the message must be delivered to the user's device, and it must not fall into one of Meta's free buckets. Templates are charged by their category — marketing, utility, authentication or authentication-international — and, since 1 October 2026, free-form replies inside the customer service window are charged as service messages once a business phone number has used its monthly free tier of 1,000 service messages.
Everything else is not billable. Messages customers send to you are never charged. A send that fails — an invalid number, a per-user marketing limit, a payment problem on the account — ends in a failed status and no charge, and a message whose time-to-live (TTL) runs out before the phone comes online is dropped unbilled. Messages delivered inside an open free entry point window, which a Click-to-WhatsApp ad opens, carry no charge; neither do each business phone number's first 1,000 delivered service messages a month, nor the one-to-one messages a coexistence business sends from the WhatsApp Business app.
Status webhooks say which bucket each message landed in. The pricing object arrives with the sent status and with one of delivered or read: type is regular for a billable message and free_entry_point inside a free entry point window, while free_customer_service now marks a service reply that fell inside the number's monthly free tier (until 30 September 2026 it covered every service reply and every utility template sent inside an open window). category names the rate. Meta says the older billable boolean will be deprecated, so new code should decide from type and category. This page sets out the business rule; the webhook pricing object entry documents the payload field by field.
Key takeaways
- A billable message is a WhatsApp message Meta charges for: it was delivered and its pricing type is regular.
- Inbound, failed and time-to-live-expired messages are never billed.
- The charge happens once, at delivery; the read status repeats the pricing object but adds no cost.
- Free entry point deliveries report type
free_entry_point; service replies within a number's first 1,000 a month reportfree_customer_service. - Since 1 October 2026, utility templates sent inside an open window and service replies beyond the free tier report type
regular.
02 · Specifications
A billable message: key facts and limits
| Charge trigger | Delivery to the user's device |
|---|---|
| Never billed | Inbound, failed and TTL-expired messages |
| Billable pricing.type | regular |
| Free pricing.type values | free_entry_point, free_customer_service (service free tier) |
| Service free tier | First 1,000 delivered service messages per number a month |
| Pricing object sent with | sent, plus one of delivered or read |
| Priced by | Category × recipient's country calling code |
| Service replies beyond the tier (India) | ₹0.145 each on InfiQ's card since 1 October 2026 |
03 · Operation
How does a billable message work?
The API accepts the send
A 200 response with a
wamidmeans Meta accepted the request. It proves nothing about delivery, and nothing has been charged yet.`sent` previews the pricing
The
sentstatus carries thepricingobject with the expectedtypeandcategory. The message can still fail or expire, so this is not yet a charge.Delivery creates the charge
When the delivery receipt arrives — status
delivered— andpricing.typeisregular, the message is billable at its category's rate for the recipient's market, set by the country calling code of the number.`read` adds nothing
The
readstatus repeats the pricing object but is not a second charge. Statuses can arrive out of order, so treat a read as proof of delivery if it comes first.Failures and expiries stay unbilled
A
failedstatus carries anerrorsarray explaining why, and a message dropped at the end of its time-to-live never reaches the phone. Neither is charged, and inbound messages never are.
04 · Code samples
A billable message in code
{"id": "wamid.HBgMOTE5ODc2NTQzMjEwFQIAERgSNDRGQjE2NDQ4QkQwM0U5","status": "delivered","timestamp": "1792386000","recipient_id": "919876543210","pricing": {"billable": true,"pricing_model": "PMP","type": "regular","category": "utility"}}
One entry from value.statuses. type regular means this delivery is charged at the utility rate.
05Playground
A working model of Billable Message. Use its controls to replay it step by step.
When does a message start to cost money?
- Accepted · wamid to sent: status: sent
- sent to delivered · billed: status: delivered
- delivered · billed to read: status: read
- Accepted · wamid to failed · not billed: rejected before sending
- sent to failed · not billed: delivery fails
- sent to TTL expired · not billed: time-to-live runs out
- sent to delivered · free: delivered in a free entry point window
- sent to delivered · free tier: service reply within the monthly free tier
- Accepted · wamid
- sent
- delivered · billed
- read
Step 4 of 4 · end of walk
read
Opened in the chat. The pricing object repeats; there is no second charge. A read arriving first still means delivered.
Arrived from delivered · billed via status: read.
Can move to
Nothing — this is a final state.
Happy path, step 4 of 4: read (via status: read). Opened in the chat. The pricing object repeats; there is no second charge. A read arriving first still means delivered.
06 · Cautions
Common mistakes with a billable message
Counting accepted requests as spend
A 200 response and a
wamidprove acceptance, not delivery. Forecasts and cost dashboards built on send counts overstate spend; build them on delivered statuses.Booking a message once per webhook
The pricing object appears on
sentand again ondeliveredorread, so summing every webhook that carries one doubles the count. Book one line perwamid.Relying on the `billable` boolean
Meta says it will be deprecated in a future Graph API version. Read
pricing.typeandpricing.categoryso the code keeps working when the flag disappears.Treating in-window replies as uncharged
Since 1 October 2026, utility templates sent inside an open window arrive with
type: regular, and service replies are charged once a number passes 1,000 in the month. Cost models that zeroed both now under-forecast.Resending instead of waiting
A resend that is delivered is billed again, and if the original also lands later you pay twice. Let the time-to-live do its job and resend only after a
failedstatus.
07 · Worked example: 10,000 dispatch updates, 9,620 charges
Example: 10,000 dispatch updates, 9,620 charges
A Surat textile wholesaler sends 10,000 utility dispatch updates with a 12-hour time-to-live. 9,620 report delivered with type: regular and category: utility; 240 fail with error 131026 because the numbers cannot receive WhatsApp messages; 140 go to phones that stay offline until the time-to-live runs out and are dropped. The invoice line is 9,620 utility messages at the India utility rate — ₹0.19 each on InfiQ's card — not 10,000. When retailers reply to ask about a bale, their messages cost nothing; the wholesaler's free-form answers carry no Meta charge until its number has sent 1,000 service messages that month, and each one after that is a billable service message.
08 · Rationale
Why does a billable message matter?
Every figure on a WhatsApp invoice is a count of billable messages multiplied by a rate, so knowing exactly what counts is how a team forecasts spend, explains a variance during billing reconciliation and avoids paying for messages that never arrived. It also shapes engineering choices: failed and expired sends cost nothing, but a delivered duplicate costs full price, so deduplicating retries and setting sensible time-to-live values matter more than chasing the last failure.
09 · Recommended practice
Best practices for a billable message
- Store the raw pricing object with each wamid — it is the evidence if a charge is ever disputed.
- Set time-to-live on time-sensitive templates so stale messages expire unbilled instead of arriving late.
- Watch the share of failed statuses by error code; failures are free but each one is a customer you did not reach.
- Report spend from delivered, regular-type messages only, split by category and country.
10 · Questions and answers
Billable Message FAQs
- Am I charged for messages that fail?
- No. Meta bills delivered messages only. A message that ends in a failed status, or is dropped when its time-to-live expires, is not charged.
- Are the first 1,000 service messages a month billable?
- Not by Meta. Since 1 October 2026 each business phone number gets 1,000 delivered service messages a month that report
free_customer_service, and Meta bills from the 1,001st. Ask your provider whether its own invoice passes that tier through. - Is a read message charged more than a delivered one?
- No. The charge happens once, at delivery. The read status repeats the pricing object for your records but adds no cost.
- Is a marketing template billable if the customer has an open service window?
- Yes. Templates are charged by their category whether or not a window is open, so a marketing template inside the window is still billed at the marketing rate.
- Are messages my customers send me billable?
- No. Inbound messages are never charged. They do open a 24-hour customer service window, and your free-form replies inside it become billable service messages once your number has used its monthly free tier of 1,000 service 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).