
The problem
Win-back campaigns are the throughput-limited side of customer retention. The marketing team has a fixed weekly capacity for outreach emails, calls, or discount offers. The question is always: of the thousand lapsed customers, which 100 should we focus on this week to maximise recovered revenue?
Most teams answer this by sorting on recency (most-recently-lapsed first) or on historical value (highest-spending customers first). Both are partial answers. The better answer is the conditional probability that outreach succeeds × the expected revenue if it does — the predicted recoverable revenue. Sorting by that puts the highest-leverage cases at the top.
How it works
Two predictions compose. _predict will_return on each lapsed customer conditioned on their history, segment, and lapse pattern returns the probability of a successful win-back. _predict expected_value returns the predicted revenue if they do return. Multiplied, the result is recoverable_revenue per customer; the outreach queue is sorted descending.
The system updates as the campaign runs. Every successful win-back contributes to the conditional probability for similar future cases; every failed outreach adjusts the model for that pattern. Mature deployments track per-cohort ROI: which lapsed-customer segments respond best to which outreach type, predicted in advance from the historical signal.
{
"from": "customers",
"where": {
"status": "lapsed",
"last_purchase_within": "180_days"
},
"predict": "will_return",
"select": ["$p", "$why", "customer_id", "lifetime_value"],
"orderBy": "$p:desc",
"limit": 100
}For the full architecture, see the technology overview. For the broader narrative across multiple use cases, read The Predictive Application.
See it live
This use case runs in the 🛒 E-commerce demo today. Click through to the live application and inspect the queries that produce the result. Source is on GitHub under Apache 2.0.
Frequently asked
How is this different from churn-ranked outreach?
Churn-ranked outreach targets ACTIVE customers at risk of leaving. Win-back ranking targets LAPSED customers who already left. Same conditional-probability machinery, different population. Mature deployments run both; the two queues feed different parts of the retention team.
What defines "lapsed" for this prediction?
Application-level decision based on the typical purchase cadence. For e-commerce, 90-180 days without purchase is the common threshold. For SaaS, account-cancellation or downgrade. The prediction works on any binary outcome (returned: true/false) once the team defines it.
Does this work for win-back from cancelled subscriptions?
Yes. Replace "will_return" with "will_reactivate"; the conditional probability is the same shape. Predict reactivation probability conditioned on the reason for cancellation, the time since cancellation, and the customer's pre-cancellation patterns.
Can the system recommend the optimal win-back offer per customer?
Yes, as a second prediction. _predict will_return conditioned on the offer type and discount level. Different customer segments respond differently to free-shipping vs discount-percentage vs new-product-offer. The ranking can be the joint prediction of customer × offer.
How does this handle customers who lapsed for service or quality reasons?
If the lapse cause is in the data (support tickets, returns, NPS scores), the prediction conditions on it. Customers who lapsed due to product issues respond better to product-update outreach; customers who lapsed due to price respond better to discount offers. The conditional probability captures this when the signal is available.



