Ironfang Finance - Rule reference
Validation rule reference
Look up an EN 16931 or Peppol BIS Billing error by its rule code: what failed, how to fix it, and a tested before and after.
Explained rules
Core invoice fieldsBR
38 explanations
- BR-01Add 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-02Add 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-04Add the invoice type code
The document has no
cbc:InvoiceTypeCode(cbc:CreditNoteTypeCodein a credit note), or it is blank. Add the code for what the document is, such as380. - BR-05Add the invoice currency code
The document has no
cbc:DocumentCurrencyCode, or it is blank. State the currency the invoice is issued in as a three-letter ISO 4217 code. - BR-06Add 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-07Add 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-08Add the seller postal address
The seller
cac:Partymust contain acac:PostalAddress. This rule checks only that the group is there; the country code inside it is checked byBR-09. - BR-10Add the buyer postal address
The buyer
cac:Partyneeds acac:PostalAddresschild. Only its presence is tested here; the buyer country code inside it is the subject ofBR-11. - BR-11Add the country code to the buyer postal address
A buyer
cac:PostalAddressmust containcac:Country/cbc:IdentificationCodewith a value. A missing, empty or blank code fails alike. - BR-12Add the sum of line net amounts to the monetary totals
cac:LegalMonetaryTotalhas nocbc:LineExtensionAmount. Write the sum of the line net amounts there, even when the document has a single line. - BR-13Add the total without VAT to the monetary totals
cac:LegalMonetaryTotalhas nocbc:TaxExclusiveAmount. Add the total without VAT: the line total minus document allowances plus document charges. - BR-17Name the payee, or remove a payee that is the seller
A
cac:PayeePartyneedscac:PartyName/cbc:Name, and its name or identifier must not repeat the seller's. If the seller is paid, leave the payee out. - BR-18Add the name of the seller tax representative
A
cac:TaxRepresentativePartymust carry a name incac:PartyName/cbc:Name. A blank name fails, and acbc:RegistrationNamedoes not count. - BR-21Give every line a non-empty line identifier
The
cbc:IDat the start of each invoice or credit note line must hold some text. An empty or blank line identifier fails; its value is not checked. - BR-22Add the invoiced or credited quantity to every line
Each line needs a quantity element,
cbc:InvoicedQuantityorcbc:CreditedQuantity. Without it the unit code check and the line calculation fail too. - BR-23Add the unitCode attribute to the line quantity
The
cbc:InvoicedQuantityorcbc:CreditedQuantityon each line must carry aunitCodeattribute naming its unit of measure. - BR-25Give 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-26Add the item net price to every line
Each line needs
cac:Price/cbc:PriceAmount, the net price per unit. A line with nocac:Pricefails here, and the Peppol line calculation fails with it. - BR-27Fix 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-28Make the item gross price zero or positive
The gross price in
cbc:BaseAmountof a line price discount must not be below zero. A credit or correction takes its sign from the quantity. - BR-29Fix an invoicing period that ends before it starts
When the document-level invoicing period gives both dates,
cbc:EndDatemust fall on the same day ascbc:StartDateor later. - BR-32Add a VAT category to each document-level allowance
A document-level allowance needs a
cac:TaxCategorywith acbc:IDunder the VAT scheme, so the discount is taken off the right VAT breakdown. - BR-45Add the taxable amount to each VAT breakdown
Every
cac:TaxSubtotalneeds acbc:TaxableAmount: the net amount on which the VAT in that breakdown is calculated. - BR-47Add the VAT category code to each VAT breakdown
Every
cac:TaxSubtotalneeds acac:TaxCategory/cbc:IDholding the VAT category code, in a tax category whose tax scheme isVAT. - BR-48Add the VAT rate to each VAT breakdown
Every VAT breakdown needs
cbc:Percentin its tax category, even when the rate is 0. Only categoryO, not subject to VAT, may leave it out. - BR-50Add the account identifier to the payee financial account
A credit transfer with code
30or58has acac:PayeeFinancialAccountbut no account number in itscbc:ID. Add the real account identifier. - BR-51Replace the full card number with its last four digits
Warning:
cbc:PrimaryAccountNumberIDis longer than 10 characters, which points to a full card number. Send the last four digits; the invoice stays valid. - BR-52Add an identifier to each supporting document reference
Every
cac:AdditionalDocumentReferenceneeds acbc:IDnaming the supporting document. An identifier that is empty or only whitespace fails. - BR-53Add the VAT total in the VAT accounting currency
When
cbc:TaxCurrencyCodeis given, the document needs a second tax total whosecbc:TaxAmountis stated in that currency. - BR-54Give every item attribute both a name and a value
Each
cac:AdditionalItemPropertymust have acbc:Nameand acbc:Value. If the item has no value for an attribute, leave the attribute out. - BR-55Add the preceding invoice number to the billing reference
Each
cac:BillingReferencemust holdcac:InvoiceDocumentReferencewith acbc:ID. Leave the billing reference out if there is no preceding invoice. - BR-56Add the VAT identifier of the seller tax representative
A
cac:TaxRepresentativePartyneeds acac:PartyTaxSchemewith tax schemeVATand acbc:CompanyID: the VAT number of the representative itself. - BR-57Add the country code to the deliver-to address
A deliver-to address in
cac:DeliveryLocation/cac:Addressmust includecac:Country/cbc:IdentificationCode. Only its presence is tested here. - BR-61Add the payee account to a credit transfer
Payment means code
30or58announces a credit transfer, so the invoice must say which account to pay:cac:PayeeFinancialAccount/cbc:ID. - BR-62Add 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-63Add 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-64Add the schemeID attribute to the item standard identifier
An item standard identifier in
cac:StandardItemIdentification/cbc:IDmust say which scheme it belongs to, inschemeID:0160for a GTIN. - BR-65Add the listID attribute to the item classification code
An item classification code in
cac:CommodityClassificationmust name its classification system inlistID, using a UNTDID 7143 code.
Calculations and conditionsBR-CO
17 explanations
- BR-CO-03Send either the VAT point date or the VAT point date code, not both
cbc:TaxPointDateand the VAT point date code incac:InvoicePeriod/cbc:DescriptionCodemust not appear together. Send one of them, or neither. - BR-CO-04Add the VAT category code to every invoice line
Each line needs
cac:Item/cac:ClassifiedTaxCategory/cbc:IDunder theVATtax scheme, giving the VAT category of the item. - BR-CO-09Add 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-10Fix 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-11Fix 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-12Fix 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-13Fix 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-14Fix 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-15Fix 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-16Fix 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-17Fix 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-18Add 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-CO-19Give the invoicing period a start date, an end date or both
An invoicing period in
cac:InvoicePeriodneedscbc:StartDate,cbc:EndDateor both. A description of the period in words does not count. - BR-CO-21Give each document-level allowance a reason code or reason text
A discount or other allowance on the whole document must say why it is given, in
cbc:AllowanceChargeReasonCode,cbc:AllowanceChargeReasonor both. - BR-CO-22State the reason for each document-level charge
A charge on the whole document, such as freight or packing, must carry a reason code from UNTDID 7161, a reason text, or both.
- BR-CO-23Add a reason to each allowance on an invoice line
An allowance attached to an invoice or credit note line must name its reason with a code, text or both. The price discount inside
cac:Priceis not covered. - BR-CO-26Give the seller a VAT, legal registration or seller identifier
The seller must carry at least one of a VAT identifier, a seller identifier in
cac:PartyIdentification, or a legal registration identifier.
Code listsBR-CL, PEPPOL-EN16931-CL
17 explanations
- BR-CL-01Use 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.EN 16931
- BR-CL-03Use an ISO 4217 currency code in every currencyID attribute
The
currencyIDof an amount is not a three-letter ISO 4217 code. Use the code of the invoice currency, such asGBP, in upper case.EN 16931 - BR-CL-04Use 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.EN 16931 - BR-CL-10Use an ISO 6523 ICD code as the scheme of a party identifier
The
schemeIDon acac:PartyIdentification/cbc:IDmust be an ISO 6523 ICD code, such as0088for a GLN.SEPAis allowed for seller and payee only.EN 16931 - BR-CL-13Use a UNTDID 7143 code in the classification listID
The
listIDon an item classification code must be a UNTDID 7143 code, such asTSTfor UNSPSC orSTIfor CPV, not the name of the scheme.EN 16931 - BR-CL-14Use an ISO 3166-1 alpha-2 country code in addresses
Every
cac:Country/cbc:IdentificationCodemust be a two-letter ISO 3166-1 code in upper case. The code for the United Kingdom isGB, notUK.EN 16931 - BR-CL-16Use a UNTDID 4461 payment means code
cbc:PaymentMeansCodemust be a UNTDID 4461 code, such as30for credit transfer or49for direct debit, not a bank scheme or product name.EN 16931 - BR-CL-17Use a permitted VAT category code in each tax category
Every
cac:TaxCategory/cbc:IDmust be one ofS,Z,E,AE,K,G,O,L,MorB. Internal tax codes such asSRare rejected.EN 16931 - BR-CL-18Use a permitted VAT category code on each line item
The line category in
cac:ClassifiedTaxCategory/cbc:IDmust be a permitted code such asS,ZorE. An internal code likeSRis rejected.EN 16931 - BR-CL-19Use an allowance reason code from the UNTDID 5189 list
An allowance reason code must be one of the UNTDID 5189 codes permitted in Peppol, such as 95 for Discount. A word such as DISCOUNT is not a code.EN 16931
- BR-CL-20Use a charge reason code from the UNTDID 7161 list
A charge reason code must be an upper-case UNTDID 7161 code, such as FC for freight or DL for delivery. Plain words such as FREIGHT are rejected.EN 16931
- BR-CL-21Use an ISO 6523 ICD code in the item identifier schemeID
The
schemeIDon an item standard identifier must be a code from the ISO 6523 ICD list. For a GTIN that is0160, not the textGTIN.EN 16931 - BR-CL-22Use a VATEX code for the VAT exemption reason code
cbc:TaxExemptionReasonCodemust hold a code from the VATEX list, such asVATEX-EU-132. Made-up codes are rejected; send reason text if no code fits.EN 16931 - BR-CL-23Use 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.EN 16931 - BR-CL-24Use a permitted MIME code for embedded attachments
The
mimeCodeof an embedded attachment must be one of six values: PDF, PNG, JPEG, CSV, Excel xlsx or OpenDocument spreadsheet. Anything else fails.EN 16931 - BR-CL-25Use 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.EN 16931
- PEPPOL-EN16931-CL008Use a Peppol electronic address scheme code in EndpointID
The
schemeIDon eachcbc:EndpointIDmust exactly match a code on the Peppol list of electronic address schemes, such as0088for a GLN.Peppol BIS Billing
Decimal precisionBR-DEC
6 explanations
- BR-DEC-01Write the document allowance amount with no more than two decimals
A document-level allowance amount has more than two digits after the decimal point. Write it with two at most:
1.00passes,1.000fails. - BR-DEC-12Write the total without VAT with no more than two decimals
cbc:TaxExclusiveAmountin the monetary totals has more than two digits after the decimal point. Write the total without VAT to two decimals at most. - BR-DEC-18Write the amount due with no more than two decimals
cbc:PayableAmounthas more than two digits after the decimal point. Round the amount due for payment to two decimals and format it that way. - BR-DEC-20Write each VAT breakdown tax amount with no more than two decimals
The
cbc:TaxAmountof acac:TaxSubtotalhas more than two digits after the decimal point. Round the VAT category tax amount to two decimals. - BR-DEC-23Write 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-DEC-24Write the line allowance amount with no more than two decimals
An allowance on an invoice line has a
cbc:Amountwith more than two digits after the decimal point. Round the line allowance to two decimals.
VAT categoriesBR-S, BR-Z, BR-E, BR-AE, BR-IC, BR-G, BR-O
26 explanations
Standard rated (S) (6)
- BR-S-01Add 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-02Add the seller VAT identifier when lines are Standard rated
A document with a Standard rated line must identify the seller for VAT, through the seller's own tax identifier or a tax representative's VAT identifier.
- BR-S-05Give a Standard rated line a VAT rate above zero
A line in VAT category
Sneeds a rate greater than zero in its item tax category. A rate of 0, a negative rate or no rate at all fails. - BR-S-08Fix 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-09Fix 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-S-10Remove the exemption reason from a Standard rated VAT breakdown
A Standard rated VAT breakdown must not carry exemption reason text or an exemption reason code. VAT is charged in category
S, so nothing is exempt.
Zero rated (Z) (3)
- BR-Z-01Add 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.
- BR-Z-05Set the VAT rate of a Zero rated line to 0
A line in VAT category
Zmust have a VAT rate of exactly 0. Any other rate on the line, or no rate element at all, fails. - BR-Z-10Remove the exemption reason from a Zero rated VAT breakdown
A Zero rated VAT breakdown must carry neither exemption reason text nor an exemption reason code. The category
Zsays all that is needed.
Exempt (E) (4)
- BR-E-01Use exactly one exempt VAT breakdown for all exempt content
When a line, document allowance or document charge is exempt, the VAT breakdown needs exactly one entry in category
E: not none, and not one per reason. - BR-E-08Make the exempt taxable amount equal the exempt lines, charges and allowances
The exempt VAT breakdown taxable amount must equal exempt line net amounts plus exempt document charges minus exempt document allowances, exactly.
- BR-E-09Set the tax amount of the exempt VAT breakdown to zero
No VAT is charged in the exempt category, so the tax amount of a VAT breakdown with category
Emust be exactly 0. - BR-E-10Add 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.
Reverse charge (AE) (4)
- BR-AE-02Identify the seller and the buyer on a reverse-charge invoice
A document with a reverse-charge line needs a seller tax identifier and, for the buyer, a VAT identifier or a legal registration identifier.
- BR-AE-05Set the VAT rate of a reverse-charge line to 0
A line in VAT category
AEmust have a VAT rate of exactly 0, even though the buyer will account for VAT on the supply. - BR-AE-09Set the tax amount of the reverse-charge VAT breakdown to zero
The seller charges no VAT under reverse charge, so a VAT breakdown with category
AEmust show a tax amount of exactly 0. - BR-AE-10Add 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.
Intra-community supply (K) (4)
- BR-IC-02Add the seller and buyer VAT identifiers to an intra-community supply
A document with an intra-community supply line (category
K) needs a seller or tax representative VAT identifier and a buyer VAT identifier. - BR-IC-10Add the intra-community supply reason to the VAT breakdown
A VAT breakdown in category
Kmust state the intra-community supply reason: the codeVATEX-EU-IC, the matching reason text, or both. - BR-IC-11Add a delivery date or invoicing period to an intra-community supply
When the VAT breakdown includes category
K, the document needs an actual delivery date or an invoicing period at document level. - BR-IC-12Add the deliver-to country to an intra-community supply
A document with a
KVAT breakdown must give the country the goods were delivered to, in the deliver-to address undercac:Delivery/cac:DeliveryLocation.
Export outside the EU (G) (1)
- BR-G-02Add the seller VAT identifier to an export invoice
A document with a line in category
G, export outside the EU, needs a seller VAT identifier, or a tax representative one, under theVATscheme.
Not subject to VAT (O) (4)
- BR-O-02Remove VAT identifiers from a document that is not subject to VAT
When a line is category
O, not subject to VAT, the document must not carry a VAT identifier for the seller, the buyer or a tax representative. - BR-O-05Remove the VAT rate from a line that is not subject to VAT
A line in category
Omust not have acbc:Percentin its classified tax category, not even0. Leave the rate out entirely. - BR-O-10Add the not subject to VAT reason to the VAT breakdown
A VAT breakdown in category
Omust say that the amount is not subject to VAT: the codeVATEX-EU-O, reason text, or both. - BR-O-11Keep amounts not subject to VAT on a separate invoice from other VAT categories
A document with a VAT breakdown in category
Omay not have a breakdown in any other category. Out-of-scope and VAT-rated amounts need separate documents.
Peppol requirementsPEPPOL-EN16931, PEPPOL-COMMON
29 explanations
Business rules (PEPPOL-EN16931-R) (24)
- PEPPOL-EN16931-R001Add 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-R002Keep to one document-level note
Peppol allows one
cbc:Notedirectly under the root unless seller and buyer both have German postal addresses. Merge the texts into one note. - PEPPOL-EN16931-R003Add 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-R004Use 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-R005Remove a VAT accounting currency that repeats the invoice currency
cbc:TaxCurrencyCodeis only for VAT accounted in a currency other than the invoice currency. Leave it out when the two would be the same. - PEPPOL-EN16931-R007Use an approved business process identifier
cbc:ProfileIDmust name a business process the Peppol rules recognise; for Billing,urn:fdc:peppol.eu:2017:poacc:billing:01:1.0, not a version. - PEPPOL-EN16931-R008Remove 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-R010Add 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-R020Add 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-R040Fix 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-R041Add 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-R042Add 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-R043Write the charge indicator as true or false, not 1 or 0
Peppol wants
cbc:ChargeIndicatoron document and line allowances and charges spelled as true or false. The schema also allows 1 and 0; Peppol does not. - PEPPOL-EN16931-R044Mark the price-level adjustment as a discount, or move a surcharge out of the price
Only a discount may sit in
cac:Price/cac:AllowanceCharge, so itscbc:ChargeIndicatormust befalse. A surcharge goes in the net price or a line charge. - PEPPOL-EN16931-R046Fix 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-R051Use the invoice currency code in every amount currencyID
An amount has a
currencyIDother thancbc:DocumentCurrencyCode. All amounts must be in the invoice currency, bar the VAT total in an accounting currency. - PEPPOL-EN16931-R053Put the whole VAT breakdown in a single tax total
The document must have exactly one
cac:TaxTotalcontainingcac:TaxSubtotalelements. Put every VAT breakdown inside that one tax total. - PEPPOL-EN16931-R054Send a tax total without a breakdown only with a VAT accounting currency
A
cac:TaxTotalwith nocac:TaxSubtotalmust appear exactly once whencbc:TaxCurrencyCodeis given, and not at all when it is absent. - PEPPOL-EN16931-R055Give the VAT total in the accounting currency the same sign as the invoice VAT total
The VAT totals in the invoice currency and in the VAT accounting currency must not be on opposite sides of zero. Zero goes with either sign.
- PEPPOL-EN16931-R061Add the mandate reference to a direct debit
Payment means
49or59is a direct debit and needscac:PaymentMandate/cbc:ID, the reference of the mandate the buyer signed. - PEPPOL-EN16931-R110Start each line period on or after the invoicing period start date
When the document has an invoicing period start date, no line period may start earlier. Correct the line date or start the document period earlier.
- PEPPOL-EN16931-R120Fix 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-R121Use 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.
- PEPPOL-EN16931-R130Use the line quantity unit on the price base quantity
When
cac:Price/cbc:BaseQuantityhas aunitCode, it must be the code used on the line quantity. Convert the price rather than relabel the unit.
Process and document type codes (PEPPOL-EN16931-P) (3)
- PEPPOL-EN16931-P0100Use an invoice type code that Peppol BIS Billing allows
Peppol BIS Billing accepts only part of the UNTDID 1001 invoice codes. A code such as
325(proforma) passes EN 16931 and fails here. - PEPPOL-EN16931-P0101Use a credit note type code that Peppol BIS Billing allows
In a Peppol credit note,
cbc:CreditNoteTypeCodemust be381,396,81,83or532. An invoice code such as380is rejected. - PEPPOL-EN16931-P0106Pair the VATEX-EU-IC exemption code with category K
The exemption reason code
VATEX-EU-ICis reserved for intra-community supplies, categoryK. A tax category with any other code that carries it is rejected.
Formats (PEPPOL-EN16931-F) (1)
- PEPPOL-EN16931-F001Write dates as plain YYYY-MM-DD with no time zone
Peppol dates must be exactly ten characters,
YYYY-MM-DD. A time zone suffix such asZor+01:00passes the XSD but fails this rule.
Identifier checks (PEPPOL-COMMON) (1)
- PEPPOL-COMMON-R040Fix a GLN whose check digit is wrong
An identifier with scheme
0088must be all digits and end in the correct GS1 check digit.7300010000001passes;7300010000002does not.
Country-specific requirementsNL-R and other country codes
3 explanations
Netherlands (NL) (3)
- NL-R-001Reference the corrected invoice on a credit note from a Dutch supplier
When the seller address is in the Netherlands, a credit note must carry the number of the invoice it corrects in
cac:BillingReference. - NL-R-003Use scheme 0106 (KVK) or 0190 (OIN) for a Dutch seller legal identifier
When the seller address is in the Netherlands,
cac:PartyLegalEntity/cbc:CompanyIDneeds a value andschemeID0106(KVK) or0190(OIN). - NL-R-007Add payment means when a Dutch supplier is owed money
A seller in the Netherlands must include
cac:PaymentMeanswhenever the buyer has something to pay: an invoice due above zero or a credit note due below it.
UBL syntax and structureUBL-CR, UBL-SR, UBL-DT
5 explanations
Elements outside the model (UBL-CR) (3)
- UBL-CR-006Remove the issue time from the document
Warning:
cbc:IssueTimeis outside the EN 16931 model. The invoice stays valid; drop the element and keep the issue date. - UBL-CR-561Remove the tax total from invoice lines
A
cac:TaxTotalinside a line is not part of EN 16931 and draws a warning. The document stays valid; VAT belongs in the document-level breakdown. - UBL-CR-682Move the delivery address into DeliveryLocation
A warning:
cac:Delivery/cac:DeliveryAddressis outside the invoice model. Write the deliver-to address ascac:Delivery/cac:DeliveryLocation/cac:Address.
Repetition limits (UBL-SR) (1)
- UBL-SR-53Add the CompanyID to a PartyTaxScheme, or remove the scheme
Every
cac:PartyTaxSchememust hold both acbc:CompanyIDand acac:TaxScheme/cbc:ID. A tax scheme sent without the number it registers is rejected.
Data types (UBL-DT) (1)
- UBL-DT-01Write every amount with no more than two decimals
An amount has more than two digits after the decimal point. Every amount element is limited to two, except the item net price and allowances on the price.
XML diagnosticsFW
1 explanation
- FW-XML-001Fix 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. 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.
Background reading
Two longer articles explain where these rules come from and how to read a failure: How Peppol invoice validation actually works, from the XML layers to the Peppol rules, and Understanding EN 16931 validation errors, on the business rules behind most errors. To check a document against all of them, use the free Peppol validator. For a whole document that passes, with its totals worked through against BR-CO-10 to BR-CO-16, see the Peppol XML invoice example.
Not yet explained
The validator checks every official rule in the supported release, including the 1,003 that have no Ironfang explanation yet. Each code below links to its official definition, not to a page here.
Show the 1,003 rules without an explanation, by family
Core fields (BR) (20)
Decimal precision (BR-DEC) (15)
UBL syntax: elements outside the model (UBL-CR) (675)
675 syntax-binding rules, from UBL-CR-001 to UBL-CR-681. They are listed in the official EN 16931 rule index.
UBL syntax: data types (UBL-DT) (23)
23 syntax-binding rules, from UBL-DT-06 to UBL-DT-28. They are listed in the official EN 16931 rule index.
UBL syntax: repetition limits (UBL-SR) (53)
53 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 ...) (72)
- BR-AE-01
- BR-AE-03
- BR-AE-04
- BR-AE-06
- BR-AE-07
- BR-AE-08
- 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-02
- BR-E-03
- BR-E-04
- BR-E-05
- BR-E-06
- BR-E-07
- BR-G-01
- 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-03
- BR-IC-04
- BR-IC-05
- BR-IC-06
- BR-IC-07
- BR-IC-08
- BR-IC-09
- BR-O-01
- BR-O-03
- BR-O-04
- BR-O-06
- BR-O-07
- BR-O-08
- BR-O-09
- BR-O-12
- BR-O-13
- BR-O-14
- BR-S-03
- BR-S-04
- BR-S-06
- BR-S-07
- BR-Z-02
- BR-Z-03
- BR-Z-04
- BR-Z-06
- BR-Z-07
- BR-Z-08
- BR-Z-09
Country-conditional rules (99)
- 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-002
- NL-R-004
- NL-R-005
- NL-R-006
- 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

