On this page

A WhatsApp template in VGraple CRM is assembled from up to six parts: header, body, footer, buttons, and optionally a carousel or a limited-time offer, each with its own rules Meta enforces at review. This article covers what each component is, what it can and cannot contain, and where the builder blocks a combination Meta itself does not allow.
Builder components: first 5 of 7 steps
- 1Choose a header, or none
- 2Write the body
- 3Add a footer, if useful
- 4Add buttons
- 5Or switch on Carousel
Before you start
- Open the builder from Templates, then New Template, or start from a gallery template and edit its components from there.
- Authentication-category templates use a different, much simpler builder than every other category, described in its own section below.
- Carousel and limited-time offer are opt-in toggles near the top of the form; the rest of the component list is not shown once either is switched on, since both have their own fixed shape.
Steps
- Choose a header, or none. The header type picker offers six options: None, Text, Image, Video, Document and Location. A text header holds up to 60 characters and at most one variable, with no line breaks and no bold or italic formatting. An image, video or document header requires uploading a file (see media headers and sample values) and cannot contain a variable, since a variable has nothing to substitute into a file. A location header is a fixed map pin with no configuration of its own beyond the type.

Write the body. This is the only required component besides a name and category. Use
{{1}},{{2}}and so on for variables, numbered in order starting from 1 with nothing skipped. The body has a 1,024-character limit and supports basic WhatsApp formatting (bold with asterisks, italic with underscores). See variables: rules, limits and best practices for the placement rules the validator checks.Add a footer, if useful. An optional line of static text up to 60 characters, shown in grey under the body on the customer's phone. A footer cannot contain a variable, since it is identical for every recipient by definition, and it cannot appear alongside a limited-time offer.
Add buttons. Choose from four types: Quick Reply (a tap-to-reply shortcut, up to 3 per template), Visit Website (opens a URL, up to 2 per template, and the destination path but not the domain may contain a variable), Call Phone Number (dials a fixed number, up to 2 per template) and Copy Offer Code (copies a coupon code to the clipboard, only 1 per template). Every button label must be unique and under 25 characters, and a template can carry up to 10 buttons in total.
Or switch on Carousel. Toggling "Carousel template (2-10 scrollable cards)" replaces the header, body-only view with a card builder. Every card needs the same header type across the whole carousel, its own body text up to 160 characters, and up to 2 buttons (Quick Reply, Visit Website or Call Phone Number) per card. The template still has one shared top-level body text shown above the cards.
Or switch on Limited-Time Offer. Available only for Marketing-category templates. Enter the coupon code and a countdown length; the builder automatically adds a Copy Offer Code button first and requires a Visit Website button right after it, in the exact order Meta requires. Adding an offer removes any footer, since the two cannot coexist.
For Authentication, use the dedicated builder. Selecting the Authentication category replaces the whole form above with four settings: whether to add Meta's standard security-recommendation sentence, the code's expiry in minutes (1 to 90), the OTP button type (Copy Code, One-Tap or Zero-Tap), and for One-Tap or Zero-Tap, the Android app's package name and signature hash so WhatsApp can hand the code directly to your app. There is no body text field, because Meta supplies the wording for this category.
What you will see
A live phone preview on the right of the builder updates as you type, showing the header, body with sample values substituted, footer and buttons the way a customer's phone will render them. The pre-submission risk score (covered in what each validator message means) sits below the preview and recalculates on every change.
Settings and options
| Component | Limits | Notes |
|---|---|---|
| Text header | 60 characters, at most 1 variable | No line breaks, no bold or italic formatting |
| Image / video / document header | 5 MB (image), 16 MB (video), 100 MB (document) | JPEG or PNG images; MP4 or 3GPP video; PDF documents. No variable |
| Body | 1,024 characters, up to 10 variables | Required for every category except Authentication |
| Footer | 60 characters | No variables; cannot combine with a limited-time offer |
| Buttons | Up to 10 total; 3 Quick Reply, 2 Visit Website, 2 Call Phone Number, 1 Copy Offer Code | Every label unique, 25 characters max |
| Carousel | 2 to 10 cards, up to 2 buttons per card | All cards share one header type; card body up to 160 characters |
| Limited-time offer | Coupon code plus expiry, Marketing category only | Requires a Visit Website button; cannot combine with a footer |
| Authentication | Fixed layout; expiry 1-90 minutes | No body, header, footer or custom buttons of your own |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| "A media header carries a file, not text, so it cannot contain a variable" | A variable placeholder was typed into an image, video or document header field | Remove the variable; media headers cannot substitute values |
| "Footers are identical for every recipient, so they cannot contain variables" | A {{n}} placeholder was added to the footer | Move any personalisation into the body instead |
| "A footer cannot sit next to a limited-time offer" | Both a footer and an offer are set on the same template | Remove the footer; the offer strip takes that space in the bubble |
| "COPY_CODE is required at index 0" from Meta on submission | A limited-time offer's buttons were reordered manually so the code button is not first | Let the builder manage the offer's button order; it places the code button first and the URL button second automatically |
| "All carousel cards must use the same header type" | One card uses an image header while another uses video, for example | Set every card to the same header type before submitting |
| Header formatting error on a text header | A line break or bold/italic markup was used in the header field | Headers are plain text only, one line, with no formatting |
Related reading
Once the components are built, run them through what every validator message means before submitting, and see media headers and sample values for the upload flow behind image, video and document headers.