On this page
The short answer
BR-CL-05 fails when cbc:TaxCurrencyCode, the currency in which the seller accounts for VAT, is not a code on the ISO 4217 alphabetic list pinned with this release. Write the three-letter code of that currency in upper case: EUR in the corrected example, where the failing one had HRK.
HRK was the code of the Croatian kuna, which the euro replaced in 2023, and it is no longer on the list. The failing invoice also carried HRK as the currency of its VAT total in the accounting currency, so that amount was rejected too.
What the rule checks
The rule reads cbc:TaxCurrencyCode and nothing else, and only when the document has one. The element is optional: an invoice whose VAT is accounted for in the invoice currency leaves it out and is not checked here.
The code is trimmed and then looked up case-sensitively. When tried, 978, the numeric ISO code for the euro, and the word EURO both failed. EUR with spaces around it passed this rule but was reported by BR-53, because the currencyID of EUR on the VAT total no longer matched the code as written.
The pinned list has a gap: STN, the current code for the São Tomé and Príncipe dobra, is missing, while the older STD is still there. When tried, STN in both places failed this rule and BR-CL-03; STD passed the EN 16931 layer and was rejected on the amount by PEPPOL-EN16931-CL007, whose list has it the other way round.
Only the code is judged. That it differs from cbc:DocumentCurrencyCode is checked by PEPPOL-EN16931-R005, and that a VAT total exists in that currency by BR-53.
| Term | Meaning | UBL element |
|---|---|---|
| BT-6 | VAT accounting currency code | cbc:TaxCurrencyCode |
| BT-111 | Invoice total VAT amount in accounting currency | cac:TaxTotal/cbc:TaxAmount (in the tax total without cac:TaxSubtotal) |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The VAT accounting currency is set once in configuration and still holds a code that has since been withdrawn, such as
HRKafter Croatia moved to the euro. - The currency is stored as its ISO numeric code,
978for the euro, and written through unchanged. - A currency name or an abbreviation such as
EUROis typed where the code belongs. - A formatter lower-cases codes, or the value was entered by hand in lower case.
How to fix it
- Find the currency in which the seller keeps its VAT accounts for this supply; for a seller reporting VAT in euro it is
EUR. - Write its ISO 4217 alphabetic code, three upper-case letters with no spaces, in
cbc:TaxCurrencyCode. - Use the same code as the
currencyIDof thecbc:TaxAmountin the secondcac:TaxTotal, the one without a breakdown, which states the VAT total converted into that currency. - If VAT is accounted for in the invoice currency after all, remove
cbc:TaxCurrencyCodeand the second tax total instead. - Review stored currency settings when a country changes its currency; a code that was valid when it was configured can later drop off the list.
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: the VAT accounting currency and its VAT total are both in HRK
<cbc:DocumentCurrencyCode>GBP</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>HRK</cbc:TaxCurrencyCode>
<!-- buyer reference, parties and the first tax total omitted from this fragment -->
<cac:TaxTotal>
<cbc:TaxAmount currencyID="HRK">5.80</cbc:TaxAmount>
</cac:TaxTotal>Fragment of the corrected invoice: EUR in both places
<cbc:DocumentCurrencyCode>GBP</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>EUR</cbc:TaxCurrencyCode>
<!-- buyer reference, parties and the first tax total omitted from this fragment -->
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">5.80</cbc:TaxAmount>
</cac:TaxTotal>Two values differ, HRK in the failing invoice and EUR in the corrected one: cbc:TaxCurrencyCode and the currencyID of the VAT total in that currency. BR-CL-05 is reported on the currency code. BR-CL-03 and PEPPOL-EN16931-CL007 are reported on the cbc:TaxAmount of the second cac:TaxTotal, which carries the same invalid code as its currency. Correcting the code in both places clears all three.
What the validator reported
- The failing invoice reports BR-CL-03, BR-CL-05 and PEPPOL-EN16931-CL007. 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
InvoiceandCreditNote; when tried, a credit note withHRKin both places reported the same three rules. - The Peppol layer does not test
cbc:TaxCurrencyCodeagainst a currency list. When tried with only that element changed toHRK, the Peppol layer reportedPEPPOL-EN16931-R055, which found no VAT total in the accounting currency, and the EN 16931 layer addedBR-53to this rule. - The list is the same ISO 4217 snapshot that
BR-CL-03andBR-CL-04apply to amounts and to the document currency.
Related rules
- BR-CL-03 checks the currencyID of every amount, including the VAT total in the accounting currency
- PEPPOL-EN16931-CL007 repeats the amount currency check on the Peppol layer, with a slightly different list
- BR-53 requires a VAT total in the currency this element names
- BR-CL-06 checks the VAT point date code, another optional VAT reporting field with a short code list of its own
- 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-CL-05 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.

