Skip to main content

Taxes

Tax is applied through the billing.tax mode:

  • provider — provider tax (Stripe Tax) is collected on the hosted checkout and flows onto the persisted invoice.
  • eu_oss — a local EU One-Stop-Shop rate table computes the tax.
  • none — no tax is applied.

The computation path is a seam: the package binds a TaxCalculator (the EU-OSS table, or none) so a local computation can replace the provider path without touching the invoicing code.

Reverse charge, only on a validated VAT id

Intra-EU B2B reverse charge is rendered as EN 16931 category AE. The reverse-charge zero rate is applied only when both are true:

  • the buyer's VAT id is validated — a VatIdValidator seam, with a VIES-backed implementation shipped and a null default that proves nothing offline; and
  • the supply is cross-border — the buyer's country differs from billing.company.country.

So a fake id, a VIES outage, or a domestic sale is never wrongly zero-rated. A correction inherits the tax treatment of the invoice it corrects, so a reverse-charge invoice's correction is itself category AE (never the zero-rated Z a 0% rate would default to).

A zero always says why

SaleTaxFacts carries a reason beside the amount whenever a sale carried no tax:

ReasonWhat it meansBelongs in a return
reverse_chargethe buyer accounts for the tax instead of youyes, on both sides
supplied_outside_the_unionthe supply is placed outside the union, so no member state's tax is dueno

The two produce the same amount and nothing else about them is the same, which is the whole reason the field exists. Read only as a number, a supply placed outside the union is indistinguishable from an intra-union B2B one — and from an invoice that simply failed to charge tax. An exemption a document cannot name is one it cannot claim, so the reason travels with the decision rather than being inferred later from a zero.

Two things it deliberately does not cover. A free supply is not exempt — there is no taxable amount to relieve, so the reason stays empty rather than putting an exemption note on a document with nothing to exempt. And a nil rate a country grants for a category of goods is not an exemption either: that is a rate of zero on a taxable supply, and it still belongs in a return, so folding it in here would let it adopt the treatment of a supply that must stay out of one.


← Back to the documentation index