TVA
A tax engine, not a screen. It decides the VAT treatment of a supply (domestic rate, EU reverse charge, export exemption, franchise) and feeds your invoices and your platform subscription. You do not drive it by hand, it runs the moment an invoice is finalized.
Overview
VAT on a service depends on who sells, to whom, and where. A VAT-registered seller in France billing a French client: 20%. A business client in another EU country with a valid VAT number: reverse charge, 0%, VAT is owed by the customer. A client outside the EU: exempt. A seller under the franchise regime (French micro-entrepreneur, article 293 B): no VAT at all. This engine encodes those rules and decides for you.
The determination is pure, no side effects. It takes the seller fiscal config (country, regime, intra-EU VAT number, OSS registration, whether the 10,000 euro threshold is crossed) and the buyer fiscal identity (country, business or consumer, VAT number), and returns a treatment, a rate in percent, the country whose rate applies, and a legal mention key. The standard rates of the 27 EU countries are a dated, versionable snapshot you keep current with your accountant.
For intra-EU reverse charge, a well-formed VAT number is not enough: it has to exist. The engine calls VIES, the EU official service, to confirm the number is active. VIES is often down, so the behavior is cautious: if the service does not answer, the number is treated as unvalidated and the invoice falls back to B2C with VAT. An invoice is never blocked because a third-party API is unavailable.
What the module does
Five VAT treatments
Every supply lands on one of these cases. The engine picks based on seller and buyer, in this priority order: seller franchise first, then unknown buyer country (cautious fallback), same country, outside the EU, validated EU B2B, finally EU B2C.
- Domestic: standard rate of the seller country (20% in France)
- Reverse charge: intra-EU B2B with a validated number, 0%, VAT owed by the client
- Export exempt: buyer outside the EU, 0%
- Franchise: seller under article 293 B, 0%, no VAT charged
- OSS destination: intra-EU B2C above the threshold, rate of the client country
VIES validation of the VAT number
Two levels. Format first, free and instant: known EU country prefix and per-country body structure. This pre-filter avoids useless calls. Existence next: the validator hits the VIES REST API, which confirms the number is active and returns the attached name and address. Validation only fires when it is useful, a cross-border intra-EU B2B with a well-formed number.
Bilingual legal mentions
Each treatment carries its legal mention, in French and English, ready to print on the document. Franchise: VAT not applicable, article 293 B of the French Tax Code. Reverse charge: article 196 of Directive 2006/112/EC, VAT due by the customer. Export: VAT exempt, supply outside the EU, article 259 B. Normal VAT adds no mention. The text is standard but the app can override it per locale.
Fiscal config derived from your legal entity
You do not fill a separate VAT form. The engine reads your legal entity: country of establishment, intra-EU VAT number, and regime. A micro-entrepreneur is derived to franchise automatically. OSS registration and crossing the 10,000 euro EU sales threshold default to false, the situation of most freelancers, and stay overridable.
Applied to invoice lines
Once the treatment is decided, it rewrites the line rates. Reverse charge, export and franchise force every line to 0%, that is a legal obligation, you cannot charge VAT. OSS destination aligns the lines on the client country rate. In domestic, the entered rates are kept, to allow a legitimate reduced rate through. Totals are recomputed and the mention is added at the foot of the invoice.
How to use it
- 01
Fill in your legal entity
In /settings/legal-entity, you set your country, regime and intra-EU VAT number. The engine derives your seller config: VAT-registered or franchise.
- 02
Add the client fiscal details
On the invoice, you fill the recipient country, VAT number and business status. A present SIRET or number tips the heuristic to B2B.
- 03
Finalize the invoice
When you finalize in /counsel/invoices, the engine determines the treatment. It validates the number via VIES if it is an intra-EU B2B.
- 04
Rates and mention land
Lines move to the right rate (0% for reverse charge, client rate for OSS), totals are recomputed, the legal mention is added at the foot of the document.
- 05
Your platform subscription follows the same rule
When the platform bills your subscription, the same engine decides the rate and materializes the matching Stripe Tax Rate based on your country and status.