- VRBL overview
- VRBL invoice overview
VRBL overview
Vertex Universal Standard (VRBL) provides a structured XML format for electronic business documents. You can use it to represent country and mandate-specific information for transformation into the required final format.
Your system must provide complete, internally consistent business information. VRBL also supports inbound conversion and extensions as new mandates and requirements emerge.
Select your country and mandate in the VRBL technical specifications for element definitions, usage, cardinalities, permitted values, and validation rules.
VRBL basic concepts
VRBL uses the following concepts to structure, validate, and transform electronic business documents.
| Concept | Meaning |
|---|---|
| Business document | An XML file that represents an electronic document, such as an invoice, dispatch advice, or application response. |
| Document type | Identifies the document's purpose and determines its XML structure, including mandatory and optional groups and elements. |
| Group | An XML container node that organises elements and nested groups into a hierarchy. |
| Element | An XML leaf node that holds information within that hierarchy. |
| Validation | Checks the document's structure, syntax, and semantic validity using XML schemas and business rules. The checks depend on the document type and mandate. |
| Transformation | Converts outbound VRBL documents into mandate or platform-specific formats, and inbound documents from those formats into VRBL. |
Supported document types
VRBL supports the following document types. Several VRBL document types use the same underlying Universal Business Language (UBL) document type.
Document-type overviews explain how the main components fit together. Use the mandate-specific specifications for the exact fields and rules that apply to your implementation.
| VRBL document type | UBL document type | Purpose |
|---|---|---|
| Invoice | ubl:Invoice |
Exchange billing data for invoices, credit notes, and debit notes. |
| Dispatch Advice | ubl:DespatchAdvice |
Notify a buyer about the dispatch of items and the details of an order. |
| Waybill | ubl:Waybill |
Provide carriers, consignors, consignees, or authorities with delivery instructions, carriage terms, and shipment details. |
| Payments Report | ubl:Statement |
Report completed fund transfers, invoice allocations, and account reconciliations. |
| Rejections Report | ubl:Statement |
Exchange response data that identifies a previously submitted document, reports its rejection, and explains the reasons. |
| Transactions Report | ubl:Statement |
Provide business partners or regulatory bodies with activity logs and audit trails of commercial transactions over a specified period. |
| Lifecycle Message | ubl:ApplicationResponse |
Track, report, and audit the processing stages and status changes of a business document throughout its lifecycle. |
| Compliance Response | ubl:ApplicationResponse |
Communicate regulatory status, tax authority approval, or compliance verification results for a submitted document. |
| Application Response | ubl:ApplicationResponse |
Notify a sender of a document's acceptance, rejection, or processing status at the application level. |
Technical standards and extensions
VRBL combines UBL 2.4 document structures with reusable extensions and mandate-specific rules.
| Standard or mechanism | Role in VRBL | What this means for your implementation |
|---|---|---|
| XML | Provides the document syntax. | Create well-formed XML documents. |
| UBL 2.4 | Defines the underlying document structures and schema cardinalities. | Ensure that documents comply with UBL 2.4. Each VRBL invoice instance must conform to the schema for the corresponding UBL 2.4 main document type. |
| Peppol BIS and Peppol PINT Billing | Provide core rules, principles, and structures that VRBL follows where applicable. VRBL deviates where necessary to preserve semantic clarity or support mandates that don't use UBL natively. | Follow the applicable VRBL mandate profile, including documented deviations. |
| VRBL extensions | Use UBL 2.4's standard extension containers for additional reusable business terms and groups that base UBL 2.4, Peppol BIS, or Peppol PINT Billing don't cover. | Use the components predefined in the VRBL extensions schema. |
VRBL extensions
VRBL extension components use the namespace prefix vrbl, mapped to urn:vertexinc:vrbl:ExtensionComponent:1.
Each VRBL extension element or group represents a single, unique context. Its absolute XPath identifies its position within the XML document structure. VRBL extensions represent reusable business terms and business groups, rather than mandate or platform-specific variants. This allows reuse across countries and networks.
Use only the VRBL extensions predefined in the VRBL extensions schema. You can include self-defined extensions in separate extension containers, but validation and transformation ignore them.
Implementation rules and limitations
Each VRBL document targets one mandate. Use the applicable country-specific guide to identify the required information, business rules, and supported fields.
Meet the target mandate's requirements
VRBL lets you provide the elements and groups required by country-specific mandates. However, the target format determines which information the service can pass on. Transformation silently ignores data that has no equivalent in the final format.
Typically, your system generates a VRBL document and sends it to the e-invoicing service. The service validates it and, if validation succeeds, transforms it into the required final format.
When the transformed document also goes to a business recipient, the mandated format may not support all the information you want to exchange. VRBL provides generic elements, such as free-text fields or key-value pairs, to store agreed non-mandated information. Agree on the content and format of these values with the recipient. The target format's limitations still apply.
Use business terms consistently
VRBL defines reusable business terms as leaf elements and business groups as composite structures. The following principles apply:
- Each element or group name reflects the meaning of its content, and each instance represents a single meaning.
- Each business term or group has one unique context, identified by its absolute XPath. This helps prevent competing fields from representing the same meaning in the same structural position.
Mandate-specific requirements and cross-country e-invoicing can make complete semantic separation difficult. In these cases, VRBL prioritises semantic clarity and predictable interpretation. The applicable mandate profile documents any deviations.
Provide complete business information
Calculate all amounts before sending the document. Check that:
- Prices and quantities match line net amounts after allowances and charges.
- Taxable amounts, tax amounts, and summary amounts are correct within the rounding tolerances defined by the mandate.
- Prices aren't negative.
Quantities and amounts can be negative.
Target one mandate per document
Each VRBL document instance fulfils exactly one mandate. Its specification identifier defines the semantic requirements and business rules that apply. UBL 2.4 and the VRBL extension schema define the structure and cardinalities.
These rules support development and testing, help detect errors early, and ensure that error messages and rejections refer to the format you provided.
The validation doesn’t fail if you use elements or groups that the mandate doesn’t support. The document must still satisfy the applicable schema and mandate validation rules. Transformation silently ignores elements and groups outside the target mandate's scope.
Specify a receiver
Each VRBL document instance requires exactly one receiver. For outbound documents, a receiver alias identifies the target platform, network, or mandate process.
The receiver alias identifies the processing destination, rather than necessarily identifying the final business recipient. Depending on the implementation and mandate, an authority may forward the transformed document to the business recipient. Alternatively, documents may go directly to the business recipient while a subset of the data goes to the authority.
Plan for format changes
VRBL evolves to support additional country mandates, platforms, processes, and document types. You can decide when to add further mandate coverage based on your business needs and plans.
VRBL processing
For outbound business documents, the service validates the VRBL document, transforms it into the target format, and validates the output where applicable. If any stage detects an error, the service stops processing and reports the error.
The following sequence summarises outbound processing:
- The service validates the VRBL document against UBL 2.4 and the VRBL extension schema.
- The service validates the document against the VRBL mandate ruleset identified by the document’s specification identifier and receiver.
- The service transforms the VRBL document into the final format.
- Where applicable, the service validates the final document against the original mandate's schema and ruleset.
After these checks succeed, the document is ready for submission.
For inbound business documents, processing runs in the opposite direction, from the mandate or platform-specific format into VRBL.
Country-specific guides
The country and mandate-specific VRBL specifications explain how to model business documents for individual mandates, countries, platforms, and networks.
Guide terminology
The following terms describe the fields and rules in a country-specific guide. Not every term applies to every element or group.
| Term | Meaning |
|---|---|
| Context ID | A unique identifier for a VRBL element or group. |
| XPath | An expression that identifies an element or other node in the VRBL XML document. |
| Cardinality | The minimum and maximum number of times an element or attribute can occur, as defined by the XML schema. |
| Usage | An implementation rule that adds business requirements and context to the XML schema's cardinality. |
| Usage description | The business context and conditions that determine when an element or group is required. |
| Format | The nature and format of the value a data point contains. |
| Mandate business term code | The unique code or business term that the target mandate assigns to the corresponding VRBL context. |
| Final format path | The path to the corresponding element, attribute, or data field in the target mandate's final format. |
Usage codes
Usage codes indicate whether you must provide an element or group and how often it can occur. In codes that contain n, the guide replaces n with a number. For example, M3 means that three occurrences are mandatory. An element or group can have multiple usage codes. Check the usage description for the applicable conditions and restrictions.
| Code | Meaning | Implementation rule |
|---|---|---|
M |
Mandatory, once | Provide exactly one occurrence. |
Mn |
Mandatory, n times |
Provide exactly n occurrences. |
M+ |
Mandatory, one or more times | Provide at least one occurrence. Repetitions are allowed. |
O |
Optional, once | Omit the element or group, or provide one occurrence. |
On |
Optional, up to n times |
Omit the element or group, or provide up to n occurrences. |
O* |
Optional, zero or more | Omit the element or group, or repeat it with no fixed maximum. |
C |
Conditional, once | Provide one occurrence if the condition in the usage description applies. |
Cn |
Conditional, n times |
Provide n occurrences when the applicable condition requires them. |
C* |
Conditional, zero or more | Follow the applicable condition. Repetitions have no fixed maximum. |
For example, the French CIUS invoice guide specifies M3, C, O* for the Note element. Three notes are mandatory, another note is required under a specified condition, and you can provide additional optional notes. The usage description details the conditions and restrictions.
VRBL invoice overview
A VRBL invoice represents structured electronic billing data for invoices, credit notes, and debit notes. VRBL uses the ubl:Invoice root element for all three document types. The cbc:InvoiceTypeCode element identifies the invoice’s functional type.
Use this overview to understand the core identifiers, calculations, and tax breakdowns. For element definitions, usage, cardinalities, permitted values, and validation rules, select your mandate in the VRBL technical specifications.
Note
The XML examples are partial fragments, not complete documents for submission. They omit namespace declarations and unrelated content. Add the required namespaces and document content before using a fragment in your implementation.
Use the namespace mappings for
ubl,cac, andcbcfrom the applicable VRBL and UBL specifications.Each example is independent unless the surrounding text states otherwise.
Core identifiers
Provide the following identifiers to specify the document’s mandate specification and business process.
The following fragment shows both identifiers, using the Italian mandate as the example:
<ubl:Invoice>
<!-- code omitted for clarity -->
<cbc:CustomizationID>urn:vertexinc:vrbl:billing:1#Invoice#VRBL-Invoice-IT-1p2</cbc:CustomizationID>
<cbc:ProfileID>urn:vertexinc:vrbl:billing:1</cbc:ProfileID>
<!-- code omitted for clarity -->
</ubl:Invoice>
Specification identifier
Set cbc:CustomizationID to the specification identifier for your target mandate. This identifies the specification whose semantic requirements and business rules the document must follow.
The identifier combines the business process, document type, and country-specific mandate ruleset, separated by #. The following table breaks down the identifier for the Italian mandate.
| Segment | Value in example | Description |
|---|---|---|
| Business process | urn:vertexinc:vrbl:billing:1 |
The mandatory fixed prefix. |
| UBL document type | Invoice |
Identifies the document type. |
| Mandate ruleset | VRBL-Invoice-IT-1p2 |
The unique country and version string. |
XPath: /ubl:Invoice/cbc:CustomizationID
Business process type
The business process type identifies the transaction’s business process. Set cbc:ProfileID to the fixed value urn:vertexinc:vrbl:billing:1.
XPath: /ubl:Invoice/cbc:ProfileID
Calculation principles
Calculate and provide all required amounts before submitting the invoice. Transformation doesn’t calculate missing totals or tax breakdowns.
Calculate item net prices and line net amounts first. Apply document-level allowances and charges, calculate tax breakdowns, then derive the document totals and amount due for payment.
The calculations below use amounts in the document currency. Where an XPath refers to cac:TaxTotal, use the tax total in that currency, not a tax total in a different accounting currency. Check the applicable mandate specification for tax accounting currency requirements and country- or network-specific calculation rules.
Document totals
Calculate document totals from invoice line net amounts, document-level allowances and charges, tax, prepaid amounts, and rounding adjustments. The following example illustrates the document totals. See Tax breakdown calculation example for a separate worked tax calculation.
Example:
<ubl:Invoice>
<!-- code omitted for clarity -->
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">1225.00</cbc:TaxAmount>
<!-- code omitted for clarity -->
</cac:TaxTotal>
<!-- code omitted for clarity -->
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">5900</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">5900</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">7125</cbc:TaxInclusiveAmount>
<cbc:AllowanceTotalAmount currencyID="EUR">200</cbc:AllowanceTotalAmount>
<cbc:ChargeTotalAmount currencyID="EUR">200</cbc:ChargeTotalAmount>
<cbc:PrepaidAmount currencyID="EUR">1000</cbc:PrepaidAmount>
<cbc:PayableRoundingAmount currencyID="EUR">0.02</cbc:PayableRoundingAmount>
<cbc:PayableAmount currencyID="EUR">6125.02</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<!-- code omitted for clarity -->
</ubl:Invoice>
The element names and XPaths identify each total.
Invoice total tax amount
Add the tax amounts from all tax breakdowns.
XPath: /ubl:Invoice/cac:TaxTotal/cbc:TaxAmount
Invoice total tax amount
= sum(all tax category tax amounts)
/ubl:Invoice/cac:TaxTotal/cbc:TaxAmount
= sum(/ubl:Invoice/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount)
Sum of invoice line net amounts
Add all invoice line net amounts before applying document-level allowances, charges, and tax.
XPath: /ubl:Invoice/cac:LegalMonetaryTotal/cbc:LineExtensionAmount
Sum of invoice line net amounts
= sum(all invoice line net amounts)
/ubl:Invoice/cac:LegalMonetaryTotal/cbc:LineExtensionAmount
= sum(/ubl:Invoice/cac:InvoiceLine/cbc:LineExtensionAmount)
Invoice total amount without tax
Add document-level charges to the sum of invoice line net amounts, then subtract document-level allowances. If you omit a prepaid amount or rounding adjustment, treat it as zero in the calculation.
XPath: /ubl:Invoice/cac:LegalMonetaryTotal/cbc:TaxExclusiveAmount
Invoice total amount without tax
= Sum of invoice line net amounts
- Sum of document-level allowances
+ Sum of document-level charges
/ubl:Invoice/cac:LegalMonetaryTotal/cbc:TaxExclusiveAmount
= /ubl:Invoice/cac:LegalMonetaryTotal/cbc:LineExtensionAmount
- sum(/ubl:Invoice/cac:LegalMonetaryTotal/cbc:AllowanceTotalAmount)
+ sum(/ubl:Invoice/cac:LegalMonetaryTotal/cbc:ChargeTotalAmount)
Invoice total amount with tax
Add the invoice total tax amount to the invoice total amount without tax.
XPath: /ubl:Invoice/cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount
Invoice total amount with tax
= Invoice total amount without tax
+ Invoice total tax amount
/ubl:Invoice/cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount
= /ubl:Invoice/cac:LegalMonetaryTotal/cbc:TaxExclusiveAmount
+ /ubl:Invoice/cac:TaxTotal/cbc:TaxAmount
Sum of document-level allowances
Add all document-level allowance amounts.
XPath: /ubl:Invoice/cac:LegalMonetaryTotal/cbc:AllowanceTotalAmount
Sum of document-level allowances
= sum(all document-level allowance amounts)
/ubl:Invoice/cac:LegalMonetaryTotal/cbc:AllowanceTotalAmount
= sum(/ubl:Invoice/cac:AllowanceCharge[cbc:ChargeIndicator='false']/cbc:Amount)
Sum of document-level charges
Add all document-level charge amounts.
XPath: /ubl:Invoice/cac:LegalMonetaryTotal/cbc:ChargeTotalAmount
Sum of document-level charges
= sum(all document-level charge amounts)
/ubl:Invoice/cac:LegalMonetaryTotal/cbc:ChargeTotalAmount
= sum(/ubl:Invoice/cac:AllowanceCharge[cbc:ChargeIndicator='true']/cbc:Amount)
Amount due for payment
Calculate the final amount payable by subtracting prepaid amounts and adding the rounding adjustment to the invoice total with tax. If you omit a prepaid amount or rounding adjustment, treat it as zero in the calculation.
XPath: /ubl:Invoice/cac:LegalMonetaryTotal/cbc:PayableAmount
Amount due for payment
= Invoice total amount with tax
- Prepaid amount
+ Rounding amount
/ubl:Invoice/cac:LegalMonetaryTotal/cbc:PayableAmount
= /ubl:Invoice/cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount
- sum(/ubl:Invoice/cac:LegalMonetaryTotal/cbc:PrepaidAmount)
+ sum(/ubl:Invoice/cac:LegalMonetaryTotal/cbc:PayableRoundingAmount)
Provide any payable rounding adjustment in cac:LegalMonetaryTotal/cbc:PayableRoundingAmount under /ubl:Invoice. Include it in the amount due for payment.
Line-level calculations
Calculate item net prices, invoice line net amounts, and allowances or charges using the following formulas.
Item net price calculation
The following formula applies when you provide an item gross price and a single price-level discount, with no price-level charges. In this case, the item net price equals the gross price minus the discount.
For other cases, such as multiple price-level allowances or price-level charges, follow the applicable mandate’s calculation rules.
XPath: /ubl:Invoice/cac:InvoiceLine/cac:Price/cbc:PriceAmount
Item net price
= Item gross price
- Item price discount
cac:Price/cbc:PriceAmount
= cac:Price/cac:AllowanceCharge/cbc:BaseAmount
- cac:Price/cac:AllowanceCharge/cbc:Amount
The XPath expressions in this formula are relative to /ubl:Invoice/cac:InvoiceLine.
Example:
<ubl:Invoice>
<!-- code omitted for clarity -->
<cac:InvoiceLine>
<!-- code omitted for clarity -->
<cac:Price>
<cbc:PriceAmount currencyID="EUR">410</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="EUR">40</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">450</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>
</cac:InvoiceLine>
<!-- code omitted for clarity -->
</ubl:Invoice>
Invoice line net amount calculation
The invoice line net amount is the net amount excluding tax. It includes line-level allowances and charges.
XPath: /ubl:Invoice/cac:InvoiceLine/cbc:LineExtensionAmount
Invoice line net amount
= (Item net price / Item price base quantity) * Invoiced quantity
+ Sum of invoice line charge amounts
- Sum of invoice line allowance amounts
cbc:LineExtensionAmount
= (cac:Price/cbc:PriceAmount div cac:Price/cbc:BaseQuantity) * cbc:InvoicedQuantity
+ sum(cac:AllowanceCharge[cbc:ChargeIndicator='true']/cbc:Amount)
- sum(cac:AllowanceCharge[cbc:ChargeIndicator='false']/cbc:Amount)
The XPath expressions in this formula are relative to /ubl:Invoice/cac:InvoiceLine. If cac:Price/cbc:BaseQuantity is omitted, use a price base quantity of 1.
Example without line-level allowances or charges:
(200 / 2) × 10
= 1000.00
<ubl:Invoice>
<!-- code omitted for clarity -->
<cac:InvoiceLine>
<cbc:InvoicedQuantity unitCode="C62">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
<!-- code omitted for clarity-->
<cac:Price>
<cbc:PriceAmount currencyID="EUR">200</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">2</cbc:BaseQuantity>
</cac:Price>
</cac:InvoiceLine>
</ubl:Invoice>
Example with a line-level allowance and charge. This example explicitly sets the price base quantity to one:
(100 / 1) × 10 + 1 − 101
= 900.00
<ubl:Invoice>
<!-- code omitted for clarity -->
<cac:InvoiceLine>
<cbc:InvoicedQuantity unitCode="C62">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">900.00</cbc:LineExtensionAmount>
<!-- code omitted for clarity-->
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>CG</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Charge</cbc:AllowanceChargeReason>
<cbc:MultiplierFactorNumeric>1</cbc:MultiplierFactorNumeric>
<cbc:Amount currencyID="EUR">1</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">100</cbc:BaseAmount>
</cac:AllowanceCharge>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">101</cbc:Amount>
</cac:AllowanceCharge>
<!-- code omitted for clarity-->
<cac:Price>
<cbc:PriceAmount currencyID="EUR">100</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="C62">1</cbc:BaseQuantity>
</cac:Price>
</cac:InvoiceLine>
</ubl:Invoice>
Allowance or charge amount calculation
Line-level and document-level allowances and charges can include a base amount and a percentage. If an invoice includes a base amount or percentage for an allowance or charge, it must include both. Use the two values together to calculate the allowance or charge amount. Calculate the amount as follows:
Allowance or charge amount
= Base amount * (Percentage / 100)
cbc:Amount
= cbc:BaseAmount * (cbc:MultiplierFactorNumeric div 100)
The XPath expressions in this formula are relative to the applicable cac:AllowanceCharge element.
Example with a base amount and percentage:
1000 × (20 / 100)
= 200
<ubl:Invoice>
<!-- code omitted for clarity -->
<cac:InvoiceLine>
<!-- code omitted for clarity -->
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>CG</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Cleaning</cbc:AllowanceChargeReason>
<cbc:MultiplierFactorNumeric>20</cbc:MultiplierFactorNumeric>
<cbc:Amount currencyID="EUR">200</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">1000</cbc:BaseAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
<!-- code omitted for clarity -->
</cac:InvoiceLine>
</ubl:Invoice>
Example with an allowance amount only:
<ubl:Invoice>
<!-- code omitted for clarity -->
<cac:InvoiceLine>
<!-- code omitted for clarity -->
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">200</cbc:Amount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
<!-- code omitted for clarity -->
</cac:InvoiceLine>
</ubl:Invoice>
Amount precision
Precision limits don’t define when or how to round intermediate calculations. Follow the applicable mandate specification’s rounding rules.
Use a maximum of two decimal places for the following amounts. The XPath expressions are relative to /ubl:Invoice. Check the applicable mandate specification for exceptions.
| Amount | Relative XPath |
|---|---|
| Document-level allowance amount | cac:AllowanceCharge[cbc:ChargeIndicator='false']/cbc:Amount |
| Document-level charge amount | cac:AllowanceCharge[cbc:ChargeIndicator='true']/cbc:Amount |
| Sum of document-level allowances | cac:LegalMonetaryTotal/cbc:AllowanceTotalAmount |
| Sum of document-level charges | cac:LegalMonetaryTotal/cbc:ChargeTotalAmount |
| Invoice total amount without tax | cac:LegalMonetaryTotal/cbc:TaxExclusiveAmount |
| Invoice total tax amount | cac:TaxTotal/cbc:TaxAmount |
| Invoice total amount with tax | cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount |
| Amount due for payment | cac:LegalMonetaryTotal/cbc:PayableAmount |
Tax information
Tax categories and rates on invoice lines, document-level allowances, and document-level charges determine the document’s tax breakdowns. Use the applicable mandate specification to identify the required exemption information. For invoice lines and document-level allowances or charges that aren’t subject to tax, follow the applicable mandate specification rules on whether to provide a zero rate or omit the rate.
Line tax information
For taxable categories, provide the tax rate in cbc:Percent.
Tax on document-level allowances and charges
Provide the tax category code in cbc:ID within each document-level allowance or charge’s cac:TaxCategory element.
XPath: /ubl:Invoice/cac:AllowanceCharge/cac:TaxCategory
For taxable categories, provide the tax rate in cbc:Percent.
Tax breakdown
Provide one cac:TaxSubtotal for each tax breakdown required by the applicable mandate specification. The examples in this section group invoice lines, document-level allowances, and document-level charges by tax category code and tax rate. If the mandate requires additional grouping criteria, such as tax type or exemption reason, keep those breakdowns separate. Apply all required grouping criteria when calculating the taxable amount for each breakdown. Within each subtotal, cac:TaxCategory identifies the category, rate, and any required tax type or exemption information.
XPath: /ubl:Invoice/cac:TaxTotal/cac:TaxSubtotal
For example, these combinations produce three tax breakdowns.
| Tax category | Tax rate | Taxable amount (EUR) | Tax amount (EUR) |
|---|---|---|---|
S (Standard) |
25 percent | 1000.00 | 250.00 |
S (Standard) |
15 percent | 1000.00 | 150.00 |
E (Exempt) |
Zero percent | 1000.00 | 0.00 |
The invoice total tax amount is EUR 400.00, calculated as follows:
250.00 + 150.00 + 0.00
= 400.00
Treat tax rates that differ only in trailing zeros as the same rate. Don’t create separate tax breakdowns solely because of trailing zeros.
For example, two lines with category S and rates of 22 and 22.00 belong to the same tax breakdown if all other grouping criteria required by the mandate also match.
Tax calculation
For each tax breakdown, calculate the taxable amount and tax amount using the formulas that follow.
Tax category taxable amount
Add the invoice line net amounts and document-level charges for the tax breakdown, then subtract the corresponding document-level allowances. Include only amounts that match all grouping criteria required by the mandate in each sum.
XPath: /ubl:Invoice/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount
Tax category taxable amount
= Sum of invoice line net amounts
+ Sum of document-level charge amounts
- Sum of document-level allowance amounts
Tax category tax amount
Multiply the taxable amount by the tax rate divided by 100.
XPath: /ubl:Invoice/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount
Tax category tax amount
= Tax category taxable amount
* (Tax category rate / 100)
Invoice total tax amount
Add the tax amounts from all tax breakdowns. The formula and XPath appear in Invoice total tax amount under Document totals.
Tax breakdown calculation example
This example contains three invoice lines, one document-level charge, and one document-level allowance. No additional grouping criteria apply. All amounts use EUR.
| Component | Amount (EUR) | Tax category | Tax rate |
|---|---|---|---|
| Line 1 | 4000.00 | S (Standard) |
25 percent |
| Line 2 | 2000.00 | E (Exempt) |
Zero percent |
| Line 3 | 900.00 | S (Standard) |
25 percent |
| Document-level charge | 200.00 | S (Standard) |
25 percent |
| Document-level allowance | 100.00 | S (Standard) |
25 percent |
Create two tax breakdowns, one for each category-and-rate combination.
Tax breakdown 1: category S at 25 percent
Tax category taxable amount
= 4000.00 + 900.00 + 200.00 - 100.00
= 5000.00
Tax category tax amount
= 5000.00 * (25 / 100)
= 1250.00
Tax breakdown 2: category E at zero percent
Tax category taxable amount
= 2000.00
Tax category tax amount
= 0.00
Invoice total tax amount
Invoice total tax amount
= 1250.00 + 0.00
= 1250.00
The following XML fragment shows the inputs and tax breakdowns for this calculation.
<ubl:Invoice>
<!-- code omitted for clarity -->
<cac:AllowanceCharge>
<!-- Document Level Charge Amount for category S and rate 25% -->
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>Cleaning</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">200</cbc:Amount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
<!-- code omitted for clarity -->
<cac:AllowanceCharge>
<!-- Document Level Allowance Amount for category S and rate 25% -->
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>Discount</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">100</cbc:Amount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
<!-- code omitted for clarity -->
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">1250.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<!-- Tax breakdown for category S and rate = 25% -->
<!-- Taxable amount: lines 1 and 3 + charge - allowance -->
<cbc:TaxableAmount currencyID="EUR">5000.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">1250.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
<cac:TaxSubtotal>
<!-- Tax breakdown for category E and rate = 0% -->
<cbc:TaxableAmount currencyID="EUR">2000.0</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">0</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>E</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<!-- Replace this placeholder with the applicable exemption reason. -->
<cbc:TaxExemptionReason>Applicable exemption reason</cbc:TaxExemptionReason>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<!-- code omitted for clarity -->
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">4000.00</cbc:LineExtensionAmount>
<!-- code omitted for clarity -->
<cac:Item>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25.0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<!-- code omitted for clarity -->
</cac:InvoiceLine>
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">2000.00</cbc:LineExtensionAmount>
<!-- code omitted for clarity -->
<cac:Item>
<cac:ClassifiedTaxCategory>
<cbc:ID>E</cbc:ID>
<cbc:Percent>0.0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<!-- code omitted for clarity -->
</cac:InvoiceLine>
<cac:InvoiceLine>
<cbc:ID>3</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">900.00</cbc:LineExtensionAmount>
<!-- code omitted for clarity -->
<cac:Item>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25.0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<!-- code omitted for clarity -->
</cac:InvoiceLine>
</ubl:Invoice>