Configure EU VAT for B2C and B2B

Use this guide to configure EU VAT for a seller established in an EU member state. After activation, Workspace determines tax for carts, quotes, and orders from server-side transaction facts. Invoices and accounting use the immutable order tax snapshot.

EU VAT processing does not replace tax advice. Have a qualified reviewer approve tax positions, registrations, validity periods, and reporting routes before activation.

Prepare the tenant

You need a seller legal entity, active price lists with an explicit net or gross basis, an explicit tax supply kind on every sold product variant, complete fulfilment origins, and an active posting profile with postable revenue and tax accounts. Prepare approved B2C and B2B tax positions for every country and supply kind the shop uses.

Open Commerce > Policies & Taxes > Taxes > Set up EU VAT. The guided page returns only masked tax identifiers.

Maintain tenant master data instead of relying on country presets

Workspace does not ship fixed rates, tax categories, or posting accounts for individual countries. Maintain the values in each tenant through the regular lists:

PrerequisiteMaintained list
Countries in useSystem > Localization > Countries
Product and shipping tax categoriesPIM > Master Data > Tax Classes
Base country and allowed buyer countriesCommerce > Policies & Taxes > Profiles
Legal entitySystem > Organization Structure > Organizations
Country-specific posting logicFinance > Accounting > Posting Profiles
Revenue and tax accountsFinance > Accounting > Accounts

The setup page offers only enabled tenant countries and active tax classes. Registration references come from previously created tax registrations. If no country preset is provided, authorized users can create every required value manually; product code does not contain a hidden fallback for Germany or Austria.

Maintain the tax supply kind in the commercial section under PIM > Variants & Prices > Variants. The field is also available when a variant is created and uses the regular select control. Each tenant can therefore classify every sold product explicitly.

EU membership is a separate, versioned legal policy rule. Tenant master data cannot redefine it. The tenant country list determines which legally supported countries that tenant actually uses.

Addresses may additionally carry an optional, syntactically validated ISO 3166-2 region suffix for territories with different tax treatment inside a country, for example CN for the Canary Islands or 01 for Åland. The suffix alone does not prove tax-territory membership. For explicitly manifested locality exceptions, the Tax V3 territory resolver also evaluates the normalized postal code and locality. Only the resulting non-personal locality code is copied into the tax snapshot. Missing or contradictory facts block the decision. Existing addresses and snapshots are not completed or re-evaluated automatically.

Policy packs and German export deliveries

Tax V3 separates the global determination kernel from origin-country legal rules. A policy pack is bound to a release by an immutable manifest, its digest, and an external professional approval reference. Tenants cannot freely redefine legal bases or tax-territory membership. Unknown, unapproved, or manifest-mismatched packs fail closed.

The German export pack covers direct deliveries of physical goods from a German fulfilment origin to a destination outside the EU VAT territory. The resolved warehouse or dispatch origin is authoritative; the seller company's registered office does not replace it. A company established in Chile or Taiwan can therefore perform a German export delivery when the goods are actually dispatched from Germany and the required German registration exists. A dispatch from Chile or Taiwan requires its own professionally approved country pack.

The bundled German pack descriptor eu-vat-de-export-2026.2 is professionally approved and has APPROVED status. Each tenant must still record its own external approval reference and bind the exact descriptor digest 54fb743ea50b3903e0315cdcf0c6eed234ec668a698559ce8f3484c446e02fd3 before activation. Missing data continues to block activation fail closed. An existing eu-vat-de-export-2026.1 export-pack configuration is not silently reinterpreted as 2026.2 after an update.

To configure German exports:

  1. Select the installed German export pack and record the external tax-review approval reference.
  2. Create a German DOMESTIC_VAT registration for the assigned tax subject.
  3. Create and approve an EU_VAT_GOODS_EXPORT position for German origin, PHYSICAL_GOODS, DIRECT_SELLER, and EXPORT_THIRD_COUNTRY.
  4. Map DE_EXPORT_RETURN, treatment EXEMPT, and reason EXPORT_DELIVERY to the appropriate accounting path.
  5. Create a fresh cutover plan. Readiness blocks missing manifest, registration, position, or accounting bindings.

Within this scope, B2C and verified B2B purchases receive the same treatment. An unverified business sees the same server-side tax projection but remains on the existing quote path. The cart labels the result as a tax-exempt export delivery and displays the evidence requirement instead of presenting only a generic zero rate.

