# BR-E-10: Add the exemption reason to an exempt VAT breakdown

A VAT breakdown in the exempt category must say what the exemption is, through exemption reason text, an exemption reason code, or both.

- 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-E-10/
- Explanation last updated: 2026-09-20

## The short answer

`BR-E-10` fails when a VAT breakdown with category `E` has neither `cbc:TaxExemptionReason` nor `cbc:TaxExemptionReasonCode` in its `cac:TaxCategory`. Supply the reason the supply is exempt, as text, as a code from the VATEX list, or as both.

Exemption has many possible legal bases, so there is no single phrase to hard-code. The value has to come from whatever made your system treat the supply as exempt.

## What the rule checks

The rule selects each `cac:TaxCategory` with `cbc:ID` of `E` under the `VAT` tax scheme, inside `cac:TaxTotal/cac:TaxSubtotal` beneath the document root, and passes when it has a `cbc:TaxExemptionReason` child or a `cbc:TaxExemptionReasonCode` child.

A code alone satisfies it. The valid exempt fixture with its text swapped for a `cbc:TaxExemptionReasonCode` of `VATEX-EU-132` passes every layer.

The content of the text is not examined; any non-empty text passes. The validator cannot tell you that the stated exemption is the correct one.

Codes are checked elsewhere. A value outside the VATEX list is rejected by `BR-CL-22`, and the reverse-charge code `VATEX-EU-AE` on an exempt breakdown is rejected by the Peppol rule `PEPPOL-EN16931-P0107`, even with reason text beside it.

An empty `cbc:TaxExemptionReason` element is enough for this rule and is then rejected by `PEPPOL-EN16931-R008`.

| Term | Meaning | UBL element |
|---|---|---|
| BT-118 | VAT category code | `cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID` |
| BT-120 | VAT exemption reason text | `cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReason` |
| BT-121 | VAT exemption reason code | `cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReasonCode` |

## How an integration ends up here

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

- The exemption is recorded only as a tax code in the source system, with no description or legal reference the export could use.
- The reason exists per item or per customer, and the export builds the VAT breakdown from category and rate alone.
- The wording is printed on the PDF from a template and is never part of the structured data.
- Blank values are dropped during serialisation and the reason was blank for this tax code.
- A supply that is zero-rated or outside the scope of VAT was mapped to `E` by a catch-all, so no exemption reason exists for it. In that case the category assignment is the defect, and it is fixed where the category is decided.

## How to fix it

1. Find out why the supply is exempt: which provision or scheme your tax determination relied on. If it is genuinely exempt, the category stays `E`.
2. Add `cbc:TaxExemptionReason` with wording that states that basis, or `cbc:TaxExemptionReasonCode` with the VATEX code that matches it, inside the `cac:TaxCategory` of the `E` breakdown. If no listed code fits, send text.
3. Place the elements in UBL order: after `cbc:Percent` and before `cac:TaxScheme`, with the code before the text when both are sent. In the wrong order the document fails at the XSD layer and the later layers are skipped.
4. Store the reason with the tax code or exemption record at source, so the export never has to invent one.

## Before and after

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

Fragment of the failing invoice: an exempt breakdown that gives no reason

```xml
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <cac:TaxCategory>
    <cbc:ID>E</cbc:ID>
    <cbc:Percent>0</cbc:Percent>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:TaxSubtotal>
```

Fragment of the corrected invoice: reason text added to the tax category

```xml
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <cac:TaxCategory>
    <cbc:ID>E</cbc:ID>
    <cbc:Percent>0</cbc:Percent>
    <cbc:TaxExemptionReason>Exempt from VAT</cbc:TaxExemptionReason>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:TaxSubtotal>
```

The corrected invoice carries `cbc:TaxExemptionReason` in the `E` tax category and the failing one does not; that element is the whole difference. The failing document reports only `BR-E-10`. The fixture text, `Exempt from VAT`, is generic wording that satisfies the check; a real invoice should name the actual basis.

### What the validator reported

- The failing invoice reports **BR-E-10**. The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.uk/finance/rule-examples/BR-E-10-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/finance/rule-examples/exempt-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`. An exempt credit note without a reason reports the same rule.
- Only category `E` under the `VAT` tax scheme is in scope. Reverse charge has its own rule, `BR-AE-10`.
- The rule reads the VAT breakdown only. The category on a line or on a document-level allowance or charge is not where the reason is looked for.
- Tax in an exempt breakdown is a separate matter: a tax amount of 5.00 there brings `BR-E-09` and `BR-CO-17`.

## Related rules

- [BR-AE-10 is the same requirement for reverse-charge breakdowns, where the reason is fixed](https://ironfang.uk/docs/finance/rules/BR-AE-10.md)
- [PEPPOL-EN16931-R008 rejects an exemption reason element that is left empty](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R008.md)
- [BR-CO-17 checks the tax amount of the exempt breakdown against its rate of 0](https://ironfang.uk/docs/finance/rules/BR-CO-17.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-24.1: source checked 2026-09-24, explanation last updated 2026-09-20.

[The official definition of BR-E-10](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-E-10/) 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.uk/docs/finance/rules/BR-E-10)
- [Free Peppol invoice validator](https://ironfang.uk/tools/peppol-validator)
- [Rule index](https://ironfang.uk/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.uk/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.uk/mcp
