Writing an order confirmation template Meta will approve
The rules are not obvious and the rejection messages are terse. Here is what Meta actually checks, why most first submissions fail, and what the working version looks like.
{{1}}, {{2}} with no gaps, and give exactly one example value per distinct number, not per occurrence. Pick a language code from Meta's list; Darija is not on it, so Darija goes inside an Arabic template.Category first: utility, not marketing
Meta sorts templates into utility, marketing and authentication, and the choice decides what consent you need before you may send.
A utility message follows from something the customer did — they placed an order, so telling them about that order is expected. The purchase is the consent.
A marketing message needs its own, separately recorded permission. And here is the trap that costs numbers: the fact that a customer once messaged you is not marketing consent. Systems that treat any inbound message as blanket permission end up promoting to everyone who ever asked a question, which is the fastest known route to a blocked number.
So keep the confirmation strictly transactional. The moment you add a discount code to it, it is a marketing template, and it needs marketing consent.
Variables: the two rejections everybody hits
Placeholders are numbered {{1}}, {{2}}, {{3}}, and Meta substitutes them by position. Two rules follow, and breaking either gets the submission bounced:
- One example per distinct number, not per occurrence. A confirmation that greets the customer at the top and thanks them by name at the bottom uses
{{1}}twice — that is still one variable and one example value. Sending two produces an example-count mismatch. - No gaps in the sequence. If your body uses
{{1}}and{{3}}, the submission fails. The fix is to renumber to the smallest free integer, not to add the next one above the highest.
CreaScale counts variables exactly the way Meta does, in the editor, before you submit — which is the difference between a template approved on the first try and three rejections in a row.
Language codes, and the Darija question
A template is registered against one language code, and Meta accepts about thirty. Your store may need several: one approved variant per language you sell in.
Moroccan Darija is not one of the codes. This is the single most common blocker for Moroccan sellers, and the answer is not to give up on Darija — it is to write the Darija text inside a template registered as ar. The customer reads Darija; Meta sees a valid Arabic template. The same applies to other dialects without their own code.
Which variant a given buyer receives is then resolved per recipient: an Arabic-script name selects Arabic, then the locale the store recorded, then the destination country, then your store default.
What a working confirmation contains
Keep it factual, keep it short, and make every claim verifiable from the order:
- who is writing — your business name, so the message is not mistaken for a scam;
- the order reference, so the customer can match it to what they did;
- what was ordered and the total, in the order's own currency;
- the delivery address, which is what turns the message into a checkpoint rather than a receipt;
- one clear thing to do if something is wrong — replying is enough, and their reply opens a free 24-hour window in which you can fix it in plain text.
What to leave out: discount codes, upsells, star ratings, urgency. Each one converts a utility template into a marketing template and changes the consent you need.
After approval: the checks that still apply
An approved template is permission to send, not an obligation. Before each message goes out, CreaScale verifies that the merchant switch is on, that the template is still in the approved state, that the category matches the consent on file, that the contact is not already inside an open 24-hour window where a paid template would be wasted, and that neither the daily nor the monthly cap has been reached. A contact that fails any of these is skipped rather than messaged.
Frequently asked questions
How long does Meta take to approve a template?
Usually minutes to a few hours for a clean utility template. Rejections are almost always structural — wrong category, a variable-numbering gap, or a mismatched example count — rather than editorial.
Can I put a discount code in the order confirmation?
You can, but it stops being a utility template. It becomes marketing, and marketing requires a separate recorded opt-in from that customer. Keeping the confirmation purely transactional is what keeps it sendable to every buyer.
Do I need a separate template per language?
Yes. One approved variant per language code you sell in. CreaScale then picks the right variant per recipient rather than per store.
Why was my template rejected for example values?
Almost certainly because a variable appears more than once in the body and you supplied one example per occurrence. Meta wants one example per distinct number.
How many templates do I get?
One on the free plan, up to three on Starter, and unlimited from Pro upward. Above the cap the server declines the creation rather than silently ignoring it.
Confirm your COD orders on WhatsApp, automatically
Connect your store once. Every new order triggers an approved WhatsApp template in your customer’s own language — confirmation, then shipping update, then follow-up. You type nothing.
Start free — no card