Stripe MRR Report: Current MRR, Churn and Plan Mix From Your Data
Updated October 2026
Master Monthly Recurring Revenue analysis to understand subscription growth, customer retention, and revenue trends in your Stripe account.
Introduction to MRR Analysis
If you're running a subscription-based business with Stripe, one question keeps you up at night: "What is my MRR?" Monthly Recurring Revenue (MRR) is the lifeblood of subscription businesses, providing a clear picture of predictable income and business health.
To see how many of your own customers churn and what separates the ones who leave, try the free churn analysis tool.
Unlike one-time sales, MRR represents the normalized monthly value of all your active subscriptions. It's the single most important metric for understanding whether your business is growing, stagnating, or declining. This tutorial will walk you through analyzing your MRR in Stripe, answering critical questions like:
- What is my current MRR and how is it trending?
- How many active subscriptions am I managing?
- What's my customer churn rate?
- Which pricing plans drive the most revenue?
By the end of this guide, you will know how to calculate MRR, active subscriptions, customer churn and plan mix from Stripe data, and what each of those numbers leaves out.
Prerequisites and Data Requirements
Before diving into MRR analysis, ensure you have the following in place:
Required Access
- Stripe Account Access: You need administrator or developer access to your Stripe account
- Active Subscriptions: At least one active subscription to analyze (test or production)
- API Keys: If using programmatic access, you'll need your Stripe API keys (available in your Stripe dashboard under Developers > API keys)
Recommended Timeline
- Minimum Data: At least 2-3 months of subscription data for meaningful trend analysis
- Ideal Data: Six or more months, so one unusual month is not mistaken for a trend
Technical Knowledge
- Basic understanding of subscription business models
- Familiarity with the Stripe dashboard (no coding required for basic analysis)
- Optional: Basic SQL or Python knowledge for advanced analysis
What You'll Accomplish
This tutorial guides you through a complete MRR analysis workflow. You'll learn to:
- Calculate your current MRR from Stripe subscription data
- Track the number of active subscriptions over time
- Compute your monthly churn rate
- Identify which pricing plans contribute most to revenue
- Visualize trends and make strategic decisions
Each step includes code and the output it prints. The outputs come from a synthetic Stripe subscription set generated for this tutorial, with annual, quarterly, multi-item, multi-seat, non-USD, metered, trialing and canceled subscriptions in it. It is not a real business, and your own numbers will differ.
Step 1: What Is My Current MRR?
MRR is the sum of all recurring revenue normalized to a monthly amount. This means annual subscriptions are divided by 12, quarterly by 3, and monthly subscriptions are counted as-is.
Using the Stripe Dashboard
- Log into your Stripe dashboard at
dashboard.stripe.com - Navigate to Billing > Subscriptions
- Click on Overview to see your MRR displayed prominently
- Note the current MRR value and the trend direction (up/down)
Calculating MRR Manually
For a deeper understanding or custom analysis, you can calculate MRR using the Stripe API:
import stripe
from datetime import datetime, timezone
stripe.api_key = 'your_secret_key'
DAYS_PER_MONTH = 365 / 12
def monthly_cents(item):
"""Monthly value of one subscription item in minor units, or None if it cannot be computed from unit_amount."""
price = item['price']
if price['unit_amount'] is None: # tiered or metered price: no fixed amount
return None
rec = price['recurring']
months = {'month': 1, 'year': 12, 'week': 7 / DAYS_PER_MONTH, 'day': 1 / DAYS_PER_MONTH}[rec['interval']] * rec['interval_count']
return price['unit_amount'] * item['quantity'] / months
# status='active' returns active subscriptions only; auto_paging_iter() walks every page
active = list(stripe.Subscription.list(status='active', limit=100).auto_paging_iter())
total_cents, skipped = 0, 0
for sub in active:
for item in sub['items']['data']:
if item['price']['currency'] != 'usd' or monthly_cents(item) is None:
skipped += 1 # other currency or metered: handle separately
continue
total_cents += monthly_cents(item)
total_mrr = total_cents / 100
print(f"Current MRR: ${total_mrr:,.2f}")
print(f"Items skipped (not USD, or no fixed unit amount): {skipped}")
Expected Output
Current MRR: $9,675.00
Items skipped (not USD, or no fixed unit amount): 3
Understanding the Result
Your MRR represents the predictable monthly revenue from subscriptions. In this synthetic example it is $9,675.00, which you can expect each month if nothing changes. The code counts every item on a subscription, multiplies by quantity, and divides by the number of months in the billing period (so a price billed every 3 months is divided by 3). It counts only subscriptions with status active: trialing and past_due subscriptions are left out, and so are the 3 items priced in another currency or without a fixed unit amount (metered or tiered prices). Decide how to treat those before you quote a single MRR figure. Stripe's list call returns one page at a time and, by default, leaves out canceled subscriptions, which is why the code pages through the results with auto_paging_iter().
Step 2: How Many Active Subscriptions Do I Have?
Understanding your subscription count helps you assess customer base growth and calculate important metrics like average revenue per user (ARPU).
Via Stripe Dashboard
- Navigate to Billing > Subscriptions
- Apply filter: Status = Active
- The total count appears at the top of the subscription list
- Note subscriptions in "trialing" status separately as they represent future MRR
Programmatic Count
import stripe
stripe.api_key = 'your_secret_key'
# A list response has no total_count: count by walking the pages
active_count = sum(1 for _ in stripe.Subscription.list(status='active', limit=100).auto_paging_iter())
trial_count = sum(1 for _ in stripe.Subscription.list(status='trialing', limit=100).auto_paging_iter())
print(f"Active Subscriptions: {active_count}")
print(f"Trialing Subscriptions: {trial_count}")
print(f"Total: {active_count + trial_count}")
Expected Output
Active Subscriptions: 175
Trialing Subscriptions: 9
Total: 184
Key Insights
- Active Subscriptions: These contribute to current MRR
- Trialing Subscriptions: Potential MRR if they convert to paid
- Growth Rate: Compare this month's count to last month to calculate subscription growth rate
Calculate your Average Revenue Per User (ARPU): MRR ÷ Active Subscriptions. In our example: $9,675.00 ÷ 175 = $55.29. This is approximate: the 175 includes 3 subscriptions whose value is not in the MRR, and a customer with several subscriptions is counted more than once. Divide by distinct customers if you want a per-customer figure.
Step 3: What Is My Churn Rate?
Churn rate measures the percentage of customers who cancel their subscriptions during a given period. It's one of the most critical metrics for subscription businesses because high churn directly undermines growth.
Understanding Churn Types
- Customer Churn: Percentage of customers who canceled
- Revenue Churn: Percentage of MRR lost from cancellations
Calculating Monthly Customer Churn
The formula: (Customers Lost During Month ÷ Customers at Start of Month) × 100. The opening group must be the customers who were subscribed at the start of the month, including those who canceled later; listing only the subscriptions that are active today would drop exactly the customers you are trying to count.
import stripe
from datetime import datetime, timezone
stripe.api_key = 'your_secret_key'
# UTC month boundaries: the month is [month_start, next_month_start)
month_start = int(datetime(2026, 9, 1, tzinfo=timezone.utc).timestamp())
next_month_start = int(datetime(2026, 10, 1, tzinfo=timezone.utc).timestamp())
# status='all' includes canceled subscriptions, which the default list leaves out
all_subs = list(stripe.Subscription.list(status='all', limit=100).auto_paging_iter())
def live_at(sub, t):
"""Was this subscription in force at time t? Created before t and not canceled before t."""
if sub['status'] in ('incomplete', 'incomplete_expired') or sub['created'] >= t:
return False
return sub['canceled_at'] is None or sub['canceled_at'] >= t
# Customers with at least one subscription in force at the start of the month
opening = {s['customer'] for s in all_subs if live_at(s, month_start)}
# Of those, customers with no subscription in force at the end of the month
still_there = {s['customer'] for s in all_subs if live_at(s, next_month_start)}
lost = opening - still_there
churn_rate = len(lost) / len(opening) * 100
print(f"Customers at Start: {len(opening)}")
print(f"Customers Lost: {len(lost)}")
print(f"Monthly Customer Churn Rate: {churn_rate:.2f}%")
Expected Output
Customers at Start: 189
Customers Lost: 10
Monthly Customer Churn Rate: 5.29%
Interpreting Churn Rate
The bands below are illustrative thresholds, not a sourced benchmark. What counts as acceptable depends on your segment, price point and contract length.
| Churn Rate | Assessment | Action Required |
|---|---|---|
| < 2% | Excellent | Maintain current retention strategies |
| 2-5% | Good | Monitor trends, optimize onboarding |
| 5-7% | Concerning | Investigate cancellation reasons, improve product value |
| > 7% | Critical | Immediate action needed, customer interviews, product-market fit review |
In this synthetic example, 10 of 189 customers is 5.29%, which falls in the "Concerning" band of the illustrative table. One month on 189 customers is a small sample: one or two customers more or fewer moves the rate by about half a point to a full point, so look at several months before acting. Exit surveys can help you learn why customers leave.
Understanding statistical significance in your churn analysis is crucial. Learn more about statistical significance in A/B testing to ensure your retention experiments yield reliable results.
Step 4: Which Plans Are Most Popular?
Analyzing plan distribution helps you understand which offerings resonate with customers and drive revenue. This insight informs pricing strategy and product development.
Via Stripe Dashboard
- Go to Products > Pricing
- Each price shows the number of active subscriptions
- Sort by "Subscriptions" to see most popular plans
Detailed Plan Analysis
import stripe
from collections import defaultdict
stripe.api_key = 'your_secret_key'
plan_stats = defaultdict(lambda: {'count': 0, 'mrr': 0.0})
for sub in active: # the active subscriptions fetched in Step 1
for item in sub['items']['data']:
cents = monthly_cents(item) # helper from Step 1
if item['price']['currency'] != 'usd' or cents is None:
continue
name = item['price']['nickname'] or item['price']['id']
plan_stats[name]['count'] += 1
plan_stats[name]['mrr'] += cents / 100
sorted_plans = sorted(plan_stats.items(), key=lambda x: x[1]['mrr'], reverse=True)
print(f"{'Plan Name':<30} {'Subscriptions':<15} {'MRR':<15}")
print("-" * 60)
for plan, stats in sorted_plans:
print(f"{plan:<30} {stats['count']:<15} ${stats['mrr']:>12,.2f}")
Expected Output
Plan Name Subscriptions MRR
------------------------------------------------------------
Professional Plan 41 $ 4,575.00
Starter Plan 73 $ 2,280.00
Enterprise Plan 5 $ 1,200.00
Basic Plan 40 $ 600.00
Professional Plan (annual) 10 $ 600.00
Team Plan (quarterly) 6 $ 420.00
Strategic Insights
Each row counts subscription items, so a subscription with two items appears in two rows, and the plan MRR values add up to the $9,675.00 from Step 1.
From this analysis, you can identify:
- Revenue Drivers: The Professional Plan (monthly) brings in $4,575 of the $9,675 MRR, about 47%, with fewer subscriptions than Starter
- Volume Leaders: Starter Plan has the most subscriptions (73), which makes it the main entry point in this data
- High-Value Segments: Enterprise is 5 of 175 subscription items (about 3%) but $1,200 of MRR (about 12%)
- Optimization Opportunities: Whether upselling Starter customers to Professional works is a question to test, not something this table shows
Interpreting Your Results
Now that you've gathered your MRR data, active subscription counts, churn rate, and plan distribution, it's time to synthesize these metrics into actionable insights.
Calculating Key Performance Indicators
1. MRR Growth Rate
Formula: ((Current Month MRR - Previous Month MRR) ÷ Previous Month MRR) × 100
Hypothetical example:
Current MRR: $9,675.00
Previous MRR: $9,100.00
Growth Rate: ((9,675.00 - 9,100.00) / 9,100.00) × 100 = 6.32%
2. Net MRR Churn
This accounts for both lost revenue (downgrades/cancellations) and gained revenue (upgrades/expansion):
Net MRR Churn = ((Churned MRR - Expansion MRR) ÷ Starting MRR) × 100
Hypothetical example:
Starting MRR: $9,100.00
Churned MRR: $520.00
Expansion MRR: $700.00
Net MRR Churn: ((520 - 700) / 9,100) × 100 = -1.98% (negative means expansion outweighed losses)
3. Customer Lifetime Value (LTV)
A rough estimate of the revenue a customer generates over their lifetime. It uses revenue, not margin, and assumes churn stays constant:
LTV = ARPU ÷ Monthly Churn Rate
Example from the figures above:
ARPU: $55.29
Churn Rate: 5.29% (0.0529)
LTV: $55.29 ÷ 0.0529 = about $1,045
Health Check Framework
Use this framework as a starting checklist. The ranges are illustrative assumptions, not sourced benchmarks, and healthy values differ by business stage, price point and segment:
| Metric | Healthy Range | Warning Signs |
|---|---|---|
| MRR Growth Rate | > 10% monthly | < 5% for 3+ months |
| Customer Churn | < 5% monthly | > 7% or increasing trend |
| Net MRR Churn | < 0% (negative) | > 2% positive |
| LTV:CAC Ratio | > 3:1 | < 2:1 |
Trend Analysis
Single-point measurements only tell part of the story. Track these metrics over time:
- Weekly MRR: Identify seasonal patterns and campaign impact
- Monthly Cohorts: Track retention by signup month
- Plan Migration: Monitor upgrade and downgrade patterns
- Churn Reasons: Categorize cancellations to identify systemic issues
Cohort tables and survival curves can show patterns in your subscription data that a single month's metrics hide.
Run It on Your Own Stripe Export
Export your subscriptions from Stripe as a CSV and upload it at MCP Analytics. The analysis returns the MRR, active subscription count, customer churn rate and plan breakdown that this tutorial's steps compute. You choose the columns; nothing connects to your Stripe account.
Common Issues and Solutions
Issue 1: MRR Doesn't Match Revenue
Problem: Your calculated MRR differs from actual revenue received.
Cause: MRR represents normalized recurring revenue, not actual cash flow. One-time charges, failed payments, and billing timing create discrepancies.
Solution:
- Exclude one-time charges from MRR calculations
- Account for failed payments in a separate "at-risk MRR" metric
- Use MRR for growth trends, not cash flow projections
Issue 2: Churn Rate Seems Too High
Problem: Your churn rate exceeds 7-10% monthly.
Cause: Poor product-market fit, inadequate onboarding, pricing issues, or competitive pressure.
Solution:
- Implement exit surveys to understand cancellation reasons
- Segment churn by plan, tenure, and acquisition channel
- Improve onboarding with targeted emails and product tours
- Consider retention campaigns (pause plans, discounts) before cancellation
- Interview churned customers to identify product gaps
Issue 3: Subscription Count Increasing, But MRR Flat
Problem: You're acquiring customers but revenue isn't growing proportionally.
Cause: New customers choosing lower-tier plans while high-value customers churn (negative revenue mix).
Solution:
- Analyze ARPU trends over time
- Segment new subscriptions by plan tier
- Review marketing channels: are you attracting the right customers?
- Implement upgrade incentives for starter-tier customers
- Focus acquisition on higher-value customer segments
Issue 4: API Rate Limits When Fetching Subscriptions
Problem: Stripe API returns rate limit errors when processing many subscriptions.
Cause: Exceeding Stripe's API rate limits, which Stripe documents separately for test and live mode.
Solution:
import stripe
stripe.api_key = 'your_secret_key'
# The library retries connection errors and conflict or lock-timeout responses; a plain rate-limit 429 is raised as RateLimitError, so back off yourself
stripe.max_network_retries = 3
def fetch_all_subscriptions():
# status='all' includes canceled; auto_paging_iter() follows has_more for you
return list(stripe.Subscription.list(status='all', limit=100).auto_paging_iter())
try:
subscriptions = fetch_all_subscriptions()
except stripe.RateLimitError:
# not retried by the library: sleep with exponential backoff and jitter, or fetch in smaller date ranges with the created filter
raise
Issue 5: Difficulty Tracking MRR Changes Over Time
Problem: Understanding what drove MRR changes requires manual investigation.
Cause: Stripe doesn't provide built-in MRR movement categorization.
Solution: Implement MRR movement tracking:
- New MRR: Revenue from new subscriptions
- Expansion MRR: Revenue from upgrades and add-ons
- Contraction MRR: Revenue lost from downgrades
- Churned MRR: Revenue lost from cancellations
Use Stripe webhooks to track subscription lifecycle events and categorize MRR changes as each event arrives.
Next Steps with Stripe Analytics
You have now seen the fundamentals of MRR analysis in Stripe. Here are advanced topics to explore next:
1. Cohort Retention Analysis
Track how customer cohorts (grouped by signup month) retain over time. This reveals whether your product is improving at retaining customers and helps predict long-term value.
2. Revenue Forecasting
Use historical MRR growth, churn rates, and seasonality to project future revenue. This is critical for fundraising, hiring plans, and strategic planning.
3. Advanced Segmentation
Segment your MRR analysis by:
- Acquisition Channel: Which marketing channels drive highest-value customers?
- Geographic Region: Do certain markets have better retention or ARPU?
- Customer Characteristics: Company size, industry, or use case
- Product Usage: Correlate feature adoption with retention
4. Churn Prediction
Build machine learning models to identify at-risk customers before they cancel. Techniques like Accelerated Failure Time (AFT) models can help predict subscription lifetime based on customer behavior.
5. Pricing Optimization
Experiment with pricing changes using controlled tests. Understand how to apply ensemble learning methods like AdaBoost to optimize pricing based on customer characteristics and behavior patterns.
6. Payment Recovery
Analyze failed payment patterns and implement dunning strategies to recover revenue from involuntary churn (expired cards, insufficient funds).
Recommended Resources
- Stripe Sigma: SQL-based reporting directly on your Stripe data
- Stripe Webhooks: Notifications for subscription events as they happen
- Customer Success Platforms: Tools like ChurnZero or Catalyst for proactive retention
- Data Warehouses: Export Stripe data to Snowflake or BigQuery for advanced analysis
Conclusion
Understanding your MRR is fundamental to operating a successful subscription business. By systematically analyzing your current MRR, active subscriptions, churn rate, and plan distribution, you gain the insights needed to make informed decisions about growth, retention, and product strategy.
The metrics you've learned to calculate (MRR growth rate, customer churn, ARPU, and LTV) form the foundation of subscription business analytics. Track these consistently, identify trends early, and take action when metrics signal opportunity or risk.
Remember that MRR analysis is not a one-time exercise but an ongoing discipline. Set up weekly or monthly reviews, automate data collection where possible, and share insights across your organization. The businesses that win in subscription markets are those that deeply understand their metrics and act on them quickly.
To run these calculations on your own subscriptions without writing code, see the "Run It on Your Own Stripe Export" section above.
Explore more: Stripe Analytics: all tools, tutorials, and guides →
Not sure which plan? Compare plans →