What it means
WhatsApp does not let a business type a fresh message to a customer whenever it likes. If the customer has not written to you in the last 24 hours, the only thing you may send is a message template: a structure you registered in advance, that a Meta reviewer approved, with a small number of blanks you fill at send time.
This is the single largest architectural difference between WhatsApp and every other messaging channel a CRM touches. On Telegram or email you compose and send. On WhatsApp you either reply inside an open window, or you select an approved template and supply parameters. A campaign that was designed as free text has to be redesigned as a template library.
Templates live on the WABA, are created and read at /{waba-id}/message_templates, and are sent from a specific phone number. A template is identified by its name together with its language, so order_shipped in en_US and order_shipped in tr are two separate approvals of the same logical message.
The three categories, and why the choice is financial
Every template is filed under one of three categories, and the category is not a label you pick for tidiness. It determines what you are charged, how aggressively the message is frequency-capped per user, and how strictly it is reviewed.
The rule that catches people out is contamination. Category is decided by content, not by your intent for the message. Take a genuine order confirmation and add one closing line offering ten percent off the next purchase, and the template is no longer utility. Meta will either reject it for an incorrect category or, more disruptively, approve it and later re-categorise it, which arrives as a template_category_update webhook and quietly changes what your notifications cost.
Authentication is stricter still. It exists for one-time passcodes and uses a fixed structure with a copy-code or one-tap autofill button. Anything else in the body, including a friendly marketing sign-off, is a category mismatch.
Structure: components, variables and limits
A template is made of components, and only the body is mandatory:
- Header. Optional. Either a short line of text or a single media item: image, video or document. A text header may contain at most one variable.
- Body. Required. The message itself, with as many variables as you need, subject to the formatting rules below.
- Footer. Optional, short, and static. Footers cannot contain variables at all, which is why the "reply STOP to unsubscribe" line belongs there.
- Buttons. Optional. Quick replies that come back to your webhook, URL buttons that open a link, a single call button, copy-code buttons for authentication, and Flow buttons that open a WhatsApp Flow.
Variables are written as {{1}}, {{2}} and so on, in order, and newer templates may use named placeholders such as {{order_id}} instead. Whichever form you use, three formatting rules cause most of the rejections we see:
- The body may not begin or end with a variable. A body that is nothing but
{{1}}is rejected every time. - Two variables may not sit adjacent to each other.
{{1}} {{2}}needs real words in between. - Every variable needs an example value submitted with the template. A missing example is an invalid format, not a warning.
Component text is also length-capped: headers and footers are limited to a short single line, the body allows a long paragraph but not an article, and button labels are very short. Meta publishes the exact character counts and adjusts them, so build your editor against the documented limits rather than assuming the ones you memorised last year still hold.
Lifecycle: from submitted to disabled
A template moves through a small state machine, and the states arrive as message_template_status_update webhooks:
- PENDING. Submitted, awaiting review. Usually minutes.
- APPROVED. Sendable. This is the only state from which a send succeeds.
- REJECTED. Comes with a machine-readable reason code. Fix and resubmit, or appeal.
- PAUSED. Quality-triggered. Recipients blocked or reported messages built from this template, so Meta stopped it temporarily. It resumes by itself.
- DISABLED. The end state after repeated pauses. The template is dead and needs to be rebuilt with different content, not resubmitted unchanged.
Pausing is the state teams misread most often. It is not an account penalty and it is not random: it is Meta telling you that this specific piece of copy generated negative feedback. The correct response is to look at who received it and why they objected, not to resubmit the same words under a new name, which simply reproduces the pause on a fresh template.
Why it matters
Templates are the throttle on every outbound WhatsApp programme. You cannot launch faster than review, you cannot personalise beyond your declared variables, and you cannot change your mind about the wording on the morning of the campaign. Teams that treat the template library as product infrastructure, versioned, reviewed, and shipped ahead of the campaign, run smoothly. Teams that treat it as copywriting discover that the campaign is blocked on a reviewer.
The library is also an asset with real switching costs. Approval history and template quality accrue to the WABA. Move to a different account and you start again from zero, which is one more reason to own your WABA.
A rejected template, and the fix
Here is a real shape of failure. A retailer submits a template under utility:
{{1}}, your order {{2}} has shipped. Track it here. Also, everything in our summer range is 30% off this week, grab it before it goes: bit.ly/sale
This fails on four counts at once. It begins with a variable. It claims to be utility while advertising a sale, so the category is wrong. It uses a link shortener, which reads as a phishing signal to a reviewer. And it never names the business, which is the other half of the same signal.
The version that passes, submitted as utility:
Hi {{1}}, your Acme order {{2}} has shipped and should arrive by {{3}}. You can follow it from the button below.
The promotion becomes its own marketing template, sent to the audience that opted in to promotions, with a full acme.com URL button and an opt-out line in the footer. Two templates, two categories, two audiences, and both get approved.
Common mistakes
- Writing one template and hoping. Submit the whole campaign set days early. Review time is not yours to control.
- Editing an approved template in place. Version the name instead, so the running campaign is never blocked by a re-review.
- Blaming the account for a paused template. The pause is about that specific copy and that specific audience.
- Using shortened links. Shorteners hide the destination from the reviewer and are a reliable way to collect a scam rejection.
- Leaving the opt-out out of marketing templates. A visible way to stop reduces blocks, and blocks are what destroy your quality rating.
- Ignoring category re-classification. Meta can move a template between categories after approval, and your cost per message moves with it.
Related concepts
- 24-hour customer service window: the reason templates exist at all.
- Conversation-based pricing: where the category turns into money.
- Quality rating: what a badly targeted template destroys.
- Opt-in: the permission that should exist before any template is sent.
- Interactive message: the free-form counterpart available inside the window.
- Drip campaign: a multi-step sequence built entirely out of approved templates.
How Pinlyx handles it
Pinlyx syncs your WABA's template library, shows each template's category, language, approval state and rejection reason in one list, and blocks a campaign from launching on a template that is not currently approved. Variables are mapped to CRM fields visually, with the start, end and adjacency rules checked before submission rather than after rejection. Status and category changes arrive through the Meta webhooks and appear as alerts, so a template that gets paused mid-campaign stops the sequence instead of failing silently. More on WhatsApp CRM.