close

DEV Community

houseofmvps
houseofmvps

Posted on

Your SaaS is leaking money right now. Here's how to find it in 60 seconds.

I’m going to show you something that most SaaS founders have never checked

It takes 60 seconds and it might ruin your morning.


Open your Stripe dashboard. Go to Payments. Filter by status: Failed. Set the date range to the last 90 days.

Add up the numbers.

That total?

That’s revenue you billed for but never collected. Customers who didn’t cancel their payments just broke. And unless you did something about each one individually, that money is gone.


I’ve been building a payment recovery tool

For the past few months, I’ve talked to dozens of SaaS founders.

Almost none of them had ever run this filter.

The number is usually between 5% and 12% of total billings.

On $20K MRR, that’s $1,000 to $2,400 every single month that silently disappears.


Why it happens

Subscription payments fail for a handful of reasons, and they’re more mundane than you’d expect.

Insufficient funds account for roughly 44–47% of all card declines.
This is the biggest bucket by far. The customer’s card is valid, they haven’t cancelled, they just don’t have enough balance on billing day. This is especially common with debit cards.

Fraud detection flags cause another 15–20%.
Most of these are false positives the bank’s algorithm flagged a recurring charge as suspicious. The customer has no idea this happened.

Expired or reissued cards make up about 10–12%.
Visa says roughly 30% of all cards get reissued in any given year. When that happens, the old card number on file stops working. Unless the customer proactively updates it (they won’t), the next charge fails.

The rest is a mix of card limits, incorrect details from card reissuance, processor errors, and the dreaded “do not honor” generic decline that issuers throw when they don’t want to tell you the real reason.


What Stripe does about it and what it doesn’t

Stripe has a feature called Smart Retries. If you’re on Stripe Billing, it’s on by default. It uses an ML model trained on hundreds of billions of data points across the entire Stripe network to figure out the best time to retry a failed charge.

The model considers over 500 signals card issuer patterns, time of day, day of week, customer activity, even debit card payday cycles.

It’s genuinely impressive engineering.

Stripe says it recovers $9 in revenue for every $1 spent on Billing.

But here’s what Smart Retries don’t do:

They don’t email your customer.
They don’t send an SMS.
They don’t alert you that a VIP account is past due.
They don’t warn a customer whose card is about to expire.
They don’t put up an in-app banner asking the customer to update their payment method.

Smart Retries handle the charge retry.

Everything else the outbound communication, the pre-dunning, the urgency creation, the one-click card update links is on you.

And “on you” usually means “doesn’t happen.”


The gap is where the money lives

The gap between what Stripe recovers automatically and what a proper dunning system recovers is where your lost revenue sits.

Third-party sources estimate Smart Retries alone recover somewhere around 38% of failed payments.

The best dedicated dunning systems push recovery to 50–70%, according to Churn Buster’s published data across their client base.

That 20–30 percentage point gap, applied to your specific failed payment volume, is the dollar amount you’re currently leaving on the table every month.


Here’s the math on a real SaaS business

$20,000 MRR

About 13% of recurring charges decline monthly (Recurly’s benchmark across 1,200 sites).

That’s $2,600/month in failed charges.

Stripe Smart Retries recover ~38%, getting back roughly $988.

The remaining $1,612 needs human-scale intervention:
an email, an SMS, a warning before the card expires.

A proper dunning system recovering at 55% would get back $1,430 — an incremental $442/month over Stripe alone.

That’s $5,304/year in revenue that was already yours, from customers who never wanted to leave.


What you can do right now, for free

Before you buy any tool, do three things:

First

Run that Stripe filter I mentioned.

Know your number.

It’s the most important metric in your business that you’re not tracking.


Second

Set up a webhook listener for invoice.payment_failed.

When it fires, send an email from your own domain
(not noreply@, not billing@ a real address that someone reads)

Include a link to Stripe’s Customer Portal where the customer can update their card.

You can generate a portal session URL via:

stripe.billingPortal.sessions.create()
Enter fullscreen mode Exit fullscreen mode

Takes maybe an afternoon of work.


Third

Pull card expiry data from the Stripe API.

The PaymentMethod object has:

  • card.exp_month
  • card.exp_year

Write a daily cron that checks for cards expiring in the next 30 days and emails those customers a heads up.

This alone prevents a meaningful chunk of failures from ever happening.


If you want this fully automated

I built SaveMRR for exactly this use case.

$19/month for bootstrapped SaaS founders.

There’s a free Revenue Scan that:

  • Connects to your Stripe (read-only)
  • Uses restricted API keys
  • AES-256 encrypted
  • Shows you the exact dollar amount you’re losing

Takes 60 seconds. No credit card needed.

👉 https://savemrr.co


But honestly

Start with the Stripe filter.

The number will motivate everything else.


Top comments (0)