Build a message template, add variables and buttons, and submit it to Meta for approval — then track, sync, and fix rejections.

WhatsApp templates are messages pre-approved by Meta that you can send to customers outside the free-reply window. From the /templates page you create your templates, preview them, submit them to Meta for review, and track their status — all in one place.
The page lists your existing templates in a table with status filter pills above it, and opens a two-column Create/Edit modal: the form on one side, and a live WhatsApp-style preview on the other that updates as you type.
Access: The page is customer-facing, but it shows templates for your currently active WhatsApp account only; if you have no active WhatsApp account, no templates will appear. Syncing with Meta also requires a business account id configured in settings first.
Above the table are filter pills that show templates by status, each with a count, plus an "All" option. The possible statuses:
| Status | Meaning |
|---|---|
DRAFT |
Saved locally only, not yet sent to Meta |
PENDING |
Sent to Meta and currently under review |
APPROVED |
Approved by Meta and ready to use |
REJECTED |
Rejected by Meta (rejection reason shown) |
PAUSED |
Temporarily paused by Meta |
DISABLED |
Disabled by Meta |
Editing is available only for templates in DRAFT or REJECTED status; approved templates cannot be edited.
Click Create new template to open the Create modal. The form is split into the following fields:
| Field | Required? | Rules |
|---|---|---|
| Template name | Yes | The template's machine name. Auto-lowercased with spaces replaced by underscores on submit; must match ^[a-z0-9_]+$ (up to 512 characters). Example: welcome_message. |
| Language | Yes | The template language. Options: ar (Arabic, default), en, en_US, en_GB. |
| Category | Yes | Meta category: MARKETING (default), UTILITY, or AUTHENTICATION. Choosing AUTHENTICATION automatically adds a Copy code button and disables the opt-out button. |
| Header | Optional | Toggled by a checkbox — see details below. |
| Body | Yes | The message text, up to 1024 characters, supporting {{N}} variables — see details below. |
| Footer | Optional | Toggled by a checkbox; free text limited to 60 characters. |
| Buttons | Optional | Toggled by a checkbox; up to 3 buttons — see details below. |
When the header is enabled, you pick its format from a list: TEXT, IMAGE, VIDEO, or DOCUMENT.
image/jpeg, image/png (recommended 1200×628, aspect ratio 1.91:1).video/mp4, video/3gpp.application/pdf.The body text is required, with a maximum of 1024 characters. You insert {{N}} variables via the "Insert variable" picker, which is mapped to a catalog of data sources; the groups shown by default are contact, business, and custom. Each variable needs a sample value to show Meta what it will look like.
The body cannot start or end with a variable; a variable must be surrounded by text.
When buttons are enabled you can add up to 3 buttons total, across four types each with its own limit:
| Type | Max | Notes |
|---|---|---|
QUICK_REPLY |
10 | — |
URL |
2 | Must start with http:// or https://; supports {{1}} with an example |
PHONE_NUMBER |
1 | + followed by digits (6 to 15) |
COPY_CODE |
1 | — |
Button text is limited to 20 characters, and two buttons cannot share the same text. To move faster, presets are available: yes/no, visit site, order tracking, and auth.
For MARKETING templates there is a checkbox that automatically appends an opt-out quick-reply button labeled "Stop promotions" (Arabic templates get the Arabic equivalent automatically). The checkbox is disabled and auto-checked if you have already added a manual opt-out button. An opt-out button is required when submitting a marketing template for approval.
At the bottom of the form is the "Submit for Meta approval" checkbox — it decides the template's fate:
DRAFT only and is not sent to Meta. Good for finishing later.PENDING (or whatever Meta returns). This is the core "get approved" action.Once submitted, the template stays PENDING until Meta decides: APPROVED or REJECTED.
On rejection, the view modal shows the rejection reason (rejected_reason) in a red banner explaining why Meta rejected the template. You can then edit the rejected template and resubmit it (editing is available for DRAFT and REJECTED only). Resubmitting an existing template deletes the old Meta template and recreates it.
Syncing pulls the status and rejection reason from Meta into the database:
meta_id, i.e. it has actually been sent to Meta).Remember that syncing all templates requires a business account id configured in settings first.
From the /templates page you can:
DRAFT status without sending to Meta.PENDING).DRAFT and REJECTED only.meta_id).We use essential cookies to run the site. With your permission we also measure usage and ad performance. You can change this anytime. Privacy policy