# BR-O-01: Give a document with not subject to VAT content exactly one O breakdown

A line, document allowance or document charge in category `O` needs one VAT breakdown in `O`. A document with none, or with two, is rejected.

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

## The short answer

`BR-O-01` fails when category `O` is used somewhere in the document and `cac:TaxTotal` does not hold exactly one `cac:TaxSubtotal` whose `cac:TaxCategory/cbc:ID` is `O`. In the recorded example the not subject to VAT breakdown of 25.00 was written twice. Keep a single `O` breakdown that covers every line, allowance and charge in `O`.

Having no VAT to report does not remove the breakdown. An invoice whose lines are all outside the scope of VAT still needs its one `O` entry, with a tax amount of 0.00 and an exemption reason, such as the code `VATEX-EU-O`.

## What the rule checks

The trigger is any `cbc:ID` of `O` under the `VAT` scheme, in a line's `cac:ClassifiedTaxCategory` or in any `cac:TaxCategory`, the breakdown's own included. The count that follows looks only at `cac:TaxTotal/cac:TaxSubtotal` under the document root, and it must be exactly 1.

A missing breakdown fails as well as a repeated one. When tried, deleting the only `O` breakdown from the corrected invoice reported this rule with `BR-CO-18`, `PEPPOL-EN16931-R053` and `PEPPOL-EN16931-R054`, because the document was then left with no VAT breakdown at all.

An allowance or a charge is enough to set it off. When tried, a document-level allowance of 5.00 in category `O` on a Standard rated invoice with no `O` breakdown reported this rule, beside `BR-O-03` for the seller VAT identifier that invoice carries; a 4.00 charge in `O` did the same with `BR-O-04`.

Amounts play no part here. The recorded duplicate repeats the full 25.00, which satisfies `BR-O-08` twice over; when tried with one `O` breakdown per line instead, 25.00 and 10.00 for two `O` lines, `BR-O-08` failed at each of the two as well.

The opposite case gets through. An `O` breakdown of 0.00 on a Standard rated invoice with no `O` content passes this rule, because the breakdown counts as `O` content itself; when tried, that invoice was rejected by `BR-O-11` and `BR-O-12` instead.

| Term | Meaning | UBL element |
|---|---|---|
| BG-23 | VAT breakdown | `cac:TaxTotal/cac:TaxSubtotal` |
| BT-118 | VAT category code | `cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID` |
| 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-95 | Document level allowance VAT category code | `cac:AllowanceCharge[cbc:ChargeIndicator = false]/cac:TaxCategory/cbc:ID` |
| BT-102 | Document level charge VAT category code | `cac:AllowanceCharge[cbc:ChargeIndicator = true]/cac:TaxCategory/cbc:ID` |

## How an integration ends up here

Possible causes, from the shape of the rule rather than from measured usage:

- Breakdowns are generated only where there is VAT to report, so a document wholly outside the scope of VAT is sent with an empty tax total.
- The tax summary is appended twice, for example once by the line loop and once by a totals step, and both copies say `O`.
- One breakdown is written per line or per internal tax code, and several codes, such as "outside scope" and "non-business", all map to `O`.
- A document-level allowance or charge is put in `O` while the lines use another category, so no `O` breakdown was ever planned for it.

## How to fix it

1. List what the document puts in `O`, reading each line's `cac:Item/cac:ClassifiedTaxCategory/cbc:ID` and the `cac:TaxCategory/cbc:ID` of each `cac:AllowanceCharge` directly under the root; in the recorded example that is the single line of 25.00.
2. Write one `cac:TaxSubtotal` for them: the net `O` content as `cbc:TaxableAmount`, `0.00` as `cbc:TaxAmount`, and a `cac:TaxCategory` with `cbc:ID` `O`, the reason code `VATEX-EU-O` or the reason text, no `cbc:Percent`, and the `VAT` scheme.
3. If the generator produced several `O` breakdowns, merge them into that one and delete the rest. In the recorded example the second copy simply goes.
4. Leave `cac:TaxTotal/cbc:TaxAmount` at `0.00`, since an `O` breakdown adds no VAT to it.

## Before and after

These are fragments, not complete documents. The complete synthetic documents they come from are linked below.

Fragment of the failing invoice: two identical O breakdowns for the one O line of 25.00

```xml
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <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>
      <cbc:TaxExemptionReasonCode>VATEX-EU-O</cbc:TaxExemptionReasonCode>
      <cbc:TaxExemptionReason>Not subject to VAT</cbc:TaxExemptionReason>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:TaxCategory>
  </cac:TaxSubtotal>
  <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>
      <!-- the same reason code and text omitted from this fragment -->
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:TaxCategory>
  </cac:TaxSubtotal>
</cac:TaxTotal>
<!-- line 1, 25.00 in category O, omitted from this fragment -->
```

Fragment of the corrected invoice: a single O breakdown

```xml
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <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>
      <cbc:TaxExemptionReasonCode>VATEX-EU-O</cbc:TaxExemptionReasonCode>
      <cbc:TaxExemptionReason>Not subject to VAT</cbc:TaxExemptionReason>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:TaxCategory>
  </cac:TaxSubtotal>
</cac:TaxTotal>
```

The failing invoice repeats the whole `O` `cac:TaxSubtotal`, taxable amount 25.00 and tax 0.00, so its `cac:TaxTotal` holds two identical entries for the one line; the corrected invoice keeps one. The failing document reports only `BR-O-01`: the VAT total of 0.00 still equals the sum of the breakdowns, and each copy agrees with the 25.00 line on its own.

### What the validator reported

- The failing invoice reports **BR-O-01**. The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.com/finance/rule-examples/BR-O-01-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`, with one finding at the document root. The failing invoice rewritten as a credit note reported the same single finding when tried.
- Only the `VAT` scheme counts, in the categories and in the breakdown. Other categories have a rule of this kind each, such as `BR-Z-01` and `BR-E-01`, while `BR-S-01` allows several Standard rated breakdowns because Standard rates differ.
- The single `O` breakdown still has to be right in its details: `BR-O-08` checks its taxable amount, `BR-O-09` its tax amount and `BR-O-10` its reason.

## Related rules

- [BR-O-08 checks the taxable amount of the single O breakdown against the O lines, allowances and charges](https://ironfang.com/docs/finance/rules/BR-O-08.md)
- [BR-O-09 requires the tax amount of that breakdown to be zero](https://ironfang.com/docs/finance/rules/BR-O-09.md)
- [BR-CO-18 is reported beside this rule when an out-of-scope invoice is sent with no VAT breakdown at all](https://ironfang.com/docs/finance/rules/BR-CO-18.md)
- [BR-Z-01 is the Zero rated version of the exactly-one breakdown rule](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-01](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-O-01/) 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-01)
- [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
