The failure catalog, at length
Billing failures that never throw.
A few of the ways billing goes wrong at a company selling seats and
metered usage, with a stack of coupons and a handful of deals that were
negotiated one at a time. Some of these you have hit. The rest are waiting
for the customer who is shaped the right way.
A coupon that applies to nothing on the invoice
What happens
A Stripe coupon carries a list of the products it applies to. When none of the products on an invoice are on that list, the invoice generates with no discount at all. The coupon is attached and valid the whole time, and the dashboard shows it there. Anything you assert about the coupon being attached passes, because it is attached.
What it costs
The customer was promised a discount and paid without it. They have no copy of what the invoice was supposed to say, so the overcharge goes out again every cycle until somebody works out by hand what it should have said.
Dunning that quietly stops
What happens
A payment fails and the retry sequence that should follow it does not run. There is no error, because the failure is an absence. The invoice sits open with next_payment_attempt null, a field nobody has a reason to read.
What it costs
Revenue you invoiced correctly and then never chased, on every failure that goes unretried.
Usage that runs all month and never reaches an invoice
What happens
A meter event arrives with a customer Stripe cannot map, or with a timestamp outside the window Stripe will accept it in. Stripe records the rejection and returns success to the caller that sent it. The invoice that goes out is smaller than the month was, and it is internally consistent with every event that did land.
What it costs
The account consuming the most is the one you are underbilling, and they have no reason to raise it with you.
A mid-cycle change that credits a number nobody chose
What happens
Someone adds seats halfway through a period. What comes out depends on the proration behavior set on that change and on the anchor the period is measured from. The arithmetic is always correct for the configuration it was handed, which is not the same as being the number anyone intended.
What it costs
Small on any single change, and every plan change your product offers goes down the same path.
Several open invoices at once, none of them resolving
What happens
A customer ends up holding more than one open invoice at the same time. Each one is individually valid, so nothing that reads an invoice on its own has anything to report. The bad state only exists in the aggregate.
What it costs
A customer who cannot tell which invoice is real disputes one of them, and the rest stay open.
Tax calculated on a number the line no longer holds
What happens
A line changes after tax was worked out for it, or an exemption is recorded against a customer whose invoices were already issued. The tax figure on the invoice is arithmetically sound and it belongs to a version of the line that no longer exists.
What it costs
A tax error is the one class of billing mistake with a counterparty who audits it, and it repeats every cycle until somebody re-derives the total by hand.
An amount off by a factor of a hundred
What happens
Stripe takes every amount in the currency's minor unit, and JPY has no decimal places where USD has two. Code written for two produces an amount that is still a plausible-looking number, in a currency nobody on the team tests in.
What it costs
Every amount in that currency is wrong by the same factor, from the day you started selling in it.
Which of these are true of your account?
Murphy re-derives your invoices and tells you which of these are already true of your account. Two weeks free.
Start free