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, andKwas 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
- Confirm that the supply really is an intra-community supply. If it is, category
Kstays. - In the
cac:TaxCategoryof theKbreakdown, addcbc:TaxExemptionReasonCodewithVATEX-EU-IC,cbc:TaxExemptionReasonwithIntra-community supplyor its standard equivalent in the invoice language, or both. - Keep the UBL order:
cbc:ID,cbc:Percent, the code, the text, thencac:TaxScheme. With the text ahead of the code, the document failed the XSD layer when tried. - Configure the reason on the
Ktax 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
- The failing invoice reports BR-IC-10. The corrected document passes every layer with no findings.Download the failing XMLDownload the corrected 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
InvoiceandCreditNote. As a credit note, the failing invoice reported the same finding at the same breakdown when tried. - Only
Kbreakdowns under theVATscheme are in scope. Exempt, reverse-charge, export and not-subject breakdowns have their own reason rules:BR-E-10,BR-AE-10,BR-G-10andBR-O-10. - Peppol adds the reverse check: a breakdown carrying
VATEX-EU-ICmust be categoryK, orPEPPOL-EN16931-P0106is reported. - A reason is not all that a
Kdocument needs.BR-IC-02,BR-IC-11andBR-IC-12check 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
- BR-E-10 asks for a reason on exempt breakdowns, where the wording depends on the exemption
- BR-O-10 is the same presence check for breakdowns that are not subject to VAT
- BR-CL-22 rejects a reason code that is not in the VATEX list
- Browse every rule in the reference
- Background: Understanding EN 16931 validation errors
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.
