WhatsApp template rejected? Fixing Shopify order templates

Why Meta rejects WhatsApp message templates for Shopify order updates, what each rejection reason means, and how to write templates that pass and stay utility.

You write a perfectly reasonable order confirmation, submit it in WhatsApp Manager, and an hour later it says Rejected with a single word in capitals as the explanation. The message was polite. It mentioned nothing but the order. And you cannot send a single notification until a version of it is approved, because on the Cloud API the first message to a customer must always be a template that Meta has reviewed.

This article is about that review: what Meta is checking, what each rejection reason actually means, the mistakes that Shopify order templates make more often than other kinds, and how to write the four templates a store needs so they pass first time and keep their utility pricing. It draws on Meta's published template guidelines and on the templates merchants bring to Beacon Messenger support when something will not go through.

What the review is looking at

Meta's template guidelines say templates are reviewed automatically when created or edited, that review can take up to 24 hours, and that a template which is rejected, or whose status changes to anything other than Approved, cannot be sent. The review has three concerns and they are worth separating, because the fix for each is different.

  • Format. Do the variables follow the rules: numbered, sequential, not at the very start or end of the text, not next to each other, each with a sample value?
  • Policy. Does the content comply with WhatsApp's Business and Commerce policies, and does it avoid the patterns Meta associates with abuse or scams?
  • Category. Does the content match the category you chose? A template labelled utility that reads like a promotion, or a template whose language setting does not match its text, fails here.

The rejection reason tells you which of the three you hit. That is why the first rule of fixing a rejected template is to read the code rather than rewording at random and resubmitting, which burns a day per attempt.

The rejection reasons, translated

