On this page
The short answer
BR-O-12 fails when the VAT breakdown includes category O and any line has an item category under the VAT scheme other than O. In the recorded example a second line, Example zero rated item for 10.00 in Z, sits beside the O line of 25.00. Move that line to an invoice of its own, so that this one holds only O lines.
It closes the gap that BR-O-11 leaves, since that rule compares breakdowns with breakdowns: a line whose category has no breakdown, like the Zero rated one here, slips past it and is caught by this rule.
What the rule checks
The trigger is an O cac:TaxCategory in cac:TaxTotal/cac:TaxSubtotal. Every cac:ClassifiedTaxCategory in the document under the VAT scheme whose cbc:ID is not O is then counted, and the count must be zero; one finding is raised at the root however many lines are affected.
The other category makes no difference. When tried, a Standard rated line at 20 in place of the Zero rated one reported this rule with BR-S-01 and BR-S-02, and an exempt line reported it with BR-E-01 and BR-E-02.
Supplying the missing breakdown does not rescue the document. When tried, a Zero rated breakdown of 10.00 cleared BR-Z-01 and brought BR-O-11 in its place, next to this rule and BR-Z-02.
The rule needs an O breakdown to start from. An invoice with O lines and no O breakdown is reported by BR-O-01 instead.
| Term | Meaning | UBL element |
|---|---|---|
| BG-25 | Invoice line | cac:InvoiceLine (cac:CreditNoteLine in a credit note) |
| BT-151 | Invoiced item VAT category code | cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID (cac:CreditNoteLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID in a credit note) |
| BT-118 | VAT category code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The breakdown is built from a document-level "not subject to VAT" flag, while each line takes its category from the item master, where one item is Zero rated.
- An item the seller supplies both inside and outside its VAT activity brings its taxable category from the price list onto an otherwise out-of-scope invoice.
- A delivery or packaging line is added automatically, with a default category, after the document was set to
O.
How to fix it
- Check each line's category against the supply it describes. If the Zero rated line is really outside the scope of VAT, change its category to
O, drop its rate and add its 10.00 to theOtaxable amount. - If the line is genuinely Zero rated, remove it from this invoice and bill it on a separate document, with its own
Zbreakdown and the seller identifier thatBR-Z-02requires there. - Recalculate the totals of what remains: in the recorded example the line total, the totals without and with VAT and the amount due all return from 35.00 to 25.00.
- Enforce it in the mapping: when a document is written with an
Obreakdown, refuse to write lines in any other category.
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 Zero rated line of 10.00 beside the O line, with only an O breakdown
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>O</cbc:ID>
<!-- reason code and text omitted from this fragment -->
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
<!-- totals of 35.00 and line 1, 25.00 in category O, omitted from this fragment -->
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">1</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">10.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Example zero rated item</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>Z</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<!-- price omitted from this fragment -->
</cac:InvoiceLine>Fragment of the corrected invoice: the Zero rated line has gone and the totals are back to the O line
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="GBP">25.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="GBP">25.00</cbc:TaxInclusiveAmount>
<!-- allowance, charge, prepaid and rounding totals omitted from this fragment -->
<cbc:PayableAmount currencyID="GBP">25.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<!-- quantity and amount omitted from this fragment -->
<cac:Item>
<cbc:Name>Example service</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>O</cbc:ID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<!-- price omitted from this fragment -->
</cac:InvoiceLine>The failing invoice adds line 2, Example zero rated item at 10.00 in category Z with a rate of 0, and raises the line total, the totals without and with VAT and the amount due to 35.00, while the O breakdown stays at 25.00 to match the one O line; the corrected invoice has only that line. The failing document also reports BR-Z-01, because Z content needs a Zero rated breakdown, and BR-Z-02, because a Zero rated line needs a seller VAT identifier, a tax registration identifier or a tax representative, and this seller has none.
What the validator reported
- The failing invoice reports BR-O-12, BR-Z-01 and BR-Z-02. 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, where the line categories sit undercac:CreditNoteLine/cac:Item. The failing invoice as a credit note reported the same three findings when tried. - Document-level allowances and charges in other categories are covered by
BR-O-13andBR-O-14; withBR-O-11for breakdowns, the four keep every part of anOdocument inO.
Related rules
- BR-O-11 rejects a second VAT breakdown beside the O one, which this rule does not need to find
- BR-O-13 applies the same restriction to document level allowances
- BR-Z-02 is reported with this rule because the Zero rated line needs a seller VAT or tax registration identifier
- BR-Z-01 is reported too, since the Zero rated line has no Zero rated 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-O-12 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.

