SaaS Subscription & MRR Data Generator

A realistic MRR movement ledger — new, expansion, contraction, churn — with plan tiers, seat counts, and plan-dependent churn hazard. Built for practicing net revenue retention, cohort, and churn analysis.

SeededCSV + ExcelChurn labels100% in-browser

Generate the dataset

Save / load scenario (stored only in this browser)

Quick-start presets

What's in this dataset

Each row is one MRR movement for an account in a given month. Sum the deltas to reconstruct MRR, build cohorts, or compute NRR.

ColumnTypeDescription
monthdateFirst of the month the movement occurred.
account_id / accountint / textThe subscribing company.
movementtextnew, expansion, contraction, or churn.
plantextStarter / Pro / Business / Enterprise.
seatsintegerActive seats after the movement (0 on churn).
mrrnumberAccount MRR after the movement.
mrr_deltanumberChange in MRR from this movement (negative for contraction/churn).
region / industrytextFirmographic dimensions for segmentation.
anomaly0/1Present only with injection on; flags suspicious churn events.

Why it's realistic

Each account starts on a plan (weighted toward smaller tiers), with a seat count appropriate to that plan, and a signup spread across the last 24 months. Every subsequent month it faces a plan-dependent churn hazard — Starter accounts churn far more often than Enterprise — plus chances of expansion (seat adds or upgrades) and occasional contraction. Because larger plans both churn less and expand more, the ledger reproduces the real shape of a SaaS book: a leaky bottom end, sticky enterprise revenue, and net retention that depends entirely on which cohort you slice. That makes it ideal for NRR, logo vs. revenue churn, and cohort-retention exercises that actually have signal.

Good for

NRR / GRR calculations Cohort retention curves Churn modeling & prediction MRR waterfall dashboards Finance / SaaS metrics demos Interview take-homes

FAQ

How do I reconstruct total MRR?

Sort by month and take a running sum of mrr_delta — that's exactly what the preview chart plots. The mrr column gives each account's level after a movement.

Why don't all accounts have a churn row?

Accounts that are still active at "today" simply have no churn event yet — just like a live book. Their last row reflects their current state.

Is anything uploaded?

No — generation is 100% in your browser.