Updated on October 25, 2026
A WhatsApp template is rejected when Meta finds a formatting problem (malformed variables, variables out of sequence, too many for the text length or placed at the start or end of the message), content that breaks policy (requests for sensitive data, threats, scams, prohibited products), the wrong category or duplicate text. To fix it, read the reason in WhatsApp Manager or in the message_template_status_update webhook, edit the template and resubmit, or file an appeal with sample values. Meta makes a decision within 24 hours.
Below are the official reasons, how to spot each one and what to change in the text. If you are still building your first templates, start with how Meta categorizes templates.
How the review works
Every new template, and every edited template, is reviewed before it can be sent. According to Meta’s template review documentation, the review combines automated systems and manual review and takes up to 24 hours. The result shows up:
- in WhatsApp Manager, as a notification;
- by email to the business portfolio admins;
- in Business Support Home, with the rejection details;
- in the
message_template_status_updatewebhook, if you track it through the API.
Until the review is complete, the template stays PENDING and cannot be used.
The most common rejection reasons
Meta lists the reasons below as the most frequent ones. The right-hand column shows the fix.
| Reason | Example of the problem | How to fix |
|---|---|---|
| Missing or mismatched curly braces | {{1}, {1}}, {{ 1 }} | Use exactly {{1}} |
| Special characters in a variable | {{#1}}, {{$amount}}, {{1%}} | Keep the symbol outside the variable: $ {{1}} |
| Variables out of sequence | {{1}}, {{2}}, {{5}}, {{4}} | Number them in order: {{1}}, {{2}}, {{3}} |
| Too many variables for the text length | “Hi {{1}}, {{2}} {{3}} {{4}}.” | Add fixed text or use fewer variables |
| Message starts or ends with a variable | “{{1}}, your order has shipped.” or “…code {{1}}” | Put text before and after |
| Request for sensitive data | “Send us your full card number” | Ask only for the last digits, never a full ID or account number |
| Abusive or threatening content | “Pay today or we will make your name public” | Remove threats of legal action or public shaming |
| Commerce Policy violation | Selling prohibited items | Check the policy before creating the template |
| Spam or scam-like content | Exaggerated promises, suspicious links | Clear text, identified brand, your own domain |
| Character limits | Body too long, too many emojis | Respect each component’s limits |
| Duplicate | Same body and footer as an existing template | Change the text or reuse the existing template |
The duplicate rule does not apply to authentication templates, which use preset text defined by Meta.
Variables: the errors that cause most rejections
Most formatting rejections come from variables. Compare:
| Likely rejected | Likely approved |
|---|---|
| “{{1}}, your bill is due tomorrow.” | “Hi {{1}}, your bill is due tomorrow.” |
| “Your tracking code is {{1}}” | “Your tracking code is {{1}}. Track it on the carrier’s website.” |
| “Amount: {{$1}}” | “Amount: $ {{1}}.” |
| “Hi {{1}}! {{2}} {{3}}.” | “Hi {{1}}, your order {{2}} was delivered on {{3}}. If anything is wrong, just reply to this message.” |
| “{{1}}{{2}}” | “Order {{1}}, expected delivery on {{2}}. Thank you for your purchase.” |
Variables placed side by side ({{1}}{{2}}) are also rejected: Meta uses this very case as its INVALID_FORMAT example.
Every parameter needs a sample value. In WhatsApp Manager, use the Add Sample button; in the API, use the example field of each component. Without samples, the reviewer cannot judge the real message. Use realistic samples: “Marina” and “48213” say more than “test” and “123”.
How to read the reason in the webhook
If you track templates through the API, the result arrives in the message_template_status_update field. A formatting rejection looks like this:
{
"field": "message_template_status_update",
"value": {
"event": "REJECTED",
"message_template_id": 1689556908129835,
"message_template_name": "bill_reminder",
"message_template_language": "en_US",
"reason": "INVALID_FORMAT",
"message_template_category": "UTILITY",
"rejection_info": {
"reason": "Your template has parameters placed next to each other (like {{1}}{{2}}) without text or punctuation between them.",
"recommendation": "Separate parameters with descriptive text and ensure each parameter is clearly contextualized."
}
}
}
The rejection_info object, with an explanation and a recommendation, is only included when the reason is INVALID_FORMAT. Possible reason values, according to the webhook reference:
reason | Meaning | Action |
|---|---|---|
INVALID_FORMAT | Invalid format | Read rejection_info and fix variables, limits or structure |
INCORRECT_CATEGORY | Content does not match the chosen category | Change the category or rewrite (see template categories) |
TAG_CONTENT_MISMATCH | Content does not match the chosen category | Same action as INCORRECT_CATEGORY |
PROMOTIONAL | Content violates policies | Review the text against the policies |
ABUSIVE_CONTENT | Content violates policies | Remove threats and aggressive or misleading language |
SCAM | Content violates policies | Remove promises and scam-like elements |
CATEGORY_NOT_AVAILABLE | Deprecated | Should not appear on new templates |
A simple handler that stores the reason and alerts the team:
export function handleTemplateStatus(value, db, alert) {
db.updateTemplate(value.message_template_id, {
status: value.event,
category: value.message_template_category,
reason: value.reason,
});
if (value.event === 'REJECTED') {
const detail = value.rejection_info?.recommendation ?? 'see Business Support Home';
alert(`Template ${value.message_template_name} rejected (${value.reason}): ${detail}`);
}
}
Watch for other events in the same webhook too: PAUSED and DISABLED (low quality), FLAGGED (negative feedback, at risk of being disabled), IN_APPEAL (appeal in progress) and LIMIT_EXCEEDED (the account has reached its template limit).
Fix and resubmit, or appeal
You have two paths when a template is rejected.
Edit and resubmit
If the problem is in the text, edit and resubmit. According to the template management documentation, only APPROVED, REJECTED or PAUSED templates can be edited, and each edit replaces all components at once. For rejected templates, the category can also be changed in the edit.
With the Cloud API directly, the edit is a POST to the template ID:
curl -X POST "https://graph.facebook.com/v26.0/TEMPLATE_ID" \
-H "Authorization: Bearer META_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"components": [
{
"type": "BODY",
"text": "Hi {{1}}, the bill for order {{2}} is due on {{3}}. You can get a copy using the button below.",
"example": { "body_text": [["Marina", "48213", "10/30/2026"]] }
}
]
}'
You can also create a new template with a different name. If you delete an approved template, its name is blocked for 30 days.
File an appeal
If you think the rejection was a mistake, appeal it. Any rejected template can be appealed, and the appeal must include samples. In WhatsApp Manager:
- Hover over the suitcase icon (Account tools) and click Message templates. If you have several accounts, pick the right one in the top-right dropdown.
- Click the rejected template.
- Adjust the content if needed.
- Click Add Sample and fill in sample values and images.
- Click Submit.
Meta responds within 24 hours. During the appeal, the webhook may send the IN_APPEAL event.
Category rejections follow a different path: the review is requested in Business Support Home, within 60 days. Templates that Meta identifies as disguised authentication cannot be reviewed; in that case, create an authentication template (see WhatsApp verification codes).
Send errors that look like rejections
Some errors only show up when you send an already approved template. They are often mistaken for rejections:
| Code | Meaning | Action |
|---|---|---|
132000 | Number of parameters does not match the template | Check how many parameters each component expects |
132001 | Template does not exist in the given language or is not approved | Check name, language code and status |
132007 | Template content violates a WhatsApp policy | Review the text against the rejection reasons |
132015 | Template paused due to low quality | Wait for the pause to end or edit it |
132016 | Template disabled after repeated pauses | Create a new template with different content |
The full list, with causes and fixes, is in WhatsApp API error codes.
Checklist to avoid rejection
- Variables in
{{1}}format, in sequence, with no symbols inside and never side by side. - Fixed text before the first variable and after the last one.
- A realistic sample value for every variable and a sample image for media headers.
- No requests for full card, account or ID numbers.
- No threats, aggressive collection language or exaggerated promises.
- A category that matches the content: notices are utility, offers are marketing.
- Text that differs from the templates you already have.
How to do it with Vectalk
On Vectalk, templates are created and edited with the same request bodies as the Cloud API, using an instance token (the WABA is resolved from the token). To fix a rejected template, send the new components to POST /api/templates/{templateId}; editing works for APPROVED or REJECTED templates. To check the status, use GET /api/templates?name=bill_reminder. The message_template_status_update webhook arrives in Meta’s format at the URLs you registered.
curl -X POST https://apis.vectalk.com.br/api/templates/TEMPLATE_ID \
-H "Authorization: Bearer YOUR_INSTANCE_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "components": [ { "type": "BODY", "text": "Hi {{1}}, the bill for order {{2}} is due on {{3}}. You can get a copy using the button below.", "example": { "body_text": [["Marina", "48213", "10/30/2026"]] } } ] }'
See the endpoints at docs.vectalk.com.br and create your account at apps.vectalk.com.br/register.
Frequently asked questions
How long does Meta take to review a template?
Up to 24 hours, for both the initial review and appeals. Many templates are approved sooner, but plan launches around the maximum.
Can I use a rejected template while my appeal is pending?
No. Only templates with APPROVED status can be sent. If the send is urgent, create a corrected version with a different name in parallel.
My template was approved, but as marketing. Is that a rejection?
No. Since April 2025, templates submitted as utility that Meta considers marketing are approved as marketing. The fix is to request a category review or rewrite the text. See template categories.
Why was an identical template approved in another account and rejected in mine?
Meta notes that its examples are illustrative and that similar text can get different results depending on the exact content and sample values. The duplicate rule also matters: if a template with the same body and footer already exists, the new one is rejected. Adjust the text and use realistic samples.
How many times can I edit a template?
Approved templates can be edited up to 10 times in 30 days, or once in 24 hours. The documentation does not state a limit for rejected templates.
Official sources checked on October 25, 2026: Template review, message_template_status_update webhook, Template management, Template categorization, Error codes, WhatsApp Business Messaging Policy.
