HomeHome

Getting a churn-analysable export out of any billing platform

Every churn calculation needs the same seven fields. What changes between platforms is where those fields live and which status values lie to you. This is the mapping for fourteen billing systems, plus the four already covered under integrations.

TL;DR: Fourteen billing platforms, the seven fields a churn analysis needs from each, and the platform-specific status traps that silently produce wrong answers. Four more are covered under integrations.

The seven fields, on every platform

Every churn, retention and revenue-quality calculation reduces to these. The platform pages map each one to that system's own field names.

By platform

The second column is the trap that most often produces a wrong answer on that platform. Almost all of them are status values that do not mean what they sound like.

PlatformMost common silent error
PaddleTax-inclusive pricing distorts MRR by geography
Chargebeenon_renewing is churn that has already happened
Recurlycanceled versus expired inverts the answer
Maxio (Chargify)Metered components make MRR genuinely ambiguous
BraintreeThere is no MRR, so build it explicitly
PayPalChurn dates usually have to be inferred, not read
Lemon Squeezycancelled still serves until ends_at
GumroadOne-off sales and memberships share the export
FreemiusLifetime licences are not recurring revenue
RevenueCatStore commission means gross price is not revenue
WooCommerce Subscriptionspending-cancel is a decision already made
GoCardlessfinished is not churn
FastSpringPerpetual licences and maintenance plans are not subscriptions
ZuoraRevenue lives in rate plan charges, not on the subscription

Already covered elsewhere on this site

Four sanity checks before you trust any export

These catch the majority of unusable files in about five minutes, whatever platform produced them.

  1. Does any row have a cancellation or end date? If none do across a multi-year file, the export was filtered to active subscriptions and every churn figure computed from it will be zero. This single defect accounts for more wrong churn numbers than every definitional argument combined, and it is fixed with one email rather than with analysis.
  2. Does the row count match what the seller says? Fewer rows than the stated customer count means the file is filtered. More rows usually means one customer holds several subscriptions, which changes how you aggregate before you count anything.
  3. Does summed normalised monthly revenue match reported MRR? Normalise annual amounts to monthly first. A gap beyond a few percent means a missing component, a currency issue or a different definition — find out which before you continue, because everything downstream inherits it.
  4. Is the history long enough? Twenty-four months is the minimum for cohort work and thirty-six is better. Seasonality and renewal behaviour are untestable below that, and it is far easier to ask for more now than to re-open the request later.

Related: what sellers say and how to verify it, the 23-point checklist, and the free calculators.

Verify it against the raw rows

Every check on this page can be run by hand in a spreadsheet, and if you have the time you should. If you would rather not: send us the target's subscription export and we run the full human-reviewed analysis — logo churn, revenue churn, customer concentration, annual-plan decay, zombie MRR and an A–F revenue-quality grade. The free Starter tier covers one CSV per month, which is enough to check a single deal.

See a sample report →  ·  Get the free 23-point checklist →

Frequently asked questions

What data do you need to calculate SaaS churn?

Seven fields: a stable customer identifier, subscription status, recurring amount and currency, billing interval and term, start date, cancellation or end date, and ideally the date of the last successful payment. Everything else is optional. Without a cancellation date you cannot compute churn at all.

Why do churn numbers differ between billing platforms?

Mostly because status vocabularies differ and rarely mean what they sound like. Recurly's canceled is still serving while expired is gone; Chargebee's non_renewing is economically churned but counted as active; WooCommerce's pending-cancel is a decision already made. Reading any of these literally produces a wrong rate.

What is the most common problem with a subscription export?

It was filtered to active subscriptions only, so it contains no cancellation dates and every churn figure computed from it comes out at zero. Count the rows with a cancellation or end date before you do anything else, and request a complete file if there are none.

9%
Median B2B SaaS revenue churn
88%
Median gross revenue retention
23
Audit Checklist Points

The seller's churn number is almost always wrong. Send the CSV and find out before you wire.

Get the Free Checklist →

🛡️ Free Starter tier: 1 CSV analysis per month. No credit card. Verify a seller's churn claims before you commit.