WhatsApp API: message cost, the 24-hour window and fallback_template
Last updated: 27 September 2026 · 7 min read
Meta charges every time you send a template message, while plain text sent inside the 24-hour window is free. Sending the same notifications in the right order cuts the cost several times over.
Steps
-
1
Prices
- UTILITY (orders, delivery, payments, reminders): 0.036 AZN
- AUTHENTICATION (OTP, sign-in confirmation): 0.036 AZN
- MARKETING (campaigns, discounts, announcements): 0.165 AZN
- Free text inside the window: free
This is Meta's per-message rate, and Clomni adds no fee. MARKETING is 4.6 times more expensive than UTILITY, so create order, delivery and reminder templates in Meta as UTILITY. The category affects both the price and the chance of approval.
-
2
The 24-hour window
The window opens for 24 hours from the moment the customer writes to you. During that time you can send them any text for free. When the window is closed, you can send only an approved template, and each template is paid for separately.
A template you send does not open the window. The customer opens it: by replying, or by tapping a quick reply button in the template.
-
3
One request with fallback_template
Put
text(the text) andfallback_template(the template to send when the window is closed) in the same request. Clomni checks the window itself:- if it is open, the text goes out and the response has
sent_as: "session"(free); - if it is closed, the template goes out,
sent_as: "template"(paid); - if there is no
fallback_templateand the window is closed, nothing is sent and422comes back: no paid message goes out without you knowing.
fallback_templatehas the same structure astemplate:name,language,parameters.{ "channel_id": 159, "phone_number": "+994 50 123 45 67", "text": "Your parcel is with the courier. It will arrive today by 18:00.", "fallback_template": { "name": "kargo_status", "language": "az", "parameters": { "body": { "1": "AZ-10422", "2": "with the courier" } } } } - if it is open, the text goes out and the response has
-
4
Cargo example: 5 notifications, 1 payment
Over a day, 5 notifications go out for one parcel: “received”, “arrived at the warehouse”, “cleared customs”, “with the courier”, “delivered”. Sending each one as a separate template means 5 payments. The right way:
- send the first notification with a template that has a quick reply button, for example “Track parcel” or “Yes, keep me posted” (1 payment);
- when the customer taps the button, the 24-hour window opens;
- send the other notifications as plain text: it is free and needs no approval;
- if the next notification falls after 24 hours, the API switches to
fallback_templateby itself.
-
5
The numbers
1,000 parcels, 5 notifications a day:
- each notification as a separate template: 180 AZN a day, 5,400 AZN a month (30 days), 65,700 AZN a year;
- with 1 template and 4 free texts: 36 AZN a day, 1,080 AZN a month, 13,140 AZN a year;
- savings: 144 AZN a day, 4,320 AZN a month, 52,560 AZN a year.
This assumes every customer taps the button. In practice 60-80% do, so the real saving is about three quarters of this amount.
A MARKETING campaign to 10,000 people costs 10,000 × 0.165 AZN = 1,650 AZN. The next 24 hours of messages with a customer who replies or taps a button are free.
-
6
What goes out when
- The customer wrote in the last 24 hours or tapped a template button:
textgoes out, free. - The window is closed and there is a fallback:
fallback_templategoes out, 0.036 AZN (utility) or 0.165 AZN (marketing). - The window is closed and there is no fallback: a
422error, nothing is sent, nothing is charged. - First contact: a template, 0.036 AZN for OTP, 0.165 AZN for a campaign.
- The customer wrote in the last 24 hours or tapped a template button:
-
7
Check the window in advance
If you are preparing many notifications, find out in advance which numbers have an open window: those are free.
curl -s "https://api.clomni.ai/v1/accounts/{account_id}/whatsapp/messages/window?channel_id=159&phone_number=%2B994501234567" \ -H "Authorization: Bearer <API_ACARI>"Response:
{ "open": true, "last_inbound_at": "2026-08-07T09:15:00Z", "expires_at": "2026-08-08T09:15:00Z", "conversation_id": 1042 }open: falsewithlast_inbound_at: nullmeans this number has never written to you: the first message has to be a template.