Create and approve a WhatsApp message template
Every business-initiated WhatsApp conversation starts with a template Meta has reviewed and approved. This guide walks the full task — drafting, submitting, tracking, and resubmitting after a rejection. If you are still connecting the account itself, do the WABA setup first, then come back here. The concept page explains the lifecycle model this guide executes; the troubleshooting page covers templates stuck at pending and reclassifications.Why templates exist
Two rules shape everything on WhatsApp. Meta only lets a business start a conversation with a pre-approved template — an order confirmation, a one-time passcode, a shipping update. When the customer replies, a 24-hour service window opens and free-form messages (text, media, interactive buttons) are allowed without a template. When the window closes, you are back to templates only. The 24-hour window guide covers the full model. Because every cold-open send depends on one, template approval is the gate for the rest of your WhatsApp setup — campaigns, flows, and inbox workflows all reference approved templates.Step 1 — Pick the right category
The category you declare drives both what Meta charges and how strictly the review judges the content.
The honest-categorization rule: declare what the message actually is. A promotional body submitted as
utility to pay the cheaper rate is the single most common rejection — and a suspended WABA is the downstream risk if Meta reclassifies it anyway. Always send what the customer expects in the least expensive category the content genuinely qualifies for. The content policy lists what Meta rejects outright (gambling, adult content, illegal products, misleading claims).
Step 2 — Draft the body with variables
Body variables are numbered placeholders —{{1}}, {{2}}, {{3}} — filled at send time:
test or xxx:
Formatting rules Meta enforces:
- Variables cannot contain newlines, tabs, or more than four consecutive spaces at send time
- Formatting markers (
*bold*,_italic_,~strikethrough~) must be paired — an unmatched*is a formatting-error rejection - URLs are allowed in the body; avoid shortened/obfuscated links (bit.ly et al.) — they read as phishing to the reviewer
Step 3 — Header, footer, buttons
Optional components, configured per template.Header
- Text — a single line, up to 60 characters. It may contain one variable.
- Media — an image, video, or document (PDF). Always provide a sample file at submission so the reviewer can see it. Use a media header when the visual carries the message (a product photo, a boarding pass).
Footer
Static text, up to 60 characters, no variables. Use it for legal lines (“Reply STOP to opt out”) or a support hint.Buttons
Two types; do not mix them in one template.- Quick reply — up to 3 buttons. Each press sends a predefined text back to you and opens (or resets) the 24-hour window. Labels are ≤25 characters, plain text.
- Call-to-action — up to 2 buttons, each either URL (deep link, may use one variable suffix) or phone number (opens the dialer with a fixed number).
Step 4 — Languages
Each locale is a separate submission with its own status — approvingen does not approve es. Reuse the same template name across locales so a single send call resolves the right language via the language.code you pass:
language to the actual body language — a Spanish body under language=en is one of the most common rejections. Track each locale’s status independently: es can be approved while pt-BR is still pending.
Step 5 — Submit and track status
In the dashboard: Channels → WhatsApp → Templates → New Template. Filling the form creates the template indraft; pressing Submit moves it to pending. From there:
Most templates are approved within minutes; allow up to 24 hours. The full lifecycle model — including
active, paused, and archived states — is on the template lifecycle concept page. The API carries the same statuses; poll GET /api/v1/messages/templates?status=pending to watch open submissions.
Step 6 — Handle a rejection
A rejection is a do-over, not a dead end. Meta keeps the template name free for 30 days, so edit the rejected template and resubmit under the same name. Map the rejection to one of the usual causes:
Resubmission example. This body was rejected when submitted as
utility:
- Re-categorize. Resubmit the identical body as
marketing, sample{{1}}=Ada. Approved. - De-promote the copy. If it must stay
utility, remove the promotion:
Step 7 — Send with the approved template
Reference the approved template byname and language, and fill the variables through components:
- Interactive follow-ups — wrap the template send in a WhatsApp Flow (a form the recipient fills in-chat). See WhatsApp Flows.
- Broadcast to a segment — reference this template from a campaign. The campaign launch playbook covers opt-in checks, throttling, and delivery tracking.
- Free-form replies — once the recipient answers, drop the template and use the 24-hour window. See The 24-hour window.
Checklist before you submit
- Category declared honestly (marketing copy as
marketing) - Realistic sample value on every
{{n}}variable - Header ≤60 chars (text) or a sample media file attached
- Buttons: one type only, up to 3 quick-reply or up to 2 call-to-action
- Declared
languagematches the body language - No prohibited content per the content policy