The scenario
The store sells cat food, litter and a small line of toys and accessories, almost exactly one year old and built by a founder who is herself a multi-cat owner. It runs on Shopify with KNET, Tabby and cash on delivery at checkout, and the founder had read enough about recurring revenue to launch a formal monthly subscription for food and litter within the first six months.
The subscription looked right on paper: the same two products every household needs, on a schedule that repeats without fail. Uptake was almost nothing. Meanwhile the store's own order data showed plenty of customers reordering the same items on their own, at their own pace, without ever touching the subscription button — they were simply doing it as a fresh manual order each time, which the founder had been reading as retention already failing rather than retention already happening in a shape nobody had designed for.
- Monthly revenue band
- pending client sign-off
- Average order value
- pending client sign-off
- Fulfilment
- Own stock, contracted courier, scheduled runs for bags and litter cartons
- Team
- Founder and one part-time customer-service reply on WhatsApp
The subscription button was empty. The reorders were happening anyway
When we split the order history by cohort, the first thing that stood out was which product actually predicted a second order. It was not the bestselling food brand, which sold well once and often did not sell again to the same household within ninety days. It was a specific mid-size litter, bought by customers who came back at a rate roughly double the store average, almost always for the same litter and almost always within a narrow, predictable window.
That window is the part the subscription had never used. A recurring charge asks a customer to commit before she knows exactly when she will need the product again, and Kuwaiti cat owners resisted that commitment even when the maths clearly favoured it. What they did instead, unprompted, was message the store on WhatsApp roughly once a month asking whether the same litter was in stock — the exact reorder behaviour the subscription was trying to automate, just running manually through a channel the store had never built a flow around.
The store did not have a retention problem in the sense of customers leaving. It had a channel problem: the loyalty was arriving on WhatsApp, one message at a time, and getting answered rather than systematised. Every reorder was a request for a reminder, dressed up as a stock question.
What we did — the messages and flows
The losers are here on purpose. A test with only winners was never a test.
A WhatsApp reminder timed to when the litter actually runs out
Winner"Your usual litter should be running low around now — want us to send it?"
- Format:
- WhatsApp Business API template, sent once per customer's own reorder interval
This single message replaced the subscription pitch entirely and outperformed it by every measure that mattered. It asks nothing of the customer before the moment she actually needs the product, and it is framed as a question rather than a charge, which matched exactly how customers were already behaving on their own.
Order confirmation and delivery update on WhatsApp
Winner"Your order is confirmed. Your bag is out for delivery on Thursday."
- Format:
- Two-message WhatsApp flow triggered automatically at order and at dispatch
A basic flow, but the one that captured the opt-in in the first place: a customer who knows the store will actually message her about something useful is far more willing to give the number than one who suspects it leads to marketing spam. This flow is what earned the right to send the reminder later.
A food-and-litter bundle offered inside the reminder
Winner"While we're at it — need food too? One delivery, one fee."
- Format:
- Follow-up WhatsApp message sent after a positive reply to the litter reminder
Attaching the cross-sell to a message the customer had already said yes to worked far better than pitching it cold, because the delivery decision was already made and this only asked her to add one more thing to the same van run — a genuinely useful offer rather than an interruption.
The formal monthly subscription, kept live as the control
Lost"Subscribe and save 10% every month, automatically."
- Format:
- Standard Shopify subscription app, recurring card charge
Kept running rather than switched off immediately, because the comparison is what proved the reminder was doing the actual work. Uptake stayed low the entire time, and the customers who did subscribe cancelled at a noticeably higher rate than the reminder's opt-out rate, which is the clearest possible sign that the format itself, not the offer, was the problem.
A generic monthly broadcast to the entire WhatsApp list
Lost"This month's offers for all your pet's needs."
- Format:
- One unsegmented broadcast sent to the full opted-in list
This one taught people to mute the number. A dog owner receiving cat-litter offers and a customer who just reordered receiving the same generic blast both read it as noise, and the opt-out rate on this message was the highest of anything tested, which is exactly why every message after it was segmented by last product bought.
What we did — the optimizations, in order
Read the cohorts to find the real gateway product
We split repeat purchase rate at thirty, sixty and ninety days by the first product each customer bought, rather than looking at the store's overall repeat rate as one number.
Why: The bestselling food brand looked like the obvious retention product and was not. The mid-size litter nobody was pushing turned out to be the one actually predicting a second order, which redirected every flow and every reminder that came after it.
Move the channel from a personal reply to the official WhatsApp API
We migrated the store's stock-question replies off a personal WhatsApp number and onto the official Business API, with opt-in captured at checkout and again on the order-confirmation page.
Why: A personal number cannot send a templated reminder at scale and risks getting banned the moment it is used for anything resembling marketing. The official API is what let a manual reply pattern become a system that runs itself for every customer, not just the ones who happen to message first.
Build the flows around the reorder interval, not the calendar
Order confirmation, delivery update, the litter reminder timed to each customer's own historical reorder gap, and the bundle follow-up were written in Kuwaiti dialect and built as one connected sequence.
Why: A reminder sent on a fixed monthly date ignores that one household finishes a bag in three weeks and another in six. Timing it to each customer's own pattern is what made the message read as helpful rather than as a sales calendar nobody asked to be on.
Segment every broadcast by last product and by species
After the generic blast failed, every subsequent broadcast was segmented by last product bought and by whether the household owned a cat, a dog, or both, at two to four sends a month.
Why: This is the direct fix for the opt-out spike, and it also respected the reality that nine in ten of this store's customers own cats rather than dogs — a dog owner who keeps receiving cat litter offers has every reason to mute the number, and did.
Give lapsed customers one specific reason, not a blanket discount
Customers who had gone past ninety days without reordering their gateway litter received a message naming that specific product and asking whether they had switched brands or stores, rather than a generic win-back discount.
Why: A blanket discount teaches every customer to wait for the next one. Asking a specific question about a specific product surfaced real answers — a brand switch during a stockout, a move to a pet shop in Rai or Shuwaikh — that told the store exactly what to fix rather than just buying back one order at a discount.
Measure repeat rate, revenue per recipient and opt-out together
Every message's repeat purchase rate, revenue per recipient and opt-out rate were reviewed weekly side by side, rather than judging a message on sales alone.
Why: A message can sell well and still be quietly costing the list, the way the generic broadcast did. Watching the three numbers together is what let the store kill a working-but-resented message before it did lasting damage to the channel every other flow depends on.
What changed
The table above carries the figures once the client signs them off, and the shape worth flagging now is that repeat purchase rate moved on the back of the reminder message specifically, not the subscription it replaced — the subscription stayed live throughout as a control and never closed the gap. The WhatsApp opt-in rate climbed once customers understood the number would send something useful rather than a stream of offers.
The share of revenue from returning customers grew fastest among households that bought the gateway litter first, which confirmed the cohort read rather than just following from it — the founder had been marketing the bestselling food hardest, when the quieter litter product was doing more of the retention work all along.
The two losing tests earned their place in the record. The subscription's own cancellation rate, higher than the reminder's opt-out rate, showed the format itself was the obstacle, not the price or the offer. The generic broadcast's spike in opt-outs is the reason every message after it carries a segment.
What we would do next
First, extend the same reorder-timed reminder logic to the food line on a per-household basis, since the food reorder gap varies far more by number of cats in the home than the litter gap does.
Second, retire the formal subscription once the reminder's numbers hold for another full quarter, and redirect that engineering effort into a referral message for customers who have reordered three times, which this account has not tried yet.