Skip to content
Blog

One Stripe customer with several open invoices at the same time

Support forwards a message from a customer who has received three invoices this month and wants to know which one is real. You open their page in Stripe and all three are there, all open, all apparently owed.

Read any one of them and it is fine. The problem only exists in the set.

Where the extras come from

A subscription left past_due keeps its billing cycle. Leaving it there is one of the three things your account can do when retries run out, and it means invoices continue to be generated and charged on the retry settings. The period rolls over on schedule whether or not the last invoice was paid. Two cycles of a failing card is two open invoices, and the customer sees both.

A subscription marked unpaid is a different setting and produces a different pile. Invoices continue to be generated and stay in draft, so nothing is finalized and nothing is attempted. They will not show up in a list of open invoices at all, which is worse in its own way, because the periods accumulate where nobody is counting them.

Invoices you create yourself are the third source. Code that creates an invoice for an overage or a negotiated adjustment rarely checks whether the customer already has something open. Neither does a human doing the same thing in the Dashboard during a busy week.

Why nothing flags it

Every check that reads a single invoice reports success, correctly. The amounts are right. The line items are right. The invariant being broken is a property of the customer, and no object in Stripe carries it.

The customer is the one who notices. They usually notice by paying the wrong one or disputing one at random, which is worse than either of you doing nothing.

Confirming it

List invoices filtered by customer with status open, or just open the customer’s page in the Dashboard, which shows them together. Then look at what you have. Do their periods overlap? Are several of them charge_automatically? Is the subscription itself past_due or unpaid? The Dashboard badges an open invoice Past due or Retrying, which tells you which ones Stripe still thinks it is working on. Run the same list with status draft while you are there, since that is where an unpaid subscription puts them.

Worth doing across the whole account base rather than for one complaint, since the customers holding four open invoices are not the ones who write in.

Fixing it

Decide which invoice represents what the customer actually owes. Void the rest, which keeps the record while removing the obligation, or mark them uncollectible if you want them to stay in your reporting as bad debt. Voided invoices count as zero for reporting. You can void an invoice that is open or uncollectible, and you can mark an open one uncollectible. Void is terminal, so an invoice that has already been paid needs a credit note instead.

Then close the tap. Of the three things your account can do when retries run out, only cancelling the subscription stops it from manufacturing new invoices. The other two keep generating them, one into open and one into draft. Make the code path that creates one-off invoices look for existing open ones on that customer first and refuse to add to a pile.

This is billing state corruption rather than a wrong number. Every amount is correct and the situation is not.