calvin.goh
/ projects / sports-churn-model
← All projects
2021 – 2023Astro · Premier LeaguePython · XGBoost · RedshiftGrowth & Retention Senior Manager

Predicting who walks away when the whistle blows.

Sports subscribers don't churn evenly. They churn on a schedule — the off-season, the team elimination, the final match. I built a seasonal retention model that treats the football calendar as a feature, not a nuisance. Outputs feed a tiered save-the-sale playbook that kicks in before the cliff, not after.

Model AUC
0.81
90d forward window
Seasonal churn
−8pp
absolute · vs prior-season
Subs scored nightly
42k
4 segments, daily
01 · PROBLEM
The May cliff

Churn spiked every May when the Premier League ended — and again after team eliminations in knockout rounds. Retention ran flat dashboards that surfaced the drop after it happened, not before.

02 · APPROACH
Calendar-aware features

Built a gradient-boosted model on Redshift with features keyed to the football calendar: match density, team-of-interest signal, off-season decay, renewal history. Scored nightly into a 4-segment risk tier.

03 · RESULT
Interventions, not autopsies

Save-the-sale triggered on risk score, not on the calendar. Diehards got early renewal perks. Casuals got non-sports content discovery nudges. Seasonal churn dropped 8 points year-over-year.

// THE SEASON CYCLE

Churn follows the calendar. So does the model.

AUG
SEP
OCT
NOV
DEC
JAN
FEB
MAR
APR
78%
MAY
62%
JUN
JUL
GROUP STAGE
low risk · weekly engagement
KNOCKOUTS
team elimination triggers
FINAL
peak
OFF-SEASON
the cliff · save window
Normalized churn-risk index · peaks at MAY · smoothed over 3 seasons
// MODEL · FEATURE IMPORTANCE

What actually predicts walk-away.

+Days since last live match view
0.24
+Off-season session decay slope
0.19
+Team-of-interest elimination
0.14
Historical renewal at season end
0.11
Bundle tenure (telco)
0.09
Non-sports content breadth
0.08
+Weekday-only viewing pattern
0.07
+Payment method · prepaid
0.05
+ drives churn · suppresses churn
// MODEL CARD
AlgorithmXGBoost · binary classifier
TargetChurn within 90d
Training window3 seasons · 2019–2022
Features47 engineered · 8 calendar-aware
RefreshNightly · Airflow DAG
Score output[0,1] · binned into 4 risk tiers
Holdout AUC0.81
Top-decile lift4.2×
Downstream · CleverTap campaign routing ·
save-the-sale call queue · CX priority flag.
// RETENTION BY FAN SEGMENT

Four fans, four curves.

Diehards barely flinch when the season ends. Bundled subs lose more than half of their base by March. Each segment got its own save playbook — and its own trigger window.

Selected segmentDiehard baseline% retained · M0 = kickoff
89%
Diehard · M11
56%
Regular · M11
24%
Casual · M11
16%
Bundled · M11
We stopped calling every churner in May. We started calling the right ones in March — and they stayed.
— Head of CX
Astro Sports
// INTERVENTION PLAYBOOK

Four tiers. Four triggers.

The model scores nightly. Risk tier routes the subscriber to the right channel at the right cost — before the churn event, not after.

T1
Low risk · hold

No intervention. Measure baseline retention. Feeds the control group.

T2
Medium · nudge

Non-sports content discovery push. Free mini-bundle trial. CleverTap in-app.

T3
High · incentive

Early-renewal discount, match-pack bundle, loyalty-point accelerator.

T4
Critical · call

Outbound save-the-sale. Human CX. Custom offer authority to level-2 agents.