Updated on October 25, 2026
Utility templates sent inside the 24-hour customer service window were free from July 1, 2025 to September 30, 2026. Since October 1, 2026, Meta charges for them at the regular rate: for recipients in Brazil, R$ 0.0350 (US$ 0.0068 on the USD rate card) per delivered message. Today, utility messages are only free inside a free entry point window (opened by Click-to-WhatsApp ads), and, inside the customer service window, the no-cost alternative is to reply with free-form messages, which use the free tier of 1,000 service messages per phone number per month.
This article explains how the rule used to work, what changed, how to check the charge in the webhook and how to rework your flows so you don’t pay unnecessarily.
How the rule worked until September 30, 2026
When Meta switched from conversation-based to per-message pricing on July 1, 2025, it added an incentive: utility templates sent while the customer service window was open were not charged. In the status webhook, those messages came with pricing.type set to free_customer_service.
In practice, this made flows like these free:
- the customer asks “has my order shipped?” and the system replies with the tracking template;
- the customer books through chat and gets the confirmation template with a calendar button;
- the customer asks for a copy of a bill and gets the template with the payment slip.
Many teams built automations around this. That is what changed.
What changed on October 1, 2026
According to Meta’s pricing page, from October 1, 2026:
- utility inside the customer service window is billed at the regular rate. In the webhook, the
pricing.typeof these messages changed fromfree_customer_servicetoregular; - service messages (free-form replies, without a template) are billed after a free tier of 1,000 per phone number per month;
free_customer_servicenow only indicates service messages within that free tier.
| Situation | Until Sep 30, 2026 | Since Oct 1, 2026 |
|---|---|---|
| Utility template outside the window | Billed | Billed |
| Utility template inside the customer service window | Free (free_customer_service) | Billed (regular) |
| Free-form message (service) inside the window | Free | Free up to 1,000 per number per month; billed after that |
| Any category in the free entry point window | Free | Free (free_entry_point) |
Meta also notes that accounts without a payment method keep getting service messages delivered until the free tier runs out; after that, they are no longer delivered.
Want to try it while you read? Create a Vectalk account and send your first message through the official API. Create free account →
The customer service window: what it is (and what it isn’t)
The customer service window is the 24-hour period that opens when a user messages the business. Every new message from the user restarts the timer. While it is open, you can send any type of message: text, media, buttons, lists and templates. Outside it, only templates.
The point is that the window defines what you can send, not how much you pay. After the October change, the window still allows free-form messages, but it no longer zeroes out the cost of utility templates.
What is still free
Free entry point window
When a user messages from a Click-to-WhatsApp ad, on the Android or iOS app, and the business replies within the customer service window, a free entry point window of up to 7 days opens. In it, marketing, utility, authentication and service messages are not charged. In the webhook, these messages have pricing.type set to free_entry_point. Only Meta Business Agent messages remain billable in this window.
Service free tier
Each business phone number gets 1,000 free delivered service messages per month. The tier does not roll over and resets at midnight on the first day of the month, in the Messaging account’s time zone. It applies to free-form messages (text, media, interactive buttons, lists), not to templates.
How to cut costs inside the window
If the customer just wrote to you, the window is open and you can reply without a template. An interactive message with buttons delivers the same information as a utility template and is classified as service:
{
"messaging_product": "whatsapp",
"to": "5584999999999",
"type": "interactive",
"interactive": {
"type": "button",
"body": { "text": "Your order 48213 left for delivery today at 9am. Tracking code: BR123456789." },
"action": {
"buttons": [
{ "type": "reply", "reply": { "id": "tracking_ok", "title": "Got it" } },
{ "type": "reply", "reply": { "id": "talk_to_agent", "title": "Talk to an agent" } }
]
}
}
}
A simple rule for your system:
- Window open? Reply with a free-form message (text or interactive). It uses the service free tier and, after that, costs the same as utility in Brazil (R$ 0.0350).
- Window closed? Use a utility template, the only way to start contact with a transactional notice.
- User came from a Click-to-WhatsApp ad? Inside the free entry point window, nothing is charged (except Meta Business Agent).
In Node.js, the decision looks like this:
const TWENTY_FOUR_HOURS = 24 * 60 * 60 * 1000;
export function chooseFormat(contact, now = Date.now()) {
const windowOpen = contact.lastInboundAt &&
now - contact.lastInboundAt < TWENTY_FOUR_HOURS;
return windowOpen ? 'interactive' : 'utility_template';
}
Store the time of each contact’s last inbound message from the messages webhook. To send the payload above or a template, see how to send messages with the WhatsApp API.
How much is the switch worth? For recipients in Brazil, utility and service (after the free tier) have the same rate, R$ 0.0350. The savings come from the free tier: up to 1,000 free-form messages per number, per month, cost nothing. At higher volumes the difference is small, and the choice should put user experience first.
How to check it in the webhook
The pricing object in the status webhook shows each message’s category and pricing type. A utility template sent inside the window now arrives like this:
{
"id": "wamid.HBgL...",
"status": "delivered",
"timestamp": "1761400000",
"recipient_id": "5584999999999",
"pricing": {
"billable": true,
"pricing_model": "PMP",
"type": "regular",
"category": "utility"
}
}
Meta warns that the billable field will be deprecated in a future version and recommends using pricing.type and pricing.category together. A Python classifier:
def classify(pricing):
ptype, category = pricing.get("type"), pricing.get("category")
if ptype == "free_entry_point":
return "free (entry point)"
if ptype == "free_customer_service":
return "free (service tier)"
if ptype == "regular":
return f"billed as {category}"
return f"check: {ptype}/{category}"
If you still see free_customer_service on utility messages dated after October 1, 2026, review your report: in the current webhook, that type only indicates service messages within the free tier. The guide on message status via webhook covers the rest of the payload.
Practical examples
| Flow | Window | Recommended format | Cost (Brazil) |
|---|---|---|---|
| Customer asks about an order and you reply with tracking | Open | Interactive message | Service free tier, then R$ 0.0350 |
| Shipping notice the day after purchase, no conversation | Closed | Utility template | R$ 0.0350 |
| Lead arrives from an ad and asks for the payment slip | Free entry point | Template or free-form | Free |
| Payment reminder three days before the due date | Closed | Utility template | R$ 0.0350 |
| Customer asks in chat for a new PIX code | Open | Free-form message with the code | Service free tier, then R$ 0.0350 |
PIX is the Brazilian central bank’s instant payment system. These rates apply to recipients with Brazilian numbers; for other countries, check that market’s rate on Meta’s rate card. For payment and sales-recovery flows, see PIX, boleto and abandoned cart recovery. To model volumes, use the method in WhatsApp campaign cost.
What about the template category?
None of this changes the category rules. Utility still has to be non-promotional and tied to a user action or account. If the template has sales content, it becomes marketing, which costs R$ 0.3217 in Brazil, inside or outside the window. The rules are in how Meta categorizes your template.
How to do it with Vectalk
On Vectalk, status webhooks arrive in Meta’s format, with each message’s pricing object, so you can build a cost report and see the effect of the change. Free-form and interactive messages are sent with POST /api/messages, using the same payloads as the Cloud API, and you pay Vectalk, which pays Meta, without adding a card on Meta. See the message types at docs.vectalk.com.br and create your account at apps.vectalk.com.br/register.
Frequently asked questions
Are utility messages still free within 24 hours?
No. Since October 1, 2026, utility inside the customer service window is billed at the regular rate. The only exception is the free entry point window, opened by Click-to-WhatsApp ads.
Is replying to a customer with free-form text billed?
Not for the first 1,000 service messages per number, per month. From the 1,001st on, each delivered service message is billed (R$ 0.0350 for recipients in Brazil).
Why does my report still show free_customer_service?
Since October 1, 2026, that type indicates service messages within the monthly free tier, not utility. Messages from before that date keep the old meaning.
Is the 1,000 free tier per account or per number?
Per business phone number. A business with three numbers gets up to 3,000 free service messages per month, if the volume is spread across them.
What happens if I have no payment method on file?
According to Meta, service messages keep being delivered until the free tier runs out; after that, they are no longer delivered.
Official sources checked on October 25, 2026: WhatsApp Business Platform pricing and the BRL and USD “List rates” spreadsheets (effective October 1, 2026), Message status webhook, Template categorization.
Put your business on the official WhatsApp
Create your account, connect your number to the official API (you can keep the app with coexistence) and start serving customers and sending messages.
