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.
Each row is one MRR movement for an account in a given month. Sum the deltas to reconstruct MRR, build cohorts, or compute NRR.
| Column | Type | Description |
|---|---|---|
| month | date | First of the month the movement occurred. |
| account_id / account | int / text | The subscribing company. |
| movement | text | new, expansion, contraction, or churn. |
| plan | text | Starter / Pro / Business / Enterprise. |
| seats | integer | Active seats after the movement (0 on churn). |
| mrr | number | Account MRR after the movement. |
| mrr_delta | number | Change in MRR from this movement (negative for contraction/churn). |
| region / industry | text | Firmographic dimensions for segmentation. |
| anomaly | 0/1 | Present only with injection on; flags suspicious churn events. |
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.
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.
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.
No — generation is 100% in your browser.