Every board meeting starts with the MRR chart, and every investor asks "what's your MRR growth rate?" Yet most SaaS founders at $50K-$5M ARR track MRR in a spreadsheet or rely on Stripe's basic dashboard, which shows the number but not the story behind it. They cannot explain why MRR dipped in March or which plan tier is driving growth. This analysis gives you a proper MRR decomposition -- new MRR, churned MRR, net movement, churn rate, ARPU, and plan-level breakdowns -- from a simple Stripe export.
Worked Example (Simulated): How Do New and Canceled Subscriptions Change MRR?
Question: How do new and canceled subscriptions change monthly recurring revenue (MRR), and which plans make up the total?
Inputs: Made-up data with no random draws. The plan prices are set by hand: Basic $20, Pro $50, Enterprise $100 per month. The list of seven subscriptions, with start months and first inactive months, is also typed by hand. A subscription counts as active from its start month up to, but not including, its first inactive month.
Method: For each month, add the plan prices of the active subscriptions. New MRR is the price total for subscriptions that start that month. Churned MRR is the price total for subscriptions that end that month. Churn rate is cancellations in the month divided by active subscriptions in the prior month.
plan_names = ("Basic", "Pro", "Enterprise")
prices = {"Basic": 20, "Pro": 50, "Enterprise": 100}
# end_month is the first month no longer active; None means still active.
subscriptions = [
("S1", "Basic", 1, None),
("S2", "Pro", 1, 4),
("S3", "Basic", 2, 6),
("S4", "Enterprise", 3, None),
("S5", "Pro", 4, None),
("S6", "Basic", 5, 6),
("S7", "Basic", 6, None),
]
print("Made-up data, no random draws")
print("Plan prices:")
for plan in plan_names:
print(f"{plan}: ${prices[plan]} per month")
print("\nSubscription inputs (id, plan, start month, first inactive month):")
for sid, plan, start, end in subscriptions:
print(f"{sid}, {plan}, {start}, {end if end is not None else 'active'}")
def money(v):
return f"-${-v}" if v < 0 else f"${v}"
print("\nMonth | MRR | New MRR | Churned MRR | Net change | Active "
"| Cancellations | Churn rate")
previous_mrr = 0
previous_active_count = 0
for month in range(1, 7):
active = [(sid, plan, start, end) for sid, plan, start, end
in subscriptions
if start <= month and (end is None or month < end)]
mrr = sum(prices[plan] for _, plan, _, _ in active)
new_mrr = sum(prices[plan] for _, plan, start, _ in active
if start == month)
canceled = [(sid, plan, start, end) for sid, plan, start, end
in subscriptions if end == month]
churned_mrr = sum(prices[plan] for _, plan, _, _ in canceled)
cancellations = len(canceled)
churn_rate = (cancellations / previous_active_count * 100
if previous_active_count else 0.0)
print(f"{month} | ${mrr} | ${new_mrr} | ${churned_mrr} | "
f"{money(mrr-previous_mrr)} | {len(active)} | {cancellations} | "
f"{churn_rate:.1f}%")
previous_mrr = mrr
previous_active_count = len(active)
print("\nMonth 6 MRR by plan:")
for plan in plan_names:
active_count = sum(1 for _, p, start, end in subscriptions
if p == plan and start <= 6
and (end is None or 6 < end))
total = active_count * prices[plan]
print(f"{plan}: ${total} from {active_count} active")
print("Method: monthly plan price times active count; churn rate equals "
"cancellations in a month divided by the prior month's active count.")
Printed output:
Made-up data, no random draws
Plan prices:
Basic: $20 per month
Pro: $50 per month
Enterprise: $100 per month
Subscription inputs (id, plan, start month, first inactive month):
S1, Basic, 1, active
S2, Pro, 1, 4
S3, Basic, 2, 6
S4, Enterprise, 3, active
S5, Pro, 4, active
S6, Basic, 5, 6
S7, Basic, 6, active
Month | MRR | New MRR | Churned MRR | Net change | Active | Cancellations | Churn rate
1 | $70 | $70 | $0 | $70 | 2 | 0 | 0.0%
2 | $90 | $20 | $0 | $20 | 3 | 0 | 0.0%
3 | $190 | $100 | $0 | $100 | 4 | 0 | 0.0%
4 | $190 | $50 | $50 | $0 | 4 | 1 | 25.0%
5 | $210 | $20 | $0 | $20 | 5 | 0 | 0.0%
6 | $190 | $20 | $40 | -$20 | 4 | 2 | 40.0%
Month 6 MRR by plan:
Basic: $40 from 2 active
Pro: $50 from 1 active
Enterprise: $100 from 1 active
Method: monthly plan price times active count; churn rate equals cancellations in a month divided by the prior month's active count.
Result: MRR rises from $70 in month 1 to $210 in month 5, then falls to $190 in month 6. In month 6, new MRR is $20 and churned MRR is $40, a net change of -$20. Month 6 MRR is $40 from Basic, $50 from Pro and $100 from Enterprise. In this example month 6 has more canceled MRR than new MRR because the list was written that way.
Limit: This is a small made-up example, not a forecast or a guide to typical churn. Real results depend on the source data and the rules used to treat free periods, annual plans, pauses, refunds, and plan changes.
Why the Top-Line MRR Number Is Not Enough
A company with $50,000 MRR could be adding $8,000 in new subscriptions each month while losing $7,500 to cancellations -- net growth of just $500 that masks serious churn. Or it could be adding $3,000 with only $500 in churn -- slower gross growth but far healthier fundamentals. The top-line number tells you nothing about the engine underneath.
This is not a theoretical problem. Understanding whether your growth is real -- new customers outpacing churn -- or artificial -- new acquisition barely replacing lost revenue -- is the difference between a fundable company and a treadmill.
Dedicated SaaS metrics tools like ChartMogul or Baremetrics are paid products (see each for current pricing), and their dashboards still leave the interpretation to you. If you are pre-Series A with $50K-$5M ARR, you need the report, not another dashboard subscription. Upload your Stripe export, get the decomposition, share the PDF with your board.
What the Report Shows You
MRR growth trend
The worked example above shows MRR month by month from a made-up subscription list. The shape of this line tells the story of your business. A steadily rising line means growth is working. A flattening line is the earliest warning sign that growth is stalling -- often months before it shows up in quarterly revenue. A declining line means churn is winning. The report computes your current MRR and month-over-month growth rate as headline KPIs.
MRR movement: new vs. churned
A grouped bar chart showing new MRR and churned MRR side by side for each month. This is where the real story lives. A month where you added $12,000 in new MRR but lost $9,000 to churn looks like $3,000 net growth on the trend line -- respectable until you see that 75% of your effort went to replacing lost revenue rather than growing. Watch for months where churned MRR exceeds new MRR. Even one month of negative net MRR deserves investigation. Was there a price increase? A product outage? A competitor launch? Seasonal B2B budget cuts?
Revenue by plan tier
Current MRR contribution by subscription tier. This answers the question every SaaS founder needs to confront: where does the money actually come from? Use the worked example above to see how plan prices and active subscriptions add up to MRR by plan. The plan summary table shows subscriber count, total MRR, and average revenue per subscriber for each tier -- critical for pricing decisions and deciding where to focus sales effort.
Churn rate trend
Monthly subscriber churn rate plotted over time. Churn compounds. If a 5% monthly churn rate held for 12 months, about 46% of customers would be gone (1 - 0.95^12). A creeping increase from 2% to 4% over six months is a structural problem. A single spike to 8% is an event. The distinction matters because the fix is completely different.
Monthly metrics table
Total MRR, active subscribers, new subscriptions, cancellations, churn rate, ARPU, and month-over-month growth for every month. This is the table you paste into investor updates or hand to your finance team. Every number is computed from your actual Stripe data.
SaaS KPI summary
Four vital signs at a glance: current MRR, MoM growth rate, current churn rate, and ARPU. These four numbers tell you whether things are on track.
When to Use MRR Analysis
- Board meeting preparation -- the MRR decomposition and trend charts are exactly what board decks need. Growth plus context, not just a number.
- Investor updates -- net MRR, churn rate, and ARPU are the three metrics every SaaS investor asks for. Having them broken down by tier shows operational maturity.
- After a pricing change -- measure the immediate impact on new MRR, churn, and ARPU. A price increase that spikes churn temporarily but raises ARPU permanently is often worth it -- this analysis quantifies the tradeoff.
- Monthly operating review -- track whether the business is getting healthier or leaking. The movement chart makes the "leaky bucket" problem visible immediately.
- Deciding which plan tier to sunset or invest in -- if Basic has the most subscribers but the highest churn and lowest ARPU, the math might say sunset it or redesign it.
What Data Do You Need?
A Stripe subscription export as CSV. Go to Stripe Dashboard, Billing, Subscriptions, Export.
Required columns
- Subscription ID -- unique identifier for each subscription
- Customer ID -- ties subscriptions to customers
- Status -- active, canceled, trialing, or past_due
- Plan name -- tier name (Basic, Pro, Enterprise)
- Plan amount -- price in cents (4900 = $49.00)
- Billing interval -- month or year
- Start date -- when the subscription was created
- End date -- cancellation date (blank for active subscriptions)
For meaningful trends, you need at least 50 subscriptions across 3 or more months. The analysis works best with 200+ subscriptions and 6+ months of history, giving enough data points for trend lines and churn rates to stabilize. Works with Chargebee, Recurly, Paddle, or any system that exports equivalent columns -- the tool maps column names during upload.
One common pitfall: Stripe stores amounts in cents. If your export already shows dollar amounts ($49.00 rather than 4900), the analysis detects and adjusts. Annual plans are normalized to monthly values automatically (dividing by 12).
What to Do With the Results
Immediate
- Build your board slide -- use the MRR trend chart and movement chart together. "We grew from $12K to $31K MRR over nine months, but churn accelerated in months 7-9 as early cohorts reached renewal. Now retention is the priority."
- Benchmark your churn -- use a benchmark that matches your customer segment and states how churn was measured.
- Identify the leaky tier -- if one plan accounts for a disproportionate share of cancellations, investigate whether the product delivers enough value at that price point to justify continued payment.
Strategic
- Pair with churn prediction -- MRR analysis shows you the aggregate picture; churn prediction identifies the individual accounts at risk right now
- Feed into revenue forecasting -- the monthly MRR values from this analysis are the input for revenue forecasting, which projects where MRR is heading with confidence intervals
- Track net revenue retention -- NRR above 100% means existing customers are worth more this month than last.
When to Use Something Else
- Want to predict which customers will churn: Use churn prediction -- it flags at-risk accounts before they cancel.
- Want to project MRR forward for board decks: Use revenue forecasting -- it produces 6-month projections with confidence intervals.
- Want to see if retention is improving across signup cohorts: Use cohort retention analysis -- it shows whether newer cohorts are stickier than older ones.
- Want per-customer lifetime value predictions: Use CLV modeling -- it estimates how much each customer is worth over time.
- Data is one-time purchases, not subscriptions: MRR analysis does not apply. Use revenue trend analysis for non-recurring revenue.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai