Calculating MRR from Stripe seems simple until you actually try it.
You open the Stripe dashboard, look at "Monthly revenue," and think you're done. You're not. That number includes one-time charges, refunds, and trial conversions in the same bucket as your actual recurring subscriptions. For any business with more than one pricing plan or billing interval, it's almost certainly wrong.
Here's how to do it correctly.
The Core Problem: Billing Intervals
Stripe lets customers pay monthly, annually, quarterly, or on any custom interval you define. MRR normalizes all of these to a monthly figure — which means you can't just sum up what Stripe charged last month.
The rule is simple:
MRR contribution = subscription amount / billing interval in months
| Billing interval | Formula | Example ($120 plan) | |-----------------|---------|---------------------| | Monthly | amount × 1 | $120 MRR | | Annual | amount / 12 | $10 MRR | | Quarterly | amount / 3 | $40 MRR | | Semi-annual | amount / 6 | $20 MRR |
The most common mistake: counting annual subscribers at their full annual charge. A customer paying $1,200/year contributes $100/month to MRR — not $1,200, not $0.
What Counts as MRR (and What Doesn't)
Counts toward MRR:
- Active recurring subscriptions, normalized to monthly
- Subscriptions with trials that have converted to paid
- Discounted subscriptions (use the discounted amount, not list price)
Does NOT count toward MRR:
- One-time charges (setup fees, consulting, LTD sales)
- Free trials that haven't converted
- Paused subscriptions
- Past-due subscriptions where payment has failed
- Refunded charges
This last one catches people out. If a customer's payment failed last week and they're past_due in Stripe, they shouldn't be in your MRR until it clears. Stripe doesn't automatically remove them from "active" — you need to filter by status explicitly.
The Correct Stripe API Query
To pull accurate MRR from the Stripe API, you need to:
- Fetch all subscriptions with
status: "active"only - For each subscription, iterate the line items (not just the top-level amount)
- Normalize each item to monthly based on its
recurring.intervalandrecurring.interval_count - Sum everything
The interval_count field matters. A plan billed every 3 months has interval: "month" and interval_count: 3. Don't forget to divide by interval_count.
function normalizeToMonthly(
amount: number,
interval: string,
intervalCount: number
): number {
switch (interval) {
case "day": return (amount / intervalCount) * 30;
case "week": return (amount / intervalCount) * 4.33;
case "month": return amount / intervalCount;
case "year": return amount / (intervalCount * 12);
default: return 0;
}
}
Net MRR vs Gross MRR
Always use net MRR — that means after discounts and Stripe fees. Gross MRR inflates your number and doesn't reflect what actually hits your bank.
The difference compounds quickly. If you have $5K gross MRR with 15% in coupons and a 2.9% Stripe fee, your net MRR is closer to $4,200. Reporting $5K to yourself (or publicly) gives you a distorted picture of your business health.
Handling Multi-Currency
If you have customers in multiple currencies, normalize everything to a single base currency before summing. Use the exchange rate at the time of calculation — not the time of subscription creation.
Makerfolio handles this automatically by reading each subscription's currency from Stripe and converting to USD at the current rate on sync.
Why This Is Harder Than It Sounds
The real difficulty isn't the math — it's the edge cases:
- Subscription with multiple items: some Stripe subscriptions have multiple line items (base plan + add-ons). Sum all items.
- Coupons: percent-off and amount-off coupons both reduce the effective MRR.
- Trials with a trial end: the subscription is
activebut revenue hasn't started. Filter these out or treat as $0 until trial ends. - Metered billing: usage-based subscriptions don't have a fixed amount at subscription level. You need to look at actual usage charges from the previous period.
The Shortcut: Connect Makerfolio
If this sounds like a lot of work — it is. Makerfolio handles all of it automatically. Connect your Stripe account with a read-only restricted key, and Makerfolio:
- Fetches all active subscriptions
- Normalizes every billing interval correctly
- Handles multi-currency conversion
- Excludes trials, failed payments, and one-time charges
- Displays the verified net MRR on your public profile
The calculation runs in seconds and updates every time you sync.
Key Takeaways
- Never use Stripe's "Monthly revenue" dashboard number — it's not MRR
- Divide annual plans by 12, quarterly by 3, and use
interval_countfor custom intervals - Use net MRR — after discounts, before or after Stripe fees depending on your preference (be consistent)
- Filter by
status: "active"only — past_due and trialing don't count - Sum line items, not subscription totals, to handle add-ons correctly
Getting MRR right is foundational. Every other metric — churn, NRR, LTV — is built on top of it. Get it wrong and everything downstream is wrong too.