The missing event

Subscription retention is a solved measurement problem, and it's solved because of one structural gift: the cancel button. A customer cancels, a row is written, and the business knows within seconds. That single event makes churn rate computable, cohort curves drawable, and save flows possible. The economics of those curves — and why averaging them misleads — are the subject of subscription economics: your churn rate is hiding the real number.

Transactional DTC has none of that. There is no moment at which a customer declares they're done. There is only an order that doesn't happen, followed by another that doesn't happen, followed by a gradually strengthening silence that nobody is watching in real time.

So the loss is discovered retrospectively. Someone runs a cohort report in Q3 and notices the Q4 cohort from last year has stalled. The information is accurate and nine months stale. Every customer in it has long since found another brand, and the window in which a modest, well-timed intervention might have worked closed months ago.

The absence of a cancel event doesn't mean attrition isn't happening. It means it's happening without a receipt, and you're reconstructing it from an archaeology dig two quarters later.

Why "inactive at 180 days" fails

The common workaround is a fixed inactivity threshold: past 180 days with no order, flag as churned. It's better than nothing and it fails in three specific ways.

It's binary when the truth is continuous. A customer at 179 days isn't active and at 181 isn't churned. They have a probability of being gone that rises smoothly, and collapsing that into a flag throws away the information you'd use to prioritize.

It's global when behavior is individual. A customer whose personal cycle is 28 days sitting at 120 days is deep into abnormal territory. A customer whose cycle is 150 days at the same 120 is entirely normal. One threshold applied to both is wrong for both, and multi-SKU catalogues make this worse, not better.

It's late by construction. Any threshold long enough to avoid false positives is long enough that responsiveness has already decayed. You've optimized for confident diagnosis at the cost of every treatment window.

A lapse model you can build in a spreadsheet

The alternative is a continuous, per-customer lapse probability, and it needs no machine learning — just your order table.

Step one: build the interpurchase distribution. For every pair of consecutive orders in your history, record the gap in days. You now have a distribution describing how long customers normally wait. Compute its percentiles: the 50th, 75th, 90th, 95th.

Step two: segment the distribution. A single global curve is a blunt instrument. Segment by first-product category and by order number — the gap between orders one and two behaves differently from the gap between four and five, and a 30-day-supply buyer differs from a 90-day one. Three to six segments captures most of the value.

Step three: score each customer daily. For a given customer, take their elapsed days since last order and find where it falls in their segment's distribution. If 78% of historical gaps in their segment were shorter than their current elapsed time, they are past the point where 78% of returning customers had come back. Tomorrow that figure is a little higher.

Be precise about what that percentile is and isn't, because it's the most attackable step in the method. Your interpurchase distribution is built only from gaps that closed — it is censored by construction, since customers who never returned contribute no gap at all. So the percentile is strictly P(gap this long | they eventually returned), not P(gone). Read naively it overstates lapse risk, and a statistician in the room will say so.

Two honest responses. For ranking — who is most at risk today — the censoring is largely harmless, because it distorts every customer in the same direction and you're using the score to sort, not to state an absolute probability. For anything that needs a real probability, you want a survival model (Kaplan-Meier over time-to-next-order, treating still-active customers as censored observations) rather than a raw percentile. Start with the percentile because you can build it this week; upgrade when the ranking is driving enough spend to justify it. Just don't call the percentile a churn probability in a board deck.

Step four: personalize where you have data. Customers with three or more orders have their own observed cycle. Use the ratio of elapsed days to their personal median gap and blend it with the segment curve — weighting toward their personal history as their order count rises.

That's it. It's a percentile lookup and a ratio, it updates daily, and it produces a continuously ranked list of who is slipping away and how confidently you can say so.

Reading three customers, worked

A supplements brand. Segment median gap 42 days, 75th percentile 68 days, 90th percentile 104 days, 95th 138 days.