Meta's template rejection reasons and what to change
ReasonWhat it meansTypical Shopify cause
INVALID_FORMATA variable or element breaks the formatting rules.Body starts with {{1}} (the customer's name) or ends with a bare link variable; variables numbered 1, 2, 4; two variables with only a space between them.
TAG_CONTENT_MISMATCHThe category or the language does not match the content.A utility template that includes a discount code or “shop again”; a template set to English whose text is in Spanish.
PROMOTIONALMarketing wording in a utility or authentication template.An order confirmation that ends with “Use WELCOME10 on your next order.”
SCAMThe text resembles phishing or fraud patterns.Urgent payment language, a shortened link, or asking the customer to confirm account details.
ABUSIVE_CONTENTThreatening, shaming or harassing tone.Cash-on-delivery reminders phrased as consequences (“your order will be blacklisted”).

Most rejections merchants bring us are INVALID_FORMAT, and almost none of them are about meaning. Because a variable can expand to anything, Meta will not let one sit at the very beginning or end of the message, where it could turn the whole text into something else. “{{1}}, your order is confirmed” fails. “Hi {{1}}, your order is confirmed.” passes. The same logic forbids two variables side by side, since “{{1}} {{2}}” is effectively one unbounded variable.

Why Shopify order templates trip over format rules

Order messages are mostly variables. Name, order number, total, tracking number, tracking link: it is natural to write them as a list of placeholders with a word or two between, and that is exactly the shape the format check dislikes. The fix is to give every variable a sentence to live in.

  1. Open with fixed text: “Hi {{1}}, thanks for your order.” rather than “{{1}} thanks for your order”.
  2. Close with fixed text too. If the last thing you want is a link, put a full stop after it: “Track it here: {{3}}.” A button is better still; a URL button carries the link outside the body, so the body can end on words.
  3. Number variables in the order they appear and do not skip. If you delete a variable while editing, renumber the rest.
  4. Separate variables with real words. “Order {{2}} for {{3}}” is fine; “{{2}} {{3}}” is not.
  5. Fill in the sample values with what a real message would contain. A sample of “#1043” for an order number and “$84.00” for a total lets the reviewer see the message a customer will see; a sample of “x” gives it nothing to judge and is a common cause of both format and vagueness rejections.

Beacon Messenger's automations map each numbered variable to a Shopify merge field after approval, so the template body itself should not contain field names. Write {{1}}, {{2}}, {{3}} in Meta; map them to customer_first_name, order_number and order_total in the app. The merge field list is per trigger: shipping updates get tracking_number, tracking_company and tracking_url, abandoned checkouts get items_summary and checkout_url, and the confirmation and cash-on-delivery templates get the order fields. Our order notifications setup guide walks through the mapping screen.

Keeping the template utility

Category is not just a review question; it is a pricing one. Utility templates are billed at a lower rate than marketing ones, and since July 2025 a utility template sent inside an open 24-hour service window is free. Meta's template categorization guidelines say a utility template must be non-promotional, with no persuasive intent, and must be specific to a transaction the customer already has: their order, their account, their delivery. One sentence of upsell in an otherwise transactional message is enough to make the whole template marketing, and Meta's pricing documentation puts the burden on the business to review the category assigned to each approved template, because the category at the time of sending is what you are billed for.

The safe test is to ask, for each sentence, whether it is about this order or about a future one. “Your order #1043 has shipped” is about this order. “Don't forget our autumn collection” is about a future one, and it belongs in a separate marketing template that Beacon Messenger will only send to customers who opted in. The app enforces that split at send time: the marketing trigger checks consent and logs a skip instead of sending when the shopper never agreed, while the utility triggers do not require it. If the two kinds of content are mixed in one template, you lose the distinction, and with it the cheaper rate. The October 2026 changes make that gap wider, as covered in our pricing change post.

The four templates a store needs, written to pass

These are shapes, not scripts; put your own voice in. Each one starts and ends with fixed text, keeps variables apart, and says nothing about anything except the transaction.

  • Order confirmation (utility): “Hi {{1}}, thanks for your order {{2}} from {{3}}. Your total is {{4}}. We'll message you when it ships.” Button: View order → order status URL.
  • Shipping update (utility): “Hi {{1}}, your order {{2}} is on its way with {{3}}. Tracking number: {{4}}. Reply here if anything looks off.” Button: Track package → tracking URL.
  • Cash-on-delivery confirmation (utility): “Hi {{1}}, please confirm your cash-on-delivery order {{2}} for {{3}} so we can dispatch it. Reply YES to confirm or NO to cancel.” No penalties, no capitals, no deadlines phrased as threats.
  • Abandoned checkout (marketing): “Hi {{1}}, you left {{2}} in your basket at {{3}}. Your checkout is saved if you'd like to finish.” Button: Complete checkout. This is marketing by Meta's definition whatever you call it, so submit it as marketing and let the consent check do its job.

When the template was approved and then stopped working

A template's status is not permanent. Meta can pause a template whose messages customers keep blocking or reporting, and an edit puts an approved template back into review. Beacon Messenger refreshes the template list from your WhatsApp Business Account and only offers approved templates in the automation picker; if the template an automation points at is no longer there, the app records the event in the message log with the reason template_not_found rather than attempting a send that Meta would refuse. So the symptom of a paused or re-reviewed template is a run of skipped rows for one trigger, and the fix is in WhatsApp Manager, not in the store.

If you need to resubmit, note that Meta will not let a rejected template's name be reused immediately, so give the fixed version a new name (order_confirmation_v2 is fine) and repoint the automation once it is approved. The delivery verification guide explains how to read the log to tell a template problem from a phone number or consent problem.

Frequently asked questions

How long does WhatsApp template approval take?

Meta's documentation says review is automatic and can take up to 24 hours. In practice straightforward utility templates are often approved within minutes, but plan for a day, and do not schedule a launch that depends on a template that is still in review.

Why was my WhatsApp order confirmation template rejected as INVALID_FORMAT?

Almost always because a variable sits at the very start or end of the body, two variables are adjacent, the numbering skips, or the sample values are missing or meaningless. Start and end with fixed text, keep variables apart with words, number them in order and give each a realistic sample.

Can I put a discount code in a utility template?

No. Any promotional content makes the template marketing under Meta's categorization guidelines, and a utility template that contains it is rejected as TAG_CONTENT_MISMATCH or PROMOTIONAL, or recategorised later. Keep the offer in a separate marketing template that is only sent to customers who opted in.

Does Beacon Messenger create the templates for me?

No. Templates belong to your WhatsApp Business Account and are created and reviewed in Meta's WhatsApp Manager. Beacon Messenger syncs the approved list, lets you pick one per trigger, maps its variables to Shopify order fields and sends it, logging every send, delivery and skip.

What happens to my Shopify notifications if a template is paused by Meta?

Sends for that trigger are skipped and logged as template_not_found until an approved template is selected again. Fix or replace the template in WhatsApp Manager, wait for approval, then choose it in the automation. Nothing is queued in the meantime, so customers do not receive a burst of old messages afterwards.

More guides