Skip to content

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.

EN 16931Fatal: the document is invalidVAT

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.

TermMeaningUBL element
BT-118VAT category codecac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID
BT-120VAT exemption reason textcac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReason
BT-121VAT exemption reason codecac: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.

Validate your corrected invoice

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

<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

<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

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.

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 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.