“Dynamic” is not a separate template type. A dynamic template is simply a regular WhatsApp template that uses variable placeholders (
{{1}}, {{2}}, …). It lives in the same Templates list, uses the same builder, and goes through the exact same Meta approval process as any other template.If a template contains at least one {{n}} placeholder, the Xobito UI labels it “dynamic”. If it has none, it’s labelled “static”. That’s the entire distinction.{{1}}, {{2}}, {{3}} — that Xobito replaces with real values when the message is sent. Internally, Xobito stores a body_params_count on each template: any value greater than zero means the template has variables and the UI calls it “dynamic”.

Why variables matter
One template, many personalised messages. Without variables:- You would need a separate template for every recipient — impractical.
- Your messages would say “Hi Customer” instead of “Hi Alex”.
- You could not reference order numbers, dates, or account details.
Variable syntax
Xobito template variables use double-brace numbered placeholders:- Double braces on each side.
- Digits only — no names, no spaces.
- Start at
{{1}}and number sequentially.
How variables work
Inside the body (and in text headers), you insert numbered placeholders wherever a value should be filled in:{{n}} is replaced at send time. For a contact named Alex with order A1042 arriving Friday:
Variables must be numbered sequentially starting at
{{1}}. Skipping numbers ({{1}} then {{3}}) will be rejected by Meta.Where variables can appear
| Template part | Variables allowed |
|---|---|
| Text header | Yes — up to 1 variable |
| Body | Yes — typically 1 to several |
| Footer | No |
| Media header | No (the sample file is separate) |
| Quick-reply button label | No |
Example values at creation time
When you create a template with variables, you must supply a sample value for each one. Meta reviewers use these to see what a real message will look like.| Variable | Example value |
|---|---|
{{1}} | Alex |
{{2}} | A1042 |
{{3}} | Friday |
body_variable_value, and (if you have a text header) header variable example values are stored in header_variable_value.
How values get filled in at send time
In a campaign
When you set up a campaign that uses a dynamic template, Xobito asks you to provide values for each variable. These are saved with the campaign asheader_params, body_params, and footer_params JSON arrays — and applied to every message the campaign sends.
In a CSV campaign
For a CSV-driven campaign, you upload a spreadsheet with one row per recipient. The CSV columns supply the variable values on a per-row basis, so every recipient can get different values. Example CSV:In live chat
When you send a template in a chat, Xobito asks you to fill in the values right there — one-off per message.Creating a template with variables
You don’t create “dynamic templates” in a separate place — you use the normal template builder and add{{n}} placeholders wherever you want personalisation.
Open the template builder
Templates → Add Template. See Create a Template for the full walkthrough.
Write the body with variables
Insert
{{1}}, {{2}}, etc. wherever you want a personalised value. Numbers must be sequential starting at {{1}}. The moment you add one, the template is considered “dynamic”.Save and wait for approval
Submission sends the template to Meta. The status moves to PENDING, then APPROVED or REJECTED — same flow as any other template.
Previewing before you send
Variables in URL buttons
If you use URL buttons that include a variable (for examplehttps://yoursite.com/receipt/{{1}}), you supply the value at send time, the same way as body variables. See Variables & Media for details on button availability.
Rules and limits
| Rule | Detail |
|---|---|
| Variable format | Double braces around a digit: {{1}}, {{2}} |
| Numbering | Sequential, starts at {{1}}, no gaps |
| Sample required | Every variable must have a sample value at creation time |
| Body start/end | Meta often rejects templates that begin or end with a bare variable — wrap them in text |
| No nested braces | {{{{1}}}} is not valid |
Best practices
Keep variables short and specific
Keep variables short and specific
{{1}} for a first name, {{2}} for an order number. Not for an entire sentence — Meta rejects those as “meaningless placeholder”.Use realistic sample values
Use realistic sample values
Meta reviewers look at examples. “Alex” and “A1042” look legitimate. “xxx” and “test” look like you’re gaming the system.
Think about empty values
Think about empty values
Decide what to do when a contact has no value for a variable. Either skip that recipient or provide a campaign-level fallback.
Preview every campaign
Preview every campaign
Before a 10,000-recipient send, preview at least three real recipients. Catch formatting issues before they go live.
Number carefully
Number carefully
If you remove a middle variable like
{{2}}, you must renumber the rest so the sequence is {{1}}, {{2}}, {{3}} without gaps.Troubleshooting
Template rejected for 'meaningless variable'
Template rejected for 'meaningless variable'
Meta thinks
{{1}} is being used as a placeholder for vague or large content. Shorten the variable — a name, a number, a date. Use fixed text for bulk copy.Variable shows as {{1}} in the actual message
Variable shows as {{1}} in the actual message
Either the variable wasn’t supplied at send time, or the source value is empty. Check the campaign setup and the recipient’s record.
Template rejected with 'variable sequence wrong'
Template rejected with 'variable sequence wrong'
Variables must be numbered 1, 2, 3… with no gaps. If you removed
{{2}} but kept {{3}}, renumber.Only some recipients got the message
Only some recipients got the message
Recipients with missing values may have been skipped. See the campaign log for per-recipient details.
Next steps
Variables & media
Deep dive into headers and media uploads.
Custom fields
Store the data you’ll use as variable values.
Create a campaign
Send your dynamic template to a group.
Meta approval
Avoid rejection with our full guide.