# BR-AE-10: Add the reverse-charge reason to the VAT breakdown

A reverse-charge VAT breakdown must state why no VAT is charged, as exemption reason text, a 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-AE-10/
- Explanation last updated: 2026-09-20

## The short answer

`BR-AE-10` fails when a VAT breakdown with category `AE` has neither `cbc:TaxExemptionReason` nor `cbc:TaxExemptionReasonCode` in its `cac:TaxCategory`. Add the reason: the text `Reverse charge`, or the equivalent standard wording in the language of the invoice, or the reason code that means reverse charge, `VATEX-EU-AE`. Sending both is allowed.

The category is not the problem. If the supply is under reverse charge, `AE` stays and the missing statement is added.

## What the rule checks

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

A code on its own is enough. The valid reverse-charge fixture with its text replaced by a `cbc:TaxExemptionReasonCode` of `VATEX-EU-AE` passes every layer.

Only presence is tested, not meaning. Arbitrary text passes, and so did an unrelated code from the same list, `VATEX-EU-132`, on a reverse-charge breakdown. A clean result is therefore no evidence that the stated reason is the right one; that remains your responsibility.

A code must still come from the VATEX code list. One that is not on the list satisfies this rule but is rejected by `BR-CL-22`.

An empty `cbc:TaxExemptionReason` element counts as present here, and is then rejected by `PEPPOL-EN16931-R008`, which forbids empty elements.

The rule reads the VAT breakdown only. The category on a line or on a document-level allowance or charge is not where this reason is looked for.

| 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 source system prints the reverse-charge statement as a footer on the PDF, and nothing maps it into the structured tax data.
- The reason is held on the tax code and the export reads only category and rate.
- The mapping writes exemption reasons for category `E` and was never extended to `AE`.
- Empty strings are stripped before serialising, and the reason field was blank for this tax code.
- The reason was written somewhere other than the VAT breakdown.

## How to fix it

1. Establish from the tax determination that the supply really is under reverse charge. If it is, keep category `AE`. Changing the category to make the finding go away would misstate the transaction.
2. In the `cac:TaxCategory` of the `AE` breakdown, add `cbc:TaxExemptionReason` with the reverse-charge wording, or `cbc:TaxExemptionReasonCode` with `VATEX-EU-AE`, or both.
3. Keep the UBL order inside `cac:TaxCategory`: `cbc:ID`, `cbc:Percent`, `cbc:TaxExemptionReasonCode`, `cbc:TaxExemptionReason`, then `cac:TaxScheme`. With the text placed before the code, the XSD layer rejects the document and the EN 16931 and Peppol layers do not run.
4. Hold the reason against the tax code in the source system so that every reverse-charge document gets it, rather than patching single invoices.

## 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 reverse-charge breakdown with 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>AE</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: the reason text sits between the rate and the tax scheme

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

The corrected invoice has `cbc:TaxExemptionReason` with the text `Reverse charge` in the `AE` tax category; the failing one has no reason element at all. Nothing else differs, and the failing document reports only `BR-AE-10`.

### What the validator reported

- The failing invoice reports **BR-AE-10**. The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.uk/finance/rule-examples/BR-AE-10-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/finance/rule-examples/reverse-charge-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`. A reverse-charge credit note without the reason reports the same rule.
- Only category `AE` under the `VAT` tax scheme is in scope. Exempt breakdowns have the parallel rule `BR-E-10`.
- The other reverse-charge rules still apply: `BR-AE-09` fires when the breakdown carries a tax amount, and `BR-AE-02` fires when the seller VAT identifier is missing. Adding the reason does not settle those.

## Related rules

- [BR-E-10 asks for the same reason fields on an exempt VAT breakdown](https://ironfang.uk/docs/finance/rules/BR-E-10.md)
- [PEPPOL-EN16931-R008 rejects a reason element that is present but empty](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R008.md)
- [BR-CO-09 checks the country prefix on the seller and buyer VAT identifiers in the document](https://ironfang.uk/docs/finance/rules/BR-CO-09.md)
- [BR-CO-17 checks the breakdown tax amount against its rate, which is 0 for reverse charge in the recorded fixture](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-AE-10](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-AE-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-AE-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
