WhatsApp template rules: what each check means and how to fix it
Every check OmniBrand runs on a WhatsApp template before Meta sees it, by its code (VAR_EDGE, BUTTON_GROUPING, EDIT_LIMIT...): what it means, why Meta cares and how to fix it.
Before a WhatsApp template goes to Meta for review, OmniBrand checks it against Meta's published rules. The same checks run in your browser while you write and again on our server when you press Submit for review, so a template Meta would certainly refuse never leaves OmniBrand. Each check has a code; this page explains every one.
How to read a check
- Must fix: Meta will refuse the template. In the template builder Submit for review stays off until it is fixed; the Checks panel lists it under Must fix, with a Fix button when OmniBrand can fix it for you. If the server still finds one when you submit, the builder shows "Meta would reject this template, so nothing was sent. Fix these and try again:".
- Likely rejection: a common reason for rejection or re-categorisation. You can still submit.
- Tips: advice only.
- Checks marked *OmniBrand guideline* are our own rule of thumb where Meta publishes no number; they are never Must fix.
- Who can submit: members with the Manage WhatsApp templates task (Owners, Admins and Editors by default; see Roles and tasks).
When Meta itself refuses
If Meta still refuses, the builder says "Meta refused the template:" with Meta's own words and, when Meta sent an error number we recognise, the matching rule below: 2388299 is VAR_EDGE, 2388293 is VAR_DENSITY, 2388019 is TEMPLATE_QUOTA, 2388039 is EDIT_WHILE_PENDING, 2388040 is BODY_MAX, 2388047 is HEADER_NO_MARKDOWN, 2388072 is VAR_SYNTAX, 2388073 is FOOTER_NO_VARS and 2388024 is NAME_TAKEN_LANG. Nothing changes at Meta: a new template stays in the builder as a Draft (fix the text and press Submit for review again), and a submitted one keeps its status (fix it and press Save changes again).
NAME_FORMAT (must fix)
The name may use only lowercase English letters, digits and underscores, up to 512 characters, e.g. eid_offer_2026. Replace spaces and capitals with underscores and lowercase.
NAME_TAKEN_LANG (must fix)
This WhatsApp Business Account already has a template with this name in this language. Choose another name, or add a different language to the existing one.
NAME_RECENTLY_DELETED (likely rejection)
A template with this name was deleted less than 30 days ago. Meta blocks the name of a deleted approved template for 30 days, so pick a new name or wait.
LANGUAGE_CODE (must fix)
The language code is not one WhatsApp accepts. Use Meta's codes: en, en_US, en_GB, ar, ar_EG, ar_AE and so on. Portuguese must be pt_BR or pt_PT.
LANGUAGE_SCRIPT_MISMATCH (likely rejection, OmniBrand guideline)
The text does not look like the chosen language: an Arabic template whose text is mostly not Arabic, or an English one written mostly in Arabic. Change the language or translate the text. Meta never translates; write each language separately.
CATEGORY_ADVICE (likely rejection, OmniBrand guideline)
A Utility or Authentication template contains promotional words (offer, discount, sale, عرض، خصم...) or a promotional button. Meta approves such templates as Marketing, which costs marketing prices and may only go to people who agreed to marketing. Remove the promotion or choose Marketing.
AUTH_SHAPE (must fix)
Authentication templates have a fixed shape set by Meta: the body is "{{1}} is your verification code.", there is one one-time-password button (Copy code, One-tap autofill or Zero-tap), no header, footer, media, links or emoji, and the code expiry is 1 to 90 minutes. One-tap and zero-tap buttons need your Android app's package name and signature hash. Zero-tap also needs you to accept Meta's zero-tap terms (the tick box under Button in the builder).
BODY_REQUIRED (must fix)
Every template needs body text.
BODY_MAX (must fix)
The body is longer than Meta allows: 1,024 characters (600 for a limited-time offer). Shorten it.
HEADER_TEXT_REQUIRED (must fix)
You chose a text header but left it empty. Type the header, or choose no header.
HEADER_TEXT_MAX (must fix)
A text header can be at most 60 characters.
HEADER_ONE_VAR (must fix)
A text header can hold only one variable.
HEADER_NO_MARKDOWN (must fix)
The header must be plain text: no formatting characters (* _ ~ `), no line breaks and no emoji.
HEADER_MEDIA_SAMPLE (must fix)
An image, video or document header needs a sample file that Meta reviews the template with. Accepted: JPEG or PNG images up to 5 MB, MP4 videos up to 16 MB, PDF documents up to 100 MB. OmniBrand checks the file itself, not its name. A template made in WhatsApp Manager needs a new sample before it can be edited here.
HEADER_LOCATION_CATEGORY (must fix)
A location header is allowed only in Marketing and Utility templates.
FOOTER_MAX (must fix)
The footer can be at most 60 characters.
FOOTER_NO_VARS (must fix)
The footer cannot contain variables.
VAR_SYNTAX (must fix)
A variable is written wrongly. Numbered variables are written {{1}}, {{2}}; named ones {{first_name}} (lowercase letters, digits and underscores). Braces must match, and one template uses either numbers or names, never both.
VAR_SEQUENTIAL (must fix)
Numbered variables must start at {{1}} and run 1, 2, 3 with no gaps, in the order they first appear.
VAR_EDGE (must fix)
The text starts or ends with a variable (Meta error 2388299). Add words before the first variable and after the last one, e.g. "Hello {{1}}, your order is ready." rather than "{{1}}, your order is ready".
VAR_ADJACENT (must fix)
Two variables sit next to each other with only spaces or punctuation between them. Put words between them.
VAR_DENSITY (likely rejection, OmniBrand guideline)
There are many variables for the length of the text (Meta error 2388293). Meta publishes no exact ratio; we warn below 3 words of fixed text per variable, or when variables are more than 30% of the words. Add text or use fewer variables.
VAR_EXAMPLE (must fix)
Every variable needs a realistic example value, which Meta's reviewers read. An example cannot be empty, contain line breaks, tabs or 4 spaces in a row, be another variable, or be a placeholder such as "test", "x" or "name". Use a real-looking value such as "Sara" or "A-1042".
BUTTON_COUNTS (must fix)
Too many buttons: at most 10 in total, 10 quick replies, 2 website buttons, 1 call button, 1 copy-code button (and one of each Flow, catalog, product-list and WhatsApp-call button). One-time-password buttons belong only to authentication templates.
BUTTON_TEXT (must fix)
Every button needs a label of 1 to 25 characters, without variables, and no two buttons may share a label.
BUTTON_GROUPING (must fix)
Quick-reply buttons must sit together, not mixed between website or call buttons. Move them next to each other.
URL_FORMAT (must fix)
A website button needs a full https:// link of at most 2,000 characters. It may end with one variable, written {{1}}, for example https://example.com/order/{{1}}, and that variable needs an example (such as an order number) without spaces. Encode spaces and non-English characters (%20).
URL_SHORTENER (likely rejection, OmniBrand guideline)
The link uses a link shortener (bit.ly, tinyurl, t.co...). Reviewers often refuse them; use a link on your own domain.
PHONE_FORMAT (must fix)
A call button needs the number in international format with its country code, e.g. +966500000000, at most 20 characters.
BUTTONS_DESKTOP (tip)
With more than 3 buttons WhatsApp shows 2 and puts the rest under "See all options". With 4 or more buttons, or quick replies mixed with other buttons, WhatsApp desktop does not show the template at all.
CAROUSEL_SHAPE (must fix)
A carousel is Marketing only and has 2 to 10 cards. Every card has an image or a video (all the same type), at most 2 buttons with the same types in the same order on every card, and card text of at most 160 characters (all cards or none). There is no header or footer above the cards.
LTO_SHAPE (must fix)
A limited-time offer is Marketing only: an offer headline of at most 16 characters without variables, an image or video header, a body of at most 600 characters, no footer, a copy-code button first (code at most 15 characters) and at most one website button after it.
COUPON_SHAPE (must fix)
A coupon template has exactly one copy-code button with a sample code of 1 to 20 characters and no spaces.
CATALOG_SHAPE (must fix)
A catalog template has exactly one View catalog button, no other buttons and no header (WhatsApp shows a product image).
MPM_SHAPE (must fix)
A product-list template needs a text header and exactly one View items button. The sections you list under Products in the builder must fit what WhatsApp can show: at most 10 sections and 30 products in all, each section with a title of up to 24 characters and at least one product ID.
FLOW_SHAPE (must fix)
A Flow template needs exactly one Flow button that names one Flow, and the screen it opens when it navigates.
CONTENT_SENSITIVE_ID (likely rejection, OmniBrand guideline)
The text seems to ask for a full card, account, IBAN or national ID number. Meta refuses these; asking for the last 4 digits is fine.
CONTENT_THREAT (likely rejection, OmniBrand guideline)
The wording may read as threatening or shaming ("final warning", "legal action"). Meta refuses abusive or threatening templates. Rephrase it politely.
CONTENT_PROHIBITED (likely rejection, OmniBrand guideline)
The text mentions something WhatsApp's Business Policy does not allow in Gulf markets: alcohol, tobacco, gambling, dating, cryptocurrency or lending. Remove it.
DUPLICATE (likely rejection)
Another template on this WhatsApp Business Account has the same text. Meta refuses duplicates; change the wording or use the existing template.
EMOJI_DENSE (likely rejection, OmniBrand guideline)
More than 10 emoji in the message, or 3 or more with more than one emoji per 8 words. Use fewer.
MARKETING_OPT_OUT (tip)
A Marketing template should give people a way to stop: add a "Stop promotions" quick reply and a footer such as "Reply STOP to unsubscribe".
TEMPLATE_QUOTA (must fix)
The WhatsApp Business Account has reached Meta's template limit: 250 templates for an unverified business, 6,000 for a verified one with an approved display name (each language counts). Delete templates you no longer use.
EDIT_LIMIT (must fix)
Only approved, rejected or paused templates can be edited. An approved template can be edited once in 24 hours and at most 10 times in 30 days; rejected and paused ones have no limit. The message says how many hours are left. Changing only OmniBrand's own settings (where a variable's value comes from, its fallback) is not an edit and is always allowed.
EDIT_CATEGORY_LOCKED (must fix)
The category of an approved template cannot change. Create a new template in the other category instead.
EDIT_WHILE_PENDING (must fix)
The template is in review (PENDING or IN_APPEAL) and cannot be edited until Meta decides (Meta error 2388039).
MESSAGE_TTL (must fix)
Meta does not accept the chosen Message validity for this category. Allowed: Authentication 30 seconds to 15 minutes, or 30 days; Utility 30 seconds to 12 hours, or 30 days; Marketing 12 hours to 30 days; always whole seconds. Fix sets the field back to Meta's default. Switching the category to one that does not accept the period removes it by itself.
MESSAGE_TTL_ADVICE (likely rejection)
An authentication message could arrive after its code has expired: the Message validity (or Meta's default of 10 minutes) is longer than the code expiry set under Say when the code expires (Minutes). Meta recommends a validity no longer than the code expiry; Fix sets the validity to the code expiry.
MESSAGE_TTL_ROUTE (tip)
Meta applies a marketing template's validity to messages sent with Optimised delivery (Marketing Messages API). Marketing messages sent through the regular Cloud API keep being retried for up to 30 days.
Related
Official references
Checked against the product on Sep 24, 2026