Stripe Invoice Revisions: How to Fix a Billing Mistake Without Restarting the Invoice
Stripe now lets you revise a finalized invoice instead of voiding and rebuilding it. Here's how it works, and why the old fix risked churn.
Every subscription business eventually finalizes an invoice that's wrong. A plan change prorates against the wrong date. A seat count updates a day late. A tax rate gets misapplied on a customer who just moved states. A line item duplicates because a webhook fired twice. None of these are dramatic failures — they're the ordinary cost of running billing logic across thousands of accounts — but until recently, fixing one on an invoice that had already been sent to a customer meant voiding it and rebuilding a replacement from scratch. Stripe shipped a real fix for that specific problem: invoice revisions, which let you edit a finalized invoice in place instead of starting over.
That number isn't SaaS-specific — it covers B2B invoicing broadly — but there's no reason subscription billing is exempt. If anything, recurring billing adds its own failure modes on top: proration math, mid-cycle upgrades, usage line items pulled from a metering system, tax jurisdiction changes, coupon stacking. A correction on a finalized invoice isn't a rare event you can build a manual process around. It's routine enough that the tooling for it matters.
Why "void and recreate" was the riskier half of the fix
Before revisions existed, correcting a finalized invoice meant two separate API calls: void the original, then create and finalize a fresh one with the right line items. Voiding on its own is well-behaved — Stripe treats a void as a paper trail entry, not a deletion, and the invoice stays visible with a zero-value status for reporting. The risk shows up one layer down, in what a void does to subscription state. When you void the most recent invoice on an active subscription, Stripe recomputes the subscription's status by walking its invoices from newest to oldest: a paid or uncollectible invoice underneath pushes the subscription back to active, but an invoice that had already exhausted its retry attempts can leave the subscription sitting in past_due, unpaid, or canceled depending on what's left. Voiding by hand, in the middle of an already-fragile billing state, meant a support agent could trigger a status change they weren't trying to make.
The bigger problem was on the customer-facing side. A manually recreated invoice is a genuinely new object — new invoice number, no field connecting it back to the one the customer already has sitting in their inbox or their expense report. If that original invoice was mid-retry when the mistake was caught, the customer had already been notified once about a specific amount and a specific invoice number. A second, unrelated invoice for a different amount lands next, with nothing in either email explaining that they're the same charge, corrected. For a customer already annoyed that a payment failed once, that's exactly the wrong moment to also look confused about which invoice is real.
| What happens | Void + manually recreate (old way) | Invoice revision |
|---|---|---|
| Original invoice number stays traceable | No — orphaned, no link to the replacement | Yes, via the latest_revision field |
| Works while an invoice is mid-retry | Requires a manual void that can shift subscription status | Yes — open and uncollectible are exactly the eligible statuses |
| Support can see the correction history in one place | No — two unrelated invoice IDs to reconcile by hand | Yes — both invoices reference each other |
| Editable fields | None — you rebuild the whole invoice | Description, line items, customer info, discounts, tax |
| Works on a paid invoice | No — the money already moved | No — use a credit note instead |
What a revision actually changes
A revision only applies to an invoice in open or uncollectible status — finalized, not yet paid, not yet void. That window matters because it's the exact same window an invoice sits in while it's working through your dunning retries. You can edit the invoice description, add, remove, or update line items, correct the customer's billing details, apply or remove a discount, and fix the tax calculation. When you finalize the revised version, Stripe voids the original automatically and writes a latest_revision reference pointing forward to the new one — so a support agent pulling up the original invoice number six months from now sees exactly what it turned into, instead of a dead end.
What it doesn't do is let you touch anything already settled. A paid invoice is closed to revision entirely — the money's moved, and the correct tool at that point is a credit note against the wrong line items, refunded or applied as a balance toward the next invoice. A void invoice is already a dead end and can't be revised either. Revisions exist specifically to cover the messy middle: an invoice a customer has already seen, that hasn't been collected yet, where you'd otherwise have been tempted to just void it and hope nobody noticed there were now two.
Source: aggregated invoice-accuracy benchmarks (Ardent Partners, QuickBooks, Parseur, DocuClipper, Grand View Research, 2024–2025); Churnkey, State of Retention (2025)
Put those two next to each other and the priority is obvious. Billing mistakes aren't an edge case at 39% industry-wide — they're a routine operational fact. And the subscriber most likely to be sitting in front of a wrong invoice is often the same one already sitting inside a failed-payment retry cycle, exactly the group Churnkey's data says bails at the first sign of extra friction rather than waiting to see if it sorts itself out. A correction workflow that adds a second confusing invoice email on top of a first failed-payment email is stacking friction on the customers who can least absorb it.
Where this fits into your dunning and support workflow
The practical change is smaller than it sounds: give whoever handles billing corrections — support, finance ops, or an internal tool — a documented path to Stripe's revision workflow instead of a manual void-and-rebuild script. A few things worth setting up around it:
- Route corrections through the revision workflow by default, not a manual void. Reserve a raw void for invoices you genuinely want to kill with no replacement — a duplicate charge from a webhook retry, a subscription that was cancelled before the invoice should have generated at all.
- Keep the customer-facing invoice number stable in your own emails. Since the revision links back to the original via
latest_revision, your support macros and dunning templates can reference "an updated version of invoice #1042" instead of introducing a second, unrelated number the customer has to reconcile themselves. - Log revisions as a distinct event from your normal payment-failure tracking. If your involuntary churn reporting only looks at
invoice.payment_failed, a billing-mistake-driven cancellation right after a revision can get miscategorized as a plain payment failure, when the real cause was upstream of the payment attempt entirely.
None of this replaces getting your proration and tax logic right in the first place — the cheapest correction is the one you never have to make. But at 39% of invoices needing a fix somewhere, "never make a mistake" was never a realistic target. What's changed is that fixing one no longer means gambling with a customer's subscription status or handing your support team two disconnected invoice numbers to untangle by hand, the same category of confusion we cover from the dispute side when an unfamiliar charge on a statement gets reported as fraud instead of a support ticket.
A wrong invoice, cleanly fixed, is a non-event most customers never think twice about. A wrong invoice fixed badly — two emails, two numbers, a subscription that mysteriously flips to past_due — is how a billing team accidentally manufactures its own cancellation, one that shows up in your reporting looking exactly like every other churn event even though nobody at your company meant to cause it. If you're trying to separate that kind of self-inflicted churn from the voluntary kind, our churn calculator is a fast way to see how much even a small correction-driven leak is worth chasing down. It's also, worth saying plainly, a completely different problem from the one CancelFlow solves — this is about never accidentally pushing a subscriber toward the door in the first place, which matters just as much as what you show them once they're already there.
Frequently asked questions
What is a Stripe invoice revision?+
An invoice revision is a way to edit a finalized invoice in place instead of voiding it and building a replacement by hand. When you finalize the revision, Stripe automatically voids the original invoice and stamps a latest_revision reference on it pointing to the new one — so the two stay linked in the API and the Dashboard instead of existing as two unrelated invoice numbers.
Which invoices can be revised?+
Only invoices in open or uncollectible status — in other words, invoices that have been finalized but not yet paid, including ones currently sitting in a payment retry cycle. You can't revise an invoice that's already paid or already void. A paid invoice needs a credit note or refund instead; a void invoice is already a dead end.
Does revising an invoice affect Stripe's Smart Retries or a subscription's past_due status?+
Stripe's documentation doesn't spell out retry-timer behavior specifically, but the mechanics point one direction: a revision produces a new invoice object, so any recovery attempt has to run against that new invoice going forward. What revisions do solve, which the old void-and-duplicate approach didn't, is keeping that new invoice traceably linked to the one the customer already saw — instead of leaving a support agent, and the customer, staring at two disconnected invoice numbers for what should be one bill.
Can I still fix a mistake if the invoice has already been paid?+
Not with a revision. Once an invoice is paid, Stripe treats it as closed for editing purposes. To correct a paid invoice you issue a credit note against the incorrect line items, and either refund the difference or apply the credit toward a future invoice. Revisions exist specifically to cover the earlier, riskier window — a finalized invoice that hasn't been collected yet.
Stop losing subscribers today
One script tag. One function call. A live cancellation flow in under 10 minutes.
Start free trial →