A WhatsApp abandoned cart recovery flow that actually earns money in India is usually three messages: one at about 45 minutes, one at 8 hours, one at roughly 22 hours, with the discount held back until the last one. That's the copy side, and it's the easy part. The hard part is that Meta classifies cart reminders as Marketing templates, which means you need real opt-in, you pay per message, and delivery is not guaranteed. Get the opt-in mechanics and template categories wrong and the flow either never gets approved or quietly torches your number's quality rating in the first fortnight.
Here's how we set these up for Indian D2C stores, including the bits the app dashboards don't tell you.
A cart reminder is a Marketing template. Stop trying to file it as Utility
Utility templates exist for transactions the customer has already committed to: order confirmed, payment received, shipment out for delivery, refund processed. An abandoned cart is, by definition, a transaction that did not happen. So it goes in the Marketing bucket.
We still see stores submit "Your order is waiting" as a Utility template to save on send cost. Two things happen. Either it gets rejected, or it gets approved and then re-categorised by Meta later, sometimes weeks in, which means your cost per send changes without anyone telling you. Marketing rates in India are among the cheapest in Meta's rate card, so the saving you're chasing is small and the risk of a category dispute mid-festive-season is not.
The billing model also changed. Meta moved away from bundling 24 hours of messages into one "conversation" charge and now bills per template message. Practical effect: every reminder in your sequence is a separate line item on the invoice, and adding a fourth message costs real money instead of riding free on an already-open conversation. Free-form replies inside an open 24-hour service window (when the customer messages you first) are a different matter and aren't billed as templates, which is why a flow that provokes a reply is cheaper to run than one that doesn't.
Opt-in is the part that gets stores restricted
Having a customer's phone number is not opt-in. In India this trips people up constantly, because checkout collects a mobile number by default and COD makes that number feel like an invitation. It isn't.
Meta's requirement is consent that names WhatsApp and names your business, collected in a place the customer can see. What we implement:
- An unchecked box at checkout with wording along the lines of "Send me order updates and offers on WhatsApp from [Brand]". Unchecked. Pre-ticked consent is where most complaints originate, and complaints are what move your quality rating.
- A second capture point that doesn't depend on checkout, because the customers you most want to reach never reached checkout. A click-to-WhatsApp button on PDPs, a WhatsApp widget on the cart drawer, or a click-to-WhatsApp ad. When the customer messages first, you get a 24-hour window and cleaner consent in one move.
- Storage of the consent record with timestamp and source. If Meta or a BSP asks why you messaged someone, "it was in the customer list" is not an answer.
One clarification worth having, because it comes up in nearly every kickoff call: WhatsApp templates do not go through DLT. DLT registration is TRAI's regime for SMS sender IDs and content templates on Indian telecom networks. WhatsApp Business Platform approval is entirely Meta's process. You will need DLT if you're also running transactional SMS as a fallback for non-WhatsApp numbers, and you should be, but they're separate pipelines with separate approval queues.
Getting templates approved without three rounds of rejection
Approval itself is usually fast, minutes to a couple of hours through most Indian BSPs. Rejections cluster around the same handful of causes, and they're all avoidable:
- A variable at the very start or very end of the body. "{{1}}, your cart is waiting" gets bounced. Put a word in front of it.
- Two variables next to each other. "{{1}} {{2}}" needs static text between them.
- Sample values that don't look like real data. If you pass "xyz" as the sample for a product name, the reviewer has no way to judge the message. Pass an actual product title and an actual cart URL.
- Body copy that promises something the template can't deliver. "Reply STOP to unsubscribe" is fine; "Click below for your free gift" with no gift logic behind it is not.
For the button, use a URL button with a dynamic suffix so one approved template serves every cart. The base URL is static and approved once; the suffix carries the cart or recovery path. On Shopify you can build a cart permalink in the form /cart/{variant_id}:{qty} with a discount parameter appended, which rebuilds the cart on tap even if the customer switched devices. Note the awkward case: cart permalinks don't reliably reconstruct subscription line items, bundle builders that write line item properties, or anything a third-party app injected at checkout. If your store sells those, you need the abandoned checkout recovery URL from the webhook instead, and your BSP or app has to support passing it through.
Approve a Hindi variant if a meaningful share of your traffic is Tier 2 and Tier 3. Each language is a separate template submission. Don't machine-translate and hope; a clumsy Hindi template gets blocked by customers faster than an English one.
Timing that respects the clock and the customer
Three sends, spaced so the last one still lands inside the day the customer was shopping:
- ~45 minutes. No offer. A nudge with the product name and the cart link. Plenty of abandonment in India is a UPI collect request that timed out or a bank OTP page that hung, and these people just need the link again.
- ~8 hours. Address the actual objection. Delivery timeline, COD availability, returns window, GST invoice for B2B buyers. Still no discount.
- ~22 hours. Discount or a hard scarcity line, once, and only if your margin can carry it.
Hold all sends between 9pm and 8am IST and queue them for the morning. A 2am cart reminder buys you a block, and blocks are the input to your quality rating. Also worth suppressing during the first 48 hours of a big festive sale, when the same customer is already getting your campaign broadcasts. Meta has been tightening how many marketing templates a single user receives, so treat marketing delivery as competitive rather than guaranteed: if you've already sent two campaign broadcasts that day, your cart reminder is the one that gets dropped.
The arithmetic, with a holdout
Take a store with 1,000 abandoned checkouts a month and an AOV of ₹1,850. Of those, 620 have valid WhatsApp opt-in and a number registered on WhatsApp. Three sends each is 1,860 messages. Assume ₹0.80 per marketing message plus ₹0.15 BSP markup, so ₹0.95 all-in: 1,860 × ₹0.95 = ₹1,767. Call it ₹1,800 with GST rounding.
Say the flow reports a 9% recovery rate on those 620, which is 56 orders and ₹103,600 in revenue. At 40% gross margin that's ₹41,440, less roughly ₹3,700 of discount on the 20 orders that used the third-message code. About ₹37,700 against ₹1,800 of messaging.
Now the honest version. Hold back 10% of eligible carts and send them nothing. If 3.5% of that holdout converts on their own, your incremental rate is 9% − 3.5% = 5.5%, or 34 orders, not 56. Revenue ₹62,900, margin ₹25,160, still a return of roughly 14x on messaging spend. That's a flow worth running. It's also 40% smaller than the number on the dashboard, and if you're making budget decisions off the dashboard number you'll over-invest in the wrong channel.
Run the holdout for at least six weeks before you trust it. Monthly volume of 1,000 carts gives you a 62-cart control group, which is thin. Two months is better.
For most Indian stores, COD confirmation beats cart recovery
Unwelcome, but true often enough that we bring it up first when a founder asks about WhatsApp abandoned cart recovery. If you're running 60% COD with a 25% RTO rate, a WhatsApp order-confirmation flow with Confirm and Cancel buttons, plus a prepaid-conversion offer for the confirmed ones, moves more rupees than any cart sequence. It's a Utility template, so it's cheaper per send. It fires on every COD order rather than on the subset of carts with opt-in. And a cancelled order before dispatch costs you nothing, while an RTO costs forward freight, return freight and a repack.
Build both. Just build that one first.
How this breaks
Quality rating is per phone number, and it drops on block rate and report rate, not on open rate. Once it hits low, your messaging tier gets capped and templates can be paused. You climb tiers by sending consistently within limits: 250 unique recipients per 24 hours, then 1,000, then 10,000, then 100,000. A store that launches with a 40,000-contact blast on day one gets throttled and then wonders why the cart flow isn't delivering.
Other things we've had to fix after the fact:
- One WhatsApp number shared between the cart flow and customer support. Support agents reply into the same thread, the 24-hour window state gets confused, and automated sends fire on top of live conversations. Use separate numbers, or at minimum a proper agent-inbox handover rule.
- Numbers that aren't on WhatsApp, still sitting in the send list, still being charged for by some BSPs. Validate, and route the failures to SMS.
- BSP lock-in. Your templates and your number live with whoever holds the WABA. Make sure the WABA is under your own Meta Business Manager, not the BSP's, or migrating later costs you re-approval on everything.
- Opt-outs captured in the WhatsApp tool but never written back to Shopify, so the customer keeps getting email and SMS from the same brand they just told to stop.
What to do this week
Pull your abandoned checkout count for the last 30 days, then check what share of those records has a phone number with consent attached. If it's under half, the flow isn't your problem yet: the opt-in capture is. Fix the checkout checkbox and add a click-to-WhatsApp entry point on your top five product pages, wait two weeks, then build the sequence.
If you'd rather have someone check the plumbing first, we look at cart abandonment, checkout drop-off and message-channel setup as part of a free store audit. And if the constraint is engineering time rather than strategy, a Shopify developer on a monthly retainer can get the templates, webhooks and consent sync done in a fortnight.

