Product analytics · SQL + Python

Where a subscription funnel leaks money.

Queried 40K users and 303K events in PostgreSQL to find the trial-to-paid drop-off and the revenue it put at risk, then proved an onboarding fix with a controlled experiment rather than a hunch.

Role
Self-directed analytics project
Stack
PostgreSQL · SQL · Python · Tableau
Scale
40K users · 303K events · 30K payments
Verdict
Ship the onboarding change, move spend off paid

The question

Not "is churn high," but "where does it start, and what does it cost?"

A subscription business can look healthy on installs and still bleed at the trial-to-paid seam. The task was to locate the leak in the funnel, put a dollar figure on it, and decide whether an intervention was worth shipping.

40K
users analyzed in PostgreSQL
303K
product events across the funnel
30K
payment records reconciled

The diagnosis

37% churn, and roughly $43K of recurring revenue at risk.

Built the analysis in SQL with CTEs and window functions to trace retention cohorts and isolate the drop-off, rather than reading a single top-line number.

Retention against churn

cohort analysis · PostgreSQL

Retained63%
Churned37%

The 37% churn translated to roughly $43K in at-risk monthly recurring revenue, which reframed the problem from a metric into a budget line.

The experiment

An onboarding change, tested properly.

Rather than ship on intuition, I evaluated an onboarding variant as a controlled A/B test: a sample-ratio-mismatch check to trust the split, a two-proportion z-test for the effect, and an ARPU guardrail so a conversion win could not hide a revenue loss.

Trial-to-paid conversion, control vs variant

two-proportion z-test · SRM check · ARPU guardrail · widths illustrative

Controlbaseline
Variant+2.9pp

+2.9pp conversion lift, significant at p<0.001, with the ARPU guardrail intact. The recommendation was a full rollout.

The call

Recommendation

Ship the onboarding change, and move acquisition spend off paid. The channel comparison showed paid buying the users who converted and retained worst, while organic carried the healthiest cohorts.

How I'd measure it

One number that couples conversion to retention.

North Star
Trial-to-paid conversion, held against 30-day retention.
Coupled on purpose, so an onboarding change cannot win conversion by importing users who churn a month later.
Activation
Share of trials reaching the core action.
Conversion
Trial-to-paid rate by cohort and channel.
Retention
30-day survival and at-risk MRR.

Limits and next steps

What I would validate before scaling the call.

01

Novelty effect

Re-read the A/B result over a longer window to confirm the lift holds past the first exposure.

02

Attribution window

Confirm the paid-vs-organic quality gap survives a fair lookback, not a last-click artifact.

03

Segment the churn

Split the 37% by plan and cohort so the fix targets the segment actually leaking.

04

Guardrail durability

Track ARPU post-rollout so the conversion win does not quietly erode revenue per user.

Falsification. If the lift decays over a longer horizon or ARPU slips after rollout, the recommendation is wrong and the change should be rolled back, not defended.