# PEPPOL-EN16931-P0107: Use VATEX-EU-AE only on a reverse-charge breakdown in category AE

The reverse-charge code `VATEX-EU-AE` must sit in tax category `AE`. The recorded intra-community supply used it in place of `VATEX-EU-IC` in its `K` breakdown.

- Layer: Peppol BIS Billing
- Severity: fatal (the document is invalid)
- Topics: VAT, Code lists
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/PEPPOL-EN16931-P0107/
- Explanation last updated: 2026-09-28

## The short answer

`PEPPOL-EN16931-P0107` fails for each `cac:TaxCategory` carrying `VATEX-EU-AE` whose `cbc:ID` is not `AE`. The code says the customer accounts for the VAT under the reverse charge, and `AE` is the only category with that meaning.

The recorded example sells to a buyer in Germany with both VAT identifiers, a delivery date and a deliver-to country, in category `K`: an intra-community supply. Such a sale is often called a reverse charge, yet it has a code of its own, `VATEX-EU-IC`, and restoring that code is the correction.

## What the rule checks

Every `cac:TaxCategory` whose exemption code upper-cases to `VATEX-EU-AE` is tested, and it passes only with the category `AE`. The category is trimmed but the code is not: when tried, a trailing space after `VATEX-EU-AE` hid it from this rule, while `BR-CL-22` still accepted it.

A domestic reverse charge left at the standard rate is caught twice. When tried, `VATEX-EU-AE` in a Standard rated breakdown at 20 percent was reported by this rule and by `BR-S-10`.

The rest of the invoice is not examined. When tried, the recorded example with its breakdown and line switched to `AE`, still carrying `VATEX-EU-AE`, passed every layer, because it already had the seller and buyer VAT identifiers that `BR-AE-02` needs. Whether `AE` or `K` is right is a VAT question the validator cannot answer.

| Term | Meaning | UBL element |
|---|---|---|
| BT-121 | VAT exemption reason code | `cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReasonCode` |
| 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:

- Every sale without VAT to a VAT-registered business in another member state is labelled reverse charge, whether goods or services are supplied.
- The exemption code comes from a reverse-charge flag on the customer, while the category comes from the kind of supply.
- A domestic reverse charge for particular goods or services is marked by the code alone, and the category stays `S`.

## How to fix it

1. Tell the two treatments apart. Goods dispatched to a VAT-registered buyer in another member state are an intra-community supply, `K` with `VATEX-EU-IC`; a supply on which the buyer accounts for the VAT in another way, such as many cross-border services, is `AE` with `VATEX-EU-AE`.
2. For an intra-community supply, as in the example, keep `K` and write `VATEX-EU-IC`. `BR-IC-10` needs a reason on that breakdown, and the text would do on its own.
3. For a reverse charge, change the breakdown and its lines to `AE`, with the rate `0` and no VAT amount, and make sure the VAT identifiers are present.
4. For a domestic reverse charge coded `S` by mistake, the category has to change too: a Standard rated breakdown may carry no exemption reason at all.

## 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 intra-community breakdown with the reverse-charge code

```xml
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <cac:TaxCategory>
    <cbc:ID>K</cbc:ID>
    <cbc:Percent>0</cbc:Percent>
    <cbc:TaxExemptionReasonCode>VATEX-EU-AE</cbc:TaxExemptionReasonCode>
    <cbc:TaxExemptionReason>Intra-community supply</cbc:TaxExemptionReason>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:TaxSubtotal>
```

Fragment of the corrected invoice: the intra-community breakdown carries VATEX-EU-IC

```xml
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <cac:TaxCategory>
    <cbc:ID>K</cbc:ID>
    <cbc:Percent>0</cbc:Percent>
    <cbc:TaxExemptionReasonCode>VATEX-EU-IC</cbc:TaxExemptionReasonCode>
    <cbc:TaxExemptionReason>Intra-community supply</cbc:TaxExemptionReason>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:TaxSubtotal>
```

Only the exemption code differs: `VATEX-EU-AE` in the failing invoice, `VATEX-EU-IC` in the corrected one; the category `K`, the reason text and the amounts are unchanged. The failing document reports this rule and nothing else, because the text satisfies `BR-IC-10` and no EN 16931 rule compares a code with its category.

### What the validator reported

- The failing invoice reports **PEPPOL-EN16931-P0107**. The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.com/finance/rule-examples/PEPPOL-EN16931-P0107-invalid.xml)
  - [Download the corrected XML](https://ironfang.com/finance/rule-examples/intra-community-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`. When tried, `VATEX-EU-AE` in the breakdown of an exempt credit note reported this rule.
- A rule of the Peppol layer. On the EN 16931 layer, `BR-CL-22` accepts `VATEX-EU-AE` as a listed code in any category.
- Category `AE` brings requirements of its own, among them the VAT identifiers of `BR-AE-02` and a reason under `BR-AE-10`.

## Related rules

- [BR-AE-10 requires a reason on a reverse-charge breakdown, where VATEX-EU-AE belongs](https://ironfang.com/docs/finance/rules/BR-AE-10.md)
- [BR-IC-10 requires the reason on an intra-community supply breakdown, restored here as VATEX-EU-IC](https://ironfang.com/docs/finance/rules/BR-IC-10.md)
- [PEPPOL-EN16931-P0105 rejects the not subject to VAT code when it appears in a reverse-charge breakdown](https://ironfang.com/docs/finance/rules/PEPPOL-EN16931-P0105.md)
- [PEPPOL-EN16931-P0108 rejects the second-hand means of transport code in an intra-community breakdown](https://ironfang.com/docs/finance/rules/PEPPOL-EN16931-P0108.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 PEPPOL-EN16931-P0107](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/PEPPOL-EN16931-P0107/) 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/PEPPOL-EN16931-P0107)
- [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
