
Your marketing team submitted 14 templates on Wednesday. Six utility, eight marketing. Three marketing templates came back rejected on Friday afternoon — two days before the Diwali campaign launch. You rewrote them over the weekend, resubmitted Sunday night. Monday morning, two are still pending. The campaign launches with 12 templates instead of 14, the missing two were the high-value SKUs, and the marketing team is furious at the messaging team for the rest of the week.
This happens every quarter at every enterprise WhatsApp operation in India that doesn't have a template playbook.
Most teams run 80-200 active templates. Every quarter, those templates need refreshes — seasonal language, new product names, updated pricing. If 15% fail on the first submission, that's 30 rejections to debug per quarter. Each one is a 24-48 hour resubmission cycle. Each one is engineering time, ops time, and a campaign that doesn't ship on schedule.
It gets worse the more it happens. Repeat rejections at the WhatsApp Business Account level signal poor template hygiene to Meta's review system. Future templates from that account face heavier scrutiny — even clean ones. The flag isn't visible. You just notice that templates that used to clear in 30 minutes now sit in review for 18 hours.
The templates below get approved on the first try. Not because they're clever. Because they follow the patterns Meta's classifier already trusts.
What the Classifier Is Actually Checking
Before the templates, a quick framework. Meta's review process — automated screening first, human review for edge cases — checks four things.
Category fit. Does the content match the category you submitted? Promotional language in a utility template is the most common failure mode. A utility template that says "Enjoy 10% off your next order" gets approved as marketing and billed at ₹0.88 per message instead of ₹0.13. That's a 7x cost increase you didn't ask for.
Single purpose. A receipt that also pitches a loyalty program. A shipping update that includes a discount code. The classifier reads the strongest signal in the body, and in a hybrid template, the strongest signal is always the promotional half. One job per template, every time.
Variable hygiene. Templates that are too generic — "Hi {{1}}, your {{2}} is ready" — get rejected because the classifier can't tell what the template is for. The transactional event has to live in the static text Meta reads, not buried inside variables.
Prohibited content. Pharma promotion, gambling, political content, and a few other restricted categories get rejected regardless of how cleanly they're written.
Get those four right and approval is mostly a formality.
A note before we start: Meta updates its template guidelines often — sometimes monthly. The patterns below reflect what's working as of mid-2026, but the specific phrasing that passes today may need a small tweak six months from now. Treat the principles as durable. Treat the exact wording as something to re-verify every time you submit a new batch.
A note before we start: Meta updates its template guidelines often — sometimes monthly. The patterns below reflect what's working as of mid-2026, but the specific phrasing that passes today may need a small tweak six months from now. Treat the principles as durable. Treat the exact wording as something to re-verify every time you submit a new batch.
Right now, every Indian D2C brand, fintech, edtech, and SaaS team is sending more WhatsApp templates than they did last year.
Order updates. Payment confirmations. OTPs. Appointment reminders. Refill nudges.
The volume keeps climbing because the channel works.
But what happens when half your templates come back rejected on a Friday afternoon, two days before a campaign launch? How do you tell a marketing team that their Diwali sale is delayed because Meta didn't like the word "exclusive"? And how do you build a template library that doesn't fall apart every time Meta updates its rules?
You stop writing for your customer and start writing for the classifier.
Before we get into the templates themselves, let's first understand why first-try approval matters so much.
The 50 templates, by industry
Each entry below shows the template body, the category it should be submitted under, the variables it uses, and a one-line note on what makes it pass.
Templates marked Utility go through Meta's transactional review. Templates marked Marketing require explicit user opt-in and pay the higher per-message rate. Templates marked Authentication are restricted to identity verification and follow stricter formatting rules — no URLs, no media, no emojis, parameters limited to 15 characters.
Every one of these templates is also available pre-built in Cheerio's template library. If you're already on Cheerio, you can deploy any of them in one click rather than retyping and resubmitting. The patterns are still useful to understand even if you never type a template yourself — knowing why something passes is what lets you write the next one.
E-commerce and retail (D2C) — 6 templates
D2C is the heaviest WhatsApp user in India. Most brands run 80% utility, 20% marketing. The discipline that wins here is keeping the order journey clean and the promotional content in a separate flow.
1. Order confirmation Category: Utility | Variables: {{customer_name}}, {{order_id}}, {{amount}}, {{delivery_date}}
Hi {{customer_name}}, your order #{{order_id}} for ₹{{amount}} is confirmed. Estimated delivery: {{delivery_date}}. You'll receive a tracking link once shipped.
Why this passes: No emotional framing. The transaction sits in the static text. Descriptive language, not persuasive.
2. Order shipped notification Category: Utility | Variables: {{order_id}}, {{carrier}}, {{tracking_id}}, {{eta}}
Your order #{{order_id}} has shipped via {{carrier}}. Tracking ID: {{tracking_id}}. Expected delivery: {{eta}}.
Why this passes: The carrier and tracking ID anchor the message in a real logistics event. No "great news," no "we're so excited."
3. Out for delivery Category: Utility | Variables: {{order_id}}, {{delivery_partner}}, {{delivery_window}}
Order #{{order_id}} is out for delivery with {{delivery_partner}} today. Expected window: {{delivery_window}}. Please ensure someone is available to receive it.
Why this passes: Reads like a logistics notification because it is one. The instruction at the end is functional, not promotional.
4. Delivered confirmation with feedback ask Category: Utility | Variables: {{order_id}}, {{customer_name}}
Order #{{order_id}} has been delivered. {{customer_name}}, please reply YES once received, or DELIVERY ISSUE if there's a problem.
Why this passes: The reply prompt is a service action, not an opt-in. It maps to the order, not to a future relationship.
5. Cart abandonment reminder Category: Marketing | Variables: {{customer_name}}, {{product_name}}, {{cart_link}}
Hi {{customer_name}}, you left {{product_name}} in your cart. Complete your purchase here: {{cart_link}}. Items in cart are reserved for 24 hours.
Why this passes: Submitted as marketing, which is what it is. No discount baked in. The 24-hour reservation gives it a transactional flavour without misclassifying.
6. Restock notification Category: Marketing | Variables: {{customer_name}}, {{product_name}}, {{product_link}}Hi {{customer_name}}, {{product_name}} is back in stock. You requested a notification when this item was available. View here: {{product_link}}.
Why this passes: The reference to the user's earlier request anchors the message. Cleanly submitted as marketing.
Financial services (BFSI) — 5 templates
BFSI runs almost entirely on utility and authentication. The discipline here is regulatory: every message has to map to a real account event, and language has to be neutral. Aspirational copy gets reclassified instantly.
7. Payment received Category: Utility | Variables: {{amount}}, {{date}}, {{reference_id}}, {{account_last4}}
Payment of ₹{{amount}} received on {{date}}. Reference: {{reference_id}}. Credited to account ending {{account_last4}}.
Why this passes: Specific, transactional, no relationship language.
8. EMI reminder Category: Utility | Variables: {{customer_name}}, {{emi_amount}}, {{due_date}}, {{loan_id}}
{{customer_name}}, your EMI of ₹{{emi_amount}} for loan {{loan_id}} is due on {{due_date}}. Auto-debit will be initiated on this date.
Why this passes: Maps to a known account, gives a clear date, no urgency language.
9. Loan disbursal confirmation Category: Utility | Variables: {{loan_id}}, {{amount}}, {{account_last4}}, {{disbursal_date}}
Loan {{loan_id}} of ₹{{amount}} has been disbursed to account ending {{account_last4}} on {{disbursal_date}}. View statement in your dashboard.
Why this passes: Every variable maps to a regulated event. The language matches how banks already communicate.
10. OTP for transaction verification Category: Authentication | Variables: {{otp}}, {{validity_minutes}}
{{otp}} is your verification code. Valid for {{validity_minutes}} minutes. Do not share this code with anyone, including bank representatives.
Why this passes: Authentication templates are the most restrictive. No URLs, no media, no emojis, parameters limited to 15 characters. This template has none of those, and the do-not-share line is standard guidance Meta accepts.
11. Card transaction alert Category: Utility | Variables: {{amount}}, {{merchant}}, {{card_last4}}, {{date_time}}
Transaction of ₹{{amount}} at {{merchant}} on card ending {{card_last4}} at {{date_time}}. Reply BLOCK if not authorised.
Why this passes: Real-time event, includes a service action ("Reply BLOCK"), no marketing intent anywhere.
Education (schools, coaching, online) — 5 templates
Edtech and schools use WhatsApp for class reminders, fee notices, and parent communication. The trap most edtech brands fall into is bundling course recommendations into utility templates. Don't.
12. Class reminder Category: Utility | Variables: {{student_name}}, {{class_name}}, {{date_time}}, {{join_link}}
Reminder: {{student_name}}'s {{class_name}} class is scheduled for {{date_time}}. Join link: {{join_link}}.
Why this passes: Specific to a class the student is enrolled in. The link is the join link, not a promo page.
13. Assignment submission confirmation Category: Utility | Variables: {{student_name}}, {{assignment_name}}, {{submitted_date}}, {{course_id}}
{{student_name}}, your submission for {{assignment_name}} ({{course_id}}) was received on {{submitted_date}}. Faculty will respond within 5 working days.
Why this passes: Confirms an action the student took. No upsell, no future-state language.
14. Fee due reminder Category: Utility | Variables: {{student_name}}, {{fee_amount}}, {{due_date}}, {{payment_link}}
{{student_name}}, school fees of ₹{{fee_amount}} for the current term are due by {{due_date}}. Pay here: {{payment_link}}.
Why this passes: Maps to an existing fee schedule. The payment link is the service action, not a promotion.
15. Result published notification Category: Utility | Variables: {{student_name}}, {{exam_name}}, {{result_link}}
{{student_name}}, your {{exam_name}} results have been published. View your scorecard here: {{result_link}}.
Why this passes: Specific to a real exam the student took. No "amazing news," no relationship framing.
16. Course launch announcement Category: Marketing | Variables: {{customer_name}}, {{course_name}}, {{start_date}}, {{enrol_link}}
Hi {{customer_name}}, our {{course_name}} cohort begins {{start_date}}. Enrolment is open until seats fill: {{enrol_link}}.
Why this passes: Submitted as marketing because it is. The "until seats fill" line is factual, not manufactured urgency, and it anchors the offer in a real event.
Healthcare and life sciences — 4 templates
Healthcare templates have to navigate Meta's restrictions on pharma promotion. Stick to appointments, results, and reminders — and avoid anything that sounds like a recommendation.
17. Appointment reminder Category: Utility | Variables: {{patient_name}}, {{doctor_name}}, {{date_time}}, {{clinic_address}}
Reminder: {{patient_name}}'s appointment with {{doctor_name}} is on {{date_time}} at {{clinic_address}}. Reply RESCHEDULE if you need to change.
Why this passes: Maps to a booked appointment. The reschedule action is functional.
18. Lab report ready Category: Utility | Variables: {{patient_name}}, {{test_name}}, {{report_link}}
{{patient_name}}, your {{test_name}} report is ready. Download here: {{report_link}}. Please consult your doctor for interpretation.
Why this passes: Specific test, specific patient, no promotional language. The doctor consultation note is medical guidance, not an upsell.
19. Prescription refill reminder Category: Utility | Variables: {{patient_name}}, {{prescription_id}}, {{refill_date}}
{{patient_name}}, your prescription {{prescription_id}} is due for refill on {{refill_date}}. Reply REFILL to confirm or visit your pharmacy.
Why this passes: Tied to an existing prescription. The reply action is functional. No drug names in the static text — those can trigger pharma-promotion flags.
20. Vaccination due reminder Category: Utility | Variables: {{patient_name}}, {{vaccine_name}}, {{due_date}}, {{booking_link}}
{{patient_name}}, your {{vaccine_name}} dose is due on {{due_date}}. Book your slot here: {{booking_link}}.
Why this passes: Public health notification, specific to a scheduled vaccine. The booking link is the service action.
Real estate (developers and brokers) — 4 templates
Real estate WhatsApp use cases are 70% appointment scheduling and 30% project updates. The classifier will flag anything that reads like a sales pitch on a project that isn't already being booked.
21. Site visit confirmation Category: Utility | Variables: {{customer_name}}, {{project_name}}, {{visit_date}}, {{site_address}}
{{customer_name}}, your site visit to {{project_name}} is confirmed for {{visit_date}}. Address: {{site_address}}. Reply RESCHEDULE if needed.
Why this passes: Confirms a scheduled visit. Functional reply option. No project-promotion language in the body.
22. Booking payment received Category: Utility | Variables: {{customer_name}}, {{unit_id}}, {{amount}}, {{payment_date}}
{{customer_name}}, your booking payment of ₹{{amount}} for unit {{unit_id}} was received on {{payment_date}}. Booking confirmation will be shared within 48 hours.
Why this passes: Maps to a real transaction. The 48-hour follow-up sets a service expectation.
23. Construction milestone update Category: Utility | Variables: {{customer_name}}, {{project_name}}, {{milestone}}, {{photo_link}}
{{customer_name}}, {{project_name}} has reached {{milestone}}. View progress photos: {{photo_link}}.
Why this passes: Tied to a customer's existing booking. The milestone is factual, not aspirational.
24. New project launch (existing customers) Category: Marketing | Variables: {{customer_name}}, {{project_name}}, {{location}}, {{brochure_link}}
Hi {{customer_name}}, our new project {{project_name}} in {{location}} is now open for bookings. Brochure: {{brochure_link}}.
Why this passes: Submitted as marketing. Sent to an opt-in audience of existing customers. Factual launch announcement, no urgency manufacturing.
Hospitality (hotels and F&B) — 4 templates
Hotels and restaurants run booking confirmations, table reminders, and check-in flows on WhatsApp. The trap is including loyalty program prompts inside booking confirmations.
25. Hotel booking confirmation Category: Utility | Variables: {{guest_name}}, {{check_in}}, {{check_out}}, {{booking_id}}, {{hotel_address}}
{{guest_name}}, your booking {{booking_id}} is confirmed. Check-in: {{check_in}}. Check-out: {{check_out}}. Address: {{hotel_address}}.
Why this passes: Every detail anchors to a real reservation. No upsell of room upgrades.
26. Restaurant reservation reminder Category: Utility | Variables: {{guest_name}}, {{restaurant_name}}, {{date_time}}, {{party_size}}
{{guest_name}}, your reservation at {{restaurant_name}} for {{party_size}} people is on {{date_time}}. Reply CANCEL if you can't make it.
Why this passes: Specific to a booking. The cancel action is functional courtesy, not engagement bait.
27. Pre-check-in form Category: Utility | Variables: {{guest_name}}, {{booking_id}}, {{form_link}}
{{guest_name}}, please complete pre-check-in for booking {{booking_id}} to skip the front desk: {{form_link}}.
Why this passes: Mapped to an existing booking. The benefit is operational, not promotional.
28. Order ready for pickup (F&B) Category: Utility | Variables: {{customer_name}}, {{order_id}}, {{pickup_location}}
{{customer_name}}, order #{{order_id}} is ready for pickup at {{pickup_location}}. Please show this message at the counter.
Why this passes: Real order, real location. Functional instruction at the end.
Technology (SaaS, IT, startups) — 4 templates
SaaS templates split between utility (account events, billing, password resets) and marketing (feature launches, webinars). Auth templates carry the OTP load.
29. Trial expiry reminder Category: Utility | Variables: {{customer_name}}, {{product_name}}, {{expiry_date}}, {{upgrade_link}}
{{customer_name}}, your {{product_name}} trial ends on {{expiry_date}}. Continue with a paid plan: {{upgrade_link}}.
Why this passes: Tied to an active trial. The upgrade link is informational — no "exclusive deal," no "special offer for you."
30. Subscription renewal confirmation Category: Utility | Variables: {{customer_name}}, {{plan_name}}, {{amount}}, {{next_billing_date}}
{{customer_name}}, your {{plan_name}} subscription has been renewed for ₹{{amount}}. Next billing: {{next_billing_date}}.
Why this passes: Real billing event. No upgrade pitch.
31. Login OTP Category: Authentication | Variables: {{otp}}, {{product_name}}
{{otp}} is your login code for {{product_name}}. Code expires in 5 minutes. Do not share with anyone.
Why this passes: Auth template formatting — no links, no emojis, OTP under 15 characters. Standard structure Meta's auth template library accepts.
32. Webinar registration confirmation Category: Utility | Variables: {{attendee_name}}, {{webinar_title}}, {{date_time}}, {{join_link}}
{{attendee_name}}, you're registered for {{webinar_title}} on {{date_time}}. Join link: {{join_link}}. Calendar invite to follow.
Why this passes: Confirms a registration the user submitted. Service-oriented, not promotional.
Travel and tourism — 3 templates
Travel templates work cleanly because the events are unambiguous: bookings, check-ins, schedule changes. Stay close to the booking and you'll pass.
33. Flight booking confirmation Category: Utility | Variables: {{passenger_name}}, {{pnr}}, {{flight_number}}, {{departure_time}}
{{passenger_name}}, your booking is confirmed. PNR: {{pnr}}. Flight {{flight_number}} departs at {{departure_time}}. Web check-in opens 48 hours before departure.
Why this passes: PNR + flight number anchor the message in airline systems. The check-in note is operational.
34. Schedule change alert Category: Utility | Variables: {{passenger_name}}, {{pnr}}, {{old_time}}, {{new_time}}, {{flight_number}}
{{passenger_name}}, flight {{flight_number}} (PNR {{pnr}}) has been rescheduled. New departure: {{new_time}} (was {{old_time}}). Reply HELP for assistance.
Why this passes: A real operational change with the old and new state spelled out. The HELP reply is functional.
35. Holiday package launch Category: Marketing | Variables: {{customer_name}}, {{destination}}, {{travel_dates}}, {{package_link}}
Hi {{customer_name}}, our {{destination}} package for {{travel_dates}} is now bookable. Package details and pricing: {{package_link}}.
Why this passes: Submitted as marketing. Specific destination, specific dates, no manufactured urgency.
Auto dealers — 3 templates
Auto dealer templates run service reminders, booking confirmations, and delivery notifications. Treat the vehicle as the transactional anchor and you'll pass cleanly.
36. Service appointment confirmation Category: Utility | Variables: {{customer_name}}, {{vehicle_number}}, {{service_date}}, {{service_centre}}
{{customer_name}}, your {{vehicle_number}} service is scheduled for {{service_date}} at {{service_centre}}. Reply RESCHEDULE if needed.
Why this passes: Vehicle number + service centre anchor the message. Functional reply.
37. Test drive booking confirmation Category: Utility | Variables: {{customer_name}}, {{model_name}}, {{date_time}}, {{showroom_address}}
{{customer_name}}, your test drive for the {{model_name}} is confirmed for {{date_time}} at {{showroom_address}}. Please carry a valid driving licence.
Why this passes: Confirms a booked test drive. The licence reminder is operational courtesy.
38. Vehicle delivery readiness Category: Utility | Variables: {{customer_name}}, {{model_name}}, {{vin_last6}}, {{delivery_date}}, {{showroom}}
{{customer_name}}, your {{model_name}} (VIN ending {{vin_last6}}) is ready for delivery on {{delivery_date}} at {{showroom}}. Please bring final payment confirmation.
Why this passes: Specific vehicle, specific delivery event. No upsell of accessories or service plans.
Manufacturing and industrial (OEMs) — 3 templates
B2B WhatsApp use cases are quieter but real — order confirmations to dealers, dispatch updates, payment notifications. The discipline is the same as D2C: keep it specific to the transaction.
39. Purchase order confirmation Category: Utility | Variables: {{dealer_name}}, {{po_number}}, {{order_value}}, {{dispatch_date}}
{{dealer_name}}, PO {{po_number}} for ₹{{order_value}} is confirmed. Expected dispatch: {{dispatch_date}}. Invoice will follow.
Why this passes: B2B transactional language, real PO reference, factual dispatch date.
40. Dispatch notification Category: Utility | Variables: {{po_number}}, {{transporter}}, {{lr_number}}, {{eta}}
PO {{po_number}} has been dispatched via {{transporter}}. LR number: {{lr_number}}. ETA: {{eta}}.
Why this passes: Logistics-grade detail. Reads like an operations alert because it is one.
41. Payment received against invoice Category: Utility | Variables: {{dealer_name}}, {{invoice_number}}, {{amount}}, {{payment_date}}
{{dealer_name}}, payment of ₹{{amount}} received against invoice {{invoice_number}} on {{payment_date}}. Updated statement available on request.
Why this passes: Maps to an existing invoice. Standard B2B language.
Salons and hair dressers — 3 templates
Salons live and die by appointment reminders. Keep them tied to the booking and the stylist.
42. Appointment booking confirmation Category: Utility | Variables: {{customer_name}}, {{service}}, {{stylist_name}}, {{date_time}}
{{customer_name}}, your {{service}} appointment with {{stylist_name}} is confirmed for {{date_time}}. Reply CANCEL or RESCHEDULE if needed.
Why this passes: Service + stylist + time anchors the message. Functional reply options.
43. Reminder 24 hours before appointment Category: Utility | Variables: {{customer_name}}, {{stylist_name}}, {{date_time}}, {{salon_address}}
{{customer_name}}, reminder: appointment with {{stylist_name}} tomorrow at {{date_time}}. Address: {{salon_address}}.
Why this passes: Maps to the existing booking. Useful reminder content, no upsell.
44. Loyalty milestone notification Category: Marketing | Variables: {{customer_name}}, {{visits_count}}, {{reward_link}}
Hi {{customer_name}}, you've completed {{visits_count}} visits with us. View your loyalty rewards: {{reward_link}}.
Why this passes: Submitted as marketing. Tied to actual visit history. The reward link is the offer, not buried in a utility template.
Gyms and yoga studios — 3 templates
Gym templates run on attendance tracking, class bookings, and renewals. Treat the membership as the transactional anchor.
45. Class booking confirmation Category: Utility | Variables: {{member_name}}, {{class_name}}, {{date_time}}, {{instructor}}
{{member_name}}, your spot in {{class_name}} on {{date_time}} with {{instructor}} is confirmed. Please arrive 10 minutes early.
Why this passes: Specific class, specific instructor, real booking event.
46. Membership renewal reminder Category: Utility | Variables: {{member_name}}, {{plan_name}}, {{expiry_date}}, {{renewal_link}}
{{member_name}}, your {{plan_name}} membership expires on {{expiry_date}}. Renew here: {{renewal_link}}.
Why this passes: Real membership event. No "don't lose your gains," no urgency language.
47. New batch announcement Category: Marketing | Variables: {{member_name}}, {{class_name}}, {{start_date}}, {{registration_link}}
Hi {{member_name}}, our new {{class_name}} batch begins {{start_date}}. Registration is open: {{registration_link}}.
Why this passes: Marketing template, submitted correctly. Specific class and start date anchor the offer.
Media, marketing and advertising — 2 templates
Agencies and publishers use WhatsApp mostly for client account events and content delivery.
48. Campaign report ready Category: Utility | Variables: {{client_name}}, {{campaign_name}}, {{report_link}}
{{client_name}}, your {{campaign_name}} weekly report is available. Download here: {{report_link}}.
Why this passes: Tied to an active client engagement. Functional delivery of a deliverable.
49. Invoice generated Category: Utility | Variables: {{client_name}}, {{invoice_number}}, {{amount}}, {{due_date}}
{{client_name}}, invoice {{invoice_number}} for ₹{{amount}} has been generated. Due date: {{due_date}}.
Why this passes: Standard invoicing language. No follow-up pitch.
Tailoring and custom apparel — 1 template
50. Order ready for fitting/pickup Category: Utility | Variables: {{customer_name}}, {{order_id}}, {{pickup_date}}, {{store_address}}
{{customer_name}}, your order #{{order_id}} is ready for {{pickup_date}}. Store: {{store_address}}. Please bring this confirmation.
Why this passes: Specific order, specific pickup event. Functional instruction.
The patterns that hold across all 50
Look across these templates and the same five moves keep showing up.
One purpose per template. None of the utility templates above try to upsell, cross-sell, or recommend.
The cart abandonment reminder doesn't include a discount. The shipping update doesn't pitch the next product. The salon reminder doesn't ask for a referral.
When you need to do those things — and you should — they go into separate marketing templates with their own opt-in.
The transactional event lives in the static text. "Your order #{{order_id}}" beats "Your order." "Flight {{flight_number}}" beats "Your flight."
The classifier needs to see the transactional anchor in the text it actually reads, not buried inside a variable. This is the single biggest reason that templates which look fine to a human get rejected by Meta's automated review.
Buttons stay functional. Track Order, View Invoice, Reschedule, Pay Now are utility-safe. Shop Now, Browse Collection, Learn More, Get Offer are marketing tells.
The button text is part of the template Meta reviews — treat it that way.
Language stays neutral. Notice that none of the templates use excited, thrilled, great news, don't miss, or exclusive. They describe what happened. They tell the user what to do next. That's it.
Strip the warmth, keep the information.
Reply prompts are service actions, not opt-in fishing. "Reply RESCHEDULE if needed" is a service action. "Reply YES to receive exclusive offers" is opt-in fishing for marketing consent, and the classifier catches it consistently.
If you need marketing opt-in, run it in a dedicated flow.
This is the pattern we keep seeing at Cheerio AI when we audit a new customer's template library — the brands that get approved the first time aren't writing better copy than the brands that don't. They're writing more boring copy, anchored in real transactional events, with promotional content kept out of the utility flow entirely.
When clean templates still get rejected
Even templates that follow every rule can fail review. The most common reasons aren't about content.
The first is over-generic variables. "Hi {{1}}, your {{2}} is ready" gives the classifier no context. The fix is to put the static text around the variables — "Hi {{customer_name}}, your {{order_type}} order is ready for pickup."
The second is prohibited industry content. Pharmacies promoting specific drugs, gambling references, political content, regulated financial products. These get rejected regardless of how cleanly they're written.
The third is inconsistent example values. When you submit a template, you provide example values for each variable. If your example values look promotional ("FLAT 50% OFF," "LIMITED TIME"), the template will be classified by what the examples imply, even if the live values look different.
The fourth is too many emojis or all-caps. One or two emojis in a marketing template is fine. Five emojis in a utility template reads as promotional. Headlines in ALL CAPS read as advertising.
If a clean template gets rejected, you have 60 days from the rejection date to request a review through Business Support Home. Quote Meta's guidelines, name the trigger event, and show how the body matches the category.
Most clean-pattern appeals succeed.
How Cheerio AI Makes This a Non-Problem
Cheerio AI builds template management into the workflow engine. All 50 templates above ship pre-built in Cheerio's template library, indexed by industry and use case — so your team deploys them in one click rather than retyping and resubmitting from scratch. The templates ship in the patterns Meta's classifier already trusts. Your team customises the variables to match your brand, rather than rebuilding the structure.
The natural-language workflow builder means your shipping confirmation flow and your discount campaign flow live in different paths from the moment they're built. No accidental bundling. No utility template carrying a promotional CTA because someone tried to save a step. The platform enforces the separation that Meta's classifier requires.
Because Cheerio orchestrates across WhatsApp, email, SMS, RCS, Instagram, and Messenger from one engine, promotional content that would contaminate a utility template gets routed to the appropriate marketing channel instead. The two paths never collide inside one template, which means the classifier never has to make the call.
And the integrations with Shopify, WooCommerce, payment gateways, and CRMs mean order numbers, payment IDs, PNRs, and invoice references flow into templates as real data — visible to the classifier in the static body text where it does the most good.
Templates are reusable assets you build once and ship hundreds of times. Getting the patterns right pays compound interest on every send.


