# BR-CL-05: Use an ISO 4217 code for the VAT accounting currency

`cbc:TaxCurrencyCode` must be a code on the pinned ISO 4217 alphabetic list, such as `EUR`. The withdrawn `HRK`, numeric codes and lower case are rejected.

- Layer: EN 16931
- Severity: fatal (the document is invalid)
- Topics: Code lists, VAT
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-CL-05/
- Explanation last updated: 2026-09-28

## 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 `HRK` after Croatia moved to the euro.
- The currency is stored as its ISO numeric code, `978` for the euro, and written through unchanged.
- A currency name or an abbreviation such as `EURO` is typed where the code belongs.
- A formatter lower-cases codes, or the value was entered by hand in lower case.

## How to fix it

1. Find the currency in which the seller keeps its VAT accounts for this supply; for a seller reporting VAT in euro it is `EUR`.
2. Write its ISO 4217 alphabetic code, three upper-case letters with no spaces, in `cbc:TaxCurrencyCode`.
3. Use the same code as the `currencyID` of the `cbc:TaxAmount` in the second `cac:TaxTotal`, the one without a breakdown, which states the VAT total converted into that currency.
4. If VAT is accounted for in the invoice currency after all, remove `cbc:TaxCurrencyCode` and the second tax total instead.
5. 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.

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

```xml
<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

```xml
<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](https://ironfang.com/docs/finance/rules/BR-CL-03.md), **BR-CL-05** and [PEPPOL-EN16931-CL007](https://ironfang.com/docs/finance/rules/PEPPOL-EN16931-CL007.md). The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.com/finance/rule-examples/BR-CL-05-invalid.xml)
  - [Download the corrected XML](https://ironfang.com/finance/rule-examples/tax-currency-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 `Invoice` and `CreditNote`; when tried, a credit note with `HRK` in both places reported the same three rules.
- The Peppol layer does not test `cbc:TaxCurrencyCode` against a currency list. When tried with only that element changed to `HRK`, the Peppol layer reported `PEPPOL-EN16931-R055`, which found no VAT total in the accounting currency, and the EN 16931 layer added `BR-53` to this rule.
- The list is the same ISO 4217 snapshot that `BR-CL-03` and `BR-CL-04` apply 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](https://ironfang.com/docs/finance/rules/BR-CL-03.md)
- [PEPPOL-EN16931-CL007 repeats the amount currency check on the Peppol layer, with a slightly different list](https://ironfang.com/docs/finance/rules/PEPPOL-EN16931-CL007.md)
- [BR-53 requires a VAT total in the currency this element names](https://ironfang.com/docs/finance/rules/BR-53.md)
- [BR-CL-06 checks the VAT point date code, another optional VAT reporting field with a short code list of its own](https://ironfang.com/docs/finance/rules/BR-CL-06.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-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.

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

## Links

- [This rule as a web page](https://ironfang.com/docs/finance/rules/BR-CL-05)
- [Free Peppol invoice validator](https://ironfang.com/tools/peppol-validator)
- [Rule index](https://ironfang.com/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.com/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.com/mcp
