The rules Meta actually enforces on WhatsApp message templates - naming, positional variables, mandatory examples, UTILITY vs MARKETING, media sample limits - and the button choice that quietly reclassifies your template and multiplies its cost.
Key takeaways
- Every variable must carry an example value. Meta rejects a submission with no examples outright, and this is the single most common cause of a first-attempt rejection.
- UTILITY and MARKETING are priced differently. Adding a URL button to an otherwise transactional message is the classic way a confirmation template gets reclassified as marketing - putting the link in the body text as plain text keeps it UTILITY.
- Approval is per language, not per template. A template approved as "he" is not approved as "en_US", and sending the wrong language code returns error 132001 even though the template plainly exists.
- Approved is not permanent. Meta can flip a live template to paused or disabled based on quality signals, and it notifies you only by webhook - subscribe to message_template_status_update or you will find out from a failed send.
A WhatsApp message template is the only way to open a conversation with a customer outside the 24-hour window, so every automation that initiates contact depends on Meta's approval. Rejections are almost always caused by the same handful of mechanical rules rather than by judgement. Here is the full list, followed by the one decision that actually affects your cost.
Template structure
A template has four parts, three of them optional:
- Header - optional. One of
text,image,videoordocument. - Body - required. The message text, with positional variables.
- Footer - optional. Short text, no variables.
- Buttons - optional. Up to three, of type
quick_reply,urlorphone_number.
The mechanical rules behind most rejections
Template name
Lowercase letters, digits and underscores only - the pattern is ^[a-z0-9_]+$. A hyphen, a space or a capital letter fails the submission. The name is also immutable after creation; changing the wording means creating a new template.
Positional variables
Variables are {{1}}, {{2}}, {{3}} - positional, not named. There is no {{name}}. They must be sequential and start at 1: a template containing only {{1}} and {{3}} is rejected.
At send time the number of supplied values must match the variable count exactly, or you get error 132000.
Examples - the number one cause of rejection
Every variable must carry an example value. Meta rejects a submission without examples automatically. The example should be realistic: for a {{2}} representing a date and time, "12345" looks suspicious while "14/09/2026 at 10:30" passes. The reviewer - human or automated - reads the template with the examples substituted in, and that is what gets approved.
Sample file for a media header
If the header is media, a sample file is required at submission and is uploaded as a header_handle. The limits:
- Image - JPG or PNG, up to 5MB
- Video - MP4, up to 16MB
- Document - PDF, up to 100MB
That same file becomes the default media on real sends unless you pass a different media ID. A Meta media ID lives roughly 30 days, so a system that sends a media-header template over time needs to refresh it.
Length after substitution
The length limit applies to the text after variables are substituted. A template approved with short examples can still fail at send time with error 132005 when a long value is supplied. In Hebrew this bites sooner than you expect.
The decision that changes your cost: UTILITY vs MARKETING
Every template carries a category - UTILITY, MARKETING or AUTHENTICATION - and Meta prices them differently. You declare the category at submission, but Meta reclassifies based on the actual content.
The common case: an appointment confirmation or reminder is clearly UTILITY. Add a URL button pointing at your website and the template is reclassified as MARKETING, because a button leading to your site reads as promotion rather than as an operational update.
The practical fix: if a customer needs to reach a link from a transactional message, put it as plain text in the body instead of as a button. The customer can still tap it, and the template stays UTILITY.
The same logic applies to wording: "Your appointment is confirmed for" is an update. "Don't miss out!" or "Special offer" turns the same message into marketing.
Lifecycle - and what happens after approval
The statuses run: local draft, then pending once submitted, then approved or rejected. Only an approved template can be sent.
The part most systems miss: Meta can move a live, approved template to paused or disabled, based on a quality rating derived from recipient behaviour - blocks and reports. A paused template returns error 132015; a disabled one returns 132016.
Meta announces this only via webhook. Subscribe to the message_template_status_update and message_template_quality_update fields in your webhook configuration. Without them, the first time you learn your template was paused is when a campaign fails.
What to do differently
- Submit early. Approval takes anywhere from minutes to days and does not depend on your code being ready.
- Two languages, two templates. Same name, different language code, two separate submissions.
- Store the rejection reason. Meta returns one; without keeping it you resubmit the same mistake.
- Do not write like an ad. A transactional message that sounds transactional is approved faster, costs less, and gets blocked less.
Frequently asked questions
Why was my WhatsApp template rejected?
The most frequent cause is missing example values for the variables - Meta rejects submissions without them. After that, the usual causes are an invalid template name (only lowercase letters, digits and underscores are allowed), non-sequential variables that do not start at {{1}}, a missing sample file for a media header, or promotional wording in a template submitted as UTILITY.
What is the difference between UTILITY and MARKETING templates?
UTILITY covers transactional messages tied to something the customer did - a booking confirmation, an order update, a reminder. MARKETING covers promotion. Meta prices them differently and reclassifies based on actual content, so a URL button to your website can turn a confirmation into a marketing template. Putting that link in the body as plain text usually keeps it UTILITY.
Can WhatsApp template variables be named instead of numbered?
No. Variables are strictly positional - {{1}}, {{2}}, {{3}} - and must be sequential starting at 1. There is no {{name}} form. At send time you supply values in order, and the count must match the template exactly or the send fails with error 132000.
Does an approved WhatsApp template stay approved?
No. Meta continuously scores template quality from recipient behaviour such as blocks and reports, and can move a live template to paused (error 132015) or disabled (error 132016). The change is announced only through the message_template_status_update and message_template_quality_update webhook fields, so subscribe to them.
What file limits apply to a WhatsApp template media header?
A sample file is required at submission: JPG or PNG up to 5MB for an image header, MP4 up to 16MB for video, and PDF up to 100MB for a document. That sample also serves as the default media on sends unless a different media ID is supplied, and Meta media IDs expire after roughly 30 days.
Do I need a separate template for Hebrew and English?
Yes. Approval is granted per language code, so the same template name must be submitted separately for "he" and for "en_US". Sending with a language code that has not been approved returns error 132001 - template does not exist - even though the template is clearly there.
Keep reading
Related service
WhatsApp Cloud API
Templates, a two-way inbox and reminders on the official Meta API.
About the author
Yehonatan Saadia
Freelance automation, web & MVP engineer
I'm Yehonatan Saadia, a senior engineer who builds business automation, custom websites, and MVPs for small and mid-sized companies across the US, Europe, and Israel. These guides come from real client work, not theory.
Work with meHave a project like this?
Tell me what you're trying to automate or build and I'll tell you the fastest reliable way to ship it.
