Skip to content

Ironfang Finance - Rule reference

BR-O-12: Take lines in other VAT categories off a not subject to VAT invoice

Once a document has a VAT breakdown in O, every line has to be in O too. A Zero rated line beside it is rejected even without a breakdown of its own.

EN 16931Fatal: the document is invalidVATLines and prices

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.

TermMeaningUBL element
BG-25Invoice linecac:InvoiceLine (cac:CreditNoteLine in a credit note)
BT-151Invoiced item VAT category codecac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID (cac:CreditNoteLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID in a credit note)
BT-118VAT category codecac: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

  1. 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 the O taxable amount.
  2. If the line is genuinely Zero rated, remove it from this invoice and bill it on a separate document, with its own Z breakdown and the seller identifier that BR-Z-02 requires there.
  3. 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.
  4. Enforce it in the mapping: when a document is written with an O breakdown, 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

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 Invoice and CreditNote, where the line categories sit under cac: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-13 and BR-O-14; with BR-O-11 for breakdowns, the four keep every part of an O document in O.

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.