Build and operate
WhatsApp pricing
Who pays Meta, what Meta charges for, and the pricing reported on each message.
In a nutshell
Meta bills each business's WhatsApp Business Account directly, per delivered message; PaalChat never charges for Meta messages. From 1 October 2026 replies inside the 24-hour window are billable too. Each outgoing message's pricing arrives in message.status as billable, category, type and model.
Who pays whom
| Charge | Paid by | Paid to |
|---|---|---|
| WhatsApp messages (Meta's rate card) | The business, through its WhatsApp Business Account | Meta |
| PaalChat | Arranged with PaalTech separately | PaalTech |
PaalChat is a Meta Tech Provider. It never collects, pre-pays or marks up Meta's charges. The business adds a payment method to its WhatsApp Business Account in WhatsApp Manager, and Meta invoices it there.
What Meta charges for
Meta charges per delivered message, at a rate set by the recipient's country and the message's category. Rates change, so PaalChat does not repeat them here - see Meta's pricing pages and the rate card in WhatsApp Manager.
| Message | Charged |
|---|---|
| Marketing template | Always |
| Utility template | Always, from 1 October 2026 (before that, free inside the 24-hour window) |
| Authentication template | Always |
Free-form reply inside the 24-hour window (category service) |
From 1 October 2026, at the same rate as utility in that market |
| Messages inside the 72-hour window opened by a Click-to-WhatsApp ad | Free |
Important
From 1 October 2026 Meta charges for service messages: the free-form replies a business sends while the 24-hour window is open. That includes automatic replies from bots. Keep automated replies purposeful.
Source: Meta, Upcoming pricing updates for service and utility messages. Meta's own pages are authoritative when they differ from this guide.
Pricing on each message
When Meta reports a message as sent, delivered or read, it says how it prices it.
PaalChat records that on the message and passes it on as pricing in the
message.status callback and in
GET .../messages/{id}:
"pricing": {
"billable": true,
"category": "service",
"type": "regular",
"model": "PMP"
}
| Field | Meaning |
|---|---|
billable |
Whether Meta charges for this message |
category |
Meta's pricing category: marketing, marketing_lite, utility, authentication, authentication-international, service, referral_conversion |
type |
regular (charged), free_customer_service or free_entry_point |
model |
Meta's pricing model; PMP is per-message pricing |
pricing is null until Meta reports it, for messages that failed before being
sent, and for incoming messages. Treat unknown category or type values as
informational - Meta adds new ones over time.
Keeping costs predictable
- Count billable messages per business from
message.statusif you show usage to your customers; label it as Meta's charge, billed by Meta. - Send templates only to people who expect them, and batch announcements.
- For bots, reply once with what the customer needs rather than several short messages.
Usage and estimates in PaalChat
PaalChat records Meta's pricing for every delivered message and estimates what it costs from Meta's published rate card. Get Meta usage shows a month per number and category; Estimate Meta cost prices an audience before a bulk send. Each month is compared with Meta's own analytics, and where they differ Meta's figures win. These are estimates - Meta bills the business's WhatsApp Business Account directly, and Meta amounts never appear on a PaalChat invoice.
PaalChat's own plans
PaalChat's subscription is separate from Meta's charges and covers PaalChat only: the API,
callbacks, inbox, templates, automations, campaigns and analytics, within the plan's limits
(WhatsApp numbers, inbox members, contacts). List plans shows them;
plans marked placeholder are examples until PaalTech publishes its prices.
Get billing shows a business's plan, usage and invoices next to - and
apart from - its estimated Meta charges; Pay invoice gives a Paystack
checkout link. When a plan's limit is reached, new inbox members and new contacts from the API
are refused with 402 plan_limit_reached; contacts who write in are always kept, and a number
already sending keeps sending.