automations.help

Lifecycle & marketing

Build a win-back flow for customers lapsed 90 days

A customer who used to order every month quietly stops, and nothing in your store flags it — you only chase brand-new strangers while people who already loved the product drift to a competitor. Here's how to build a Klaviyo win-back flow that catches them on real purchase cadence (not a blanket 90 days), reconnects before it discounts, and self-exits the moment someone buys. It's a native Klaviyo build — no n8n or glue layer required.

Difficulty
Intermediate
Time to build
3-5 hrs
Updated
  • Klaviyo
  • Shopify

The manual way today

To do this by hand you'd export every customer from Shopify, sort by last order date, eyeball who hasn't bought in a while, cross out anyone who's an active subscriber or just reordered, write a 'we miss you' email, paste in a discount code, and send a one-off campaign — then never do it again, because it's a slog and there's always something more urgent. So most stores just don't. The customer who used to buy every month quietly stops, and nobody notices, because nothing in the store flags an order that didn't happen.

A lapsed repeat customer is the cheapest sale you'll never make: you already paid to acquire them, they already know the product, and they're drifting to a competitor in silence. There's no error message when someone stops buying — the revenue just isn't there, and it's invisible precisely because you can't miss an order that was never placed. Meanwhile the ad budget keeps chasing brand-new strangers at full acquisition cost while the people who already loved you slip away un-asked.

What running looks like

When a customer crosses your real lapse window, they enter a Klaviyo flow that reconnects before it ever discounts: a product-led 'here's what's new' email first, then a proof-led nudge, and only then — if they're still silent — a unique, expiring coupon. The moment they place an order, a flow filter drops them out, so nobody mid-purchase gets a 'we miss you' email. Active subscribers and just-reordered customers are suppressed, your best customers get a warmer no-discount track, and anyone who stays gone after the full sequence is sunset so you stop emailing a dead profile. Lapse again next year, and re-entry gives them a fresh, clean attempt.

01The build

