How to Write WhatsApp Templates That Meta Actually Approves

Aug 23, 2026 | General

WhatsApp will not let you message a customer out of the blue with free-form copy. If the 24-hour chat window is closed, you need a message template, and Meta has to approve it first.

That review is why a campaign sits in draft while “Hi {{1}}, don’t miss this!!!” comes back rejected. Approval is not random. Reviewers (and Meta’s automated checks) look for a clear purpose, the right category, enough fixed text around every variable, and copy that would not look like spam or a scam on someone’s phone.

This guide is the version we wish every Samvad customer read before hitting submit.

What Meta is actually reviewing

When you submit a template, Meta runs automated checks and, when needed, a human review. A decision usually arrives within minutes, and can take up to 24 hours. You will see the result in WhatsApp Manager, in email to your Meta Business Suite admins, and in Samvad as the template status moves from pending to approved or rejected.

If it is approved, the status is Active — Quality pending. You can send it. Meta has not yet seen how customers react. Blocks, reports, and low read rates can still pause or disable that template later. Approval is permission to send. It is not a lifetime quality score.

If it is rejected, edit the copy and resubmit, or appeal with a sample of how the message will look with real values filled in. Appeals without samples are a waste of a day.

Pick the category the copy actually matches

This is the rejection we see most often, and it also changes what you pay. Meta has three categories:

CategoryUse it whenDo not use it when
UtilityThe customer already did something, and you are confirming or updating it: order placed, appointment booked, payment received, shipment moved.You are trying to sell, upsell, or re-engage a quiet list.
MarketingYou are promoting a product, offer, restock, webinar, or any “you might like this” message.You labelled it Utility to save money. Meta will recategorise or reject it.
AuthenticationYou are sending a one-time passcode with Meta’s OTP format.You stuffed a promo or a custom header into an OTP template.

A reliable test: if the customer did not just take an action, it is marketing.

“Your appointment is tomorrow at 4:00 PM” is Utility.
“Your appointment is tomorrow — book a second session at 20% off” is Marketing.

Put a discount, coupon, “limited time”, or “just for you” line into a Utility template and Meta will either move it to Marketing (higher conversation price) or reject it. Let Meta recategorise if it must (allow_category_change on). Fighting a recategorisation to keep Utility pricing is how templates die in review.

Write the body as if a stranger has to understand it

A reviewer never sees your CRM. They see the template plus the sample values you attach. If those two things do not make the message obvious, it looks like a blank cheque for spam.

Rejected (too vague)

Hi {{1}}, thanks. {{2}}

Approved pattern (purpose is obvious)

Hi {{1}}, your order {{2}} from {{3}} has been confirmed. We will share tracking details when it ships.

Rules that catch people:

  • Do not start or end the body with a variable. “{{1}}, your order is ready” and “Your OTP is {{1}}” (in a custom body) both fail the dangling-parameter check. Put words or punctuation on both sides.
  • Do not sit two variables next to each other. {{1}}{{2}} is invalid. Write {{1}} {{2}} or, better, {{1}} (order {{2}}).
  • Keep variables sequential. {{1}}, {{2}}, {{3}}. Skipping to {{4}} fails.
  • Most of the message should be fixed text. If half the body is placeholders, Meta cannot tell what you will send. Add context, or merge fields.
  • Give real sample values. “John”, “ORD-1842”, “12 Sep 2026” review cleanly. “test”, “xxx”, and “123” look like you are hiding the real message.
  • Match the language you selected. A template marked hi with English body copy, or a mix of languages with no declared language, is an easy reject.

Named parameters such as {{first_name}} are valid in Meta’s API. In Samvad we use positional variables ({{1}}, {{2}}) because that is what most WhatsApp setups still expect. Either format is fine. Empty examples are not.

Put offers and links where Meta expects them

Marketing templates get extra scrutiny on URLs and pressure copy.

  • Put the website in a Visit website button, not as a raw link in the body. Body URLs, especially shorteners (bit.ly, tinyurl), look like phishing.
  • Use https:// only. HTTP and wa.me / api.whatsapp.com links in buttons are common rejects.
  • The button should match the sentence. “Track your order” should not open the homepage.
  • Go easy on ALL CAPS, stacked emojis, and “ACT NOW / LAST CHANCE / ACCOUNT WILL BE SUSPENDED”. Reviewers treat that as spam or as threatening the customer.
  • Gambling, raffle, and “you have won” wording is a policy magnet even when you mean a harmless contest.

