# Ironfang Finance validation rule reference

The rules Ironfang Finance runs for Peppol BIS Billing 3.0, 2026.5 (May 2026 release, aka BIS Billing 3.0.21), with the EN 16931 validation artefacts 1.3.16, on UBL 2.1 Invoice and CreditNote documents. It does not cover CII, other CIUS such as XRechnung, other Peppol document types or earlier releases, where the same identifier can mean something different.

That release defines 1,144 official rules: 979 from EN 16931 and its UBL binding, and 165 added by Peppol BIS Billing, some of which apply only to one seller country. 141 have an explanation here so far, alongside 1 Ironfang diagnostic for input the validator cannot read, which is ours and not part of either specification. The validator reports every rule either way; an explanation is extra help, not coverage.

## Explained rules

### EN 16931

- [BR-01](https://ironfang.uk/docs/finance/rules/BR-01.md): Add the specification identifier in CustomizationID
- [BR-02](https://ironfang.uk/docs/finance/rules/BR-02.md): Add the invoice number in the document-level cbc:ID
- [BR-04](https://ironfang.uk/docs/finance/rules/BR-04.md): Add the invoice type code
- [BR-05](https://ironfang.uk/docs/finance/rules/BR-05.md): Add the invoice currency code
- [BR-06](https://ironfang.uk/docs/finance/rules/BR-06.md): Add the seller name as the supplier RegistrationName
- [BR-07](https://ironfang.uk/docs/finance/rules/BR-07.md): Add the buyer name as the customer RegistrationName
- [BR-08](https://ironfang.uk/docs/finance/rules/BR-08.md): Add the seller postal address
- [BR-10](https://ironfang.uk/docs/finance/rules/BR-10.md): Add the buyer postal address
- [BR-11](https://ironfang.uk/docs/finance/rules/BR-11.md): Add the country code to the buyer postal address
- [BR-12](https://ironfang.uk/docs/finance/rules/BR-12.md): Add the sum of line net amounts to the monetary totals
- [BR-13](https://ironfang.uk/docs/finance/rules/BR-13.md): Add the total without VAT to the monetary totals
- [BR-17](https://ironfang.uk/docs/finance/rules/BR-17.md): Name the payee, or remove a payee that is the seller
- [BR-18](https://ironfang.uk/docs/finance/rules/BR-18.md): Add the name of the seller tax representative
- [BR-21](https://ironfang.uk/docs/finance/rules/BR-21.md): Give every line a non-empty line identifier
- [BR-22](https://ironfang.uk/docs/finance/rules/BR-22.md): Add the invoiced or credited quantity to every line
- [BR-23](https://ironfang.uk/docs/finance/rules/BR-23.md): Add the unitCode attribute to the line quantity
- [BR-25](https://ironfang.uk/docs/finance/rules/BR-25.md): Give every line an item name
- [BR-26](https://ironfang.uk/docs/finance/rules/BR-26.md): Add the item net price to every line
- [BR-27](https://ironfang.uk/docs/finance/rules/BR-27.md): Fix a negative item net price by moving the sign to the quantity
- [BR-28](https://ironfang.uk/docs/finance/rules/BR-28.md): Make the item gross price zero or positive
- [BR-29](https://ironfang.uk/docs/finance/rules/BR-29.md): Fix an invoicing period that ends before it starts
- [BR-32](https://ironfang.uk/docs/finance/rules/BR-32.md): Add a VAT category to each document-level allowance
- [BR-45](https://ironfang.uk/docs/finance/rules/BR-45.md): Add the taxable amount to each VAT breakdown
- [BR-47](https://ironfang.uk/docs/finance/rules/BR-47.md): Add the VAT category code to each VAT breakdown
- [BR-48](https://ironfang.uk/docs/finance/rules/BR-48.md): Add the VAT rate to each VAT breakdown
- [BR-50](https://ironfang.uk/docs/finance/rules/BR-50.md): Add the account identifier to the payee financial account
- [BR-51](https://ironfang.uk/docs/finance/rules/BR-51.md): Replace the full card number with its last four digits
- [BR-52](https://ironfang.uk/docs/finance/rules/BR-52.md): Add an identifier to each supporting document reference
- [BR-53](https://ironfang.uk/docs/finance/rules/BR-53.md): Add the VAT total in the VAT accounting currency
- [BR-54](https://ironfang.uk/docs/finance/rules/BR-54.md): Give every item attribute both a name and a value
- [BR-55](https://ironfang.uk/docs/finance/rules/BR-55.md): Add the preceding invoice number to the billing reference
- [BR-56](https://ironfang.uk/docs/finance/rules/BR-56.md): Add the VAT identifier of the seller tax representative
- [BR-57](https://ironfang.uk/docs/finance/rules/BR-57.md): Add the country code to the deliver-to address
- [BR-61](https://ironfang.uk/docs/finance/rules/BR-61.md): Add the payee account to a credit transfer
- [BR-62](https://ironfang.uk/docs/finance/rules/BR-62.md): Add the schemeID attribute to the seller electronic address
- [BR-63](https://ironfang.uk/docs/finance/rules/BR-63.md): Add the schemeID attribute to the buyer electronic address
- [BR-64](https://ironfang.uk/docs/finance/rules/BR-64.md): Add the schemeID attribute to the item standard identifier
- [BR-65](https://ironfang.uk/docs/finance/rules/BR-65.md): Add the listID attribute to the item classification code
- [BR-AE-02](https://ironfang.uk/docs/finance/rules/BR-AE-02.md): Identify the seller and the buyer on a reverse-charge invoice
- [BR-AE-05](https://ironfang.uk/docs/finance/rules/BR-AE-05.md): Set the VAT rate of a reverse-charge line to 0
- [BR-AE-09](https://ironfang.uk/docs/finance/rules/BR-AE-09.md): Set the tax amount of the reverse-charge VAT breakdown to zero
- [BR-AE-10](https://ironfang.uk/docs/finance/rules/BR-AE-10.md): Add the reverse-charge reason to the VAT breakdown
- [BR-CL-01](https://ironfang.uk/docs/finance/rules/BR-CL-01.md): Use a permitted document type code
- [BR-CL-03](https://ironfang.uk/docs/finance/rules/BR-CL-03.md): Use an ISO 4217 currency code in every currencyID attribute
- [BR-CL-04](https://ironfang.uk/docs/finance/rules/BR-CL-04.md): Use an ISO 4217 alphabetic code for the invoice currency
- [BR-CL-10](https://ironfang.uk/docs/finance/rules/BR-CL-10.md): Use an ISO 6523 ICD code as the scheme of a party identifier
- [BR-CL-13](https://ironfang.uk/docs/finance/rules/BR-CL-13.md): Use a UNTDID 7143 code in the classification listID
- [BR-CL-14](https://ironfang.uk/docs/finance/rules/BR-CL-14.md): Use an ISO 3166-1 alpha-2 country code in addresses
- [BR-CL-16](https://ironfang.uk/docs/finance/rules/BR-CL-16.md): Use a UNTDID 4461 payment means code
- [BR-CL-17](https://ironfang.uk/docs/finance/rules/BR-CL-17.md): Use a permitted VAT category code in each tax category
- [BR-CL-18](https://ironfang.uk/docs/finance/rules/BR-CL-18.md): Use a permitted VAT category code on each line item
- [BR-CL-19](https://ironfang.uk/docs/finance/rules/BR-CL-19.md): Use an allowance reason code from the UNTDID 5189 list
- [BR-CL-20](https://ironfang.uk/docs/finance/rules/BR-CL-20.md): Use a charge reason code from the UNTDID 7161 list
- [BR-CL-21](https://ironfang.uk/docs/finance/rules/BR-CL-21.md): Use an ISO 6523 ICD code in the item identifier schemeID
- [BR-CL-22](https://ironfang.uk/docs/finance/rules/BR-CL-22.md): Use a VATEX code for the VAT exemption reason code
- [BR-CL-23](https://ironfang.uk/docs/finance/rules/BR-CL-23.md): Use a UN/ECE Recommendation 20 code in unitCode
- [BR-CL-24](https://ironfang.uk/docs/finance/rules/BR-CL-24.md): Use a permitted MIME code for embedded attachments
- [BR-CL-25](https://ironfang.uk/docs/finance/rules/BR-CL-25.md): Use an EAS code as the schemeID of an electronic address
- [BR-CO-03](https://ironfang.uk/docs/finance/rules/BR-CO-03.md): Send either the VAT point date or the VAT point date code, not both
- [BR-CO-04](https://ironfang.uk/docs/finance/rules/BR-CO-04.md): Add the VAT category code to every invoice line
- [BR-CO-09](https://ironfang.uk/docs/finance/rules/BR-CO-09.md): Add the country prefix to a VAT identifier
- [BR-CO-10](https://ironfang.uk/docs/finance/rules/BR-CO-10.md): Fix a line total that does not match the sum of the lines
- [BR-CO-11](https://ironfang.uk/docs/finance/rules/BR-CO-11.md): Fix a document allowance total that does not match its allowances
- [BR-CO-12](https://ironfang.uk/docs/finance/rules/BR-CO-12.md): Fix a document charge total that does not match its charges
- [BR-CO-13](https://ironfang.uk/docs/finance/rules/BR-CO-13.md): Fix a total without VAT that does not follow from the other totals
- [BR-CO-14](https://ironfang.uk/docs/finance/rules/BR-CO-14.md): Fix a VAT total that does not match the VAT breakdown
- [BR-CO-15](https://ironfang.uk/docs/finance/rules/BR-CO-15.md): Fix a total with VAT that is not the total without VAT plus the VAT total
- [BR-CO-16](https://ironfang.uk/docs/finance/rules/BR-CO-16.md): Fix an amount due that does not follow from the total with VAT
- [BR-CO-17](https://ironfang.uk/docs/finance/rules/BR-CO-17.md): Fix a VAT breakdown amount that does not match taxable amount times rate
- [BR-CO-18](https://ironfang.uk/docs/finance/rules/BR-CO-18.md): Add the missing VAT breakdown to the tax total
- [BR-CO-19](https://ironfang.uk/docs/finance/rules/BR-CO-19.md): Give the invoicing period a start date, an end date or both
- [BR-CO-21](https://ironfang.uk/docs/finance/rules/BR-CO-21.md): Give each document-level allowance a reason code or reason text
- [BR-CO-22](https://ironfang.uk/docs/finance/rules/BR-CO-22.md): State the reason for each document-level charge
- [BR-CO-23](https://ironfang.uk/docs/finance/rules/BR-CO-23.md): Add a reason to each allowance on an invoice line
- [BR-CO-26](https://ironfang.uk/docs/finance/rules/BR-CO-26.md): Give the seller a VAT, legal registration or seller identifier
- [BR-DEC-01](https://ironfang.uk/docs/finance/rules/BR-DEC-01.md): Write the document allowance amount with no more than two decimals
- [BR-DEC-12](https://ironfang.uk/docs/finance/rules/BR-DEC-12.md): Write the total without VAT with no more than two decimals
- [BR-DEC-18](https://ironfang.uk/docs/finance/rules/BR-DEC-18.md): Write the amount due with no more than two decimals
- [BR-DEC-20](https://ironfang.uk/docs/finance/rules/BR-DEC-20.md): Write each VAT breakdown tax amount with no more than two decimals
- [BR-DEC-23](https://ironfang.uk/docs/finance/rules/BR-DEC-23.md): Write the line net amount with no more than two decimals
- [BR-DEC-24](https://ironfang.uk/docs/finance/rules/BR-DEC-24.md): Write the line allowance amount with no more than two decimals
- [BR-E-01](https://ironfang.uk/docs/finance/rules/BR-E-01.md): Use exactly one exempt VAT breakdown for all exempt content
- [BR-E-08](https://ironfang.uk/docs/finance/rules/BR-E-08.md): Make the exempt taxable amount equal the exempt lines, charges and allowances
- [BR-E-09](https://ironfang.uk/docs/finance/rules/BR-E-09.md): Set the tax amount of the exempt VAT breakdown to zero
- [BR-E-10](https://ironfang.uk/docs/finance/rules/BR-E-10.md): Add the exemption reason to an exempt VAT breakdown
- [BR-G-02](https://ironfang.uk/docs/finance/rules/BR-G-02.md): Add the seller VAT identifier to an export invoice
- [BR-IC-02](https://ironfang.uk/docs/finance/rules/BR-IC-02.md): Add the seller and buyer VAT identifiers to an intra-community supply
- [BR-IC-10](https://ironfang.uk/docs/finance/rules/BR-IC-10.md): Add the intra-community supply reason to the VAT breakdown
- [BR-IC-11](https://ironfang.uk/docs/finance/rules/BR-IC-11.md): Add a delivery date or invoicing period to an intra-community supply
- [BR-IC-12](https://ironfang.uk/docs/finance/rules/BR-IC-12.md): Add the deliver-to country to an intra-community supply
- [BR-O-02](https://ironfang.uk/docs/finance/rules/BR-O-02.md): Remove VAT identifiers from a document that is not subject to VAT
- [BR-O-05](https://ironfang.uk/docs/finance/rules/BR-O-05.md): Remove the VAT rate from a line that is not subject to VAT
- [BR-O-10](https://ironfang.uk/docs/finance/rules/BR-O-10.md): Add the not subject to VAT reason to the VAT breakdown
- [BR-O-11](https://ironfang.uk/docs/finance/rules/BR-O-11.md): Keep amounts not subject to VAT on a separate invoice from other VAT categories
- [BR-S-01](https://ironfang.uk/docs/finance/rules/BR-S-01.md): Add the Standard rated VAT breakdown that the lines, allowances or charges require
- [BR-S-02](https://ironfang.uk/docs/finance/rules/BR-S-02.md): Add the seller VAT identifier when lines are Standard rated
- [BR-S-05](https://ironfang.uk/docs/finance/rules/BR-S-05.md): Give a Standard rated line a VAT rate above zero
- [BR-S-08](https://ironfang.uk/docs/finance/rules/BR-S-08.md): Fix a Standard rated taxable amount that does not match its lines, charges and allowances
- [BR-S-09](https://ironfang.uk/docs/finance/rules/BR-S-09.md): Fix the VAT amount of a Standard rated breakdown
- [BR-S-10](https://ironfang.uk/docs/finance/rules/BR-S-10.md): Remove the exemption reason from a Standard rated VAT breakdown
- [BR-Z-01](https://ironfang.uk/docs/finance/rules/BR-Z-01.md): Add exactly one Zero rated VAT breakdown when the document has Zero rated content
- [BR-Z-05](https://ironfang.uk/docs/finance/rules/BR-Z-05.md): Set the VAT rate of a Zero rated line to 0
- [BR-Z-10](https://ironfang.uk/docs/finance/rules/BR-Z-10.md): Remove the exemption reason from a Zero rated VAT breakdown
- [UBL-CR-006](https://ironfang.uk/docs/finance/rules/UBL-CR-006.md): Remove the issue time from the document
- [UBL-CR-561](https://ironfang.uk/docs/finance/rules/UBL-CR-561.md): Remove the tax total from invoice lines
- [UBL-CR-682](https://ironfang.uk/docs/finance/rules/UBL-CR-682.md): Move the delivery address into DeliveryLocation
- [UBL-DT-01](https://ironfang.uk/docs/finance/rules/UBL-DT-01.md): Write every amount with no more than two decimals
- [UBL-SR-53](https://ironfang.uk/docs/finance/rules/UBL-SR-53.md): Add the CompanyID to a PartyTaxScheme, or remove the scheme

### Peppol BIS Billing

- [NL-R-001](https://ironfang.uk/docs/finance/rules/NL-R-001.md): Reference the corrected invoice on a credit note from a Dutch supplier
- [NL-R-003](https://ironfang.uk/docs/finance/rules/NL-R-003.md): Use scheme 0106 (KVK) or 0190 (OIN) for a Dutch seller legal identifier
- [NL-R-007](https://ironfang.uk/docs/finance/rules/NL-R-007.md): Add payment means when a Dutch supplier is owed money
- [PEPPOL-COMMON-R040](https://ironfang.uk/docs/finance/rules/PEPPOL-COMMON-R040.md): Fix a GLN whose check digit is wrong
- [PEPPOL-EN16931-CL008](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-CL008.md): Use a Peppol electronic address scheme code in EndpointID
- [PEPPOL-EN16931-F001](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-F001.md): Write dates as plain YYYY-MM-DD with no time zone
- [PEPPOL-EN16931-P0100](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-P0100.md): Use an invoice type code that Peppol BIS Billing allows
- [PEPPOL-EN16931-P0101](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-P0101.md): Use a credit note type code that Peppol BIS Billing allows
- [PEPPOL-EN16931-P0106](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-P0106.md): Pair the VATEX-EU-IC exemption code with category K
- [PEPPOL-EN16931-R001](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R001.md): Add the missing business process identifier
- [PEPPOL-EN16931-R002](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R002.md): Keep to one document-level note
- [PEPPOL-EN16931-R003](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R003.md): Add a buyer reference or a purchase order reference
- [PEPPOL-EN16931-R004](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R004.md): Use the Peppol BIS Billing 3.0 specification identifier
- [PEPPOL-EN16931-R005](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R005.md): Remove a VAT accounting currency that repeats the invoice currency
- [PEPPOL-EN16931-R007](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R007.md): Use an approved business process identifier
- [PEPPOL-EN16931-R008](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R008.md): Remove empty elements from the document
- [PEPPOL-EN16931-R010](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R010.md): Add the buyer electronic address
- [PEPPOL-EN16931-R020](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R020.md): Add the seller electronic address
- [PEPPOL-EN16931-R040](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R040.md): Fix an allowance or charge amount that does not match its base amount and percentage
- [PEPPOL-EN16931-R041](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R041.md): Add the base amount to an allowance or charge that states a percentage
- [PEPPOL-EN16931-R042](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R042.md): Add the percentage to an allowance or charge that states a base amount
- [PEPPOL-EN16931-R043](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R043.md): Write the charge indicator as true or false, not 1 or 0
- [PEPPOL-EN16931-R044](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R044.md): Mark the price-level adjustment as a discount, or move a surcharge out of the price
- [PEPPOL-EN16931-R046](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R046.md): Fix a net price that is not the gross price minus the price discount
- [PEPPOL-EN16931-R051](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R051.md): Use the invoice currency code in every amount currencyID
- [PEPPOL-EN16931-R053](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R053.md): Put the whole VAT breakdown in a single tax total
- [PEPPOL-EN16931-R054](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R054.md): Send a tax total without a breakdown only with a VAT accounting currency
- [PEPPOL-EN16931-R055](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R055.md): Give the VAT total in the accounting currency the same sign as the invoice VAT total
- [PEPPOL-EN16931-R061](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R061.md): Add the mandate reference to a direct debit
- [PEPPOL-EN16931-R110](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R110.md): Start each line period on or after the invoicing period start date
- [PEPPOL-EN16931-R120](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R120.md): Fix a line net amount that does not follow from quantity, price, charges and allowances
- [PEPPOL-EN16931-R121](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R121.md): Use a price base quantity above zero, or leave it out
- [PEPPOL-EN16931-R130](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R130.md): Use the line quantity unit on the price base quantity

### Ironfang diagnostic

- [FW-XML-001](https://ironfang.uk/docs/finance/rules/FW-XML-001.md): Fix XML that the parser refuses to read

## Not yet explained

The 1,003 official rules without an explanation are listed by family on the web page, with links to their official definitions: https://ironfang.uk/docs/finance/rules#backlog

## Links

- [This reference as a web page](https://ironfang.uk/docs/finance/rules)
- [Free Peppol invoice validator](https://ironfang.uk/tools/peppol-validator)
- [Ironfang Finance API docs](https://ironfang.uk/docs/finance)
- The same list is available to MCP clients as the tool `finance.rule.list` on https://mcp.ironfang.uk/mcp