How to build it

  1. Find your real lapse window — don't default to 90

    Needs a human

    Ninety days makes a fine headline, but it's the wrong number for most catalogs. Base 'lapsed' on how often your customers actually buy. Pull the median time between orders for your repeat buyers — Klaviyo's customer analytics shows this, or export orders from Shopify and measure the gap between consecutive orders per customer. Set the lapse threshold at roughly 1.5–2x that median: a coffee brand whose regulars reorder every 30 days has a lapsed customer at ~60 days, while a brand people buy from twice a year shouldn't flinch at 90 at all. While you're here, make the other judgment call — which customers you'd never hand a discount. Your highest-lifetime repeat buyers don't need a coupon to return, and teaching them to wait for one is expensive. Everything after this runs on its own; this is the part only you can decide.

  2. Build the 'Lapsed customer' segment in Klaviyo

    Runs itself

    Create a segment with two conditions joined by AND: 'What someone has done → Placed Order at least once over all time' (so former regulars and one-time-never-returned buyers both qualify) AND 'What someone has done → Placed Order zero times in the last [your window] days'. The Placed Order metric flows straight from Klaviyo's native Shopify integration, so there's no custom event to wire. If value tiers matter to you, add a tier property or a second segment splitting VIPs from everyone else — a lapsed high-lifetime customer and a lapsed single-order customer are not the same problem, and shouldn't get the same email.

  3. Trigger on segment entry, and set the filter that self-exits

    Needs a human

    Build a flow triggered by 'When someone enters the Lapsed customer segment'. Then add the flow filter that keeps it honest: 'Placed Order zero times since starting this flow'. That one filter is what makes a customer drop out the instant they buy again — without it, someone reorders on day two and still gets your 'we miss you' email on day five, the most embarrassing version of this automation. Turn on segment re-entry so a customer who returns, buys, and lapses again months later can be re-won on the next cycle instead of being permanently used up after one pass.

  4. Suppress the people a win-back shouldn't touch

    Runs itself

    Before anything sends, filter out the profiles where 'lapsed' is a false alarm. Active subscribers are the big one: if you run Recharge, someone with a live subscription already has their next order scheduled — they're not lapsed, and a 'come back, here's 15% off' email to a paying subscriber teaches them to cancel and re-buy at a discount. Suppress on Recharge's active-subscriber signal (exposed through its Klaviyo integration). Also drop anyone who placed an order in the last few days (a race between segment entry and send), and let Klaviyo's built-in handling exclude unsubscribed and suppressed profiles automatically. If you split VIPs from regulars in step two, branch here so your best customers get a warmer, no-discount track.

  5. Message 1 — reconnect, no discount

    Runs itself

    Lead with the product, not a coupon. The first email is a re-introduction: what's new since they last bought, restocks in the category they actually purchased, a bestseller or two. Use Klaviyo's dynamic product blocks to pull these from the Shopify catalog feed instead of hand-picking per send. No discount here — most lapsed customers come back because they were reminded the brand exists, not because of 5% off, and leading with a coupon trains people that lapsing is how you earn one. After the email, add a time delay (4–5 days is a sane default) before the flow decides what to do next.

  6. Split on the only outcome that matters — did they buy?

    Runs itself

    After the delay, add a conditional split on 'What someone has done → Placed Order zero times since starting this flow'. Anyone who ordered has done the job; they exit here and never see the rest of the sequence. Everyone still silent continues. Split on the actual Placed Order event, never on email opens — Apple's Mail Privacy Protection inflates opens to the point of noise, and the thing you care about is the purchase, not whether an inbox pre-loaded your images.

  7. Message 2 — proof and a reason, still no heavy discount

    Runs itself

    Second email, different angle: social proof, your best-reviewed products, a fresh arrival, or a reason-to-believe that isn't a price cut. Add another delay, then another Placed Order split after it — same as step six — so buyers keep exiting. Holding the discount back to the next step means the people who'd have returned anyway already did, for free, and you only spend margin on the genuinely stubborn.

  8. Message 3 — the incentive, with a unique, expiring code

    Runs itself

    Only customers who ignored two product-led emails reach the offer. Use a Klaviyo-generated unique coupon (a dynamic per-profile code tied to a Shopify discount), not one shared code — a single static code lands on a deal-aggregator site within days and gets burned by shoppers who'd have paid full price. Give it a short expiry (say 7 days) so it creates a real reason to act now and caps how long the discount is live, and exclude any collections you won't discount. Re-check right before the send with one more 'Placed Order zero times since starting this flow' split, so a customer who bought during the last wait can't be handed a coupon they no longer need.

  9. Sunset whoever's still gone — don't email a dead profile forever

    Runs itself

    After the offer and a final wait with still no order, this customer has had a full, well-spaced shot and stayed silent. End the flow, tag the profile (a property like winback-exhausted, or a tag on their last Shopify order), and stop including them in regular campaign sends — move them to a low-frequency 'sunset' segment instead. Continuing to email people who never engage drags deliverability down for everyone, including the customers who do open. Because re-entry is on, if this person ever buys again and later lapses, they re-enter the segment for a fresh, clean attempt — but until then, you let them rest.

02The stack

What it’s built on

Klaviyo
Owns the whole build: the lapsed segment, the segment-entry trigger, the 'self-exit on purchase' flow filter, the Placed Order splits between messages, the active-subscriber and recent-buyer suppressions, the unique expiring coupon, the sends, and the frequency cap that keeps the win-back from colliding with your other flows. The Recharge active-subscriber signal and the Placed Order metric it suppresses and splits on both arrive through Klaviyo's native integrations — no custom events needed.Klaviyo's free tier is enough to build and test this, and you're almost certainly already running it for email. Any ESP that supports a segment-triggered flow with conditional splits and native unique coupons works the same way — only the split syntax and coupon feature differ.
Shopify
Read through Klaviyo's native integration: the source of the Placed Order data that defines who's lapsed and who's exited, the catalog feed behind the dynamic product blocks in each email, and the store where the discount the coupon points to lives and where the winback-exhausted tag can sit. No custom Shopify code is required — the integration surfaces the order data, products, and tags inside the flow.

03Questions

Before you build

Is 90 days the right window for a win-back flow?

Usually not as a blanket rule. Ninety days is a starting placeholder; the honest threshold is based on how often your customers actually reorder. Pull the median time between orders for your repeat buyers and set the lapse window at roughly 1.5–2x that. A brand whose regulars reorder monthly has a lapsed customer near 60 days, while a twice-a-year purchase pattern shouldn't trip the flow at 90 at all. Tune the window to your cadence and the whole flow gets more accurate.

