Payments · merchant retention

Merchant Churn Study

Which merchants will stop processing in the next three months, what is really driving it, and does calling them early keep them? A churn model, a causal analysis and a randomised test on 10,000 merchants over 2025.

0.50PR-AUC vs. 9.5% churn base rate
67%of alerts are merchants who really leave
-8.3%volume effect of the payout-verification change
$54Kannual revenue retained in the A/B test

1. Predicting churn

A Random Forest scores each merchant monthly from point-in-time features: volume against its own three-month average, seasonally adjusted trend, active days, failed payments, payout delays and support tickets. SMOTE balances the training months only, and the alert threshold is tuned on a later month before testing on August and September.

Test monthsPrecisionRecallF1ROC-AUCPR-AUC
Aug–Sep 20250.6660.3680.4750.8000.504

Accuracy is 92.3%, but with 9.5% of merchants churning, accuracy says little. Precision at the alert threshold sets how much account-manager time is wasted.

2. Seasonal dip or product problem?

In July, merchants on the plugin integration moved to a new payout verification flow. Volume also swings with the seasons, so a before/after comparison mixes the two. Difference-in-differences with merchant and month fixed effects compares plugin merchants to everyone else over the same months.

+0.04 +0.00 -0.04 -0.08 Payout verification launched Jan Apr Jul Oct Dec

The friction cut plugin merchants' volume by -8.3% (95% CI -9.1% to -7.5%). The groups moved together before July (pre-trend p = 0.16).

3. Does early outreach work?

Merchants flagged in September were randomly split. Half got an account-manager call within 24 hours; half got nothing extra.

GroupMerchantsChurned
Control21470.1%
Outreach20260.4%

Churn fell by 9.7 points (p = 0.038), about 20 merchants and $53,506 a year at a 1.5% take rate.

Scoring in production

A Flask endpoint returns a churn probability, risk tier and recommended action for each merchant, with p95 latency under 50 ms in tests. A Dockerfile packages the API with a trained model.

All data is synthetic, generated with known effects so every method can be checked against the truth; the A/B outcomes are simulated from an assumed outreach effect. Built with AI-assisted coding (Claude); modeling choices, validation and review by Martins Ogiekpolor.