# 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.

- Layer: EN 16931
- Severity: fatal (the document is invalid)
- Topics: VAT, Lines and prices
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-O-12/
- Explanation last updated: 2026-09-28

## 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

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.

## 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

```xml
<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

```xml
<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](https://ironfang.com/docs/finance/rules/BR-Z-01.md) and [BR-Z-02](https://ironfang.com/docs/finance/rules/BR-Z-02.md). The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.com/finance/rule-examples/BR-O-12-invalid.xml)
  - [Download the corrected XML](https://ironfang.com/finance/rule-examples/not-subject-valid.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 `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`.

## Related rules

- [BR-O-11 rejects a second VAT breakdown beside the O one, which this rule does not need to find](https://ironfang.com/docs/finance/rules/BR-O-11.md)
- [BR-O-13 applies the same restriction to document level allowances](https://ironfang.com/docs/finance/rules/BR-O-13.md)
- [BR-Z-02 is reported with this rule because the Zero rated line needs a seller VAT or tax registration identifier](https://ironfang.com/docs/finance/rules/BR-Z-02.md)
- [BR-Z-01 is reported too, since the Zero rated line has no Zero rated breakdown](https://ironfang.com/docs/finance/rules/BR-Z-01.md)

## 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](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/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.

## Links

- [This rule as a web page](https://ironfang.com/docs/finance/rules/BR-O-12)
- [Free Peppol invoice validator](https://ironfang.com/tools/peppol-validator)
- [Rule index](https://ironfang.com/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.com/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.com/mcp
