For subscription businesses, churn is the silent killer. Unlike a single lost sale, a churned subscriber represents the loss of every future payment they would have made — their entire remaining Lifetime Value. For a DTC subscription brand with an average customer LTV of $1,400 and monthly churn creeping toward 5%, the mathematics were alarming. They were losing $840,000 in annual revenue to preventable cancellations, and they had no way to see it coming until it was already gone.
The Problem: Churn is Predictable, But Only If You're Looking
The conventional response to churn is reactive: a win-back email campaign after someone cancels, or a blanket discount offered to everyone who clicks the cancellation button. Both strategies are fundamentally flawed. Win-back emails reach customers who have already made the psychological decision to leave and converted at single-digit rates. Blanket discounts train your most loyal customers to cancel and wait for the discount offer.
The insight driving this entire project was behavioral: customers don't churn without warning. They signal their disengagement weeks before they cancel. They log in less frequently. They stop using premium features. They reduce their order size. They contact support with a complaint they don't follow up on. These signals exist in the data — they're just never assembled into a coherent predictive picture.
When the client came to us, they had customer data scattered across three systems: order history in Shopify, behavioral events in Segment, and support tickets in Zendesk. None of these systems talked to each other. There was no unified view of a customer, and certainly no predictive capability.
Phase 1 — Data Unification and Feature Engineering
The first month of the engagement was entirely infrastructure. We built a Snowflake data warehouse that ingested a nightly batch from all three source systems, normalizing customer records into a unified schema with a master customer_id as the primary key. This alone was transformative — the client could suddenly see, for the first time, the complete behavioral history of any customer in a single query.
On top of the unified data, we engineered 43 predictive features organized into four behavioral categories. Engagement metrics tracked login frequency over rolling 7, 14, and 30-day windows, mobile app session duration, and time-on-site trends. Product usage metrics captured which premium features had been used in the last 30 days and how usage had changed month-over-month. Order behavior metrics included average order value trend, days since last order versus cohort baseline, and subscription modification history (pauses, downgrades, address changes). Support sentiment metrics used a lightweight BERT-based classifier to score the sentiment of any recent support interactions, flagging negative sentiment as a strong churn predictor.
The feature engineering stage is where most data science projects fail. It's not the model that predicts churn — it's the quality and relevance of the features you give the model. We spent three weeks exclusively on feature design, validated each feature's correlation with actual churn outcomes in historical data, and eliminated 12 initially designed features that showed no predictive value.
Phase 2 — Model Training and Validation
We trained an XGBoost gradient boosting classifier on 18 months of historical customer data, with a 45-day prediction horizon: given a customer's state today, predict whether they will churn within the next 45 days. The 45-day window was specifically chosen to give the retention team meaningful intervention time without being so early that the signal-to-noise ratio collapsed.
The model was trained on 84,000 historical customer records with verified churn outcomes, using a stratified 80/20 train-test split to ensure class balance. XGBoost was selected over alternatives (logistic regression, random forest, neural network) based on cross-validation performance on this specific dataset, where it consistently outperformed alternatives by 4-7 percentage points in F1 score. The final model achieved 91% accuracy on the hold-out test set, with a precision of 0.89 and recall of 0.86 on the churn-positive class — meaning it correctly identified 86% of customers who would actually churn, with only 11% false positives.
Phase 3 — Deployment and the Real-Time Risk Dashboard
The trained model was deployed as a SageMaker endpoint on AWS, invoked nightly in a batch inference job that scores every active subscriber and writes results to a churn_risk table in Snowflake. We built a real-time risk dashboard in Next.js that the retention team uses every morning: a ranked list of at-risk accounts by churn probability, the top three behavioral signals driving each customer's risk score (SHAP values translated into plain English), and one-click integration to create a personalized retention campaign in their email platform.
The dashboard included one design decision that proved critical: we surfaced not just the risk score but the explanation. "This customer's risk is high because their login frequency dropped 73% this month, they haven't used the premium feature set in 18 days, and their last support interaction had negative sentiment." An explanation that specific allows the retention team to craft an intervention that actually addresses the root cause — not a generic discount, but a targeted re-engagement email about the specific feature they've stopped using, or a proactive support call from a senior agent.
Phase 4 — Retention Campaign Design
The model's value is entirely realized in what you do with its predictions. We designed three intervention tiers based on churn probability score. High Risk accounts (probability > 0.75) received a personal outreach from a senior account manager within 24 hours of flagging. Medium Risk accounts (0.50–0.75) received an automated personalized email sequence that highlighted their specific usage data and offered a relevant product tutorial or premium feature unlock. Low Risk accounts (0.25–0.50) received inclusion in a proactive value communication sequence.
Results After Six Months
The model identified 2,210 at-risk customers in its first six months of operation. Of those, 38% — 840 customers — were retained through intervention campaigns who would otherwise have churned. At an average LTV of $1,400 each at the time of risk scoring ($400 remaining subscription value + expected future value), the recovered revenue over the period was $840,000 against a total campaign and implementation cost of approximately $29,000. The retention campaign ROI was 2,800%.
The more lasting organizational impact was the shift in how the business thinks about churn. Before this system, churn was treated as a lagging indicator — you discovered it after it happened. Today, the retention team operates with a 45-day forward-looking view. At-risk intervention is now a proactive daily workflow, not a reactive emergency. The mental model shift from reactive to predictive is, in many ways, the most durable outcome of this engagement.
The Core Principle: Data You Already Have
One final point worth emphasizing: every data point this model uses was data the client already collected. The Shopify order history, the Segment events, the Zendesk tickets — all of it already existed. The $840,000 in recovered revenue was hiding in data the company had been storing for two years without ever unifying or analyzing for churn signal.
This is true of most businesses we work with. The intelligence required to transform business outcomes is almost always already present in existing data infrastructure. What's missing is the pipeline to unify it, the model to interpret it, and the system to act on it in time.