# BR-G-10: Add the export reason to the VAT breakdown

A VAT breakdown in category `G` must give the export reason: the code `VATEX-EU-G`, the text `Export outside the EU` or its equivalent, 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-G-10/
- Explanation last updated: 2026-09-28

## The short answer

`BR-G-10` fails when the `cac:TaxCategory` of a `G` breakdown has neither `cbc:TaxExemptionReasonCode` nor `cbc:TaxExemptionReason`. Put back the code `VATEX-EU-G`, the text `Export outside the EU` or the standard wording in the invoice language, or both, between `cbc:Percent` and `cac:TaxScheme`.

The code is the dependable choice: Peppol ties `VATEX-EU-G` to category `G`, so a mapping that writes it from the category cannot drift.

## What the rule checks

Each `G` breakdown under the `VAT` scheme in the root `cac:TaxTotal` is checked for a reason child of either kind, and the finding is reported at its `cac:TaxCategory`.

One of the two is enough. When tried, the recorded export with only `VATEX-EU-G`, and again with only the English text, passed every layer; so did the German text `Ausfuhrlieferung` on its own.

What the reason says is not checked by this rule. The code `VATEX-EU-132`, an exemption code meant for category `E`, passed every layer on the `G` breakdown when tried. Peppol does reject the codes it reserves for other categories: `VATEX-EU-IC` reported `PEPPOL-EN16931-P0106`, and `VATEX-EU-O` reported `PEPPOL-EN16931-P0105`.

An empty `cbc:TaxExemptionReason` counts as a reason for this rule. When tried, the export breakdown with an empty text and no code drew `PEPPOL-EN16931-R008` for the empty element instead.

The line cannot carry the reason for the breakdown. When tried, the code and text placed in the export item `cac:ClassifiedTaxCategory` left this rule in place and added the warnings `UBL-CR-600` and `UBL-CR-601`.

| 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 reason is written only for category `E`, and export was added to the mapping later.
- The export wording is printed on the PDF as a footnote but never mapped into the breakdown.
- The reason is configured on the item tax code and not copied when lines are grouped into the breakdown.
- Empty strings are dropped on output, and the export tax code had no reason text set up.

## How to fix it

1. Confirm that the goods are exported outside the EU; if so, the breakdown stays `G`.
2. In its `cac:TaxCategory`, add `cbc:TaxExemptionReasonCode` with `VATEX-EU-G`, `cbc:TaxExemptionReason` with `Export outside the EU` or its standard equivalent, or both.
3. Write them in schema order after `cbc:Percent`: the code first, then the text. With the text before the code, the export failed the XSD layer when tried.
4. Set the reason on the export tax code at source, so every `G` breakdown is generated with 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: a G breakdown with a rate and 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>G</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: VATEX-EU-G and the export wording after the rate

```xml
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <cac:TaxCategory>
    <cbc:ID>G</cbc:ID>
    <cbc:Percent>0</cbc:Percent>
    <cbc:TaxExemptionReasonCode>VATEX-EU-G</cbc:TaxExemptionReasonCode>
    <cbc:TaxExemptionReason>Export outside the EU</cbc:TaxExemptionReason>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:TaxSubtotal>
```

The corrected invoice has `cbc:TaxExemptionReasonCode` `VATEX-EU-G` and `cbc:TaxExemptionReason` `Export outside the EU` in its `G` tax category; the failing invoice has neither. Nothing else differs, and `BR-G-10` is the only finding.

### What the validator reported

- The failing invoice reports **BR-G-10**. The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.com/finance/rule-examples/BR-G-10-invalid.xml)
  - [Download the corrected XML](https://ironfang.com/finance/rule-examples/export-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`. The failing invoice as a credit note reported this rule at the same breakdown when tried.
- Peppol adds the reverse check through `PEPPOL-EN16931-P0104`: `VATEX-EU-G` on a breakdown of any other category is rejected.
- A reason does not complete an export document on its own: the seller needs a VAT identifier (`BR-G-02`), and the breakdown must appear once (`BR-G-01`) and carry no tax (`BR-G-09`).

## Related rules

- [PEPPOL-EN16931-P0104 rejects VATEX-EU-G on a breakdown that is not category G](https://ironfang.com/docs/finance/rules/PEPPOL-EN16931-P0104.md)
- [BR-IC-10 is the reason check for an intra-community breakdown](https://ironfang.com/docs/finance/rules/BR-IC-10.md)
- [BR-G-02 requires the seller VAT identifier on the same export invoice](https://ironfang.com/docs/finance/rules/BR-G-02.md)
- [BR-CL-22 checks that a reason code such as VATEX-EU-G is in the VATEX list](https://ironfang.com/docs/finance/rules/BR-CL-22.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-G-10](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-G-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.com/docs/finance/rules/BR-G-10)
- [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
