If you sell a SaaS product to EU customers, you're subject to EU VAT rules. The good news is that the rules are logical once you understand the underlying framework. The bad news is that most developers encounter them in the middle of a billing implementation, without time to read EU directives. This guide gives you the practical framework without the legal theory.
The Two Fundamental Rules
Everything in EU VAT for SaaS flows from two rules: (1) For B2B sales, VAT is accounted for by the buyer in their country (reverse charge). (2) For B2C sales, VAT is charged at the customer's country rate and reported by you. These two rules have very different implementation implications.
| Scenario | VAT Charged By | Rate Applied | Invoice Note |
|---|---|---|---|
| B2B EU customer, valid VAT number | Customer (reverse charge) | 0% on your invoice | "Reverse charge - Art. 196 EU VAT Directive" |
| B2C EU customer | You (supplier) | Customer's country rate | VAT amount shown explicitly |
| Non-EU customer (B2B or B2C) | Neither party | 0% (out of scope) | "Not subject to EU VAT" |
Place of Supply for Digital Services
For digital services (SaaS, APIs, software downloads), the place of supply is always where the customer is located, not where you are. This means a German company selling SaaS to a French customer must apply French VAT rules — not German ones. This is different from physical goods, where origin-based rules often apply.
Note
If your annual B2C sales to all EU countries combined exceed €10,000, you must either register for VAT in each country individually or use the EU One Stop Shop (OSS) scheme to file a single quarterly return covering all EU sales.
Implementing VAT in Your SaaS Checkout
async function computeVatTreatment({ customerCountry, vatNumber }) {
const EU_COUNTRIES = ['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'];
// Non-EU: no EU VAT
if (!EU_COUNTRIES.includes(customerCountry)) {
return { rate: 0, mechanism: 'out_of_scope', invoiceNote: 'Not subject to EU VAT' };
}
// B2B with VAT number: validate and apply reverse charge
if (vatNumber) {
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: vatNumber })
});
const { valid } = await res.json();
if (valid) {
return { rate: 0, mechanism: 'reverse_charge', invoiceNote: 'Reverse charge - Art. 196 EU VAT Directive' };
}
}
// B2C: apply customer country standard rate
const ratesRes = await fetch(`https://api.taxid.dev/v1/rates?country=${customerCountry}`, {
headers: { 'Authorization': `Bearer ${process.env.TAXID_API_KEY}` }
});
const { standard_rate } = await ratesRes.json();
return { rate: standard_rate, mechanism: 'standard' };
}OSS Registration
The EU One Stop Shop (OSS) lets you file a single VAT return for all your B2C EU sales, rather than registering in each country separately. You register in your home country, then file quarterly returns reporting sales to each EU country at that country's rate. For non-EU businesses, the Import One Stop Shop (IOSS) handles B2C sales of goods.
VAT Invoice Requirements
- →Your legal company name and address
- →Your VAT registration number
- →Customer's legal name, address, and VAT number (B2B)
- →Invoice date and a unique sequential invoice number
- →Description of services supplied
- →Net amount (ex-VAT), VAT rate, VAT amount, and total including VAT
- →For reverse charge: explicit note citing Art. 196 EU VAT Directive
- →For OSS sales: customer's country VAT rate applied
Related guides
Start validating EU VAT numbers
Free plan — 100 validations/month. No credit card required.