Ironfang Finance
Validation rule reference
Look up an EN 16931 or Peppol BIS Billing error by its rule code. Each explanation says what failed, how to fix it, and shows a tested before and after.
Explained rules
- BR-01EN 16931Add the specification identifier in CustomizationID
The document root needs a non-empty
cbc:CustomizationID. For Peppol BIS Billing 3.0 it is a fixed value, not something read from source data. - BR-02EN 16931Add the invoice number in the document-level cbc:ID
The
cbc:IDdirectly under the document root must contain the invoice or credit note number. An empty element fails; a missing one is stopped by the XSD. - BR-06EN 16931Add the seller name as the supplier RegistrationName
The supplier party needs a non-empty
cbc:RegistrationNameinsidecac:PartyLegalEntity. A trading name incac:PartyNamedoes not count. - BR-07EN 16931Add the buyer name as the customer RegistrationName
The customer party needs a non-empty
cbc:RegistrationNameinsidecac:PartyLegalEntity. An empty element fails, and so does leaving it out. - BR-25EN 16931Give every line an item name
Each invoice or credit note line needs a non-empty
cac:Item/cbc:Name. It is checked per line, and an item description does not stand in for it. - BR-27EN 16931Fix a negative item net price by moving the sign to the quantity
The item net price on a line is below zero. Prices must be zero or positive: express a credit or correction with a negative quantity.
- BR-62EN 16931Add the schemeID attribute to the seller electronic address
When the seller Party has a cbc:EndpointID, the element must carry a schemeID attribute saying which scheme the address belongs to.
- BR-63EN 16931Add the schemeID attribute to the buyer electronic address
A buyer cbc:EndpointID must carry a schemeID attribute. The rule tests that the attribute exists, not what it contains.
- BR-AE-10EN 16931Add the reverse-charge reason to the VAT breakdown
A reverse-charge VAT breakdown must state why no VAT is charged, as exemption reason text, a reason code, or both.
- BR-CL-01EN 16931Use a permitted document type code
cbc:InvoiceTypeCode and cbc:CreditNoteTypeCode must hold a UNTDID 1001 code from the list for that document, such as 380 or 381.
- BR-CL-04EN 16931Use an ISO 4217 alphabetic code for the invoice currency
cbc:DocumentCurrencyCodemust be a current three-letter ISO 4217 code in upper case, such asGBP. Names, symbols, numeric codes and lower case fail. - BR-CL-23EN 16931Use a UN/ECE Recommendation 20 code in unitCode
Every
unitCodeon a line quantity or price base quantity must be a UN/ECE Rec 20 or Rec 21 code, in upper case. Local abbreviations such asEACHfail. - BR-CL-25EN 16931Use an EAS code as the schemeID of an electronic address
The schemeID on every cbc:EndpointID must be a code from the Electronic Address Scheme (EAS) list, such as 0088, matched exactly.
- BR-CO-09EN 16931Add the country prefix to a VAT identifier
Seller, buyer and tax representative VAT identifiers must begin with a two-letter country code in upper case, such as GB or EL.
- BR-CO-10EN 16931Fix a line total that does not match the sum of the lines
The sum of line net amounts in the monetary totals must equal the line net amounts added together, rounded to two decimals.
- BR-CO-11EN 16931Fix a document allowance total that does not match its allowances
The allowance total in the monetary totals must equal the sum of the document-level allowance amounts, rounded to two decimals.
- BR-CO-12EN 16931Fix a document charge total that does not match its charges
The charge total in the monetary totals must equal the sum of the document-level charge amounts, rounded to two decimals.
- BR-CO-13EN 16931Fix a total without VAT that does not follow from the other totals
The total without VAT must equal the line total minus the document allowance total plus the document charge total, to two decimals.
- BR-CO-14EN 16931Fix a VAT total that does not match the VAT breakdown
The VAT total of a tax total must equal the sum of the tax amounts in its VAT breakdowns, rounded to two decimals.
- BR-CO-15EN 16931Fix a total with VAT that is not the total without VAT plus the VAT total
The total with VAT must equal the total without VAT plus the VAT total in the document currency, rounded to two decimals.
- BR-CO-16EN 16931Fix an amount due that does not follow from the total with VAT
The amount due must equal the total with VAT minus the prepaid amount plus the rounding amount, to two decimals.
- BR-CO-17EN 16931Fix a VAT breakdown amount that does not match taxable amount times rate
Each VAT breakdown tax amount must agree with its taxable amount times its rate. The check tolerates a difference below 1.00; the correct figure does not.
- BR-CO-18EN 16931Add the missing VAT breakdown to the tax total
Every invoice and credit note needs at least one VAT breakdown: a TaxSubtotal inside a document-level TaxTotal.
- BR-DEC-23EN 16931Write the line net amount with no more than two decimals
A line net amount has more than two digits after the decimal point. Round it to two decimals; trailing zeros count, so 25.000 fails.
- BR-E-10EN 16931Add the exemption reason to an exempt VAT breakdown
A VAT breakdown in the exempt category must say what the exemption is, through exemption reason text, an exemption reason code, or both.
- BR-S-01EN 16931Add the Standard rated VAT breakdown that the lines, allowances or charges require
If any line, document allowance or document charge is Standard rated, the VAT breakdown needs a Standard rated entry too, and the reverse also holds.
- BR-S-08EN 16931Fix a Standard rated taxable amount that does not match its lines, charges and allowances
For each Standard rate, the breakdown taxable amount must match the Standard rated line amounts plus document charges minus document allowances at that rate.
- BR-S-09EN 16931Fix the VAT amount of a Standard rated breakdown
In a Standard rated VAT breakdown the tax amount must agree with taxable amount times rate. Differences below 1.00 get through the check but are still wrong.
- BR-Z-01EN 16931Add exactly one Zero rated VAT breakdown when the document has Zero rated content
A document with a Zero rated line, document allowance or document charge needs exactly one Zero rated VAT breakdown: not none, and not two.
- PEPPOL-EN16931-R001Peppol BIS BillingAdd the missing business process identifier
The document has no cbc:ProfileID. Add it directly under the root, after cbc:CustomizationID, with the Peppol Billing process identifier.
- PEPPOL-EN16931-R003Peppol BIS BillingAdd a buyer reference or a purchase order reference
The document has neither cbc:BuyerReference nor cac:OrderReference/cbc:ID. Peppol needs at least one so the buyer can route the invoice.
- PEPPOL-EN16931-R004Peppol BIS BillingUse the Peppol BIS Billing 3.0 specification identifier
cbc:CustomizationID is missing or is not the Peppol BIS Billing 3.0 identifier. Send the Peppol value, not plain EN 16931 or another CIUS.
- PEPPOL-EN16931-R008Peppol BIS BillingRemove empty elements from the document
An element has no text and no child elements. Peppol does not allow empty elements: leave out any optional element you have no value for.
- PEPPOL-EN16931-R010Peppol BIS BillingAdd the buyer electronic address
Peppol requires a cbc:EndpointID inside the buyer Party. Only the presence of the element is tested; scheme and value are left to other rules.
- PEPPOL-EN16931-R020Peppol BIS BillingAdd the seller electronic address
Peppol requires a cbc:EndpointID inside the seller Party. The rule checks only that the element is there, not its scheme or value.
- PEPPOL-EN16931-R040Peppol BIS BillingFix an allowance or charge amount that does not match its base amount and percentage
When an allowance or charge states both a base amount and a percentage, its amount must be base times percentage over 100, within 0.02.
- PEPPOL-EN16931-R041Peppol BIS BillingAdd the base amount to an allowance or charge that states a percentage
An allowance or charge that gives a percentage must also give the base amount the percentage was applied to.
- PEPPOL-EN16931-R042Peppol BIS BillingAdd the percentage to an allowance or charge that states a base amount
An allowance or charge that gives a base amount must also give the percentage; a fixed-sum allowance or charge should carry neither.
- PEPPOL-EN16931-R046Peppol BIS BillingFix a net price that is not the gross price minus the price discount
When a line price states a gross price, the net price must equal the gross price minus the price discount exactly. There is no tolerance.
- PEPPOL-EN16931-R120Peppol BIS BillingFix a line net amount that does not follow from quantity, price, charges and allowances
Each line net amount must equal quantity x (net price / base quantity) + line charges - line allowances, within 0.02.
- PEPPOL-EN16931-R121Peppol BIS BillingUse a price base quantity above zero, or leave it out
If a line price states a base quantity, it must be greater than zero. Zero and negative values fail; omitting the element is fine.
- FW-XML-001Ironfang diagnosticFix XML that the parser refuses to read
An Ironfang diagnostic, not an official rule: the XML is malformed, in an unsupported encoding, or uses DOCTYPE, entities or XInclude. Nothing else ran.
What this reference covers
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. 41 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.
Not yet explained
Official rules in the supported release without an explanation here. Each code links to its official definition.
Calculations and conditions (BR-CO) (13)
Code lists (BR-CL) (19)
Core fields (BR) (50)
Decimal precision (BR-DEC) (20)
UBL syntax: elements outside the model (UBL-CR) (678)
678 syntax-binding rules, from UBL-CR-001 to UBL-CR-682. They are listed in the official EN 16931 rule index.
UBL syntax: data types (UBL-DT) (24)
24 syntax-binding rules, from UBL-DT-01 to UBL-DT-28. They are listed in the official EN 16931 rule index.
UBL syntax: repetition limits (UBL-SR) (54)
54 syntax-binding rules, from UBL-SR-01 to UBL-SR-56. They are listed in the official EN 16931 rule index.
VAT categories (BR-S, BR-Z, BR-E, BR-AE ...) (92)
- BR-AE-01
- BR-AE-02
- BR-AE-03
- BR-AE-04
- BR-AE-05
- BR-AE-06
- BR-AE-07
- BR-AE-08
- BR-AE-09
- BR-AF-01
- BR-AF-02
- BR-AF-03
- BR-AF-04
- BR-AF-05
- BR-AF-06
- BR-AF-07
- BR-AF-08
- BR-AF-09
- BR-AF-10
- BR-AG-01
- BR-AG-02
- BR-AG-03
- BR-AG-04
- BR-AG-05
- BR-AG-06
- BR-AG-07
- BR-AG-08
- BR-AG-09
- BR-AG-10
- BR-B-01
- BR-B-02
- BR-E-01
- BR-E-02
- BR-E-03
- BR-E-04
- BR-E-05
- BR-E-06
- BR-E-07
- BR-E-08
- BR-E-09
- BR-G-01
- BR-G-02
- BR-G-03
- BR-G-04
- BR-G-05
- BR-G-06
- BR-G-07
- BR-G-08
- BR-G-09
- BR-G-10
- BR-IC-01
- BR-IC-02
- BR-IC-03
- BR-IC-04
- BR-IC-05
- BR-IC-06
- BR-IC-07
- BR-IC-08
- BR-IC-09
- BR-IC-10
- BR-IC-11
- BR-IC-12
- BR-O-01
- BR-O-02
- BR-O-03
- BR-O-04
- BR-O-05
- BR-O-06
- BR-O-07
- BR-O-08
- BR-O-09
- BR-O-10
- BR-O-11
- BR-O-12
- BR-O-13
- BR-O-14
- BR-S-02
- BR-S-03
- BR-S-04
- BR-S-05
- BR-S-06
- BR-S-07
- BR-S-10
- BR-Z-02
- BR-Z-03
- BR-Z-04
- BR-Z-05
- BR-Z-06
- BR-Z-07
- BR-Z-08
- BR-Z-09
- BR-Z-10
Country-conditional rules (102)
- DE-R-001
- DE-R-002
- DE-R-003
- DE-R-004
- DE-R-005
- DE-R-006
- DE-R-007
- DE-R-008
- DE-R-009
- DE-R-010
- DE-R-011
- DE-R-014
- DE-R-015
- DE-R-016
- DE-R-017
- DE-R-018
- DE-R-019
- DE-R-020
- DE-R-022
- DE-R-023-1
- DE-R-023-2
- DE-R-024-1
- DE-R-024-2
- DE-R-025-1
- DE-R-025-2
- DE-R-026
- DE-R-027
- DE-R-028
- DE-R-030
- DE-R-031
- DE-R-T02
- DK-R-002
- DK-R-003
- DK-R-004
- DK-R-005
- DK-R-006
- DK-R-007
- DK-R-008
- DK-R-009
- DK-R-010
- DK-R-011
- DK-R-013
- DK-R-014
- DK-R-016
- DK-R-017
- GR-R-001-1
- GR-R-001-2
- GR-R-001-3
- GR-R-001-4
- GR-R-001-5
- GR-R-001-6
- GR-R-001-7
- GR-R-002
- GR-R-003
- GR-R-004-1
- GR-R-004-2
- GR-R-005
- GR-R-006
- GR-R-008-2
- GR-R-008-3
- GR-R-009
- GR-R-010
- GR-S-008-1
- GR-S-011
- IS-R-001
- IS-R-002
- IS-R-003
- IS-R-004
- IS-R-005
- IS-R-006
- IS-R-007
- IS-R-008
- IS-R-009
- IS-R-010
- IT-R-001
- IT-R-002
- IT-R-003
- IT-R-004
- NL-R-001
- NL-R-002
- NL-R-003
- NL-R-004
- NL-R-005
- NL-R-006
- NL-R-007
- NL-R-008
- NL-R-009
- NO-R-001
- NO-R-002
- SE-R-001
- SE-R-002
- SE-R-003
- SE-R-004
- SE-R-005
- SE-R-006
- SE-R-007
- SE-R-008
- SE-R-009
- SE-R-010
- SE-R-011
- SE-R-012
- SE-R-013
Peppol code lists (PEPPOL-EN16931-CL) (6)
Peppol formats (PEPPOL-EN16931-F) (1)
Identifier checks (PEPPOL-COMMON-R) (17)
- PEPPOL-COMMON-R040
- PEPPOL-COMMON-R041
- PEPPOL-COMMON-R042
- PEPPOL-COMMON-R043
- PEPPOL-COMMON-R044
- PEPPOL-COMMON-R045
- PEPPOL-COMMON-R046
- PEPPOL-COMMON-R047
- PEPPOL-COMMON-R049
- PEPPOL-COMMON-R050
- PEPPOL-COMMON-R052
- PEPPOL-COMMON-R053
- PEPPOL-COMMON-R054
- PEPPOL-COMMON-R055
- PEPPOL-COMMON-R056-1
- PEPPOL-COMMON-R056-2
- PEPPOL-COMMON-R057
Peppol process and type codes (PEPPOL-EN16931-P) (11)
Peppol rules (PEPPOL-EN16931-R) (16)
- PEPPOL-EN16931-R002
- PEPPOL-EN16931-R005
- PEPPOL-EN16931-R007
- PEPPOL-EN16931-R043
- PEPPOL-EN16931-R044
- PEPPOL-EN16931-R051
- PEPPOL-EN16931-R053
- PEPPOL-EN16931-R054
- PEPPOL-EN16931-R055
- PEPPOL-EN16931-R061
- PEPPOL-EN16931-R080
- PEPPOL-EN16931-R100
- PEPPOL-EN16931-R101
- PEPPOL-EN16931-R110
- PEPPOL-EN16931-R111
- PEPPOL-EN16931-R130
