Almost every WhatsApp integration hits the same wall in its first week, and most teams diagnose it wrong.

The symptom: messages sent during development go through perfectly. Messages sent from production, days later, are rejected. Nothing in the code changed.

What is actually happening#

WhatsApp treats a conversation the customer started differently from one the business started.

  • When a customer messages you, a customer service window opens. For 24 hours from their most recent message you may reply freely: any wording, no approval needed.
  • Outside that window, free-form messages are not delayed or queued. They are refused. The only thing that goes through is a template — a message format approved in advance by Meta, such as "Your order {{1}} has shipped".

In development you were inside the window, because you had just messaged the test number from your own phone. In production you were not.

Interactive figure

The 24-hour window

24h0h48h
What you want to send

Window open. This will send. A free-form reply is allowed while the window is open — no template, no approval. Rates and what counts as billable have changed more than once — Meta moved to per-message billing on 1 July 2025. Check the pricing page rather than a blog post. WhatsApp pricing.

Drag the slider past 24 hours and switch between message types. Only the free-form service reply depends on the window.

The rule is simple. What breaks integrations is that it is a state that changes over time, and most sending code treats it as a fixed setting.

One conversation, from the platform's point of view

  1. 01Closed

    No customer message on file, or the last one is more than 24 hours old. Only a template may be sent.

  2. 02The customer writes

    The window opens. Free-form replies are allowed from this moment.

  3. 03Open

    Twenty-four hours from that message. Reply in your own words, no template review needed.

  4. 04The customer writes again

    The window restarts from the newest message, not the first.

  5. 05It expires

    Back to closed. A free-form reply at hour twenty-five is rejected, not delayed.

The window belongs to the conversation between one customer and one business number — not to your campaign or your agent.

Why the rule exists#

The window exists because the alternative — any business with your number messaging you whenever it likes — is what filled SMS inboxes with spam. Template approval is the price of a channel where people still read their messages. Treat it as a feature of the medium and the design decisions get easier.

Most channels have some version of this asymmetry. WhatsApp's is the most visible because its API says no. Email's version is enforced by a spam filter that says nothing at all.

Inside and outside the window#

Inside the windowOutside it
What you may sendFree-form, in your own words, or a templateAn approved template only
ReviewNone for free-form repliesTemplate approval in advance, per language
CostSince 1 October 2026, free-form replies are charged after 1,000 free per business number each month, and utility templates are charged tooCharged per delivered template, by category and country
Who may startThe customer already didYou, with a template that fits an approved category
Typical failureRareA rejected send exactly when you needed it
The asymmetry is the design. The window rewards replying to people and makes interrupting them deliberate.

Since 1 July 2025 Meta charges per delivered message rather than per conversation, with rates set by category (marketing, utility, authentication) and the recipient's country. Free-form replies inside the window, which Meta calls service messages, had been free since November 2024. Since 1 October 2026 they are charged again: each business phone number gets 1,000 free service messages a month, unused ones do not roll over, and the rest are charged at a rate that, market by market, matches the utility and authentication rate. Utility templates sent inside an open window, free from 1 July 2025, are charged from the same date. Check Meta's current pricing page for rates, which change. One related rule: when a customer arrives from a click-to-WhatsApp ad or a Facebook Page button, a longer free entry point window of 72 hours applies, and messages sent in it carry no delivery charge.

Two windows, two lengths

24 hoursCustomer service window

From the customer's most recent message

72 hoursFree entry point window

When the customer arrives from a click-to-WhatsApp ad or a Facebook Page button

The details teams get wrong#

The clock restarts on every customer message. It is measured from the customer's latest inbound message, not from the start of the conversation.

It is one window per customer and business number. A customer who writes to sales and is transferred to support has one window, and both teams are spending it.

Queue time spends the window. If your target is "reply within four hours", you have plenty of headroom — until a public holiday, when a queue of open conversations silently becomes a queue of template sends.

Checking at queue time is too early. A message queued at hour twenty-three and sent at hour twenty-five is rejected. Check at the last possible moment.

A template is not a reply. You can answer a support question with a template, but it changes the cost and the tone.

What to build#

  1. Model the conversation. Store, per customer and business number, the timestamp of the last inbound message. The window state is derived from it, never stored as a flag.
  2. Let the send path decide. Before sending, read the state and pick free-form or template. Log which one you used, because the billing question will come later.
  3. Have templates approved before you need them. Approval is not instant. A support team that discovers at 2 a.m. that it needs an unfiled template does not reply until morning.
  4. Show the clock to agents. An inbox that shows time left on each conversation lets people pick up the right one next.
  5. Batch the expiring. Conversations about to close that need a follow-up are a scheduled job, not a surprise.

A short, honest pattern helps too: if a follow-up is likely, end with a question. The customer's reply restarts the window — the medium working as designed, not a trick.

What the send path decides, at the last possible moment

  1. 01Did this customer write to this business number in the last 24 hours?
    Yes
    Reply free-form, in your own words
    No
  2. 02Is an approved template for this message on file?
    Yes
    Send the template, and log that you did
    No
    Nothing goes out — which is why templates are approved before they are needed
Check at send time, not queue time: a message queued at hour twenty-three and sent at hour twenty-five is rejected.

The cost model this implies#

Replies inside the window are no longer simply free. Since 1 October 2026 each business number gets 1,000 free service messages a month, and every reply after that is charged at the market's service rate. Being responsive still pays, for a different reason: a reply inside the window can be written in your own words and costs at most the service rate, while the same message after the window closes needs an approved template, which costs the same or more and must already exist. A team that answers in ten minutes keeps its conversations inside the window; a team that answers in ten hours pushes more of them into templates, before counting customer satisfaction.

Treat replies as a budget line. Estimate the service messages each number sends in a month, subtract the 1,000 free ones, and price the rest from Meta's rate card. Log the type of every message you send, because the invoice will distinguish them.

Where to go next#

Sources

Every claim worth checking, with somewhere to check it.

  1. WhatsApp Cloud API documentationMeta for Developers
  2. Pricing on the WhatsApp Business PlatformMeta for Developers · accessed 2026-10
  3. Upcoming pricing updates for Meta Business Agent, service and utility messagesMeta for Developers · 2026-09-30
  4. Updates to WhatsApp Business Platform pricingMeta for Developers