Template Requirements & Limits
Meta's rules for WhatsApp message templates — character limits, variable rules, button constraints, and content policies
Meta enforces strict rules on WhatsApp message templates. If your template doesn't meet these requirements, it will be rejected during review or fail when sending.
This page covers the rules you need to follow. For how to create and manage templates in Bouncer, see WhatsApp Templates.
Template name
| Rule | Limit |
|---|---|
| Allowed characters | Lowercase a-z, digits 0-9, underscores _ only |
| Case | Must be all lowercase |
| Max length | 512 characters |
| Uniqueness | Must be unique per WhatsApp Business Account (case-insensitive) |
Avoid generic names like test, abc, or message_1 — Meta may reject them.
Categories
Every template must declare a category at creation:
- Utility — Order confirmations, shipping updates, appointment reminders, account alerts
- Marketing — Promotions, offers, newsletters, re-engagement (requires customer opt-in)
- Authentication — OTP codes, login verification, account verification
Your template content must match the declared category. If Meta detects a mismatch, the template will be rejected with INCORRECT_CATEGORY.
Tip: Bouncer sets
allow_category_change: trueby default. This lets Meta auto-assign the correct category instead of rejecting outright if you picked the wrong one.
Header
Headers are optional. You can have one header per template.
Text header
| Rule | Limit |
|---|---|
| Max length | 60 characters |
| Max variables | 1 |
| No leading or trailing variable | {{1}} Hello and Hello {{1}} alone are not allowed — add surrounding text |
| No consecutive variables | {{1}}{{2}} is not allowed |
Media header
Instead of text, you can use an image, video, or document as the header.
| Format | Accepted types | Max size |
|---|---|---|
| Image | JPEG, PNG | 16 MB |
| Video | MP4 | 16 MB |
| Document | 16 MB |
You must provide an example media file when creating the template. This is uploaded during template creation and used for Meta's review.
Body
The body is the main message text. It is required.
| Rule | Limit |
|---|---|
| Max length | 1,024 characters |
| Variable format | {{1}}, {{2}}, {{3}} — numbered sequentially |
| No named variables | {{name}} or {{order_id}} will be rejected — use {{1}}, {{2}} |
| Sequential numbering | Must start at {{1}} with no gaps |
| No leading or trailing variable | Add text before and after variables |
| No consecutive variables | {{1}}{{2}} is not allowed — add text between them |
| Variable-to-text ratio | Variables cannot make up most of the message — add enough static text |
| Max consecutive spaces | 4 |
| Max emojis (Marketing only) | 10 |
Example values
When your body contains variables, you must provide realistic example values for Meta's review. Don't use generic values like test or abc — use something that represents actual content.
Footer
Footers are optional. If included:
| Rule | Limit |
|---|---|
| Max length | 60 characters |
| No variables | Variables are not allowed in the footer |
| No line breaks | Must be a single line |
| No emojis | Emojis are not allowed in the footer |
Buttons
Templates can include up to 10 buttons total. Each button type has its own limits.
Quick Reply
| Rule | Limit |
|---|---|
| Max count | 10 per template |
| Text max length | 25 characters |
| No variables | Variables are not allowed in button text |
URL button
| Rule | Limit |
|---|---|
| Max count | 2 per template |
| URL format | Must start with https:// |
| URL max length | 2,000 characters |
| Variable placement | Only in the path or query string, not in the domain |
No wa.me links | WhatsApp links are not allowed |
| No URL shorteners | bit.ly, tinyurl, goo.gl, t.co, ow.ly are blocked |
Phone Number button
| Rule | Limit |
|---|---|
| Max count | 1 per template |
| Format | E.164 international format (e.g., +14155551234) |
| Text max length | 25 characters |
Copy Code button
| Rule | Limit |
|---|---|
| Max count | 1 per template |
| Code max length | 15 characters |
Button ordering
If you mix Quick Reply buttons with other button types (URL, Phone, Copy Code), all Quick Reply buttons must be grouped together.
Button text must be unique across the template — no two buttons can have the same label.
Authentication templates
Authentication templates have additional restrictions:
| Rule | Detail |
|---|---|
| No URLs | Cannot include URLs in the content or parameters |
| No media | Cannot use media headers |
| No emojis | Cannot include emojis in the content |
| OTP code max length | 15 characters |
| Code expiration | 1–90 minutes (code_expiration_minutes) |
| Security recommendation | Optional flag to show a security message |
Template lifecycle
After you submit a template, it goes through Meta's review process.
| Status | Can send? | Can edit? | Notes |
|---|---|---|---|
| Pending | No | No | Review typically takes less than 48 hours |
| Approved | Yes | Yes (1/day, 10/month) | Can appeal category within 60 days |
| Rejected | No | Yes (edit and resubmit) | 30-day block on reusing the same name |
| In Appeal | No | No | Waiting for Meta's review |
| Paused | No | Yes | Low quality score — edit to improve |
| Disabled | No | No | Too many pauses — create a new template |
Account limits
| Limit | Value |
|---|---|
| Templates per WhatsApp Business Account | 250 |
| Templates created per hour | 100 |
| Template edits | 1 per day, 10 per month |
Content policy
Meta rejects templates containing content in these categories:
- Adult or sexually suggestive content
- Alcohol sales
- Drugs (prescription, recreational, marijuana)
- Gambling (casinos, poker, sports betting)
- Healthcare products (medical devices, nicotine cessation)
- Illegal products or services
- Misleading claims (MLM, "get rich quick", binary options)
- COVID-19 vaccine or pandemic marketing
- Unsubstantiated financial claims
- Comparative or superlative claims without proof
wa.meorwhatsapp.comlinks in call-to-action buttons
Common rejection reasons
If your template is rejected, check for these issues:
| Problem | Fix |
|---|---|
| Character limit exceeded | Check header (60), body (1,024), footer (60), button text (25) |
| Invalid variable format | Use {{1}}, {{2}} — not {{name}} or {{order}} |
| Leading or trailing variable | Add static text before and after your variables |
| Too many variables, not enough text | Add more static content to improve the variable-to-text ratio |
| Wrong category | Make sure your content matches the declared category |
| URL contains shortener | Use full URLs instead of bit.ly, tinyurl, etc. |
| Generic template name | Use descriptive names like order_shipped instead of test |
| Parameter contains URL | Move URLs to a URL button instead of putting them in variable values |
| Promotional content in Utility | Use Marketing category for promotional messages |
| Missing opt-out for Marketing | Include an unsubscribe or opt-out option |
Common error codes
These error codes may appear when creating or sending templates:
| Code | Meaning |
|---|---|
2388019 | Template limit (250) exceeded — delete unused templates |
2388040 | Character limit exceeded |
2388047 | Header format invalid |
2388072 | Body format invalid |
2388073 | Footer format invalid |
2388293 | Variable-to-text ratio exceeded |
2388299 | Leading or trailing variable |
131008 | Parameter value contains a URL — move to button |
131047 | Outside 24-hour window — use a template message |
132000 | Parameter count mismatch |
132001 | Template does not exist — check name and language |
132015 | Template is paused — edit to improve quality |
132016 | Template disabled — create a new one |