Business Framework Interactive
Churn Prediction
Identify users likely to leave before they do. Enable proactive retention interventions for high-value customers at risk.
๐ฐ Why Churn Matters
5-25x
Cost to acquire new customer vs retain existing
5%
Retention improvement can increase profit by 25-95%
60%
Of churn can be prevented with timely intervention
User Behavior
0 30
0 20
30 70
Account Info
5 200
0 10
1 365
๐ Churn Risk Assessment
10%
Churn Probability
Low Risk
Risk Classification
Low (0-30%)
Medium (30-60%)
High (60%+)
Cohort Survival Curve
Initial: 1,000 users 12-Week Retention: 41.4%
๐ Churn Drivers (Feature Importance)
Inactivity (days)
35%
Days since last bet
Losing streak
25%
Recent win rate below average
Low engagement
20%
Bets/week declining
No deposits
15%
No deposits in 30 days
New user
5%
Account < 30 days old
๐ฏ Intervention Strategies
Inactive 5+ days
+15% retentionPush notification with personalized pick
Losing streak (3+ losses)
+25% retentionFree bet or odds boost on next wager
High churn score + high LTV
+40% retentionPersonalized outreach / VIP offer
Declining bet frequency
+10% retentionFeature highlight or new market promo
๐ง Model Features
Activity Features
- โข Days since last bet
- โข Bets per week (rolling)
- โข Session frequency
- โข Time in app
Financial Features
- โข Win rate (recent vs lifetime)
- โข Deposit frequency
- โข Average bet size
- โข Withdrawal behavior
Engagement Features
- โข Feature adoption
- โข Notification response
- โข Promo usage
- โข Support tickets
R Code Equivalent
# Churn prediction model
library(tidymodels)
# Prepare features
churn_data <- users %>%
mutate(
days_inactive = as.numeric(Sys.Date() - last_bet_date),
bets_per_week = total_bets / account_age_weeks,
recent_win_rate = wins_last_30 / bets_last_30,
churned = ifelse(days_inactive > 30, 1, 0)
)
# Train model
churn_model <- logistic_reg() %>%
set_engine("glm") %>%
fit(churned ~ days_inactive + bets_per_week + recent_win_rate +
deposits_30d + account_age, data = churn_data)
# Score users
predictions <- predict(churn_model, new_users, type = "prob")
# Prioritize interventions
at_risk <- new_users %>%
bind_cols(predictions) %>%
filter(.pred_1 > 0.6) %>%
arrange(desc(ltv * .pred_1)) # Impact = LTV ร churn probโ Key Takeaways
- โข Inactivity is the #1 churn predictor
- โข Losing streaks accelerate churn
- โข Intervene BEFORE users leave
- โข Prioritize by LTV ร churn probability
- โข Test intervention effectiveness
- โข 5% retention improvement = major profit impact