How to Audit Your Subscription Revenue for Rebills That Never Happened
TL;DR
If your cart platform has ever had an outage — any platform, any outage — some of your subscription rebills may simply not exist. Not failed, not declined: never attempted, and therefore invisible in every report you look at. This is the audit that finds them: your payment processor's records against your platform's, month by month, subscription by subscription. It takes an afternoon, and for subscription businesses it regularly finds real money.
Why "check your dashboard" doesn't work
Your cart platform's revenue report can only report the charges it attempted. If the platform was down — or a scheduled billing job silently failed — during the window when a rebill should have fired, there's no failed charge to retry, no dunning email, no line in any report. The subscription just quietly skips a period. The customer keeps access; you lose a month; nothing anywhere looks wrong.
The only place the truth lives is your payment processor — Stripe or PayPal — because that's where money actually moves. So the audit is a reconciliation: what should have been charged, against what the processor says was charged.
The audit, step by step
1. Export the truth
- Stripe: Payments → Export (set the range to your platform's lifetime, or the last 12 months), and Billing → Subscriptions → Export for the subscription list. If your cart bills through its own engine rather than Stripe Billing, the Payments export is the one that matters.
- PayPal: Activity → Statements → Custom, with subscription payments included.
2. Export your platform's version
Every cart exports orders as CSV. You want: order date, customer email, amount, and whether it was a first sale or a rebill.
3. Build the expectation
For each active subscription: start date, billing interval, cancellation date (if any). From those three facts, the number of charges that should exist is arithmetic — a $29/month subscription started March 1 and still active in August should have six charges. Lay it out in a spreadsheet: one row per subscription, expected count vs processor count vs platform count.
4. Read the three leak classes
- Missing from both (processor AND platform show fewer charges than expected): the charge was never attempted. This is the outage signature — check whether the gap lines up with a date your platform had an incident. These are recoverable conversations with real customers who expected to be billed.
- In the processor, not the platform: money moved that your platform doesn't know about. Your revenue reports, affiliate commissions and tax records are understated. This one compounds quietly.
- Failed in the processor, silent in the platform: the charge failed and no recovery sequence fired. If customers "never got a reminder," this is where that starts — dunning that doesn't fire is indistinguishable from dunning that doesn't exist.
5. Decide what "recovered" means before you email anyone
A skipped period from six months ago is a judgment call: re-bill it, forgive it, or split the difference. Whatever you choose, tell the customer the truth — "our platform missed your March renewal" is an honest sentence that keeps trust, and most subscribers who value the product will accept a correction if it comes with an apology and a choice.
What "accounted for" should mean
The deeper fix isn't a better afternoon of spreadsheets — it's a billing engine that can't lose track in the first place. The standard worth demanding from any platform:
- Every billing period is claimed before it's charged — a durable record that the period exists, written before any money moves, so a crash can't create a period that nobody owns.
- Every side effect is a ledger entry — receipt, delivery, commission, accounting push — each with its own state, so "done" is checkable per item, not assumed per order.
- A reconciler that re-walks the ledger on a schedule and heals anything that died partway — and can prove it, because the ledger is the record.
That's how GoCushy's billing engine is built — periods claimed by the database before charging, every obligation tracked to a terminal state, a reconciler sweeping every few minutes — and it's why we can put a number like our uptime in public and let you check our arithmetic. Not because outages never happen. Because when they do, nothing goes missing quietly.
A checkout that accounts for every period
Describe your offer to Claude or ChatGPT. GoCushy builds the checkout — subscriptions, dunning, receipts, tax — on your own Stripe, with a ledger behind every charge.
Get lifetime accessOne payment. 0% platform fees, locked for life. 30-day refund.
Sam Bakker is the founder of GoCushy. He's built and sold software for creators for over a decade, and now spends his time making sure your AI can run your sales machinery without you babysitting it.