Customer A. 6 prior orders, personal median gap 38 days, currently 71 days elapsed. The raw segment curve puts 71 days at about the 76th percentile; scaling by her own faster cycle (38 against the segment's 42) pulls it up to roughly 79%. Either way she's at 1.9× her own pattern and well past the segment's 75th percentile. High PRCM, clearly slipping. This is the intervention that pays.

Customer B. 4 prior orders, personal median gap 96 days, currently 88 days elapsed. Against the segment curve 88 days scores at the 83rd percentile and looks alarming. Against his own cycle he isn't late at all — he's at 0.9×. With four orders the blend still carries some segment weight but leans hard on his own history: blended lapse probability ≈ 55%. Acting here mostly reaches someone who was returning anyway — the interception problem that makes most win-back flows margin-negative. He is the clearest illustration of why a single global threshold is wrong: on the segment curve he outranks Customer A, and he shouldn't.

Customer C. 11 prior orders, personal median 31 days, currently 152 days elapsed. That's 4.9× her cycle and past the segment's 95th percentile. Lapse probability ≈ 96%. High historical value, but she's almost certainly gone, and win-back economics against a 96% lapse probability are poor. The failure here happened around day 60, unwatched.

Notice what a fixed 180-day rule does to these three: it flags none of them. All three are still "active." The one customer genuinely recoverable is at 71 days and invisible to the rule for another 109 days.

Put a dollar figure on the customers you're losing quietly — free, no login

The LTV Estimator turns your repeat rate, order value, and margin into lifetime contribution per customer — the number that decides whether an at-risk intervention is worth funding.

Open the LTV Estimator →

When intervention is worth the money

A lapse probability on its own doesn't tell you to act. Two competing forces decide the moment.

Lapse probability rises with elapsed time — the longer the silence, the more confident you are that something is actually wrong, and the less likely you're wasting money on a customer who was returning anyway.

Recoverability falls with elapsed time — the longer the silence, the more likely they've already substituted, and the less any message can do about it.

Expected value is the product of remaining value, the probability the customer is genuinely at risk, and the incremental lift your intervention produces. That product is low when you act too early (lift is real but you're paying to reach people who were coming back), low when you act too late (they're gone regardless), and peaks in between.

In the consumable categories I've modeled this for, the peak has tended to sit around 1.5× to 2.5× the customer's own median cycle — Customer A's 1.9×, not Customer C's 4.9×. Derive your own by plotting reactivation response rates against elapsed-time-to-cycle ratio; the curve is usually clear once you look, and it's almost always earlier than the flow currently fires.

That looks like it contradicts the cohort rule — trigger just past the 80–85% point of the repurchase curve, which lands much later. It doesn't. The cohort rule sets one date for a population you know nothing else about, and it's the right answer when that's true. The lapse model replaces that date entirely for the customers where you do know something: their own cycle, their own elapsed time, their own value. When you can score the individual, you should be acting earlier and on far fewer people. The 90-day blanket trigger manages to be wrong in both directions at once — late for the 28-day customer, early for the 150-day one.

Crucially, the intervention at the peak doesn't have to be a discount, and usually shouldn't be. At 1.9× cycle you're reaching someone who probably just ran out and didn't think about it — a replenishment reminder, a restock notice, or a genuinely useful nudge converts here. Discounts become necessary only once you've waited long enough that nothing else works, which is another argument for acting earlier.

Signals that arrive before the silence

Interpurchase time is a lagging indicator: by the time the gap is long enough to score, disengagement started weeks ago. Several signals move earlier, and blending them pulls the detection window forward.

You don't need a weighted model to use these. Flagging customers who hit two or more concurrently gets you most of the benefit and can be built as a segment in your existing ESP.

Operating on the signal

Common questions

How do you measure churn without a subscription or cancellation event?

You estimate it rather than observing it. Build the distribution of days between consecutive orders for your existing customers, then for any individual customer compare their elapsed days since last order against that distribution. The further into the tail they sit, the more likely they have lapsed. Instead of a binary churned or not churned label you get a continuous risk score that updates daily and can drive intervention. One important caveat: that distribution is built only from gaps that closed, so it is censored by construction and the percentile is not literally a probability of churn. It is reliable for ranking customers by risk, which is what you need in order to prioritize. If you need a true probability, use a survival model such as Kaplan-Meier on time to next order, treating still-active customers as censored observations.

What is passive churn in ecommerce?

Passive churn is customer attrition that happens without any explicit signal. In subscription businesses a customer cancels and the event is recorded. In transactional ecommerce a customer simply stops ordering, and because there is no event the business typically discovers the loss much later through a cohort report. The practical consequence is that intervention arrives after the customer has already moved to a competitor or exited the category, when the cost of winning them back is highest and the probability of success is lowest.

At what point should you intervene with an at-risk customer?

Intervene when the expected value of acting is highest, which is generally earlier than instinct suggests but not so early that you are paying to reach customers who were returning anyway. Expected value is the customer's predicted remaining contribution margin multiplied by the incremental probability your intervention changes the outcome. That product tends to peak in a window where lapse risk has risen enough to be meaningful but not so far that responsiveness has collapsed. In the consumable categories I have modeled this for, that window has tended to open somewhere between one and a half and two and a half times the customer's own median purchase cycle, but you should derive your own by plotting reactivation response against the ratio of elapsed time to cycle length.

Build your lapse curve

The uncomfortable finding when brands first build this is usually the same: a substantial group of customers are already deep into lapse territory and are receiving nothing, while the win-back flow is busy emailing people at 90 days who were never at risk. The effort is pointed at the wrong population because the only available signal was a calendar.

The fix is one distribution, one percentile lookup, and a decision about where expected value peaks. None of it requires tooling you don't already have — just the acknowledgement that in a business without a cancel button, churn is something you have to go and measure rather than something that arrives in your inbox.

Want to see the customers you're losing before the cohort report shows it?

I build per-customer lapse probability from your own interpurchase data, cross it with predicted remaining value, and set intervention triggers where expected value actually peaks. Starts with a free diagnostic call.

Request a free audit →

Mike Emerson

Mike writes Ecommerce Cure, an independent consulting practice for DTC and mid-market operators who work in contribution margin rather than revenue. Every framework here is diagnostic-first and shows its arithmetic. About the practice · Free P&L tools