Tax & Compliance
EU/UK tax zones, buyer types, zone-aware resolution, VIES validation, and finance settings.
Overview
Phase 4 extends the Phase 2 tax engine with zone-aware resolution for EU/UK compliance. Tax is resolved per document context — rentals, invoices, credit notes, and purchase orders — through ZoneAwareTaxResolver and DocumentTaxBreakdown extraction.
The legacy rule matrix (company class + catalogue item class → rate) remains for reference data; see Tax types. Zone rules take precedence for financial documents in configured territories.
Tax zones
Tax zones group countries and regions with zone-specific rules. Each zone defines how buyer type and catalogue item tax category combine to produce a treatment.
| Admin route | Purpose |
|---|---|
/admin/settings/tax/zones |
List zones |
/admin/settings/tax/zones/create |
Create zone |
/admin/settings/tax/zones/{taxZone}/edit |
Edit zone rules |
See Tax Zones API.
Buyer types
Four buyer types drive zone resolution:
| Type | Typical use |
|---|---|
| Business | B2B with VAT number |
| Individual | B2C consumer |
| Government | Public sector |
| Charity | Registered charity |
Buyer type is set on the account and consumed at document resolution time. Fresh installs seed reachable zone rules for each type.
Resolution outcomes
ZoneAwareTaxResolver returns treatments including:
| Treatment | Description |
|---|---|
| Standard rated | Normal VAT on net amount |
| Reverse charge | Customer accounts for VAT; legal text on documents |
| Zero-rated | 0% rated supply |
| Exempt | Exempt from VAT |
| Outside scope | Not title to VAT |
Reverse charge eligibility can depend on VIES VAT validation (see below). The reverse-charge display label is configurable under Finance settings.
CatalogueItem tax category
CatalogueItems carry a tax category dimension end-to-end on line items and documents. Surcharges also reference per-surcharge tax types. See Tax types for the underlying class definitions.
VIES VAT validation
For EU B2B reverse charge, Signals validates VAT numbers asynchronously against VIES:
- Validation runs after VAT number entry or manual confirmation
- Results feed reverse-charge eligibility on the account
- 30-day revalidation with a scheduled expiry check job
- Webhook:
account.vat_validatedfires after VIES or manual confirmation
Finance settings
Route: /admin/settings/finance
| Setting area | Purpose |
|---|---|
| Tax-point policy | When tax is determined (e.g. invoice date vs payment date) |
| Reverse-charge label | Legal text displayed on reverse-charge documents |
| Finance toggles | Consumed by checkout and document rendering |
Tax configuration changes are recorded in the tax configuration audit trail.
Document axes
| Document | Tax axis |
|---|---|
| Rental | Live resolution on lines; frozen at checkout |
| Invoice | Frozen snapshot from checkout |
| Credit note | Negated mirror of invoice tax |
| Purchase order | Purchase-axis tax for sub-hire procurement |
Using it in the app
Tax admin lives under Admin → Tax (sidebar group tax, gated on tax-types.view for the Tax nav link). Mutations on tax types, rates, rules, zones, and categories go through action classes that require tax-types.manage.
| Screen | Route |
|---|---|
| Finance settings | /admin/settings/finance |
| Tax Zones | /admin/settings/tax/zones |
| Tax Categories | /admin/settings/tax/categories |
| CatalogueItem Tax Types | /admin/settings/tax/catalogue-item-tax-types |
| Company Tax Types | /admin/settings/tax/company-tax-types |
| Tax Rates | /admin/settings/tax/rates |
| Tax Rules | /admin/settings/tax/rules |
Tax Zones and Tax Categories are in the admin sidebar but not on the admin landing overview cards (those cards list Finance, legacy classes, rates, and rules only).
Finance settings
Route: /admin/settings/finance
| Section | Fields |
|---|---|
| Tax Point | Tax point date — Supply date or Invoice date |
| Pricing Defaults | New rentals default to prices include tax; Show tax breakdown on documents |
| VAT Validation | VAT validation validity (days) — how long a VIES/HMRC check remains trusted |
| Reverse Charge Display | Reverse charge label — text shown on tax breakdowns and documents when reverse charge applies |
Click Save Changes to persist. There is no dedicated tax-configuration audit UI — changes surface in the general Action Log when auditable events fire.
Tax zones, categories, and rules
Tax Zones — list shows Name, Slug, Countries (account-country count), Priority, Status. Form fields: Name, Slug, Description, Priority, Active.
Tax Categories — list shows Name, Slug, Type, Default, Status. Form: Name, Slug, Type (Standard / Reduced / Zero rated / Exempt), Description, Default category, Active.
Tax Rules index combines legacy Class rules and Zone rules in one table (Type, Name/Mapping, Zones, Buyer, Result, Priority, Status).
- Add Class Rule — company tax type + catalogue item tax type → tax rate, priority, active
- Add Zone Rule — seller zone, buyer zone, optional buyer type, requires validated tax ID, tax category, result type (Standard / Reverse charge / Zero rated / Exempt / Outside scope), legal text, priority, active
Reverse-charge legal text on zone rules feeds document and totals rendering; the configurable display label comes from Finance settings.
Account tax fields
On the account form (companies and venues), the Account section shows Tax Number with validation badges:
| Badge | Meaning |
|---|---|
| Pending validation | VAT number entered, check not yet complete |
| Valid | Passed VIES/HMRC validation |
| Invalid | Validation failed |
Re-check VAT (accounts.edit) re-queues validation.
The Tax & Pricing section also exposes Sale Tax type and Purchase Tax type (legacy class axis). Fields for tax zone, buyer type, and tax exempt exist on the account model but are not on the account form UI yet — zone resolution uses account country and company data at runtime.
Warehouse seller zone
Warehouses are managed at /admin/settings/warehouses (Admin → Setup). The form covers name and address only — there is no Tax Zone picker on the warehouse modal. Seller zone for documents is resolved from each warehousee's country/tax_zone_id at runtime via TaxZoneResolver.
Reverse charge in documents
When zone resolution returns reverse charge, totals and generated documents show the reverse charge label from Finance settings plus any legal text configured on the zone rule. No separate reverse-charge editor exists outside those admin screens.
Permissions summary
| Permission | UI effect |
|---|---|
tax-types.view |
Tax admin sidebar link |
tax-types.manage |
Create / edit / delete tax types, rates, rules, zones, categories |
accounts.edit |
Re-check VAT on account form |
Related documentation
- Multi-Currency & Tax — currencies, exchange rates, base engine
- Tax types — catalogue item/company classes and rule matrix
- Invoicing — frozen tax at checkout
- Sub-Hire & Procurement — PO tax axis