TL;DR Most rejections come from (1) placeholder formatting, (2) variables at the start/end or stacked together, (3) vague content, (4) wrong category/language, (5) link issues, and (6) too many variables for the amount of text. Fixes and “Bad → Good” examples below.
Quick checklist (before you click Submit edits for review in Spur)
Variables are
{{1}}
,{{2}}
,{{3}}
… (sequential, paired braces, no special characters).Don’t start/end the body with a variable; never put variables back‑to‑back.
Content is clear (not just placeholders) and matches the chosen category and language.
Links are clean: avoid
wa.me
, avoid shorteners, use your own domain.Formatting is tidy: avoid tabs/newlines abuse or 5+ consecutive spaces; headers/footers don’t use emojis/markup.
If you use many variables, add more words (see ratio tip in Reason #6).
The most common rejection reasons (with fixes and examples)
Copy the “Good” version that fits your use case. Adjust wording, keep the structure.
1) Misformatted or non‑sequential variables
What’s wrong: Missing braces, {{1}} {{3}}
with no {{2}}
, or special chars in placeholders.
Fix in Spur: Use Add variable and keep numbering in order.
Bad
Hi {1}, your code is {{3}}
Good
Hi {{1}}, your code is {{2}}.
2) Variable at the very start/end (or stacked side‑by‑side)
What’s wrong: Variable is first/last token, or {{1}} {{2}}
with no real text. (Twilio)
Fix: Add words/punctuation before/after; merge variables if appropriate.
Bad
{{1}}, your order {{2}}
Good
Hi {{1}}, your order {{2}} is ready for pickup.
3) Vague or spam‑like content
What’s wrong: Templates like “Reminder: {{1}}” are too generic and often abused.
Fix: Give clear purpose and surround variables with context.
Bad
Reminder: {{1}}
Good
Reminder: your appointment at {{1}} is tomorrow at {{2}}. Reply 1 to confirm or 2 to reschedule.
4) Wrong category or language
What’s wrong: Content doesn’t match the selected category (e.g., promo submitted as Utility) or language metadata is wrong.
Fix:
Marketing: promos, win‑backs, back‑in‑stock.
Utility: order/appointment updates the user asked for.
Authentication: OTP/verification codes.
Also ensure the selected language matches the text.
5) Link issues (wa.me
, shorteners, wrong domain)
What’s wrong: Meta doesn’t allow direct WhatsApp links in templates; shortened or off‑brand domains get flagged.
Fix: Use your own domain and plain phone numbers in copy (not wa.me
).
Bad
Chat with us: https://wa.me/14154443344
Good
Chat with us: +1 415 444 3344
6) Too many variables for too little text
What’s wrong: High variable density hurts clarity and triggers review failures.
Fix: Add context. A practical guardrail: min words ≈ (3 × variables) + 1.
Bad
Hi {{1}} Order {{2}}
Good
Hi {{1}}, your order {{2}} is confirmed. We’ll notify you when it ships.
7) Formatting: tabs/newlines/spacing
What’s wrong: Newlines/tabs or more than four consecutive spaces; messy spacing patterns.
Fix: Keep body as normal sentences.
Bad
Hi {{1}}, Your invoice {{2}} is ready.
Good
Hi {{1}}, your invoice {{2}} is ready.
8) Header/footer problems
What’s wrong: Headers/footers with emojis, markup, or newline characters; body beginning/ending with newline.
Fix: Keep headers/footers plain; keep body clean.
9) Duplicate templates
What’s wrong: Submitting the same text under a new name.
Fix: Change both name and wording if you need a variant.
10) Policy violations (Business/Commerce)
What’s wrong: Requests for full card numbers, national IDs, prohibited items, legal threats, or shaming language.
Fix: Don’t request sensitive identifiers; if needed, ask only for partials (e.g., last 4).
11) Naming rules for templates
What’s wrong: Names with spaces or special characters.
Fix: Use lowercase alphanumeric with underscores, e.g., order_update_shipped
.
12) Character limits & operational gotchas
Heads‑up: Body is limited to ~1,024 characters; templates can only be edited under certain states and a limited number of times per month. (Operational caps vary by WABA and provider.)
Fixing a minimal example (why it fails and how to pass)
Risky draft
Hi - {{1}} Order no {{2}} .
Why it’s risky: Too terse and variable‑heavy; looks vague to reviewers.
Utility‑safe version
Hi {{1}}, your order {{2}} has been received. We’ll notify you when it ships. Reply HELP for support.
Marketing version
Hi {{1}}, thanks for your order {{2}}. Come back this week and save 10% with code THANKYOU10.
(Choose Utility for order updates; Marketing for promos.)
Copy‑paste templates that usually pass
Utility — Order shipped
Hi {{1}}, your order {{2}} has shipped. Track it here: {{3}}
Marketing — Back‑in‑stock
Hi {{1}}, {{2}} is back in stock. Grab yours: {{3}}
Authentication — OTP
Your {{1}} code is {{2}}. Do not share this code with anyone.
(Authentication has stricter patterns—keep it simple and purpose‑built.)
FAQ
What rejection codes will I see?
Common ones are INVALID_FORMAT
(formatting error) and TAG_CONTENT_MISMATCH
(category/language doesn’t match content).
Can Meta re‑categorize my template after approval?
Yes—content that looks promotional can be recategorized to Marketing. Keep Utility messages strictly transactional.
Do I need samples for placeholders?
Providing example values helps reviewers understand intent and speeds approvals; many providers explicitly ask for them when troubleshooting rejections.