Should the first win-back email include a discount?

No. Lead with the product — what's new, restocks in their category, a bestseller — and hold the incentive back. Most lapsed customers return because they were reminded the brand exists, not because of a coupon, so opening with a discount spends margin on people who'd have come back for free and teaches everyone that lapsing is how you earn a deal. The unique, expiring code only goes to the customers who've ignored two product-led emails.

Won't this email customers who already bought again?

No, and that's the point of the flow filter. 'Placed Order zero times since starting this flow' drops anyone out the instant they reorder, and a Placed Order split between every message exits buyers along the way. The discount step re-checks one more time right before sending. A customer who buys mid-sequence stops getting emails immediately rather than receiving a 'we miss you' note the day after their order ships.

Should I use one shared discount code or unique codes?

Unique, per-customer codes — Klaviyo generates these as dynamic coupons tied to a Shopify discount. A single shared code ends up on a deal-aggregator site within days and gets used by shoppers who were going to pay full price, which turns a win-back into a margin leak. A unique code with a short expiry stays tied to the one customer you meant to win back and gives them a real reason to act now.

What about my active subscribers — do they get a win-back?

No, and suppressing them is one of the most important filters in the build. A customer with a live Recharge subscription already has their next order scheduled — they're not lapsed, they're just between deliveries. Sending them a 'come back, here's a discount' email teaches them to cancel and re-subscribe at a lower price. Suppress on Recharge's active-subscriber signal (via its Klaviyo integration) so subscribers never enter the win-back path.

Can I build this myself, or should you build it?

Every segment condition, flow filter, split, and suppression is spelled out above, so if you're comfortable in Klaviyo it's an afternoon's work — and since it's a native Klaviyo build, you don't even need an n8n or glue layer. If you'd rather not own the cadence analysis, the subscriber suppression, and the unique-coupon setup, we'll build it on the Klaviyo and Shopify accounts you already pay for, document it, and hand you the keys — you own the flow outright, no monthly retainer. It starts with a free 20-minute teardown, not a contract, and you keep the plan either way.

Lifecycle & marketing

Send replenishment reminders for consumable products

Your product is built to run out — that's the business. But if nothing reminds the customer the week they hit empty, the reorder either doesn't happen or happens on Amazon. Here's how to build a Klaviyo replenishment flow timed to each consumable's real run-out date, guarded so it never nudges someone who already restocked or is on a subscription. It's a native Klaviyo + Shopify build — no glue layer required for the common case.

  • Klaviyo
  • Shopify

Intermediate3-5 hrs

Lifecycle & marketing

Build an abandoned cart flow with Klaviyo and n8n

Klaviyo's built-in abandoned cart flow is good — when its onsite tracking actually sees your checkout. When it doesn't (a headless storefront, a custom cart, a checkout the snippet never loads on), the recovery emails just don't fire. Here's how to read the abandonment straight from Shopify with n8n, guard it so you never email someone who already bought, and hand Klaviyo a reliable event to send on.

  • Klaviyo
  • n8n
  • Shopify

Intermediate4-6 hrs

Lifecycle & marketing

Save at-risk subscriptions before they cancel

By the time the 'subscription cancelled' email lands, the decision is already made — and the next charge is already gone. But Recharge emits the signals that come before a cancel: an upcoming charge nobody managed, a second skip in a row, a card that just declined. Here's how to wire Recharge and Klaviyo so those signals trigger a save while the customer is still subscribed — and intercept the cancel itself instead of only logging it. It's mostly a native Recharge + Klaviyo build; the glue layer is optional.

  • Recharge
  • Klaviyo

Intermediate4-6 hrs

Lifecycle & marketing

Build a browse abandonment flow for Shopify

Plenty of shoppers open a product page, look, and leave without ever adding to cart. A browse abandonment flow sends those people a quiet reminder of what they looked at. It's the lowest-intent recovery flow you'll build — and it has one hard limit worth saying out loud: it can only reach shoppers Klaviyo already knows. Here's how to wire it on your Shopify store, keep it from stepping on your higher-intent flows, and tell whether it's actually earning its place.

  • Klaviyo
  • Shopify

Starter2-4 hrs