On this page
The short answer
BR-DEC-19 fails when the cbc:TaxableAmount of a cac:TaxSubtotal has more than two characters after the decimal point. Write the taxable amount of that VAT category with two decimals at most: 58.50, not 58.500.
There is one finding per breakdown, located at the cac:TaxSubtotal concerned, so with several VAT categories the location tells you which one to correct. UBL-DT-01 reports its cbc:TaxableAmount as well.
What the rule checks
The rule runs once for every cac:TaxSubtotal inside a cac:TaxTotal and counts the characters after the decimal point in its cbc:TaxableAmount. When tried with both breakdowns of the recorded invoice padded, to 58.500 and 10.000, it reported this rule twice and UBL-DT-01 twice.
The VAT category makes no difference. When tried, padding only the zero-rated breakdown to 10.000 reported this rule at the second cac:TaxSubtotal.
An unrounded taxable amount can slip past the VAT arithmetic but not past this rule. When tried, 58.504 reported only this rule and UBL-DT-01: BR-S-08 accepts a standard-rated taxable amount less than 1.00 away from the sum it calculates, and BR-CO-17 checks the tax amount of 11.70 with a margin of its own.
| Term | Meaning | UBL element |
|---|---|---|
| BT-116 | VAT category taxable amount | cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The taxable amount is added up from line net amounts before each is rounded.
- A document allowance or charge is shared out across VAT categories and the shares are written with three decimals.
- The tax engine returns the taxable base at its internal precision and the mapping writes it unchanged.
How to fix it
- For each VAT category, add the rounded line net amounts and the rounded document charges, subtract the rounded document allowances, and round the result to two decimals.
- Write it to
cbc:TaxableAmountin thatcac:TaxSubtotalwith at most two decimals and no whitespace. - Calculate the tax amount of the breakdown from the rounded taxable amount, and write it with two decimals as well, since
BR-DEC-20holds it to the same limit.
Validate your corrected invoice
Before and after
These are fragments, not complete documents. The complete synthetic documents they come from are linked below.
Fragment of the failing invoice: the standard-rated breakdown gives its taxable amount as 58.500
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">58.500</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<!-- rate and tax scheme omitted from this fragment -->
</cac:TaxCategory>
</cac:TaxSubtotal>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">10.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<!-- zero-rated tax category omitted from this fragment -->
</cac:TaxSubtotal>Fragment of the corrected invoice: the same taxable amount written as 58.50
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">58.50</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<!-- rate and tax scheme omitted from this fragment -->
</cac:TaxCategory>
</cac:TaxSubtotal>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">10.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<!-- zero-rated tax category omitted from this fragment -->
</cac:TaxSubtotal>The standard-rated breakdown states its taxable amount as 58.500 in the failing invoice and 58.50 in the corrected one; the zero-rated breakdown of 10.00, the tax amount of 11.70 and every total are the same in both. With the value unchanged, BR-S-08 and BR-CO-17 pass. The failing document reports BR-DEC-19 at the first cac:TaxSubtotal and UBL-DT-01 at its cbc:TaxableAmount. UBL-DT-01 is the general two-decimal check for elements named as amounts, which leaves out only the item net price and the amounts of a price-level allowance, so the taxable amount of a breakdown always draws both findings.
What the validator reported
- The failing invoice reports BR-DEC-19 and UBL-DT-01. The corrected document passes every layer with no findings.Download the failing XMLDownload the corrected XML
Recorded on phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, the engine behind the free validator, using synthetic data. A recorded result is regression evidence for these documents; it is not a certification.
Where it applies
- Applies to UBL
InvoiceandCreditNote. When tried, a credit note with a standard-rated taxable amount of58.500reported the same two findings. - Every breakdown is in scope whatever its VAT category, and the currency plays no part in the count.
Related rules
- UBL-DT-01 reports the taxable amount of the breakdown alongside this rule
- BR-DEC-20 applies the same limit to the tax amount of each breakdown
- BR-S-08 checks the standard-rated taxable amount against the lines, allowances and charges
- BR-CO-17 checks each breakdown tax amount against this taxable amount and the rate
- Browse every rule in the reference
- Background: Understanding EN 16931 validation errors
Scope and source
Written for Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, as applied to UBL 2.1 Invoice and CreditNote documents. Other profiles, syntaxes and releases can define this identifier differently. Guidance version 2026-09-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.
The official definition of BR-DEC-19 carries the normative wording and test. This page is our explanation of it, not a copy.
Guidance does not change the engine verdict. Fixing this finding does not mean the document passes every layer, and validation does not certify legal or tax compliance or transmit a document over Peppol.

