# BR-IC-10: Add the intra-community supply reason to the VAT breakdown

A VAT breakdown in category `K` must state the intra-community supply reason: the code `VATEX-EU-IC`, the matching reason text, 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-IC-10/
- Explanation last updated: 2026-09-24

## The short answer

`BR-IC-10` fails when the `cac:TaxCategory` of a `K` VAT breakdown, in `cac:TaxTotal/cac:TaxSubtotal`, has neither `cbc:TaxExemptionReasonCode` nor `cbc:TaxExemptionReason`. Add the code `VATEX-EU-IC`, the text `Intra-community supply` or its standard wording in the language of the invoice, or both, as the corrected invoice does.

Category `K` has exactly one correct reason, so it belongs in the mapping for the category rather than in per-item data.

## What the rule checks

The rule runs on each `cac:TaxCategory` with `cbc:ID` of `K` and tax scheme `VAT` in the document-level VAT breakdown, and the finding points at that element. It passes when the element has a reason code child, a reason text child, or both.

Either field on its own is sufficient. When tried, the corrected invoice with only `VATEX-EU-IC`, and again with only the text, passed every layer.

The value itself goes unread. Arbitrary text passed, and so did the unrelated code `VATEX-EU-132` on a `K` breakdown, with no finding from any layer. Other rules catch some wrong codes: an unknown code reports `BR-CL-22`, and `VATEX-EU-G` on a `K` breakdown reported the Peppol rule `PEPPOL-EN16931-P0104`, which ties that code to category `G`.

An empty `cbc:TaxExemptionReason` counts as present for this rule. When tried, the only finding was `PEPPOL-EN16931-R008`.

A reason on the line is not read. With the code and text moved into the line `cac:ClassifiedTaxCategory`, the breakdown still reported `BR-IC-10`, and the line brought the warnings `UBL-CR-600` and `UBL-CR-601` for fields it should not carry.

| 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 mapping writes exemption reasons only for category `E`, and `K` was added later without extending it.
- The reason is attached to line items in the source system and is not copied to the breakdown built from them.
- The PDF template prints the intra-community wording as a footer, and nothing maps it into the structured data.
- Blank reason fields are dropped on export, and the tax code used for intra-community supplies had no reason configured.

## How to fix it

1. Confirm that the supply really is an intra-community supply. If it is, category `K` stays.
2. In the `cac:TaxCategory` of the `K` breakdown, add `cbc:TaxExemptionReasonCode` with `VATEX-EU-IC`, `cbc:TaxExemptionReason` with `Intra-community supply` or its standard equivalent in the invoice language, or both.
3. Keep the UBL order: `cbc:ID`, `cbc:Percent`, the code, the text, then `cac:TaxScheme`. With the text ahead of the code, the document failed the XSD layer when tried.
4. Configure the reason on the `K` tax code at source, so every intra-community 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 K breakdown with a rate but 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>K</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 code and the text both follow 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>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>
```

The corrected invoice has `cbc:TaxExemptionReasonCode` `VATEX-EU-IC` and `cbc:TaxExemptionReason` `Intra-community supply` in the `K` tax category; the failing invoice has neither, and is otherwise identical. `BR-IC-10` is the only finding the failing document reports. Either element alone would also have cleared it.

### What the validator reported

- The failing invoice reports **BR-IC-10**. The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.uk/finance/rule-examples/BR-IC-10-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/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`. As a credit note, the failing invoice reported the same finding at the same breakdown when tried.
- Only `K` breakdowns under the `VAT` scheme are in scope. Exempt, reverse-charge, export and not-subject breakdowns have their own reason rules: `BR-E-10`, `BR-AE-10`, `BR-G-10` and `BR-O-10`.
- Peppol adds the reverse check: a breakdown carrying `VATEX-EU-IC` must be category `K`, or `PEPPOL-EN16931-P0106` is reported.
- A reason is not all that a `K` document needs. `BR-IC-02`, `BR-IC-11` and `BR-IC-12` check the VAT identifiers, the delivery date or invoicing period, and the deliver-to country.

## Related rules

- [PEPPOL-EN16931-P0106 rejects the code VATEX-EU-IC on any breakdown that is not category K](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-P0106.md)
- [BR-E-10 asks for a reason on exempt breakdowns, where the wording depends on the exemption](https://ironfang.uk/docs/finance/rules/BR-E-10.md)
- [BR-O-10 is the same presence check for breakdowns that are not subject to VAT](https://ironfang.uk/docs/finance/rules/BR-O-10.md)
- [BR-CL-22 rejects a reason code that is not in the VATEX list](https://ironfang.uk/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-24.1: source checked 2026-09-24, explanation last updated 2026-09-24.

[The official definition of BR-IC-10](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-IC-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-IC-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
