If you take one thing away about the WhatsApp Business API, make it this: the 24-hour window. It governs what you can say, when, and how — and getting it wrong is the most common reason a business message fails to arrive.

What the window is

Every time a customer messages or calls your business, a 24-hour customer service window opens. Inside it, you can reply with almost anything — free-form text, images, documents — exactly like a normal chat. The clock resets each time the customer messages or calls again.

When 24 hours pass with nothing new from them, the window closes. Now you can no longer send free-form content. To reach that customer again, you must send a template message Meta has approved.

Why WhatsApp does this

The window is Meta's spam control. It keeps WhatsApp feeling like a place for real conversations, not a channel businesses can blast at will. Once a customer stops replying, a business can only reach them with approved templates — and only if they opted in.

Inside vs outside the window

  • Inside (open): free-form messages are allowed. Great for live support, back-and-forth, answering questions.
  • Outside (closed): only approved template messages can be sent. Used for notifications you initiate — reminders, updates, offers to opted-in customers.

What it costs

Replies inside the window used to be free. From 1 October 2026, each business phone number gets 1,000 free delivered service (free-form) messages a month; after that, Meta charges each one at the utility rate for the recipient's country. Utility templates sent inside the window are charged from the same date. Details in how WhatsApp pricing works.

The mistake that eats support tickets

Teams building directly against the API often send a free-form message to a customer who hasn't written in a day — and it never arrives. The failure (Meta error 131047, more than 24 hours since the customer last replied) can show up later as a failed status instead of at send time, so the code that sent it believes it worked. Multiply that across thousands of sends and you have a delivery hole and a lot of confused customers.

The fix is to check the window state on every single send and route accordingly: free-form if open, template if closed. Doing that reliably — tracking the last-inbound time per customer, per number — is fiddly to build yourself.

Why a catch-all template is not the answer

A tempting shortcut is one template whose body is little more than a single variable, used to push any text through outside the window. Meta treats templates whose content is unclear — for example a body that is only {{1}} — as marketing, re-checks a template's category against the messages it actually sends, and can limit or restrict accounts that send utility content through such wrappers. Specific templates for specific messages are the durable way.

What about Meta's Direct Send?

Meta has its own answer to the same problem. With Direct Send, a business sends plain text marked as utility, and Meta sends it with a matching approved template or, if none matches, with a fallback onboarding template while it creates a new one in the background. It is worth knowing about, with three limits as of September 2026:

  • Not every account can use it. Meta describes it as a premium solution for businesses that meet its prerequisites; an account that doesn't is refused with an error.
  • Utility only. Marketing messages are not supported.
  • Meta chooses the template. You don't decide in advance which approved wording your customer receives.

That is why walpio uses text rules instead: they work on every account, you pick the approved template each wording goes out as, you can test a message against your rules before sending it, and every API answer says which route and template were used. walpio does not send through Direct Send today.

How walpio handles it for you

This is the problem walpio was built around. On every send, walpio checks the window:

  • Window open → your text goes out as-is.
  • Window closed → walpio sends an approved template: the one you name, or — with a text rule — the template that matches the wording you sent, with the values filled in. Your systems keep sending their own wording.
  • No matching template → the send is refused with a clear reason (no_matching_template) — nothing goes out, and nothing is silently dropped.

walpio treats the window as closed a little early, after 23.5 hours, to leave a safety margin, and every API answer says which route was used. That's the difference between “we send WhatsApp” and “our WhatsApp actually arrives.”