Utility templates should stay boring on purpose. Confirm the fact. Offer a Track or Call button. Save the sale for a Marketing template.

Stay off the policy landmines

Meta will reject the template, not just the send, if the copy asks for or threatens the wrong thing.

Do not ask customers to reply with full card numbers, bank account numbers, Aadhaar, PAN, passport numbers, or photos of those documents. Last four digits of a card or a masked account is the usual limit.

Do not threaten legal action, public shaming, or account deletion as a scare tactic. “Pay now or we will take legal action” is a reject. “Your invoice {{1}} is due on {{2}}. Pay here to avoid late fees” is a Utility reminder.

Also check WhatsApp’s Commerce Policy for your industry. If the product itself is restricted, no amount of polite copy will save the template.

Duplicates fail too. If the body and footer match an existing template, Meta rejects the new one (authentication templates are the exception). Change the wording, not only the name.

Two templates you can actually submit

These are written to pass the checks above. Swap the samples for your brand, keep the shape.

Utility — order confirmed

Name: order_confirmed
Category: Utility
Header (text): Order confirmed
Body:

Hi {{1}}, we have confirmed order {{2}} for {{3}}. You will get tracking on WhatsApp when it ships. Reply if you need to change the address.

Footer: Samvad Demo Store
Button: Track order → https://example.com/orders/{{1}}
Samples: Priya / ORD-1842 / 2x ceramic mugs

Why it works: the customer already ordered, the variables sit inside a full sentence, the link is a button, and there is no offer.

Marketing — restock with a real CTA

Name: restock_alert
Category: Marketing
Header (image): a real product photo, not a screenshot of a website
Body:

Hi {{1}}, {{2}} is back in stock. Order in the next 48 hours if you want this batch — sizes go quickly.

Footer: Opt out anytime in the chat
Buttons: Shop now → https://example.com/products/mugs · Talk to us (quick reply)

Why it works: it is honestly Marketing, the urgency is specific (“this batch”, “48 hours”) rather than shouty, and the URL is on a button to your own domain.

What not to submit

Hii {{1}}🎉🎉 YOUR ORDER {{2}} EXTRA 50% OFF CLICK http://bit.ly/x9k send Aadhaar to confirm

That single line fails category, dangling tone, URL, shortener, spam formatting, and sensitive-data policy at once.

A pre-submit checklist

Run this before you send anything to Meta:

  1. Category matches the sentence, not the price you wish you were paying.
  2. Body does not start or end with {{1}}.
  3. Variables are {{1}}, {{2}}, {{3}} with words between them.
  4. Every variable has a realistic sample.
  5. Language code matches the copy.
  6. Links live on HTTPS buttons, on your domain, with labels that match the body.
  7. No full IDs, card numbers, or threat language.
  8. Header, body, and footer are not a copy of another template.
  9. Name is lowercase with underscores only (order_confirmed, not Order-Confirmed).
  10. You have looked at the WhatsApp preview with samples filled in. If you would report that message, Meta’s reviewers will too.

In Samvad, the template builder blocks the mechanical mistakes (name format, missing samples, mixed button types, broken variable indexes) before the request reaches Meta. It cannot invent a lawful category for you. That part is the copy.

If it still comes back rejected

Read the reason in WhatsApp Manager or on the template in Samvad. Most “policy” rejects are category, vague variables, or a link. Fix the copy, attach samples again, and resubmit.

Appeal when you believe the category is correct and the copy is specific — for example a genuine shipping update that was tagged as promotional because it mentioned a product name. Include the sample. Empty appeals get the same answer as empty templates.

Do not spray ten near-duplicate templates at Meta after a reject. Too many rejects in a short window can pause new submissions for a day.

Approval is step one

Once the template is live, send it to people who expect it. A technically perfect Marketing template still earns Low quality if you blast a cold list. Low quality leads to pause, then disable. At that point the problem is audience and frequency, not commas.

Write a message a reviewer can understand, put it in the category it belongs in, and attach samples that look like a real customer’s phone. That is the entire game.