The decision carries EXEMPT, EXPORT_DELIVERY, the German legal basis under § 4 no. 1(a) in conjunction with § 6(1) no. 1 UStG, and EXPORT_PROOF_CONFIRMED. It does not calculate import VAT, customs duties, or landed cost in the destination country. Buyer collection, marketplace and deemed-supplier cases, chain transactions, triangular transactions, and unknown territory aliases are outside this pack. Special territories listed explicitly in the manifest are resolved from the frozen country, region, and, where required, locality context. Monaco is treated as France for VAT; Northern Ireland is part of the EU VAT territory only for physical goods. Facts that cannot be resolved unambiguously block the decision.

Set up domestic B2C sales in one country

If a shop sells only to consumers in its own EU country, use Set up local B2C sales in the first step. Select a commerce profile that allows only that country, a supply kind, an active tax category, an active posting profile, and its revenue and tax accounts. The country comes from the commerce profile; this path does not offer a free-form or global country list.

After tax identifier, rate, start date, and evidence reference have been reviewed, Workspace creates the domestic registration, active policy release, approved B2C position, and both accounting mappings in one transaction. If a prerequisite fails, the EU VAT configuration remains unchanged. The same flow supports Germany, Spain, and other enabled EU countries. Workspace does not provide a country-specific tax rate or chart of accounts as legal guidance; those values must already be reviewed and configured in the tenant.

Then create an activation plan for B2C_ACTIVE. For a domestic-only profile, readiness requires neither a second country nor a B2B position. A later move to B2C_B2B_ACTIVE validates the B2B cases that the profile actually allows.

The supported product scope covers physical goods, electronically supplied software and SaaS, and general-rule B2B services. Classification follows the sold product; it is not inferred from storage, download, or other technical product flags. Unclassified sellable variants block activation.

Configure the tax posture

Assign one tax subject to the seller legal entity. Then record its domestic VAT, Union OSS, or local destination registrations. Union OSS is a reporting route, not the rule that determines the place of taxation. A destination sale without an applicable OSS or local registration is blocked.

Create a time-bound EU VAT policy release and add every required jurisdiction, active product tax category, and active shipping tax category. Enter 19 percent as 0.19 and 20 percent as 0.20. Mark a component as inclusive only when the source price includes tax. Activate the release after its rate set is complete; activation seals the dataset.

Record B2C and B2B decisions

For the EU EUR 10,000 exception, use the Article 59c decision type. ORIGIN_EXCEPTION uses the origin country when all conditions are met; DESTINATION_GENERAL_RULE uses the destination rule. Exactly EUR 10,000 does not exceed the threshold. In the current pilot, this decision type covers intra-EU distance sales of physical goods and supplies explicitly classified as ELECTRONICALLY_SUPPLIED_SERVICE. General services are separate; telecommunications, broadcasting, television services, and imported distance sales remain outside this product scope. The current product version does not calculate the threshold automatically, so record a reviewed, time-bound DECLARED position with evidence. Missing coverage is not treated as zero turnover.

Use a declared transaction decision for domestic B2B, intra-EU goods, and cross-border services. Keep place of taxation, liable party, reporting route, and registration reference separate. Workspace applies B2B treatment only when the storefront provides a current accepted business tax check. For the EU pilot, its issuing country must match the determined customer country for cross-border goods and general B2B services. A company name or unverified VAT ID is not sufficient. Multi-establishment customers, triangular transactions, and other special cases remain outside the pilot until dedicated presence and policy modules are available.

Save positions as drafts. A user with approval permission reviews the evidence and reason codes before approval.

Transfer configuration between tenants

Export tax positions, rates, and accounting mappings as a CSV configuration matrix. The format uses stable business references instead of tenant-local IDs. The target tenant must already contain the legal entity, policy release, posting profile, and accounts under matching references.

The existing download without schema selection and nucli continue to use matrix V1. Select matrix V2 explicitly with --schema-version v2 when the configuration contains additional tax regimes or treatments such as EXEMPT and ZERO_RATED. V1 cannot represent those values without loss, so its export fails instead of relabelling a regime or treatment. The Tax V3 workbench always requests matrix V2 explicitly for its policy-pack and treatment scope.

Preview the file before importing it. Each row is classified as CREATE, UNCHANGED, or CONFLICT, and the preview returns a digest. Only a conflict-free file with that exact digest can be applied atomically. Imported positions and rates remain drafts and require the target tenant's own review and activation. This makes the configuration reusable without transferring another customer's approval.

Map accounting and activate

Map each economic source, including order lines and paid shipping, to a revenue account. Then map every jurisdiction, tax type, tax category, liable party, and reporting route to a tax account. These mappings post an existing tax decision; they do not determine tax.

