Compliance11 min readAlberto García

EU VAT Rules for Digital Services: OSS, MOSS, and What Changed in 2021

EU VAT on digital services changed in 2021 with MOSS becoming OSS. Here's what that means for your SaaS: when OSS applies, when reverse charge applies, and how to route correctly in code.

vatossmosseudigital-servicessaascompliance

If you sell digital services — SaaS subscriptions, API access, online courses, software licenses — to customers in the EU, you are subject to EU VAT rules regardless of where your company is incorporated. Since July 2021, the Mini One Stop Shop (MOSS) was replaced by the broader One Stop Shop (OSS), changing both the threshold rules and the registration options. This guide explains what the current rules are, which regime applies to your business, and how to implement the correct VAT routing in your billing code.

What counts as a 'digital service' under EU VAT law

EU VAT law (Annex II to Directive 2006/112/EC) defines electronically supplied services as those 'delivered over the internet or an electronic network, the nature of which renders their supply essentially automated and involving minimal human intervention'. In practice, this covers virtually all software-as-a-service products.

  • SaaS subscriptions (project management, CRM, design tools, etc.)
  • API access (metered or subscription — any REST API sold as a product)
  • Online courses and e-learning platforms
  • Digital content streaming (video, music, podcasts)
  • Software license downloads and activation keys
  • Cloud storage and hosting services
  • Online marketplaces that facilitate digital goods or services

Note

If a human is meaningfully involved in delivering the service (consultancy, custom development, coaching), it may not qualify as an electronically supplied service. When in doubt, consult a EU VAT specialist for your specific product.

The B2B/B2C split: which regime applies

The most important thing to understand about EU VAT for digital services is that B2B and B2C transactions are governed by completely different rules. OSS and MOSS are strictly B2C mechanisms. Reverse charge is strictly a B2B mechanism. Both can apply to your business at the same time, for different customers.

Customer typeVAT treatmentYour obligationMechanism
B2B: valid EU VAT number, different countryReverse charge — buyer accounts for VATInvoice at 0%, validate via VIESReverse charge (Art. 196)
B2B: valid EU VAT number, same countryStandard domestic rateCharge and remit local VATDomestic supply rules
B2C: EU consumer (no VAT number)VAT at customer's country rateCollect and remit via OSSOne Stop Shop
B2C: EU consumer, below €10k/year thresholdVAT at your country's rateRemit locally until thresholdHome country rules
Non-EU customerGenerally out of scopeCheck local rulesN/A for EU VAT

OSS registration: when and why

The €10,000 EU-wide threshold for B2C digital services means that until your total B2C digital services revenue across all EU countries (excluding your home member state) exceeds €10,000 in a calendar year, you can choose to apply your home country's VAT rate and remit it locally. Once you exceed this threshold, you must charge VAT at each customer's country rate and remit via OSS.

OSS registration is done in one EU member state (typically your home country or the country where you have a fixed establishment). From there, you submit a single quarterly return covering all EU B2C VAT, and the OSS system distributes it to each member state. This replaces the old requirement to register for VAT in each country where you had customers.

What OSS does NOT cover

Note

OSS and reverse charge are separate regimes for separate customer types. OSS handles B2C VAT collection and remittance. Reverse charge handles B2B zero-rate supplies. A customer with a valid EU VAT number is never part of your OSS obligations — they account for VAT themselves via reverse charge.

Decision flowchart: which regime applies to each transaction

StepCheckIf yesIf no
1Is the customer in the EU?Continue to step 2Outside EU VAT scope (check local rules)
2Did the customer provide an EU VAT number?Continue to step 3B2C — apply OSS rate for customer's country
3Is the VAT number valid in VIES (status: active)?Continue to step 4B2C — treat as unregistered consumer
4Is the customer in a different member state from your seller entity?B2B reverse charge (0%)B2B domestic — apply standard domestic rate

Developer implementation checklist

  • 1.Add a VAT number field to your checkout and account settings UI
  • 2.Validate the submitted VAT number in real time via the TaxID API before completing the order
  • 3.Route the transaction: active VIES result → reverse charge; no number or invalid → OSS/B2C
  • 4.Store the validation result (status + request_id) with the customer record
  • 5.Generate invoices with the correct fields for the applicable treatment
  • 6.Run a monthly re-validation job on all B2B customers with status: active
  • 7.Register for OSS once your EU-wide B2C revenue approaches €10,000/year
typescriptlib/tax-router.ts
type TaxTreatment = {
  regime: 'reverse_charge' | 'oss_b2c' | 'domestic_b2b' | 'out_of_scope';
  vatRate: number; // 0 for reverse charge, customer-country rate for OSS
  reverseChargeNotation: boolean;
};

export async function determineTaxTreatment(
  customerCountry: string,
  sellerCountry: string,
  vatNumber?: string
): Promise<TaxTreatment> {
  const EU_COUNTRIES = ['AT','BE','BG','HR','CY','CZ','DK','EE','FI','FR',
    'DE','GR','HU','IE','IT','LV','LT','LU','MT','NL','PL','PT','RO','SK','SI','ES','SE'];

  if (!EU_COUNTRIES.includes(customerCountry)) {
    return { regime: 'out_of_scope', vatRate: 0, reverseChargeNotation: false };
  }

  if (!vatNumber) {
    const ossRate = await getOssVatRate(customerCountry);
    return { regime: 'oss_b2c', vatRate: ossRate, reverseChargeNotation: false };
  }

  const { status } = await fetch(
    `https://www.taxid.dev/api/v1/validate/${customerCountry}/${vatNumber}`,
    { headers: { Authorization: `Bearer ${process.env.TAXID_API_KEY}` } }
  ).then(r => r.json());

  if (status !== 'active' && status !== 'service_unavailable') {
    const ossRate = await getOssVatRate(customerCountry);
    return { regime: 'oss_b2c', vatRate: ossRate, reverseChargeNotation: false };
  }

  if (customerCountry === sellerCountry) {
    const domesticRate = await getDomesticVatRate(sellerCountry);
    return { regime: 'domestic_b2b', vatRate: domesticRate, reverseChargeNotation: false };
  }

  return { regime: 'reverse_charge', vatRate: 0, reverseChargeNotation: true };
}

Frequently asked questions

  • **If I'm outside the EU, do OSS rules still apply to me?** Yes. If you sell digital services to EU consumers, you are subject to EU VAT regardless of where your business is incorporated. Non-EU businesses can register for OSS via the Non-Union OSS scheme, which operates similarly to the EU OSS but has no €10k threshold.
  • **What happened to MOSS?** MOSS (Mini One Stop Shop) was replaced by OSS in July 2021. OSS covers not just digital services (B2C) but also goods sold via distance selling. If you were registered for MOSS, you were automatically moved to OSS.
  • **Does OSS registration affect my B2B reverse charge obligations?** No. OSS covers only B2C transactions. B2B reverse charge continues to operate independently under the same rules as before.

Start validating EU VAT numbers

Free plan — 100 validations/month. No credit card required.

AG
Alberto García

Founder, TaxID

Building EU VAT validation tools for developers. Obsessed with compliance automation and developer experience.