All posts

The VAT Stripe Tax Quietly Skips

Michael Cutajar|22 June 2026|4 min read
stripepaymentsvatossintegrations

You ship a digital product. Someone in Paris buys it. The checkout is smooth, Stripe takes the card, and Stripe Tax adds... €0 of VAT. Receipt looks clean. Everyone moves on.

Here's the catch: for a B2C sale of an electronically-supplied service, the place of supply is the consumer's country. So that French shopper triggers French VAT — 20% — payable through the EU's One Stop Shop. If you're not OSS-registered, Stripe Tax has nothing to register against, so it charges nothing. The €0 isn't a bug. It's the system going quiet precisely where the liability lands.

That's the whole post, really. But the quiet part is worth sitting with, because it's the part that bites at year-end.

Stripe Tax is good — inside its footprint

Let me be clear up front: Stripe Tax is a genuinely strong product, and Stripe is the best money rail going. Where you're registered, in the jurisdictions it supports, it calculates and collects tax cleanly and saves you a mountain of work. None of what follows is "Stripe is wrong."

The point is narrower. Stripe Tax collects tax for the places you've told it you're registered, across a set of countries it explicitly supports. That's the right design — you don't want a payments tool inventing tax registrations you don't have. But it means the tool is, by design, silent in two situations that matter:

  1. Where the rule fires but you're not registered yet. Our French consumer. The VAT is due via OSS the moment you cross the EU's €10,000 cross-border threshold — but if OSS isn't switched on in your Stripe account, nothing gets collected. The obligation accrues anyway. You just find out later.
  2. Across the long tail Stripe Tax doesn't cover. Plenty of jurisdictions sit outside any payment processor's supported list. Sales still happen there. The rules still apply there.

In both cases the checkout succeeds and looks correct. There's no error, no warning, no red flag. That's what makes it dangerous — under-collection doesn't announce itself.

The two cases worth burning into memory

For electronically-supplied services into the EU, there are really two outcomes, and your customer's status decides which:

  • Selling to a business (B2B)? Reverse charge. You generally charge no VAT — the business customer accounts for it in their own country. The €0 here is correct. (Assuming you've validated their VAT number, which is its own discipline.)
  • Selling to a consumer (B2C)? Place of supply is where the consumer is. French consumer → French VAT → collect 20% and remit via OSS. The €0 here is usually wrong once you've crossed the threshold.

Same product, same price, same checkout — opposite answers. The difference is one field: is the buyer a business or a consumer? Get that wrong, or skip OSS registration, and you've quietly under-collected on every consumer sale into that country.

An independent correctness check, across 190+ jurisdictions

This is exactly the seam OpenAccountants is built for. Stripe moves the money. OA is the independent second opinion on whether the tax is right — across 190+ jurisdictions, including the long tail no payment processor covers, with every rule signed off by a named, licensed accountant.

You call it over MCP, alongside your existing Stripe flow. Before (or after) the charge, you ask: given this product, this buyer status, and this country, what VAT actually applies — and is what I'm collecting consistent with it?

const oa = await mcp.call("get_vat_treatment", {
  product: "electronically_supplied_service",
  buyer: "consumer",        // vs "business" → reverse charge
  country: "FR",
});
// → { rate: 0.20, mechanism: "OSS", verified_by: "Michael Cutajar, CPA (Malta)" }

That verified_by line is the point. Every rule OA returns traces back to a real accountant who put their name on it — here, that's me, Michael Cutajar, CPA (Malta). Not a scraped table, not a model's best guess. A signed-off rule you can stand behind when a tax authority asks.

We built a small open-source demo that wires this on top of a normal Stripe checkout so you can see the gap and the catch in action: github.com/openaccountants/stripe-vat-demo. Clone it, run a B2C sale into France, watch the €0, then watch OA flag the 20% you owe via OSS.

Keep Stripe doing what Stripe is brilliant at. Add an independent, accountant-signed correctness layer for everything outside its registered footprint — and stop finding out about under-collection at year-end.

Try the demo repo, then connect the OpenAccountants MCP at openaccountants.com and check your own checkout against the rules.