Create a fresh activation plan. Resolve every blocker and plan again. Activate B2C_ACTIVE first. Workspace rejects the digest if the configuration changes before activation, and business buyers remain blocked during this stage. After the B2C observation period, create a new plan and advance the same tenant to B2C_B2B_ACTIVE.

If tax output is under review, suspend admission for new EU VAT transactions. Resuming requires a fresh ready digest and an external approval reference. Finalized transactions never fall back to legacy tax logic.

After activation, verify consumer domestic and destination cases, verified and invalid business cases, separate billing and shipping destinations, quotes created directly by sales, quotes created from carts, reconfirmation, orders, invoices, and accounting components in a test shop.

When German export treatment is active, also verify B2C, verified B2B, and an unverified business with a German warehouse and a third-country destination. Confirm that an EU destination stays on the existing internal-market path and that an unapproved non-German dispatch origin fails closed.

An order and invoice may be created before export evidence is confirmed. The period export and closure of the affected German VAT obligation remain blocked until all shipment-bound requirements are complete. Their canonical CCMS checks must be closed, and a real scanner must have marked the assigned files as clean. A free-form Tax Reporting reference cannot set EXPORT_PROOF_CONFIRMED. Workspace does not review the legal content of the document and does not submit a return to an authority.

A sales quote does not have to originate from a cart. Add a variant directly to the quote, then edit the line name, description, quantity, and custom price as required. Workspace still determines tax on the server from the quote context, commerce profile, and the variant's tax supply kind. Cart lineage is additional evidence only when a quote actually originated from a cart. Once EU VAT processing has finalized its first order, do not switch back to the previous tax logic. Activate it only after the full readiness review. The current product version records credit notes and corrected invoices as separate immutable follow-up documents with a source-invoice reference; test this workflow in your installation before activation.

XRechnung and reporting periods

A document profile using XRECHNUNG_3_0_2_UBL creates a separate UBL file next to the PDF invoice. Workspace publishes the final invoice bundle only after the configured external validator confirms the expected format and XRechnung profile. The bundle manifest records the validator name, version, ruleset, and XML hash. ZUGFeRD and Peppol transport are not part of this profile.

Every XRechnung requires a buyer-assigned reference; the seller's own order number is not used as a substitute. An intra-community supply of goods also requires the actual shipment date and complete delivery address in the final snapshot. The invoice bundle is not published if any of these facts is missing.

In addition to the adapter URL, configure the exact expected ruleset evidence under einvoice.validation.xrechnung_3_0_2_ruleset. For the verified KoSIT validator release, use EN16931 1.3.13, XRechnung 3.2. Publication is blocked if the value is missing or the validator reports a different value. Review and update the pin deliberately whenever the validator is upgraded.

Final EU VAT invoices create immutable tax transaction records. The reporting view groups the relevant country's VAT return and EC sales list obligations alongside Union OSS by period. Country-specific destinations include the ISO country code, for example ES_VAT_RETURN or NL_EC_SALES_LIST. For intra-EU goods, a current business tax check and initial shipment reference are sufficient for invoicing, but the period export remains blocked until complete transport evidence is confirmed. TRANSPORT_PROOF_CONFIRMED can still be recorded against the tax transaction with an encrypted external reference. EXPORT_PROOF_CONFIRMED follows a stricter contract: complete the shipment-bound requirements from the shipment view. Only closed CCMS checks and real clean scanner receipts create this evidence; Tax Reporting does not accept a free-form reference for it.

CSV and JSON exports support review and handoff to a tax advisor. The default schema tax-reporting-export.v1 remains compatible with existing consumers. Select tax-reporting-export.v2 explicitly to include treatment, reason, legal-basis, and evidence-requirement fields. After review, a user with tax_v3_reporting:close permission can close the period. Closing is idempotent and prevents later transaction projection into that obligation. Workspace does not submit returns to an authority.

The tenant-aware CLI exposes the same server contracts:

shell
nucli tax configuration matrix export --output tax-v3-matrix-v1.csv
nucli tax configuration matrix export --schema-version v2 --output tax-v3-matrix-v2.csv
nucli tax reporting confirm-evidence TRANSACTION_ID --type TRANSPORT_PROOF_CONFIRMED --reference REFERENCE
nucli tax reporting export 2026-08 DE_VAT_RETURN --schema-version v2 --format csv --output report.csv
nucli tax reporting close 2026-08 DE_VAT_RETURN