Guides#mrr#stripe#metrics

How to Calculate MRR from Stripe (The Right Way)

Most indie hackers calculate MRR wrong. This guide shows the exact formula to normalize Stripe subscriptions — monthly, annual, and quarterly — into accurate MRR.

Makerfolio··7 min read

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:

Does NOT count toward MRR:

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:

  1. Fetch all subscriptions with status: "active" only
  2. For each subscription, iterate the line items (not just the top-level amount)
  3. Normalize each item to monthly based on its recurring.interval and recurring.interval_count
  4. 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:

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:

The calculation runs in seconds and updates every time you sync.

Key Takeaways

  1. Never use Stripe's "Monthly revenue" dashboard number — it's not MRR
  2. Divide annual plans by 12, quarterly by 3, and use interval_count for custom intervals
  3. Use net MRR — after discounts, before or after Stripe fees depending on your preference (be consistent)
  4. Filter by status: "active" only — past_due and trialing don't count
  5. 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.

#mrr#stripe#metrics#indie-hacker
← All posts

Track what you just learned in Makerfolio.

Connect Stripe or Polar and get verified metrics on your public builder profile.

Start for free →
Published: February 10, 2026Updated: March 1, 2026