
How to Identify Revenue Leaks in Your B2B SaaS Business
To find revenue leaks in a B2B SaaS business, compare contract, invoice and cash collected for every account, then run seven checks: failed payments, unbilled usage, discount drift, renewals on old pricing, seat and entitlement mismatch, missed expansion, and downgrades with no save attempt. Vendor data gives a sense of scale: Recurly reports 1.25% annual involuntary churn out of 3.60% total, and Stripe says its tools recover 55% of failed payments on average. Stripe Billing (Smart Retries, 8 tries within 2 weeks) and Chargebee (up to 12 smart retries) address billing leaks, and ChartMogul (free to $10K MRR) detects them through MRR movements. Quivly, a customer success platform, helps only with expansion and renewal-risk follow-up.
This article is for informational purposes only and does not constitute financial, tax, or legal advice. Consult a qualified professional for guidance specific to your situation.
Reviewed for financial accuracy by the Startup Finance Guide editorial team. Our editors cross-reference all claims against platform documentation, pricing pages, and primary regulatory sources. Last reviewed: October 12, 2026.
To identify revenue leaks in a B2B SaaS business, put three numbers side by side for every account (what the contract says, what you invoiced, what you collected) and chase every gap through seven checks: failed payments, unbilled usage, discount drift, renewals on old pricing, seat and entitlement mismatch, missed expansion, and downgrades or cancellations nobody tried to save. Failed payments are the quickest to size. On Recurly's churn benchmark page, which reports July 2026 data from its own customer network, involuntary churn runs at 1.25% a year against 3.60% overall, so roughly a third of churn there involves no decision by the customer at all. The data you need already sits in your billing system, your CRM and your product database. Four tools come up in this guide because each covers a different part of the job: Stripe Billing (retries and recovery), Chargebee (dunning, entitlements and contract terms), ChartMogul (MRR movements) and Quivly (expansion and renewal-risk signals for the customer success team).
Key takeaways
- A revenue leak is money a customer owes, or would have paid, that never reaches you because of a payment failure, a billing setup error or a follow-up nobody made. It rarely shows up as a cancellation.
- Seven checks cover most of it. Five are billing reconciliations a finance person can run from exports. The other two (missed expansion, unsaved downgrades) sit with customer success.
- Vendor benchmarks give a rough sense of scale, and they are vendor data. Recurly reports 1.25% annual involuntary churn out of 3.60% total. Baremetrics says its average customer has about 9% of MRR exposed to failed payments. Stripe says businesses on its tools recover 55% of failed payments on average.
- Billing tools fix billing leaks. Stripe's Smart Retries default to 8 attempts within 2 weeks and Chargebee's Smart mode retries up to 12 times. Neither will tell you that a customer has outgrown their plan.
- Quivly is a customer success platform, so it belongs in the last two checks only. It reads Stripe data but does not bill, retry cards or reconcile invoices.
The seven leak types and how to measure each
| Leak type | Data you already have | How to measure it | Usual owner |
|---|---|---|---|
| Failed payments (involuntary churn) | Billing system subscription and invoice exports | Involuntary churned MRR divided by total churned MRR, and failed invoices by decline code | Billing ops or finance |
| Unbilled usage and overage | Metering or product database, invoice line items | Billable units consumed minus units invoiced, per account per period | Finance and engineering |
| Discount and contract-term drift | Signed order forms, coupon list in billing | Active discounts past their contracted end date, in MRR | Finance |
| Renewals on old pricing | Renewal dates, price book, contract uplift clauses | Renewed MRR at old price versus MRR the uplift clause allowed | Finance and account owners |
| Seat and entitlement mismatch | Active users and feature flags, billed quantities | Active seats minus billed seats, and features in use that are not on the plan | Finance and product |
| Missed expansion | Usage against plan limits, CRM opportunities | Accounts above a usage threshold with no open opportunity or task | Customer success |
| Downgrade or churn with no save attempt | Cancellation and downgrade events, CRM activity log | Share of lost or contracted MRR with no logged contact in the prior 60 days | Customer success |
The first five are arithmetic. The last two produce estimates of what might have been sold or saved, never amounts owed.
What counts as a revenue leak in B2B SaaS
A revenue leak is revenue you contracted or earned but did not collect, plus revenue a willing customer would have paid if someone had asked. MGI Research, an analyst firm that covers billing systems, defines revenue leakage more narrowly as "the variance between contractually obligated revenue and actual recognized revenue". That strict version covers the billing checks below. Missed expansion and unsaved churn fall outside it, and we include them because the fix sits in the same account-by-account review.
Leaks differ from ordinary churn in one respect: the customer has not decided anything. A card expired, a coupon never ended, a meter dropped events, a renewal rolled over at a three-year-old price. Each of those sits in your own process.
How to identify revenue leaks in seven steps
Start with the ten largest accounts if you have never done this. For each, open the signed order form, the last three invoices and the payment records. If all ten match, widen the sample. If one does not, you already know which step to run across the whole base.
Step 1: Separate failed-payment churn from cancellations
Export every subscription that ended in the last 12 months and tag each as voluntary (the customer asked to cancel or gave notice) or involuntary (the subscription ended after a payment failed). On Stripe this tag already exists. The subscription object carries a cancellation_details.reason field with the value payment_failed when a subscription was cancelled automatically after failed payments, and cancellation_requested when the customer asked.
Then calculate two numbers:
- Involuntary churn rate: customers lost to failed payments in the period, divided by customers at the start of the period. Baremetrics uses the same formula.
- Involuntary share: involuntary churned MRR divided by total churned MRR.
For context, Recurly's benchmark page puts overall annual churn across its network at 3.60%, with 2.34% voluntary and 1.25% involuntary. That is Recurly's own customer base, which skews toward card-paying subscription businesses, and the page's per-industry figures are not fully consistent with each other, so treat it as a rough reference. A B2B company that invoices large customers by bank transfer will see far less involuntary churn and far more late payment, which is a collections problem and needs an accounts receivable ageing report instead.
Next, pull the last 90 days of failed charges with decline code, amount and customer, group by code, and sort by dollars. Stripe's decline code reference says what each one needs: expired_card means the customer must use another card, insufficient_funds calls for an alternative payment method, and do_not_honor sends the customer to their issuer. Mark the hard declines separately. Stripe's retry documentation lists nine codes it cannot retry without a new payment method, among them lost_card, stolen_card and authentication_required. Sort by dollars and not by count, because two failed annual invoices can outweigh fifty monthly ones.
Step 2: Reconcile usage against what you invoiced
For usage-based and hybrid plans, compare what customers consumed with what you billed them.
- Export billable usage per account for the last three billing periods from your metering system or product database.
- Export invoiced usage and overage lines for the same accounts and periods.
- Join the two on account and period. List every account that exceeded its included allowance with no overage line.
- Check event timing. Usage that arrives after the invoice is finalised is a common way for consumption to fall off the bill.
Do the join in a spreadsheet the first time. When the same gap repeats across accounts, one metering or aggregation fault is usually behind it, so a single fix recovers many accounts. If you bill usage through Stripe, the meter is the object to inspect: a Stripe meter defines how usage events are aggregated over the billing period, and a meter with the wrong aggregation will produce wrong invoices that look perfectly normal.
Clean usage-to-invoice data also feeds everything downstream, including the forecasting approaches in our guide to affordable revenue forecasting tools for usage-based SaaS.
Step 3: Audit discounts against contract terms
List every active coupon, promotion and custom price in the billing system with its end date. Compare each against the signed order form. You are looking for discounts that should have ended and did not.
The cause is usually a default nobody questioned. A Stripe coupon, for instance, can be set to apply once, for a fixed number of months, or with duration=forever. A sales rep who promised 20% off for the first year and picked "forever" in the dashboard has created a permanent discount. Sum the MRR under every discount that has outlived its contract term. That figure is the leak.
Custom prices created for a single deal are worse: they carry no end date at all, so the only record of the intended term is the contract.
Step 4: Check renewals against your current price book
Pull every renewal from the last 12 months. For each, record the price before renewal, the price after, and what the contract allowed (a fixed uplift percentage, a move to list price, or nothing). Renewed MRR at the old price, minus the MRR the uplift clause permitted, is the leak.
This one hides well because auto-renewal works exactly as designed. The invoice goes out, the customer pays, and nobody notices that the contracted 7% uplift never reached billing.
Some of this will be deliberate. Grandfathering old customers on old prices is a legitimate choice, and Chargebee even has a documented grandfathering feature for entitlements. The test is whether someone decided it. Split your result into "agreed exception" and "nobody looked", and only count the second as a leak.
Step 5: Compare seats and entitlements to what you bill
Count active users per account in your product database and compare with the seat quantity on the subscription. Then do the same for features: which accounts are using capabilities that belong to a higher plan?
Seat gaps usually come from provisioning that is not connected to billing: an admin adds five users in the app and the subscription quantity stays put. Feature gaps come from flags switched on for a pilot and never switched off.
Be honest about what the number means. Active seats minus billed seats is an upper bound. Some contracts allow overage until the annual true-up, and some of those extra users are service accounts. Read the contract before you call it under-billing.
Step 6: Flag expansion signals with no open opportunity
Here the method changes. Nobody owes you this money yet.
Define two or three signals that fit your pricing. Common ones are usage above 80% of a plan limit for two consecutive periods, seat growth, and repeated attempts to use a gated feature. Query for accounts that cross the threshold, then cross-check against open opportunities and tasks in the CRM. Every account with a signal and no follow-up goes on the list.
If the same accounts keep outgrowing the same tier, the problem may be packaging more than follow-up, which is the subject of our piece on optimizing pricing tiers with usage data. Teams that want the cross-check automated will find the vendor options in our roundup of revenue intelligence tools for consumption tracking.
Step 7: Review downgrades and cancellations for a save attempt
Export every downgrade and voluntary cancellation from the last two quarters. For each account, check the CRM and support history for the 60 days before the event. Was there a logged call, an email from the account owner, an offer? Divide the lost or contracted MRR with no recorded contact by the total. We have no benchmark for what that share should be, and the list itself, read account by account, is probably more useful than the percentage.
Some customers leave for reasons no call would change. The check is narrower: find the accounts where usage was falling for weeks, or a champion left, and nobody on your side noticed. For consumption-priced products, our guide to customer health scoring for consumption-based billing covers which usage signals tend to come first.
A worked example
The numbers below are invented to show the arithmetic. They are not a benchmark.
Take a company with $200,000 in MRR and 400 customers. Its audit finds:
| Check | Finding | Monthly amount |
|---|---|---|
| Failed payments | 9 subscriptions ended after failed cards | $3,600 |
| Unbilled usage | 14 accounts over allowance, no overage line | $2,900 |
| Discount drift | 11 coupons past contract end date | $1,700 |
| Old-price renewals | 6 renewals missed a contracted uplift | $1,100 |
| Seat mismatch | 220 active seats above billed quantity, half of them billable under contract | $2,200 |
| Total billing leakage | $11,500 |
Leakage rate is the gap divided by what should have been collected: $11,500 divided by $211,500, or about 5.4%. Missed expansion and unsaved churn are deliberately left out of that rate because they are estimates. Track them as a separate pipeline number.
Keeping detection running after the first audit
A one-time audit finds old leaks. Billing repeats every cycle, so a configuration error in January keeps costing money until someone catches it.
Start by subscribing to payment failure events. In Stripe the invoice.payment_failed webhook fires on each failure and its attempt_count attribute shows how many tries have been made. Route failures above a dollar threshold to the account owner. Keep one log of every leak with its type, affected accounts, MRR, owner and status, and review it monthly. Finance owns discounts and billing logic, billing ops owns payment failures, customer success owns steps 6 and 7. Then re-run steps 1 to 5 after any pricing, packaging or billing-system change, because a migration can quietly drop a coupon end date or a custom price.
Start with two or three alerts. A noisy channel gets muted.
Tools that help, mapped to leak type
No single product covers all seven checks. The four below are ordered by how directly they act on money that is actually owed, which puts the billing systems first and the customer success platform last.
| Tool | Leak types it addresses | Relevant feature (per vendor docs) | Published pricing |
|---|---|---|---|
| Stripe Billing | Failed payments, discount duration, usage metering | Smart Retries (recommended 8 tries within 2 weeks), automatic card updates, failed-payment emails | 0.7% of billing volume on the pay-as-you-go plan |
| Chargebee | Failed payments, entitlements, contract terms | Smart dunning (up to 12 retries), entitlements, usage limits and alerts | Flow plan from $0 plus 0.80% of invoicing volume; Enterprise by quote |
| ChartMogul | Detection across churn, contraction and discounts | Six MRR movement types per customer, multi-billing-system import | Free to $10K MRR; Starter from $69 a month; Pro from $119 a month |
| Quivly | Missed expansion, at-risk renewals | Health score recomputed every minute, Actions Feed with drafted follow-ups | Not published (demo only) |
Stripe Billing
Stripe Billing is the subscription layer on top of Stripe payments, and its recovery tools aim straight at step 1. Smart Retries uses a model to choose retry timing, with a recommended default of 8 tries within 2 weeks and a configurable window from 1 week to 2 months. Stripe also updates saved card details automatically when an issuer replaces a card, and can send failed-payment emails. On its Billing product page, Stripe says businesses using its tools recover 55% of failed payments on average. That is Stripe's own figure with no published method.
For step 7, the customer portal can collect a cancellation reason and offer a retention coupon before the cancellation goes through.
Pricing on Stripe's Billing pricing page was 0.7% of billing volume for pay-as-you-go when we checked, on top of payment processing fees. Regional pages can differ.
What to consider:
- A custom retry schedule allows only three retries. The longer sequences need Smart Retries switched on.
- Automatic card updates depend on issuer participation. Stripe's docs say support is wide in the United States and varies elsewhere, and retries are not attempted on India-issued cards.
- Advanced usage-based billing is now sold as Metronome, which Stripe finished acquiring in January 2026. Basic metering stays in Billing through the Meters API. Usage alerts were still labelled public preview in the docs.
- Nothing here reconciles invoices against a signed contract. Steps 3 and 4 remain manual.
Chargebee
Chargebee is a billing platform that sits in front of a payment gateway, and it handles seat, tiered, usage and hybrid pricing in one catalogue. Its dunning documentation describes two modes: Smart, which retries up to 12 times at intervals chosen by error type, and Custom, capped at 5 retries. Hard declines are held until the payment method changes. It also runs dunning by email for offline payments such as bank transfers, which matters for B2B companies that invoice.
For step 5, Chargebee entitlements tie feature access to the subscribed plan, so what a customer can use and what they pay for come from the same record.
Chargebee's pricing page lists the Flow plan at $0 plus 0.80% of invoicing volume, with a $99 plus 0.65% option that breaks even at $66K a month. Enterprise, which adds contract terms and account hierarchies, is quote-only.
What to consider:
- Contract terms are an Enterprise feature, so the plan with public pricing does less for steps 3 and 4.
- Usage Alerts are documented as a private beta that support has to enable.
- For direct debit, Chargebee's own docs suggest only 2 retries, so recovery there relies mostly on emails.
- Retention (cancel flows) and RevRec are separate products with their own pricing. We did not test them.
ChartMogul
ChartMogul does not bill anyone. It reads billing data and turns it into metrics, which makes it the detection layer for this guide. Its help centre explains that every subscription change becomes one of six MRR movement types: New Business, Expansion, Contraction, Churn, Reactivation and Neutral. A discount is classified as Contraction, and an expiring discount as Expansion. That gives you a quick test for step 3: if a coupon was due to end in March and no Expansion movement appears on the account, the coupon is still running.
ChartMogul's pricing is free up to $10K MRR. Starter begins at $69 a month billed monthly and connects one billing system. Pro begins at $119 and connects several. Enterprise starts at $19,900 a year.
What to consider:
- It reports and does not recover. You still need retries and dunning in the billing system.
- ChartMogul's own usage-billing article warns that past-due subscriptions keep counting toward MRR until they are cancelled, so MRR can be inflated by accounts that have really churned.
- With usage billed in arrears, metrics are only accurate after invoicing for the period is complete.
- It sees invoices, not contracts or product usage. Steps 2, 4 and 5 need other data.
Quivly
Quivly is a customer success platform, and it has no role in the first five checks. It does not issue invoices, retry cards, run dunning or forecast revenue. Where it fits is steps 6 and 7. Its health score page describes one weighted score per account built from CRM, product, support, billing and market signals and "recomputed every minute", with the category weights set by the customer. An Actions Feed ranks follow-ups and drafts the email or Slack message for a person to review and send.
Its Stripe integration docs say it syncs customers, subscriptions, invoices and products, including invoice payment status, so a failed invoice can appear next to falling usage on the same account. That gives a CSM visibility. It recovers nothing.
On its churn solution page Quivly claims a 32% average reduction in logo churn. No sample size or method is given, and we would not plan around it.
What to consider:
- Stripe is the only billing integration listed in its documentation. Chargebee, Recurly and Zuora users would need a warehouse route through BigQuery or Snowflake.
- Pricing is not published. The site offers a demo only.
- It is a young, Y Combinator-backed company. Its trust page lists a SOC 2 Type 2 report dated July 30, 2026, which we did not read.
- A team with a few dozen accounts can run steps 6 and 7 from a spreadsheet.
Two names that often appear in this conversation have changed hands. Metronome is a Stripe product now, and Orb became part of Adyen on July 1, 2026. Both remain on sale.
How we evaluated
We started from the seven leak types and asked which data a seed-to-Series-B company already holds for each. Every method above uses only billing exports, a CRM and a product database.
For the tools, we read each vendor's own documentation and pricing pages in October 2026 and recorded only features that appear there. We did not run any of the four products against live billing data, and we have no recovery-rate measurements of our own.
For statistics, the rule was simple: the number had to appear on a primary page we could open. Vendor benchmark data stayed in if it was labelled as such. Anything second-hand was cut.
Limitations
- The Recurly, Baremetrics and Stripe figures are vendor data drawn from each company's own customers. None publishes a full method, and none is specific to B2B SaaS with invoiced enterprise contracts. Recurly's page also shows slightly different per-industry numbers in different sections.
- Baremetrics attributes a "20 to 40% of churn is involuntary" range to Paddle research. We could not locate the Paddle original, so the range is not used here.
- The widely repeated claim that leakage costs 1 to 5% of EBITDA is credited to MGI Research. MGI's public pages do not contain it, and the full reports are behind a paywall.
- Stripe's US pricing could not be confirmed separately because its site redirected us to a regional page showing 0.7%.
- Quivly's outcome claims and its SOC 2 report were not independently verified.
- Back-billing for past under-charges depends on your contracts and local law. Nothing here is legal advice.
- Under-recognised revenue can become a reporting issue as well as a cash one. The SEC staff's SAB 99 accepts 5% as a first-pass rule of thumb for materiality and adds that misstatements below 5% "could well be material". Whether your leakage matters for your accounts is a question for your auditor.
Conclusion
Run the ten-account comparison this week. It takes an afternoon and tells you which of the seven checks deserves a full pass. Fix failed payments first, because retries and card updates are a settings change. Then work through usage, discounts, renewals and seats in whatever order your sample suggests. Expansion and save attempts come last, since they depend on people more than configuration.
Track one number monthly: billing leakage as a share of what you should have collected. If it falls for three months running, the process is holding.
Frequently asked questions
What is the difference between revenue leakage and churn?
Churn is a customer deciding to leave or pay less. Leakage is revenue lost without any decision by the customer, for example a failed card, an unbilled overage or a discount that outlived its term. The overlap is involuntary churn, where a payment failure ends a subscription the customer never chose to cancel.
Which revenue leak should a startup check first?
Failed payments, in most card-billed businesses. The data is one export away, and the first fix (turning on smart retries, card updates and failed-payment emails) is configuration. If you invoice by bank transfer with net terms, start with discount drift and renewals instead, and look at receivables ageing for late payers.
How much revenue does a typical B2B SaaS company leak?
We do not know, and we doubt anyone does with precision. The published figures we found come from vendors' own customer bases. Recurly reports 1.25% annual involuntary churn across its network. Baremetrics says failed payments put about 9% of MRR at risk for its average customer before recovery. Your own audit will give you a better number than either.
Can I back-bill customers for past under-billing?
It depends on the contract. Check for invoicing windows, true-up clauses and any cap on retroactive charges, and get finance and legal to review before sending anything. Many companies correct billing going forward straight away and handle past periods account by account, telling the customer before a corrected invoice arrives.
Do I need a dedicated tool to find revenue leaks?
Not for the first audit. Exports and a spreadsheet are enough for all seven checks at a few hundred accounts. Tools earn their cost once the checks have to run every cycle. Retries and dunning belong in the billing system, MRR movements in an analytics layer such as ChartMogul, and a customer success platform like Quivly only makes sense when the account list is too long to watch by hand. It will not collect money or correct an invoice.
How often should the audit be repeated?
Monthly for failed payments and usage reconciliation, since both recur every cycle. Quarterly is usually enough for discounts, renewals and seat counts. Re-run everything after a pricing change or a billing migration.
This article reflects publicly available information as of October 2026 and does not endorse any specific platform. Benchmark figures quoted here are vendor-reported, and whether you may back-bill a customer for past under-charges depends on your contract terms. Consult a licensed professional for guidance specific to your business.
Last verified: 2026-10-12
Sources
- Stripe | Automate payment retries (Smart Retries)
- Stripe | Stripe Billing product page
- Stripe | Stripe completes Metronome acquisition
- Chargebee | Dunning for online and offline payments
- Chargebee | Pricing
- ChartMogul | Understanding MRR movements
- ChartMogul | Pricing
- Recurly | Churn rate benchmarks
- Baremetrics | Involuntary churn: how to reduce payment-failure churn
- MGI Research | Revenue Leakage Series Part 4: The Real Impact of Revenue Leakage
- Adyen | Adyen closes Talon.One and Orb acquisitions
- Quivly | Health Score
- Quivly | Stripe integration documentation
- Chargebee | Entitlements overview