The Klaviyo Subscription Winback Sequence That Recovers 25% of Cancellations on Shopify
How we build subscription winback flows in Klaviyo for Shopify merchants on Recharge and Skio, with the exact triggers, reframed offers, and SMS layer.
Maya runs Birchstone Coffee, a $3.2M ARR specialty roast subscription on Shopify Plus with Recharge. By late September her cancellation rate had drifted from 6.4 to 9.1 percent. Same product, same pricing, same onboarding emails. She called us on a Wednesday, half frustrated and half curious. “Klaviyo flows plus a simple SMS winback did more for profit than another 20 percent ad budget,” she said, quoting a merchant friend who runs a similar coffee brand. “Why isn’t mine doing that?”
We pulled her flow. The cancellation trigger was firing eleven days late. Half the work was wasted before the email even left the queue.
This is the post we wish we’d published before that call.
Why winback beats acquisition spend right now
Meta CAC for DTC consumables is roughly 38 percent higher than it was eighteen months ago. The Shopify Plus subscription brands we work with are looking at $58 to $74 blended CAC, and the LTV math leans more and more on the second, third, and fourth charge. Lose a subscriber at billing 2 and the unit economics tip negative.
Winback fixes the leakiest part of that funnel. A sequenced reactivation flow, built right, recovers 18 to 28 percent of cancellations in the first 30 days. We’ve seen 31 percent on a coffee subscription, 22 percent on a pet food brand, 19 percent on a skincare refill program. The variance is almost entirely about how fast the trigger fires and how the first offer is framed.
So the real question isn’t “should we build a winback?” It’s “what’s stopping ours from doing 25?”
Most of the time, the answer is the trigger.
The trigger most teams set up wrong
Recharge and Skio both push a subscription/cancelled event into Klaviyo. The default integration listens to the daily sync, which means the event can land in your account anywhere from 6 hours to 11 days after the actual cancellation, depending on how your webhooks are wired and whether the customer cancelled mid-cycle or at billing.
Eleven days is a death sentence for a winback. The customer has already moved on, picked up a different brand at Trader Joe’s, and forgotten you exist.
Wire it differently. We hardcode the trigger to the Recharge webhook on subscription/cancelled, not the bulk sync, and pipe it into a Klaviyo metric called Recharge Subscription Cancelled. That metric fires within 90 seconds of the cancel click. For Skio merchants the equivalent metric is Skio Subscription Cancelled, same webhook plumbing. Shopify’s own subscription purchase options documentation covers the underlying selling-plan model that both apps sit on top of.
The second thing teams miss is the cancellation reason. Recharge captures it in the customer portal. Skio captures it via the cancel-flow widget. Both pass it to Klaviyo as a metric property. If you don’t pull cancellation_reason into your flow filter you’ll send the “we’d hate to see you go” email to someone whose card just declined and meant to be updated, which is worse than no email at all.
Branch on reason. We typically split into four buckets: price or value, product or taste, life-change (moving, baby, layoff), and card-failure. Each gets a different Day-0 message. Card-failure goes to a one-step recovery flow instead of the winback sequence.
Day-0: what you offer instead of a discount
A lot of merchants reach straight for 30 percent off. It works once. It also teaches every future subscriber to cancel as a coupon-mining exercise. The next renewal cycle, your cancellation rate goes up, not down.
Day-0 should not discount the active subscription at all. Reframe the offer instead.
For the price-and-value bucket, we send a side-by-side breakdown of cost-per-use. Specialty coffee at $19 a bag with 16 cups per bag is $1.19 a cup. The 12-ounce drip at the customer’s neighborhood cafe is $5.50. The math is the offer. We’ve had this single email recover 14 percent of price-driven cancellers without any discount on the page.
For product-or-taste, we offer a free sample swap. Two new roasts of the customer’s choice, no charge, in the next box. The thinking is simple: they didn’t quit subscriptions, they quit your specific SKU. Give them a low-friction way to try a different one.
For life-change, the offer is an extended pause. Twelve weeks instead of the default four. We say so directly: “Babies are wild. We’ll pause you until February. Tap here.” About 40 percent of life-change cancellers take the pause and resume on their own.
None of these are discounts. Day-0 with no discount is what protects your subscriber-base LTV across the next twelve months of renewals.
Day-3: where SMS earns its keep
Email open rates on Day-3 in a winback context run 22 to 28 percent for us, while SMS click-through on the same audience runs 9 to 14 percent. SMS isn’t replacing the email. It’s running parallel and catching the half of the list that didn’t open.
The Day-3 SMS is short. One sentence, one link. Maya’s read: “Birchstone here. Try two roasts on us before you decide, no charge. Tap to swap.”
Two compliance notes that catch merchants out. You can only SMS a customer who explicitly opted in to SMS at subscribe. The Recharge or Skio cancel flow is not opt-in, even if the customer typed their number into the portal. And you cannot SMS a cancelled subscriber more than twice in 30 days under TCPA without a refreshed consent.
So we cap the SMS layer at Day-3 and Day-12. Two messages, both short, both with an opt-out line. That’s the corridor.
We also see merchants light up SMS for the card-failure branch, which is a separate compliance call. The customer never said they wanted to cancel, so framing the SMS as a transactional payment-update prompt is usually defensible. Check with your counsel. (Honestly, we just ask the subscription app’s compliance team for the canonical wording each time.)
Day-7: the personalized skip-or-pause email
Day-7 is the longest message in the flow. It’s also the most over-engineered by most teams.
The job of Day-7 is to surface the alternatives the customer didn’t see in the cancel flow. Most cancel flows show two buttons: cancel and pause. The merchant assumes the customer saw the pause button and chose against it. About 60 percent of the time, the customer didn’t actually see it. The cancel widget loaded slowly, they tapped cancel, the page confirmed, done.
Day-7 lays out four options in one screen: skip the next charge, pause 4 weeks, pause 12 weeks, switch frequency from 4 weeks to 8 weeks. Each option is a single tap that fires a Recharge or Skio API call from the email. No login required. (Klaviyo’s link-tracking parameter plus a Recharge customer-portal magic link does this in one round trip.)
Maya’s Day-7 recovers about 17 percent of the cancellers who got it. The big win is the 8-week frequency option. Roughly half of her “value” cancellers were over-supplied, not under-engaged. The smaller, less frequent box kept them on the books at a lower MRR per customer, but the LTV math still worked.
Day-12: the second SMS nudge
By Day-12, the customer who hasn’t responded is mostly gone. The Day-12 SMS isn’t trying to recover them. It’s trying to flush out the few who fully intended to come back but forgot.
One sentence: “Last chance to keep your roast subscription paused instead of cancelled. Tap to pause.”
Conversion on Day-12 is small in absolute terms, usually 2 to 4 percent of the audience, but the customers it recovers tend to be your best ones. They cancelled for a real reason (move, baby, surgery) and were going to resume in two months anyway. Giving them a one-tap pause keeps them on the books and saves you a re-acquisition cost down the line.
Skip Day-12 entirely if your SMS list is small or if your team isn’t comfortable with the cadence. The email-only version of this flow still does 19 to 22 percent recovery.
Day-21: education and social proof before the door closes
Day-21 is the only message in the flow that’s allowed to feel marketing-y. The customer hasn’t engaged with anything yet. They’re a cold lead now.
We open with a customer story. Real name, real photo, real city. “Diana from Pittsburgh cancelled her coffee subscription in March, came back in July, and just hit her 12th delivery.” The content is the proof. The CTA at the bottom is a one-click resubscribe at the customer’s old frequency and price. No discount. The price they had is the offer.
We layer in one piece of new product education in this email too. A new origin, a new grind option, a refreshed packaging. The frame is “here’s what’s changed since you left,” not “come back, please.”
About 6 to 9 percent of the Day-21 audience clicks through. Of those, maybe a third resubscribe. So the absolute number is small, but it’s revenue you would otherwise have written off.
The flow ends here. Day-30 onwards, the customer rolls into the standard re-engagement list with the rest of your inactive base.
Reading the numbers in Klaviyo (not Shopify)
Shopify’s subscription dashboard counts a cancelled subscription as a permanent churn the moment the cancel event fires. It doesn’t update when a winback recovers them. That’s why merchants tell us “our churn rate looks the same” three weeks into the flow.
Look at Klaviyo flow analytics instead. The metric you want is recovered revenue on the winback flow, defined as the sum of restored MRR from subscribers who hit the flow and then reactivated within 30 days. Klaviyo’s flow analytics documentation walks through the custom-metric builder that does this in two clicks: pick the flow, pick “placed order” as the conversion event, set attribution window to 30 days, filter for restored_subscription = true (Recharge and Skio both pass this property).
Cross-check against Recharge’s “Reactivations” report on the subscription analytics tab. It’s a manual sanity check, but the two numbers should agree within 5 percent. If they don’t, your flow filter is leaking events. The usual culprit is a missing cancellation_reason filter that’s letting card-failure recoveries count as winbacks.
Maya’s first month of the rebuilt flow recovered $47K in MRR equivalent. Her CFO didn’t believe it until we walked through both reports side by side.
What we keep telling clients
The shape of a good reactivation flow hasn’t changed much in five years. Trigger fast, lead with reframing not discounts, layer SMS at two specific points, and read the right report. What’s changed is the cost of getting any of those four wrong, because acquisition is so much more expensive than it was.
Most of the agencies we replace on subscription accounts have a winback in place. It’s just running 11 days late on the trigger and dropping the cancellation-reason branch. That’s the gap between “we have a flow” and “we recover a quarter of our cancels.”
Three weeks after Maya’s call, her Q4 cancellation rate was back at 6.1 percent and her recovered MRR was running $43K to $51K a month. Her CFO asked us what we did. We told her the same thing we tell every subscription brand we work with. The flow existed, we just made it actually run on time.
If you have a reactivation flow live and you don’t know your trigger latency or your reason-branched conversion rate, you’re somewhere between 11 and 18 percent recovery. The work to get to 25 isn’t bigger. It’s smaller and more boring.
Questions we get every week
Does this work on Yotpo Subscriptions or Loop instead of Recharge or Skio?
Yotpo and Loop both expose webhook events for cancellation, so yes; the metric names in Klaviyo are just different (Yotpo Subscription Cancelled and Loop Subscription Cancelled), and Loop’s cancellation-reason property is nested one level deeper in the payload. Plan an extra 90 minutes for the Loop property mapping and the architecture is otherwise identical.
What’s the right discount cap for the cancellation reason “too expensive”? We almost never discount in this flow; when we do, it’s a one-month-only price hold (the customer keeps their original price for one more cycle instead of the new higher price). That holds LTV without training cancel-as-coupon behavior. If you have to discount, cap it at 15 percent and make it a one-shot, not recurring.
Can we run this flow if our subscription app doesn’t pass cancellation reason? You can, but you lose 8 to 12 points of recovery rate. The flow becomes one-message-fits-all and the price-value cohort, which is the biggest recoverable group, gets the wrong copy. Before you launch, ask your dev or your subscription app’s support team to enable the reason field. It’s usually a settings toggle, not custom work.
How do we handle subscribers who reactivate, then cancel again 60 days later? Don’t put them back into the same sequence. Drop them into a separate “re-cancel” segment with a single Day-3 email that asks one question: what didn’t work this time. That feedback loop is more valuable than another recovery attempt. About a third of re-cancellers tell us something specific (shipping delay, taste change, life event) that we can fix product-side.
If you want help auditing your subscription reactivation flow, tell us about your stack at monkeyman.agency/contact and we’ll send back a 48-hour diagnostic with the exact trigger, reason-branch and SMS gaps we found.