On this page
The short answer
BR-IC-09 fails when the cbc:TaxAmount of a cac:TaxSubtotal in category K is not zero. The recorded invoice to a buyer in Berlin has worked out German VAT at 19%, 4.75 on 25.00. Set the breakdown tax amount to 0.00 and its rate back to 0, then take the 4.75 out of the VAT total, the total with VAT and the amount due.
On an intra-community supply the buyer accounts for the VAT on the acquisition in its own member state, so neither the seller's rate nor the buyer's rate belongs in the seller's tax amounts.
What the rule checks
Only the breakdown is examined: the cbc:TaxAmount next to a K cac:TaxCategory under the VAT scheme in the root cac:TaxTotal must equal zero as a decimal, and the finding points at that category element.
No intra-community rule reads the rate of a K breakdown. The failing invoice sets it to 19, which drew no finding of its own, and BR-CO-17 stays quiet because 4.75 is exactly 19% of 25.00.
With the rate left at 0 and the same 4.75 in the breakdown and the totals, BR-CO-17 was reported as well when tried, since a breakdown at a rate of 0 needs a tax amount that rounds to zero.
The document VAT total is a separate check. When tried, 4.75 in a K breakdown at a rate of 0, with cac:TaxTotal/cbc:TaxAmount left at 0.00, added BR-CO-14 to this rule and BR-CO-17.
The line is not what fails. Its cac:ClassifiedTaxCategory keeps K at 0 in both documents; a positive rate there would be the separate finding BR-IC-05.
| Term | Meaning | UBL element |
|---|---|---|
| BT-117 | VAT category tax amount | cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount |
| BT-118 | VAT category code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID |
| BT-119 | VAT category rate | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:Percent |
| BT-110 | Invoice total VAT amount | cac:TaxTotal/cbc:TaxAmount |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The VAT rate is looked up from the delivery country, Germany at 19% in the example, and applied although the supply is intra-community.
- The seller's domestic rate is applied first and the category switched to
Kafterwards, leaving the calculated VAT in place. - The order was priced with VAT before the buyer VAT number was confirmed, and the stored tax amount survived when the invoice was reclassified as
K. - The VAT the buyer will self-account is calculated for information and written into the breakdown tax amount.
How to fix it
- Check that the supply qualifies as intra-community: a supply to a buyer in another member state that holds a VAT identifier there. If it does, the breakdown stays
K. - Set
cbc:TaxAmountin theKcac:TaxSubtotalto0.00and itscbc:Percentto0, the same rate the line carries. - Recalculate
cac:TaxTotal/cbc:TaxAmountfrom the breakdowns, thencbc:TaxInclusiveAmountandcbc:PayableAmount. In the recorded example they return to 0.00, 25.00 and 25.00. - If VAT really is due from the seller, the supply is not an intra-community supply and needs the category and rate that apply instead. Take that to whoever owns tax determination rather than changing the amounts alone.
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: German VAT of 4.75 at 19% in the K breakdown, carried into the totals
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">4.75</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">4.75</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>K</cbc:ID>
<cbc:Percent>19</cbc:Percent>
<cbc:TaxExemptionReasonCode>VATEX-EU-IC</cbc:TaxExemptionReasonCode>
<!-- reason text and tax scheme omitted from this fragment -->
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="GBP">25.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="GBP">29.75</cbc:TaxInclusiveAmount>
<!-- allowance, charge, prepaid and rounding amounts omitted from this fragment -->
<cbc:PayableAmount currencyID="GBP">29.75</cbc:PayableAmount>
</cac:LegalMonetaryTotal>Fragment of the corrected invoice: the K breakdown at 0 with no tax, and totals without it
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<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>
<!-- reason text and tax scheme omitted from this fragment -->
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="GBP">25.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="GBP">25.00</cbc:TaxInclusiveAmount>
<!-- allowance, charge, prepaid and rounding amounts omitted from this fragment -->
<cbc:PayableAmount currencyID="GBP">25.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>The failing invoice gives the K breakdown a rate of 19 and a tax amount of 4.75, and carries the 4.75 into a VAT total of 4.75 and a total with VAT and amount due of 29.75 each; the corrected invoice has a rate of 0, 0.00, 0.00, 25.00 and 25.00. BR-IC-09 is the only finding: the totals agree with one another and 4.75 is 19% of 25.00, so neither BR-CO-14 nor BR-CO-17 is reported.
What the validator reported
- The failing invoice reports BR-IC-09. 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. The failing invoice rebuilt as a credit note, with acac:CreditNoteLine, reported the same single finding when tried. - Reported by the EN 16931 layer as a fatal finding at the
Kbreakdown'scac:TaxCategory. - Export outside the EU has the same requirement for category
GunderBR-G-09. An intra-community breakdown also needs its reason (BR-IC-10) and a taxable amount that matches its lines, allowances and charges (BR-IC-08).
Related rules
- BR-IC-10 asks for the intra-community reason in the same K breakdown
- BR-G-09 holds an export breakdown to a tax amount of zero in the same way
- BR-CO-17 joins this rule when the K breakdown keeps a rate of 0 but carries tax that does not round to zero
- BR-IC-08 checks the taxable amount of the intra-community breakdown
- 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-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.
The official definition of BR-IC-09 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.

