Taxes
Stop picking VAT rates by hand. Assign a tax class to a product or invoice line and Enlivy resolves the correct rate automatically, based on who the customer is and where they are, with the right EU codes for e-invoicing built in.
Start Today
THE ENLIVY TAX ENGINE
Every Sale, Taxed Correctly, Automatically
Assign a Tax Class. Enlivy resolves the right rate automatically, based on who the customer is and where they are.
Taxes no longer mean just adding a percentage to an invoice. The customer's country, business status, VAT number, EU rules, reverse charge, and e-invoice requirements can completely change the treatment of the same sale.
A Tax Class is a semantic product category, the way Stripe models product tax codes: Books, Foodstuffs, Digital services, Exempt. You tag a product with the category it is, never a percentage by hand. Underneath each class sits a set of tax rates, one row per country or selling scenario, and at invoice time Enlivy resolves the single applicable rate by the buyer's country and tax status, taking the highest-priority match.
- Sync tax classes from Stripe automatically, de-duplicated, with no re-entry
- Set rates inclusive or exclusive, per class
- Preview which rate applies to any customer before you send, with Simulate Mapping
- Full audit trail on every change, even on synced classes
One label, the right rate every time
Assign a Tax Class to a product, a proposal line, or an invoice line. Enlivy resolves the correct rate from who the customer is and where they sit: consumer or business, EU VAT registered or not.
Build your own rate set
Create a class per product category (goods, books, digital services), then add the rate rows underneath: one per country, a 0% EU B2B reverse charge, and a rest-of-world catch-all, each with its own priority in the resolution ladder.
Compliant e-invoicing, built in
Assign EU VAT category codes and VATEX exemption reason codes, so your e-invoices carry the machine-readable data government platforms require, not just a number and a percent.
Proven at scale
The same engine runs Enlivy's own subscription billing across 27 EU countries, and managed classes synced from Stripe stay linked per rate for ongoing consistency.
Everything You Need to Stay Tax-Correct
From automatic rate selection to PEPPOL e-invoicing, every capability you need is built in and working today.
- Rate Selection
Enlivy filters and ranks all rates in a class against the customer's country, region, business status, and VAT registration, and applies the highest-priority match. No manual picking.
- EU B2B Reverse Charge
Configure a 0% rate for VAT-registered EU businesses, with the correct AE category code and VATEX-EU-AE reason. Enlivy applies it automatically to qualifying customers; the e-invoice passes compliance checks.
- Catch-All Safety Net
A Tax Rate with no location set covers every sale that doesn't match a specific country. Without one, uncovered sales go out with no tax, silently. The simulator warns you when this is the case.
- Tax Resolved at Billing Time
Tax is determined when each invoice is generated, not when the quote was signed. VAT changes mid-contract, and customer status changes, flow onto the next invoice automatically.
- PEPPOL & e-Invoicing Ready
Enlivy produces structured e-invoices with per-line VAT categories (S, AE, Z, E, O), a grouped VAT breakdown block, and party VAT numbers, exactly as Romania's eFactura and PEPPOL require.
- Inclusive & Exclusive Pricing
Mark a rate or product as tax-inclusive and Enlivy extracts the VAT from the price. The customer pays the listed amount; the invoice breakdown is still complete and correct.
- Country, Region & Postal Targeting
Location targeting works for any country down to region and postal code level. A single rate can cover multiple countries, or zero, to act as a global catch-all.
- Multilingual
Tax Class names, descriptions, EU VAT category codes, and exemption code labels are stored and displayed in multiple languages.
THE ENLIVY ADVANTAGE
Stop Juggling Rules. Use One System.
| Capability | Enlivy Taxes | Manual / Spreadsheet Approach |
|---|---|---|
| Rate selection | Automatic by country, business status, and VAT registration | Manual pick per invoice line, error-prone |
| EU B2B reverse charge | Configured once, applied automatically with correct codes | Remembered per invoice, often missed or miscoded |
| VAT rate changes mid-contract | Each invoice resolves at generation time, always current | Frozen at the rate when the contract was created |
| PEPPOL / e-invoicing compliance | EU VAT category codes plus VATEX reason codes on every line | No structured output, rejected by government platforms |
| Inclusive pricing | Per-product flag, Enlivy extracts VAT | Manual calculation each time, rounding errors accumulate |
| Multi-country coverage | One Tax Class covers all countries with a catch-all | Separate lookup or spreadsheet column per country |
| Stripe tax sync | Auto-imported from Stripe, de-duplicated, tagged | Re-entered by hand, duplicates accumulate |
| Exempt invoices | Requires a valid VATEX reason code, audit-proof by default | "Exempt" typed as text, rejected by e-invoicing platforms |
Get Started in Minutes
Everything you need to configure tax, from scratch to fully covered.
Create a Tax Class
Add Tax Class. Give it a name (what you’ll see in dropdowns), an optional display name for invoices (e.g. VAT, GST), and an optional description. The class is ready to hold Tax Rates.
Add Tax Rates
Add a Tax Rate. Set the percentage, who it applies to, and whether it’s location-based. Assign a priority so Enlivy knows which rate wins when multiple match.
Work Seamlessly With Your Enlivy Workspace
Tax doesn’t live in isolation. The same Tax Class configuration powers every step of the commerce workflow; from first quote to final government e-invoice.
- Products
Assign a default Tax Class and a "price is tax inclusive" flag to every product. It travels with the product to any invoice or proposal line.
- Proposals & Offers
Offer lines carry the Tax Class, not a frozen rate. The rate is resolved at billing time, so changes between quote and invoice are always reflected correctly.
- Billing Schedules
Recurring plans resolve tax at each invoice's generation time. Month 7 of a 12-month plan uses the current rate, not the one from when the contract started.
- Invoices & Receipts
Tax is stored at two levels, per line item (full detail) and per invoice (grouped summary for PEPPOL). Both are automatically kept in sync.
- Stripe
Tax rates sync from Stripe automatically. Content-hash de-duplication prevents copies on repeated syncs. Stripe-sourced classes are labeled for easy identification.
- Network Exchanges (eFactura)
Enlivy generates PEPPOL-compliant structured e-invoices with per-line VAT categories, VAT breakdown blocks, and party VAT numbers, ready for Romania's eFactura and any EU government platform.
API Reference
Tax Management from the API
Enlivy models tax the way Stripe models product tax codes, not one class per country. A tax class is a semantic product category (Standard goods & services, Books, Foodstuffs, Digital services, Exempt), and you tag each product with the category it is, never a percentage by hand. Underneath each class sits a set of tax rates, one per country or selling scenario, and at invoice time Enlivy resolves the single applicable rate from the buyer's country and tax status, taking the highest-priority match.
The examples below cover both layers: the class (the category) and the rates (the country rows that resolve underneath it).
List your product-tax categories. Include tax_rates_overview for a summary of the rate set resolving under each class.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/tax-classes` +
// filters: name, description, ids
`?page=1&limit=20` +
// include tax_rates_overview for a per-class summary of the rate set
`&include=tax_rates_overview`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
);Create one class per product category you sell. A class is a category, not a country and not a single rate; the country rows live underneath it. Products then point their organization_tax_class_id at the category they belong to.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
// Create one class per product CATEGORY you sell (Standard goods & services, Books,
// Foodstuffs, Accommodation, Digital services / SaaS, Exempt). A class is a category,
// not a country and not a single rate; the country rows live underneath it.
fetch(`https://api.enlivy.com/organizations/${organizationId}/tax-classes`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
// the category, not a rate: per-locale maps
name_lang_map: { en: "Books & publications", ro: "Cărți și publicații" },
description_lang_map: { en: "Reduced-rate category for books and periodicals." }
})
});Update a category''s labels, or soft-delete it (restore later). Deleting a class removes the category its rate rows resolve under, so remove or reassign those rows first.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
const taxClassId = "your_tax_class_id";
const headers = { Authorization: `Bearer ${token}`, "Content-Type": "application/json" };
const url = `https://api.enlivy.com/organizations/${organizationId}/tax-classes/${taxClassId}`;
// Update a category's labels
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify({ name_lang_map: { en: "Books & publications (2026)" } })
});
// soft delete; restore via POST /tax-classes/restore/{taxClassId}
fetch(url, { method: "DELETE", headers });List the rate rows. Expand the parent class and the locations each row applies to. For a per-class summary, use the class''s tax_rates_overview include instead.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
fetch(
`https://api.enlivy.com/organizations/${organizationId}/tax-rates` +
`?page=1&limit=50` +
// includes: organization, organization_tax_class, locations
`&include=organization_tax_class,locations`,
{
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
}
);A tax rate is one row in a class''s rate set, not a standalone tax. Each row declares a scope, an EN16931 VAT category, and a priority; at invoice time Enlivy takes the highest-priority matching row. The canonical set: home-country domestic, EU B2B reverse charge, per-country OSS, and a rest-of-world catch-all.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
const headers = { Authorization: `Bearer ${token}`, "Content-Type": "application/json" };
const classId = "standard_goods_class_id";
// A tax rate is ONE ROW in a class's rate set, not a standalone tax. Each row declares a
// scope (locations and/or buyer conditions), an EN16931 VAT category (eu_vat_class), and a
// priority. At invoice time Enlivy takes the highest-priority row whose scope + buyer match.
const common = {
organization_tax_class_id: classId,
has_eu_vat_properties: true,
is_compound: false,
is_shipping: false,
is_inclusive: false
};
// The canonical rate set for one category (home country = Romania): four archetypes.
const rateSet = [
{
// Home-country domestic: the default when selling within Romania
name: "RO Domestic 21%", rate: 21, priority: 1000,
eu_vat_class: "S", // Standard-rated, stamped on the invoice line
has_locations: true, locations: [{ country_code: "RO" }]
},
{
// EU B2B reverse charge: 0%, matches ONLY VAT-registered businesses in other EU states
name: "EU B2B Reverse Charge", rate: 0, priority: 900,
eu_vat_class: "AE", vatex_code: "VATEX-EU-AE", // exemption reason (PEPPOL)
is_business_entity: true, is_eu_vat_registered: true, // buyer-qualification gates
has_locations: true, locations: [{ country_code: "DE" }, { country_code: "FR" }]
},
{
// Per-country EU domestic (B2C digital / OSS): charge the buyer's own country rate
name: "DE Domestic 19%", rate: 19, priority: 800,
eu_vat_class: "S",
has_locations: true, locations: [{ country_code: "DE" }]
},
{
// Rest of world: outside scope, 0%, no locations = catch-all fallback
name: "Rest of World (Outside Scope)", rate: 0, priority: 100,
eu_vat_class: "O", vatex_code: "VATEX-EU-O",
has_locations: false
}
];
for (const row of rateSet) {
await fetch(`https://api.enlivy.com/organizations/${organizationId}/tax-rates`, {
method: "POST",
headers,
body: JSON.stringify({ ...common, ...row })
});
}Adjust a single row: change its percentage, VAT category, scope, or priority in the resolution ladder. Send only the fields you are changing.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
const taxRateId = "your_tax_rate_id";
// Adjust a single row: its percentage, VAT category, scope, or priority in the ladder.
// Send only the fields you are changing.
fetch(`https://api.enlivy.com/organizations/${organizationId}/tax-rates/${taxRateId}`, {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
rate: 20, // e.g. the RO domestic rate changes
display_name: "VAT 20%"
})
});Soft-delete a single row from a class''s set, for example to retire a country you no longer sell into. It can be restored later.
const organizationId = "your_org_id";
const token = "YOUR_TOKEN_HERE";
const taxRateId = "your_tax_rate_id";
// soft delete; restore via POST /tax-rates/restore/{taxRateId}
fetch(`https://api.enlivy.com/organizations/${organizationId}/tax-rates/${taxRateId}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json"
}
});Works together with
- InvoicesCreate a compliant invoice in seconds, send it, and watch it link itself to the contract, payment, and bank transaction it belongs to. EU e-invoicing is built in, so the work between issuing and getting paid happens in one place.
- Network ExchangesSend and receive e-invoices automatically, straight through ANAF eFactura today, with PEPPOL and other EU platforms on the same rails. Incoming invoices pull in on their own, outgoing ones push out on your schedule, and every exchange keeps a full history. No XML files, no manual uploads.
- ReceiptsReceipts gives you a structured record of every payment, money in and money out: linked to your invoices and contracts, with your cashflow always up to date.
- PayslipsBuild a payslip template once with the fields your business needs, then generate payslips for every employee in minutes. Each one links to its contract, payment, and bank transaction, so the whole record stays connected and traceable.
- Data ExportExport your invoices, receipts, payslips, contracts, and transactions in the format and folder structure your accountant expects, for any date range. Built in, no extra cost, ready in seconds.
- MCPConnect Enlivy to Claude, ChatGPT, Cursor, or any AI assistant through MCP. Ask about your invoices, contracts, and pipeline, and get real work done, safely scoped to exactly what your own account can already do.