Si vous vendez un produit SaaS à des clients de l'UE, vous êtes soumis aux règles de TVA de l'UE. La bonne nouvelle est que les règles sont logiques une fois que vous comprenez le cadre sous-jacent. Ce guide vous donne le cadre pratique sans la théorie juridique.
Les deux règles fondamentales
| Scénario | TVA collectée par | Taux appliqué | Note de facture |
|---|---|---|---|
| Client B2B UE, numéro de TVA valide | L'acheteur (autoliquidation) | 0% sur votre facture | "Autoliquidation — Art. 196 Directive TVA UE" |
| Client B2C UE | Vous (fournisseur) | Taux du pays du client | Montant TVA affiché explicitement |
| Client hors UE | Aucune partie | 0% (hors champ) | "Non soumis à la TVA de l'UE" |
Note
Si vos ventes B2C annuelles vers tous les pays de l'UE dépassent 10 000 €, vous devez soit vous enregistrer à la TVA dans chaque pays individuellement, soit utiliser le guichet unique TVA (OSS) pour déclarer toutes vos ventes dans l'UE.
async function calculerTraitementTVA({ paysCLient, numeroTVA }) {
const PAYS_UE = ['AT','BE','BG','CY','CZ','DE','DK','EE','ES','FI',
'FR','GR','HR','HU','IE','IT','LT','LU','LV','MT',
'NL','PL','PT','RO','SE','SI','SK'];
if (!PAYS_UE.includes(paysCLient)) {
return { taux: 0, mecanisme: 'hors_ue', noteFacts: 'Non soumis à la TVA de l\'UE' };
}
if (numeroTVA) {
const res = await fetch('https://api.taxid.dev/v1/validate', {
method: 'POST',
headers: { 'Authorization': `Bearer ${process.env.TAXID_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ taxId: numeroTVA })
});
const { valid } = await res.json();
if (valid) return { taux: 0, mecanisme: 'autoliquidation', noteFacts: 'Autoliquidation — Art. 196 Dir. TVA UE' };
}
const ratesRes = await fetch(`https://api.taxid.dev/v1/rates?country=${paysCLient}`, {
headers: { 'Authorization': `Bearer ${process.env.TAXID_API_KEY}` }
});
const { standard_rate } = await ratesRes.json();
return { taux: standard_rate, mecanisme: 'standard' };
}Start validating EU VAT numbers
Free plan — 100 validations/month. No credit card required.