Every message you start on the WhatsApp Business API needs a template approved by Meta. Approval usually takes minutes to a few hours, but a rejection can cost you a day. Here is what Meta is actually checking.
Pick the right category
Meta reviews the template against the category you chose, and a mismatch is the most common rejection.
- Utility — something the customer expects because of something they did: an order confirmation, a delivery update, an appointment reminder. No promotion inside it, at all.
- Marketing — anything with an offer, a new product, or a "come back". Costs more per conversation, and requires the customer's opt-in.
- Authentication — one-time passcodes only, with a fixed structure.
A utility template with "and get 10% off your next order" at the end is a marketing template, and Meta will either reject it or recategorise it — which changes what you pay.
Write variables that pass
Variables are written as {{1}}, {{2}} and so on, in order, with no gaps.
- Every variable needs a sample value when you submit. "Hi {{1}}" with the sample "Priya" passes; with no sample it does not.
- A variable cannot be the whole message, and a message cannot be mostly variables. Meta rejects templates it cannot read.
- Do not put a URL in a body variable. Use a URL button, which can carry a variable in the path.
The five causes of rejection
- Category mismatch, as above.
- Vague content — "Hello {{1}}, {{2}}" tells the reviewer nothing.
- Formatting — variables out of order, or a header image the wrong size.
- Prohibited content — anything on Meta's commerce policy list.
- A name that looks like spam — "offer_offer_1" invites a closer look than "order_confirmation".
When Meta says no
The rejection comes back with a reason. In Invite it appears on the template itself; edit, resubmit from the same screen, and the new version goes to review. If the reason is "category", change the category rather than the words — that is what the reviewer is telling you.
Before you send
Preview the template against a real contact so a missing first name does not produce "Hi ,". Set a fallback value for every variable. Then send it to yourself first.