BT-5Invoice currency codeBT-111Invoice total VAT amount in accounting currency
Official rule text
[PEPPOL-EN16931-R051] All currencyID attributes must have the same value as the invoice currency code (BT-5), except for the invoice total VAT amount in accounting currency (BT-111).
Why this error occurs
In a Peppol UBL invoice every amount must be in the invoice currency (BT-5); the only exception is the VAT total in the accounting currency (BT-111). The rule checks that the currencyID attribute of every cbc:Amount, cbc:BaseAmount, cbc:PriceAmount, cbc:TaxAmount, cbc:TaxableAmount, cbc:LineExtensionAmount and all cac:LegalMonetaryTotal amounts equals cbc:DocumentCurrencyCode. It fires when a template hard-codes currencyID="EUR" while the document currency is something else, or when prices are exported in the supplier's currency on a foreign-currency invoice.
How to fix it
Generate every currencyID from the value of cbc:DocumentCurrencyCode instead of hard-coding it. For a foreign-currency invoice convert all prices and amounts to that currency before export. Keep exactly one cac:TaxTotal without subtotals in the accounting currency if BT-6 is used; all other amounts, including line prices, stay in the document currency. This rule applies to UBL only.
Example (valid)
<cbc:DocumentCurrencyCode>SEK</cbc:DocumentCurrencyCode>
...
<cbc:LineExtensionAmount currencyID="SEK">1000.00</cbc:LineExtensionAmount>
<cbc:PriceAmount currencyID="SEK">500.00</cbc:PriceAmount>
What the validator checks
Checked element (context):
UBL
cbc:Amount | cbc:BaseAmount | cbc:PriceAmount | cac:TaxTotal[cac:TaxSubtotal]/cbc:TaxAmount | cac:TaxSubtotal/cbc:TaxAmount | cbc:TaxableAmount | cbc:LineExtensionAmount | cbc:TaxExclusiveAmount | cbc:TaxInclusiveAmount | cbc:AllowanceTotalAmount | cbc:ChargeTotalAmount | cbc:PrepaidAmount | cbc:PayableRoundingAmount | cbc:PayableAmountTest (XPath):
@currencyID = $documentCurrencyCode
Check your invoice
Drop your XML or PDF on the validator and every failed rule is linked to its page here. Free, no account, the file is not stored.
Same check via API:
curl -F file=@invoice.xml https://einvoicechecker.com/v1/validateRelated rules
PEPPOL-EN16931-R001Business process identifier (BT-23) is missingPEPPOL-EN16931-R002No more than one note is allowed on document level, unless both the buyer and seller…PEPPOL-EN16931-R003Neither buyer reference nor purchase order reference givenPEPPOL-EN16931-R004Specification identifier is not the Peppol BIS Billing 3.0 identifierPEPPOL-EN16931-R005VAT accounting currency equals the invoice currencyPEPPOL-EN16931-R006Only one invoiced object is allowed on document levelPEPPOL-EN16931-R007Business process identifier has the wrong formatPEPPOL-EN16931-R008Document contains empty elements
Frequently asked questions
What does PEPPOL-EN16931-R051 mean?
PEPPOL-EN16931-R051 is a peppol bis billing 3.0 rule: All currencyID attributes must have the same value as the invoice currency code (BT-5), except for the invoice total VAT amount in accounting currency (BT-111).
Will my invoice be rejected because of PEPPOL-EN16931-R051?
Yes. PEPPOL-EN16931-R051 is flagged "fatal"; validators (KoSIT, Peppol access points, the German ZRE/OZG-RE portals) reject the invoice until it is fixed.
Which formats does PEPPOL-EN16931-R051 apply to?
Invoices and credit notes sent over the Peppol network (UBL) and, because XRechnung embeds the Peppol rule set, every XRechnung as well. Syntax: UBL.
Source: Peppol BIS Billing 3.0.20 (November 2025). Catalogue generated from the official schematron on 2026-10-14.