Say you have 30-something paying customers and one of them, a small agency in Germany, sends this email on a Monday:
"Hi, can you resend last month's invoice with our company name and VAT number on it? Our accountant needs it. VAT ID is DE..."
It feels like a two minute job. Then you find out Stripe won't let you edit that invoice, and you also start wondering if you were supposed to charge them VAT in the first place.
This post is the Stripe side of that email. What you can fix for the past invoice, how to make every future invoice right without touching it again, and the tax question you should take to an accountant instead of guessing. I'm not an accountant, so expect a few "check with yours".
Why the customer actually cares
For a business buyer an invoice is not a nice PDF, it's a document their bookkeeping depends on. The European Commission's invoicing rules list what a full VAT invoice should contain: date, a unique sequential number, both parties' full names and addresses, the customer's VAT number if the customer is the one liable for the tax, and the words "reverse charge" when the reverse charge applies.
So when the agency asks for their VAT number on the invoice, they're doing exactly what any decent bookkeeping setup tells them to do. I wrote a guide to setting up bookkeeping as a solo founder and one of the rules in it is the same thing from the other side: if you're VAT registered, make sure the invoices you receive show the vendor's tax details. Your customer is following that rule. Your invoice is the thing in their way.
First, check what they got
Two different documents get mixed up here.
- Subscriptions generate invoices automatically. If they pay you monthly through Stripe Billing, there is an invoice for every period already.
-
One-time payments through Checkout don't get an invoice by default. They get a receipt. Stripe's receipts doc says you need to enable invoices for one-time payments, by setting
invoice_creation[enabled]=truewhen you create the Checkout Session.
If you sell a one-off thing (a lifetime deal, a setup fee, credits) and you never turned that on, the customer only has a receipt. For a business buyer that's often not enough, so turn it on before the next sale.
The old invoice: you probably can't edit it
This is the part that surprises people.
When an invoice is finalized, Stripe copies the customer's tax details onto it. The Invoice API reference says the customer_tax_ids field matches customer.tax_ids until the invoice is finalized, and after that it's no longer updated. So adding the VAT number to the customer today does nothing to last month's PDF.
And you can't just revise it. Stripe's doc on editing finalized invoices says:
- invoices attached to subscriptions can't be revised after finalization (the Edit invoice button is disabled)
- invoices in
paidorvoidstatus can't be revised at all
Last month's subscription invoice that already got paid is both. Stripe also notes that in the EU you might want to void an invoice and issue a credit note instead of revising the original, and it tells you to ask your legal counsel.
What I'd do with under 50 customers:
- Add the VAT number and legal name to the customer now (next section), so the next invoice is right.
- Reply honestly: "Done for all future invoices. For last month's, I'm checking with my accountant on the correct way to reissue it."
- Ask your accountant whether a credit note plus a new invoice is needed, or whether the corrected next invoice is fine for them. The answer depends on your country, not on Stripe.
What I would not do is download the PDF and edit it in a PDF editor. Now you have an invoice that doesn't match your Stripe records or your accounting, with the same number as a different document.
Add the tax ID to the customer
In the Dashboard, open the customer, click the pencil next to Details, scroll to the Tax status and Tax ID fields, and add an ID with type and value. While you're there, set the name to their legal business name and fill in the billing address. Both names and addresses are on the EU list above, and the PDF shows what's on the customer.
With the API it's one call:
curl https://api.stripe.com/v1/tax_ids \
-u "sk_live_...:" \
-d type=eu_vat \
-d value=DE123456789 \
-d "owner[type]=customer" \
-d "owner[customer]=cus_..."
You can't edit a tax ID. To change one, you delete it and create a new one.
Then Stripe checks the number. Per Stripe's page on customer tax IDs, EU VAT numbers get validated against the European Commission's VIES system and UK VAT numbers against HMRC. It's asynchronous: it usually takes a few seconds, Stripe retries if the government service is down, and you get a customer.tax_id.updated event with verification.status set to pending, verified, unverified or unavailable.
Three details from that page worth knowing:
- Valid number doesn't mean right company. VIES only says the number is valid. You still need to check the name and address match. In the Dashboard you can hover over the VAT number to see what VIES returned, including the registered name and address.
-
unverifiedis your call. Stripe reports the result. What you do with a number that fails is up to you and your compliance needs. When it saysunavailable, you have to verify by hand. - Stripe doesn't keep re-checking. It validates when you add the ID, not over time.
For testing, Stripe has magic numbers. With an EU VAT, GB VAT or ABN type, 000000000 verifies, 111111111 fails, and 222222222 stays pending forever.
Stop doing this by email
One customer asking is a support ticket. Five is a missing field in your checkout.
If you use Stripe Checkout, set tax_id_collection[enabled]=true on the session. Checkout then shows fields for the tax ID and legal business name when the customer's location is supported. Some details from Stripe's Checkout tax ID doc:
- The customer can enter one tax ID.
- It's for business tax IDs only.
- If you pass an existing Customer, also set
customer_update[name]=autoso the business name they enter gets saved as the customer's name. - If that customer already has a saved tax ID, Checkout won't show the form again.
- During the session Stripe only checks the format. The real validation happens after, and
checkout.session.completedcan arrive before it finishes. So don't decide anything tax-related in that webhook on the assumption it's verified. -
tax_id_collection[required]=if_supportedmakes it mandatory in supported countries. For a mostly-individual customer base I'd leave it optional, or you're adding a field nobody can fill.
For customers who are already subscribed, the Customer Portal has a Tax ID option that lets them update it themselves. It's off by default. If you have the portal running already (I wrote about turning on Stripe Customer Portal before 50 customers), flip that one on once you have any business buyers.
Your own tax ID goes on the invoice too
The EU list includes the supplier's details, so if you have a VAT or GST number, put it on your invoices. In the Dashboard it's Invoice settings, the Tax tab, add your ID, then use the overflow menu to set it as default. Default tax IDs then show on your invoice and credit note PDFs unless you override them per invoice.
Same snapshot rule: you can't add, change or remove account tax IDs on an invoice after it's finalized. If you've been sending invoices without your number, the fix only applies going forward.
The question behind the question: did you owe VAT?
This is where you stop and call an accountant. But here's what Stripe does and doesn't do, so the conversation is short.
Reverse charge. Stripe's EU tax page explains it simply: in some cases when you sell services to a VAT-registered business in another EU country, the customer calculates and pays the VAT, and your invoice should say reverse charge instead of showing a tax amount. If the customer gives a domestic tax ID (same country as you), reverse charge doesn't apply and it's treated like a consumer sale.
If you use Stripe Tax, it treats a customer with a valid-format EU VAT number as reverse charge and doesn't calculate tax. Note the wording on Stripe's tax ID page: Stripe Tax applies the reverse charge when the tax ID has the required number format, regardless of the government verification result. So an unverified number still gets zero tax unless you do something about it. Another reason to look at the VIES result yourself.
If you don't use Stripe Tax, there's a customer-level setting. On the Customer object, tax_exempt can be none, exempt or reverse, and when it's reverse, invoice and receipt PDFs include the text "Reverse charge". It's a label. It doesn't make a sale reverse-chargeable, it only prints the words.
Stripe Tax only calculates where you're registered. If you have no registration for a location, the calculation returns zero tax, with taxability_reason set to not_collecting. So turning on Stripe Tax doesn't mean you're collecting anything yet. You add registrations in the Dashboard after you've actually registered with the tax authority. As I write this, Stripe's pricing page lists 0.5% per transaction where you're registered for the no-code integrations (Billing, Checkout, Invoicing, Payment Links). Check your own country's page.
Where the money question really sits. The B2B sale to the German agency is often the easy case. The harder one is consumers. Stripe's EU page says that if your business is outside the EU, you might need to register to collect VAT from your first sale in an EU country, and it describes the non-Union One Stop Shop scheme for non-EU businesses selling services to individuals, so you file one return instead of one per country. EU-based businesses have a 10,000 EUR a year threshold: under it (and a couple of other conditions), cross-border sales to individuals can stay on home-country VAT. Stripe's Thresholds page in the Tax Dashboard can show you where you're getting close, but it only highlights potential obligations. Confirming them is on you.
If reading that paragraph makes you tired, that's the honest case for a merchant of record. With an MoR the provider is the legal seller, so it handles VAT and sales tax on its own invoices, for a higher fee per sale than plain Stripe. I compared Stripe and merchant of record options in a guide about charging for a side project, with the fees as they were in October. Small SaaS with lots of individual buyers abroad is exactly where it's worth a look.
A short checklist for the next VAT email
- Reply the same day: future invoices will be fixed, the past one is with your accountant.
- Add tax ID, legal name and billing address to the Customer.
- Check the VIES result and the registered name in the Dashboard.
- Add your own tax ID in Invoice settings and set it as default.
- Turn on
invoice_creationfor one-time Checkout payments. - Add
tax_id_collection[enabled]=trueto Checkout, withcustomer_update[name]=autofor existing customers. - Turn on the Tax ID option in the Customer Portal.
- Book one call with an accountant about registration, reverse charge and how to reissue old invoices. Bring a list of your customers by country.
None of this is exciting, but it's maybe an hour of work, and it turns "can you resend the invoice with our VAT number" into an email you never get again.
So, a narrow question for anyone selling to businesses: do you collect VAT IDs in Checkout with tax_id_collection, or do you still add them by hand when someone emails? And if you made it a Checkout field, did anyone actually fill it in?
Top comments (2)
That two-minute invoice edit turning into a tax question is painfully familiar. I still do these by hand under fifty customers, and the VAT line is what stalls me. Setting the fields before the next email lands is the right call.
the vat line is exactly where it stalls. you can fix the address in a minute, but then you start wondering if the tax amount itself is wrong now. when you do them by hand, do you keep the original invoice next to the edited one, or just replace it?