On this page
The short answer
BR-AE-08 fails when the cbc:TaxableAmount beside the AE tax category does not equal the reverse-charge content of the document: the line net amounts in category AE, plus the root-level charges in AE, minus the root-level allowances in AE. In the recorded example that is 25.00 + 5.00 - 1.50 = 28.50, and the invoice sent 31.50.
The 31.50 comes from adding the discount instead of taking it off. Recalculate the figure from the document, write it to the breakdown, and leave the reverse-charge tax amount at 0.00.
What the rule checks
The rule runs on each cac:TaxCategory with cbc:ID of AE under the VAT scheme in the root cac:TaxTotal, reads the cbc:TaxableAmount of its cac:TaxSubtotal, and reports at the tax category.
Nothing is split by rate. Lines and root-level allowances and charges count when their category is AE, whatever cbc:Percent they carry: when tried, the reverse-charge discount at 20 left 28.50 acceptable here and was reported only by BR-AE-06.
Allowances and charges inside a line are already part of that line's cbc:LineExtensionAmount, so only cac:AllowanceCharge elements directly under the document root enter the reverse-charge sum.
There is no tolerance, unlike the margin under 1.00 in BR-S-08. When tried, 28.51 failed this rule. Writing 28.500 satisfied it, since the values are compared as numbers, but three decimals broke BR-DEC-19 and UBL-DT-01.
Each reverse-charge breakdown is compared with the whole sum. When tried, splitting the 28.50 into breakdowns of 25.00 and 3.50 reported this rule on both, together with BR-AE-01, which allows only one reverse-charge breakdown.
| Term | Meaning | UBL element |
|---|---|---|
| BT-116 | VAT category taxable amount | cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount |
| BT-118 | VAT category code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID |
| BT-131 | Invoice line net amount | cac:InvoiceLine/cbc:LineExtensionAmount (cac:CreditNoteLine/cbc:LineExtensionAmount in a credit note) |
| BT-99 | Document level charge amount | cac:AllowanceCharge[cbc:ChargeIndicator = true]/cbc:Amount |
| BT-92 | Document level allowance amount | cac:AllowanceCharge[cbc:ChargeIndicator = false]/cbc:Amount |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- Allowances are added to the taxable amount with the same sign as charges, as in the recorded example.
- The taxable amount is copied from the sum of the line net amounts, before document-level discounts and fees are applied.
- A reverse-charge fee or discount takes a Standard rated category from the document default, while its amount is still counted in the
AEbreakdown. - Reverse-charge content is summarised in one breakdown per source, one for the lines and one for the fees, so neither holds the full figure.
- The breakdown is built from stored order totals and not refreshed after a line or fee changed on the invoice.
How to fix it
- Add up
cbc:LineExtensionAmountfor every line whosecac:Item/cac:ClassifiedTaxCategory/cbc:IDisAE, keeping the sign of any negative line. - Add the
cbc:Amountof each root-levelcac:AllowanceChargein categoryAEwithcbc:ChargeIndicatoroftrue, and subtract each one withfalse. - Write the result, with two decimals, as the
cbc:TaxableAmountof the oneAEcac:TaxSubtotal. Itscbc:TaxAmountremains0.00underBR-AE-09. - Compare the result with
cbc:TaxExclusiveAmountwhen the whole document is reverse charge: both are built from the same lines, allowances and charges, and in the recorded example both should read 28.50.
The recorded example has one reverse-charge line, a reverse-charge discount and a reverse-charge call-out charge, all at 0%.
Reverse-charge line net amount: 25.00 Document-level charge in AE: + 5.00 Document-level allowance in AE: - 1.50 Expected taxable amount: 25.00 + 5.00 - 1.50 = 28.50 Sent: 31.50, which is 25.00 + 5.00 + 1.50, so the rule fails
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: a reverse-charge taxable amount of 31.50 beside a discount of 1.50 and a charge of 5.00
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<!-- reason code and reason omitted from this fragment -->
<cbc:Amount currencyID="GBP">1.50</cbc:Amount>
<!-- tax category AE at 0 omitted from this fragment -->
</cac:AllowanceCharge>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<!-- reason omitted from this fragment -->
<cbc:Amount currencyID="GBP">5.00</cbc:Amount>
<!-- tax category AE at 0 omitted from this fragment -->
</cac:AllowanceCharge>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">31.50</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>AE</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cbc:TaxExemptionReason>Reverse charge</cbc:TaxExemptionReason>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<!-- reverse-charge line: LineExtensionAmount 25.00 -->Fragment of the corrected invoice: 25.00 + 5.00 - 1.50 = 28.50
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">28.50</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>AE</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cbc:TaxExemptionReason>Reverse charge</cbc:TaxExemptionReason>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>Only the reverse-charge cbc:TaxableAmount differs: 31.50 in the failing invoice, 28.50 in the corrected one. The failing document reports only BR-AE-08; its tax amount of 0.00 and its total without VAT and amount due of 28.50 are the same in both documents.
What the validator reported
- The failing invoice reports BR-AE-08. 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; in a credit note the lines summed arecac:CreditNoteLine. The failing invoice converted to a credit note reported the same rule when tried. - Reported by the EN 16931 layer as a fatal finding at each reverse-charge breakdown that does not match.
- Exempt, intra-community and Standard rated breakdowns have their own taxable amount rules:
BR-E-08,BR-IC-08andBR-S-08. - The monetary totals are checked separately:
BR-CO-13compares the total without VAT with the line total, allowances and charges.
Related rules
- BR-AE-01 allows only one reverse-charge breakdown, which is what this sum is compared with
- BR-AE-09 keeps the tax amount beside this taxable amount at zero
- BR-E-08 builds the exempt taxable amount the same way, also without a tolerance
- BR-IC-08 is the taxable amount check for the intra-community breakdown
- 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-AE-08 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.

