Peppol Validation Errors
Every EN16931 and Peppol BIS Billing 3.0 rule explained in plain language, with the fix for each. Find your error by rule ID.
By Peppol Validator · Last updated
Peppol validation errors follow a naming convention that tells you which layer of the standards stack triggered the rule:
BR-*
EN16931 core business rules. These enforce the European semantic standard (e.g. BR-06 requires a seller name).
BR-CO-*
EN16931 calculation and co-occurrence rules. These check that totals, tax amounts, and related fields are mathematically consistent.
PEPPOL-EN16931-*
Peppol BIS Billing 3.0 rules. These add network-specific constraints on top of EN16931, such as code list restrictions and electronic address schemes.
BR-CC-* (e.g. BR-NO, BR-SE)
Country-specific rules. Each two-letter code corresponds to a country (NO = Norway, SE = Sweden, IT = Italy, etc.) with locale-specific requirements.
311 rules across 6 categories
Document-level60Calculation24Decimals21VAT categories98Peppol BIS46Country-specific62Document-level rules (BR-01 – BR-67)
Core rules that check mandatory fields and structural requirements at the invoice/credit note level. These fire when required elements are missing or invalid.
An Invoice shall have a Specification identifier (BT-24).
Every invoice must declare which specification it conforms to (e.g. urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0). Without it, receivers cannot determine how to interpret the document.
Fix: Add a cbc:CustomizationID element at the Invoice root level containing the correct Peppol BIS 3.0 specification identifier.
An Invoice shall have an Invoice number (BT-1).
Every invoice must carry a unique sequential number for identification and legal traceability. This is a mandatory legal requirement in most jurisdictions.
Fix: Add a cbc:ID element at the Invoice root level with the invoice number value.
An Invoice shall have an Invoice issue date (BT-2).
An issue date is required because it determines VAT reporting periods, payment due dates, and legal validity. The invoice cannot be processed without it.
Fix: Add a cbc:IssueDate element at the Invoice root level in YYYY-MM-DD format.
An Invoice shall have an Invoice type code (BT-3).
The type code distinguishes invoices (380) from credit notes (381) and other document types. Receivers need this to determine how to process the document.
Fix: Add a cbc:InvoiceTypeCode element at the Invoice root level with the appropriate UNTDID 1001 code (e.g. 380 for a commercial invoice, 381 for a credit note).
An Invoice shall have an Invoice currency code (BT-5).
All monetary amounts in the invoice are expressed in this currency. Without it, amounts are ambiguous and cannot be booked correctly.
Fix: Add a cbc:DocumentCurrencyCode element at the Invoice root level with a valid ISO 4217 currency code (e.g. EUR, USD, SEK).
An Invoice shall contain the Seller name (BT-27).
The seller's legal or trading name must be present for the buyer to identify who issued the invoice and for tax compliance purposes.
Fix: Add a cbc:Name element inside cac:AccountingSupplierParty → cac:Party → cac:PartyLegalEntity.
An Invoice shall contain the Buyer name (BT-44).
The buyer's legal or trading name must be present so the invoice can be matched to the correct entity in the receiver's system.
Fix: Add a cbc:Name element inside cac:AccountingCustomerParty → cac:Party → cac:PartyLegalEntity.
An Invoice shall contain the Seller postal address.
The seller's postal address (BG-5) is required for tax jurisdiction determination and legal identification of the seller.
Fix: Add a cac:PostalAddress element inside cac:AccountingSupplierParty → cac:Party with at least the country code.
The Seller postal address (BG-5) shall contain a Seller country code (BT-40).
The country code within the seller's address is mandatory because it determines the applicable VAT regime and tax rules.
Fix: Add a cac:Country → cbc:IdentificationCode element inside cac:AccountingSupplierParty → cac:Party → cac:PostalAddress with a valid ISO 3166-1 alpha-2 code.
An Invoice shall contain the Buyer postal address (BG-8).
The buyer's postal address is required for tax compliance, particularly for determining the place of supply and applicable VAT rules.
Fix: Add a cac:PostalAddress element inside cac:AccountingCustomerParty → cac:Party with at least the country code.
The Buyer postal address shall contain a Buyer country code (BT-55).
The buyer's country code is essential for cross-border VAT determination and correct tax treatment of the transaction.
Fix: Add a cac:Country → cbc:IdentificationCode element inside cac:AccountingCustomerParty → cac:Party → cac:PostalAddress with a valid ISO 3166-1 alpha-2 code.
An Invoice shall have the Sum of Invoice line net amount (BT-106).
The sum of all invoice line net amounts must be stated explicitly. This is the starting point for the invoice total calculation and must equal the sum of all cbc:LineExtensionAmount values.
Fix: Add a cbc:LineExtensionAmount element inside cac:LegalMonetaryTotal with the sum of all invoice line net amounts.
An Invoice shall have the Invoice total amount without VAT (BT-109).
The total amount excluding VAT must be present. It equals the sum of line net amounts plus document-level charges minus document-level allowances.
Fix: Add a cbc:TaxExclusiveAmount element inside cac:LegalMonetaryTotal.
An Invoice shall have the Invoice total amount with VAT (BT-112).
The total amount including VAT must be stated so the buyer knows the full amount being invoiced. It equals the tax-exclusive amount plus total VAT.
Fix: Add a cbc:TaxInclusiveAmount element inside cac:LegalMonetaryTotal.
An Invoice shall have the Amount due for payment (BT-115).
The amount due for payment must be present so the buyer knows exactly how much to pay, accounting for any prepayments or rounding.
Fix: Add a cbc:PayableAmount element inside cac:LegalMonetaryTotal.
An Invoice shall have at least one Invoice line (BG-25).
An invoice without any lines has no items being invoiced. At least one line is required to describe what is being charged.
Fix: Add at least one cac:InvoiceLine (or cac:CreditNoteLine for credit notes) element to the invoice.
The Payee name (BT-59) shall be provided in the Invoice, if the Payee (BG-10) is different from the Seller (BG-4).
When payment goes to a party other than the seller (e.g. a factoring company), the payee must be clearly identified by name to avoid payment errors.
Fix: Add a cbc:Name element inside cac:PayeeParty → cac:PartyName. If the payee is the same as the seller, you can remove the cac:PayeeParty element entirely.
The Seller tax representative name (BT-62) shall be provided in the Invoice, if the Seller (BG-4) has a Seller tax representative party (BG-11).
When a seller uses a tax representative (common for non-resident suppliers), the representative's name must be stated for tax authority identification.
Fix: Add a cbc:Name element inside cac:TaxRepresentativeParty → cac:PartyName. If no tax representative is needed, remove the cac:TaxRepresentativeParty element.
The Seller tax representative postal address (BG-12) shall be provided in the Invoice, if the Seller (BG-4) has a Seller tax representative party (BG-11).
When a tax representative is declared, their postal address is required for tax authority communication and jurisdiction determination.
Fix: Add a cac:PostalAddress element inside cac:TaxRepresentativeParty with at least the country code.
The Seller tax representative postal address (BG-12) shall contain a Tax representative country code (BT-69), if the Seller (BG-4) has a Seller tax representative party (BG-11).
The tax representative's country code determines which country's tax rules they represent the seller under.
Fix: Add a cac:Country → cbc:IdentificationCode element inside cac:TaxRepresentativeParty → cac:PostalAddress with a valid ISO 3166-1 alpha-2 code.
Each Invoice line (BG-25) shall have an Invoice line identifier (BT-126).
Every invoice line needs a unique identifier so it can be referenced in disputes, credit notes, or buyer's purchase order matching.
Fix: Add a cbc:ID element to each cac:InvoiceLine (or cac:CreditNoteLine) with a unique line identifier (e.g. 1, 2, 3).
Each Invoice line (BG-25) shall have an Invoiced quantity (BT-129).
The quantity of items being invoiced must be stated on each line so the buyer can verify the amount charged matches what was delivered.
Fix: Add a cbc:InvoicedQuantity element (or cbc:CreditedQuantity for credit notes) to each cac:InvoiceLine with the quantity value.
An Invoice line (BG-25) shall have an Invoiced quantity unit of measure code (BT-130).
The unit of measure (e.g. pieces, hours, kilograms) must accompany the quantity so amounts can be verified. Without it, the quantity is ambiguous.
Fix: Add a unitCode attribute to the cbc:InvoicedQuantity (or cbc:CreditedQuantity) element using a valid UN/ECE Recommendation 20 code (e.g. C62 for units, HUR for hours, KGM for kilograms).
Each Invoice line (BG-25) shall have an Invoice line net amount (BT-131).
The net amount per line (quantity times price, adjusted for line-level allowances and charges) must be present so totals can be verified.
Fix: Add a cbc:LineExtensionAmount element to each cac:InvoiceLine with the line net amount and the correct currencyID attribute.
Each Invoice line (BG-25) shall contain the Item name (BT-153).
Every line item must have a name or description so the buyer can identify what they are being charged for.
Fix: Add a cbc:Name element inside cac:InvoiceLine → cac:Item.
Each Invoice line (BG-25) shall contain the Item net price (BT-146).
The price per unit after any item price discount must be present on each line so the line net amount can be verified.
Fix: Add a cbc:PriceAmount element inside cac:InvoiceLine → cac:Price.
The Item net price (BT-146) shall NOT be negative.
A negative unit price is not allowed. If you need to represent a credit or refund, use a credit note document type or an allowance instead.
Fix: Ensure the cbc:PriceAmount value inside cac:InvoiceLine → cac:Price is zero or positive. For refunds, use a credit note (InvoiceTypeCode 381) instead.
The Item gross price (BT-148) shall NOT be negative.
The gross price (price before any item-level discount) cannot be negative because it represents the original catalogue or list price.
Fix: Ensure the cbc:BaseAmount value inside cac:InvoiceLine → cac:Price → cac:AllowanceCharge is zero or positive.
If both Invoicing period start date (BT-73) and Invoicing period end date (BT-74) are given then the Invoicing period end date (BT-74) shall be later or equal to the Invoicing period start date (BT-73).
When the invoice covers a specific period (e.g. a monthly subscription), the end date cannot be before the start date as that would be logically invalid.
Fix: Ensure cbc:EndDate is equal to or later than cbc:StartDate inside cac:InvoicePeriod at the document level. Dates must be in YYYY-MM-DD format.
If both Invoice line period start date (BT-134) and Invoice line period end date (BT-135) are given then the Invoice line period end date (BT-135) shall be later or equal to the Invoice line period start date (BT-134).
At the line level, when a service period is specified, the end date must be on or after the start date to represent a valid time span.
Fix: Ensure cbc:EndDate is equal to or later than cbc:StartDate inside cac:InvoiceLine → cac:InvoicePeriod. Dates must be in YYYY-MM-DD format.
Each Document level allowance (BG-20) shall have a Document level allowance amount (BT-92).
When a document-level allowance (discount) is applied, the amount must be stated so the invoice total can be calculated correctly.
Fix: Add a cbc:Amount element to each cac:AllowanceCharge element (where cbc:ChargeIndicator is false) at the document level.
Each Document level allowance (BG-20) shall have a Document level allowance VAT category code (BT-95).
The VAT category must be assigned to each document-level allowance so the correct tax treatment can be applied in the VAT breakdown.
Fix: Add a cac:TaxCategory → cbc:ID element inside each document-level cac:AllowanceCharge (where cbc:ChargeIndicator is false) with a valid VAT category code (e.g. S, Z, E).
Each Document level allowance (BG-20) shall have a Document level allowance reason (BT-97) or a Document level allowance reason code (BT-98).
Every document-level allowance must explain why the discount is given, either as free text or using a standard UNTDID 5189 reason code.
Fix: Add a cbc:AllowanceChargeReason and/or cbc:AllowanceChargeReasonCode element to each document-level cac:AllowanceCharge (where cbc:ChargeIndicator is false).
Each Document level charge (BG-21) shall have a Document level charge amount (BT-99).
When a document-level charge (e.g. shipping, handling) is applied, the amount must be stated for correct total calculation.
Fix: Add a cbc:Amount element to each cac:AllowanceCharge element (where cbc:ChargeIndicator is true) at the document level.
Each Document level charge (BG-21) shall have a Document level charge VAT category code (BT-102).
The VAT category must be assigned to each document-level charge so tax is correctly allocated in the VAT breakdown.
Fix: Add a cac:TaxCategory → cbc:ID element inside each document-level cac:AllowanceCharge (where cbc:ChargeIndicator is true) with a valid VAT category code.
Each Document level charge (BG-21) shall have a Document level charge reason (BT-104) or a Document level charge reason code (BT-105).
Every document-level charge must explain its purpose, either as free text or using a standard UNTDID 7161 reason code.
Fix: Add a cbc:AllowanceChargeReason and/or cbc:AllowanceChargeReasonCode element to each document-level cac:AllowanceCharge (where cbc:ChargeIndicator is true).
Each Invoice line allowance (BG-27) shall have an Invoice line allowance amount (BT-136).
When a line-level allowance (discount) is given, the amount must be specified so the line net amount can be calculated correctly.
Fix: Add a cbc:Amount element to each cac:AllowanceCharge (where cbc:ChargeIndicator is false) inside cac:InvoiceLine.
Each Invoice line allowance (BG-27) shall have an Invoice line allowance reason (BT-139) or an Invoice line allowance reason code (BT-140).
Every line-level allowance must have a reason so the buyer understands why the discount was applied.
Fix: Add a cbc:AllowanceChargeReason and/or cbc:AllowanceChargeReasonCode element to each line-level cac:AllowanceCharge (where cbc:ChargeIndicator is false).
Each Invoice line charge (BG-28) shall have an Invoice line charge amount (BT-141).
When a line-level charge (surcharge) is applied, the amount must be stated so the line net amount can be verified.
Fix: Add a cbc:Amount element to each cac:AllowanceCharge (where cbc:ChargeIndicator is true) inside cac:InvoiceLine.
Each Invoice line charge shall have an Invoice line charge reason or an invoice line allowance reason code.
Every line-level charge must explain its purpose so the buyer understands the additional cost.
Fix: Add a cbc:AllowanceChargeReason and/or cbc:AllowanceChargeReasonCode element to each line-level cac:AllowanceCharge (where cbc:ChargeIndicator is true).
Each VAT breakdown (BG-23) shall have a VAT category taxable amount (BT-116).
The taxable amount (tax base) must be present in each VAT breakdown line so the tax amount can be verified against the applicable rate.
Fix: Add a cbc:TaxableAmount element to each cac:TaxSubtotal inside cac:TaxTotal.
Each VAT breakdown (BG-23) shall have a VAT category tax amount (BT-117).
The calculated tax amount must be present in each VAT breakdown line so the total tax can be verified.
Fix: Add a cbc:TaxAmount element to each cac:TaxSubtotal inside cac:TaxTotal.
Each VAT breakdown (BG-23) shall be defined through a VAT category code (BT-118).
Each VAT breakdown line must specify which VAT category it applies to (e.g. Standard rate, Zero rate, Exempt) so the tax treatment is unambiguous.
Fix: Add a cbc:ID element inside cac:TaxSubtotal → cac:TaxCategory with a valid VAT category code (S, Z, E, AE, K, G, O, L, M).
Each VAT breakdown (BG-23) shall have a VAT category rate (BT-119), except if the Invoice is not subject to VAT.
The tax rate percentage must be stated in each VAT breakdown so the tax amount can be verified, unless the invoice falls entirely outside the scope of VAT.
Fix: Add a cbc:Percent element inside cac:TaxSubtotal → cac:TaxCategory with the applicable VAT rate (e.g. 21, 9, 0).
A Payment instruction (BG-16) shall specify the Payment means type code (BT-81).
When payment instructions are included, the payment method must be identified (e.g. credit transfer, direct debit, card payment) so the buyer knows how to pay.
Fix: Add a cbc:PaymentMeansCode element inside cac:PaymentMeans with a valid UNTDID 4461 code (e.g. 30 for credit transfer, 58 for SEPA credit transfer).
A Payment account identifier (BT-84) shall be present if Credit transfer (BG-17) information is provided in the Invoice.
When the invoice specifies credit transfer as the payment method, the account number (IBAN) must be provided so the buyer can make the payment.
Fix: Add a cbc:ID element inside cac:PaymentMeans → cac:PayeeFinancialAccount with the IBAN or account identifier.
In accordance with card payments security standards an invoice should never include a full card primary account number (BT-87). At the moment PCI Security Standards Council has defined that the first 6 digits and last 4 digits are the maximum number of digits to be shown.
For PCI DSS compliance, a full credit card number must never appear on an invoice. Only a truncated version (first 6 and last 4 digits) is permitted.
Fix: Truncate the card number in cac:PaymentMeans → cac:CardAccount → cbc:PrimaryAccountNumberID to show at most the first 6 and last 4 digits, masking the rest.
Each Additional supporting document (BG-24) shall contain a Supporting document reference (BT-122).
When additional documents are attached or referenced (e.g. timesheets, contracts), each must have a reference identifier so they can be located.
Fix: Add a cbc:ID element to each cac:AdditionalDocumentReference.
If the VAT accounting currency code (BT-6) is present, then the Invoice total VAT amount in accounting currency (BT-111) shall be provided.
When the invoice uses a different currency for VAT reporting (e.g. invoicing in USD but reporting VAT in EUR), the VAT total in the accounting currency must be stated.
Fix: Add a second cac:TaxTotal element with a cbc:TaxAmount that has the currencyID matching the cbc:TaxCurrencyCode value.
Each Item attribute (BG-32) shall contain an Item attribute name (BT-160) and an Item attribute value (BT-161).
When custom item properties are added (e.g. color, size), both the attribute name and value must be present as a pair.
Fix: Ensure each cac:AdditionalItemProperty inside cac:Item has both a cbc:Name and a cbc:Value element.
Each Preceding Invoice reference (BG-3) shall contain a Preceding Invoice reference (BT-25).
When referencing a previous invoice (e.g. in a credit note or corrective invoice), the referenced invoice number must be provided.
Fix: Add a cbc:ID element to each cac:BillingReference → cac:InvoiceDocumentReference with the preceding invoice number.
Each Seller tax representative party (BG-11) shall have a Seller tax representative VAT identifier (BT-63).
A tax representative must be identified by their VAT number so tax authorities can verify their registration and authority to represent the seller.
Fix: Add a cac:PartyTaxScheme → cbc:CompanyID element inside cac:TaxRepresentativeParty with the representative's VAT identifier.
Each Deliver to address (BG-15) shall contain a Deliver to country code (BT-80).
When a delivery address is specified, the country code is mandatory because it can affect the place of supply for VAT purposes.
Fix: Add a cac:Country → cbc:IdentificationCode element inside cac:Delivery → cac:DeliveryLocation → cac:Address with a valid ISO 3166-1 alpha-2 code.
If the Payment means type code (BT-81) means SEPA credit transfer, Local credit transfer or Non-SEPA international credit transfer, the Payment account identifier (BT-84) shall be present.
Credit transfer payment methods (codes 30, 58) require a bank account number so the buyer knows where to send the payment.
Fix: Add a cbc:ID element inside cac:PaymentMeans → cac:PayeeFinancialAccount with the IBAN or account identifier when the payment means code indicates a credit transfer.
The Seller electronic address (BT-34) shall have a Scheme identifier.
The seller's electronic address (e.g. Peppol participant ID) must include a scheme identifier so the address type is unambiguous and routable.
Fix: Add a schemeID attribute to the cbc:EndpointID element inside cac:AccountingSupplierParty → cac:Party (e.g. schemeID="0106" for GLN, schemeID="0190" for Dutch KvK).
The Buyer electronic address (BT-49) shall have a Scheme identifier.
The buyer's electronic address must include a scheme identifier so it can be properly resolved in the Peppol network or other routing systems.
Fix: Add a schemeID attribute to the cbc:EndpointID element inside cac:AccountingCustomerParty → cac:Party (e.g. schemeID="0106" for GLN, schemeID="0190" for Dutch KvK).
The Item standard identifier (BT-157) shall have a Scheme identifier.
When an item has a standard identifier (e.g. GTIN/EAN), the scheme must be specified so the receiver knows which identification system is used.
Fix: Add a schemeID attribute to the cbc:ID element inside cac:Item → cac:StandardItemIdentification (e.g. schemeID="0160" for GTIN).
The Item classification identifier (BT-158) shall have a Scheme identifier.
When an item has a classification code (e.g. CPV, UNSPSC), the scheme identifier is required so the receiver knows which classification system is being referenced.
Fix: Add a schemeID attribute to the cbc:ItemClassificationCode element inside cac:Item → cac:CommodityClassification (e.g. schemeID="STI" for UNSPSC).
An Invoice shall contain maximum one Payment Card account (BG-18).
Only one card payment account may be specified per invoice to avoid ambiguity about which card was or will be charged.
Fix: Ensure only one cac:PaymentMeans element contains cac:CardAccount. Remove any duplicate card account entries.
An Invoice shall contain maximum one Payment Mandate (BG-19).
Only one direct debit mandate may be referenced per invoice. Multiple mandates would create ambiguity about which mandate authorizes the collection.
Fix: Ensure only one cac:PaymentMeans element contains cac:PaymentMandate. Remove any duplicate mandate entries.
Calculation rules (BR-CO-*)
Consistency and calculation rules that verify totals add up, VAT amounts match, and cross-field dependencies are correct. The most common source of validation failures.
Value added tax point date (BT-7) and Value added tax point date code (BT-8) are mutually exclusive.
The invoice supplies both a literal VAT point date and a code that derives one. Only one mechanism may be used to determine when VAT becomes chargeable.
Fix: Remove either <cbc:TaxPointDate> (BT-7) or <cbc:TaxCurrencyCode>-level date code in <cac:InvoicePeriod>/<cbc:DescriptionCode> (BT-8). Keep whichever is appropriate for your tax regime.
Each Invoice line (BG-25) shall be categorized with an Invoiced item VAT category code (BT-151).
An invoice line is missing its VAT category classification. Every line must declare how it is taxed (standard-rated, zero-rated, exempt, etc.).
Fix: Add <cac:ClassifiedTaxCategory> with a <cbc:ID> (e.g., S, Z, E, AE, G, O) and a <cac:TaxScheme>/<cbc:ID> of VAT inside each <cac:InvoiceLine> → <cac:Item>.
Document level allowance reason code (BT-98) and Document level allowance reason (BT-97) shall indicate the same type of allowance.
A document-level allowance has a reason code and free-text reason that contradict each other. The UNTDID 5189 code must match the textual description.
Fix: Align <cbc:AllowanceChargeReasonCode> (BT-98) with <cbc:AllowanceChargeReason> (BT-97) in the document-level <cac:AllowanceCharge> where ChargeIndicator is false. Use the correct UNTDID 5189 code for the described allowance type.
Document level charge reason code (BT-105) and Document level charge reason (BT-104) shall indicate the same type of charge.
A document-level charge has a reason code and free-text reason that do not match. The UNTDID 7161 code must correspond to the textual description.
Fix: Align <cbc:AllowanceChargeReasonCode> (BT-105) with <cbc:AllowanceChargeReason> (BT-104) in the document-level <cac:AllowanceCharge> where ChargeIndicator is true. Use the correct UNTDID 7161 code.
Invoice line allowance reason code (BT-140) and Invoice line allowance reason (BT-139) shall indicate the same type of allowance reason.
A line-level allowance has a mismatched reason code and reason text. Both must describe the same type of allowance per UNTDID 5189.
Fix: Align <cbc:AllowanceChargeReasonCode> (BT-140) with <cbc:AllowanceChargeReason> (BT-139) in the line-level <cac:AllowanceCharge> where ChargeIndicator is false.
Invoice line charge reason code (BT-145) and Invoice line charge reason (BT-144) shall indicate the same type of charge reason.
A line-level charge has a mismatched reason code and reason text. Both must describe the same type of charge per UNTDID 7161.
Fix: Align <cbc:AllowanceChargeReasonCode> (BT-145) with <cbc:AllowanceChargeReason> (BT-144) in the line-level <cac:AllowanceCharge> where ChargeIndicator is true.
The Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48) shall have a prefix in accordance with ISO code ISO 3166-1 alpha-2 by which the country of issue may be identified. Nevertheless, Greece may use the prefix 'EL'.
A VAT identifier is missing the two-letter country prefix or uses an invalid one. VAT numbers must start with an ISO 3166-1 alpha-2 country code (e.g., DE, NL, FR), except Greece which uses EL instead of GR.
Fix: Prefix every <cbc:CompanyID> under <cac:PartyTaxScheme> with the correct two-letter country code (e.g., NL123456789B01, DE123456789). For Greek VAT numbers, use the EL prefix.
Sum of Invoice line net amount (BT-106) = Σ Invoice line net amount (BT-131).
The sum of all individual line net amounts does not equal the document-level LineExtensionAmount. This usually happens when rounding is applied at the line level and the document total is calculated independently.
Fix: Recalculate <cbc:LineExtensionAmount> under <cac:LegalMonetaryTotal> as the exact sum of all line-level <cbc:LineExtensionAmount> values. Round each line to 2 decimals first, then sum.
Sum of allowances on document level (BT-107) = Σ Document level allowance amount (BT-92).
The AllowanceTotalAmount does not equal the sum of individual document-level allowance amounts. This fires when a document-level allowance is added or removed without updating the total.
Fix: Recalculate <cbc:AllowanceTotalAmount> under <cac:LegalMonetaryTotal> as the exact sum of all <cbc:Amount> values from document-level <cac:AllowanceCharge> elements where ChargeIndicator is false.
Sum of charges on document level (BT-108) = Σ Document level charge amount (BT-99).
The ChargeTotalAmount does not equal the sum of individual document-level charge amounts. This fires when a document-level charge is added or removed without updating the total.
Fix: Recalculate <cbc:ChargeTotalAmount> under <cac:LegalMonetaryTotal> as the exact sum of all <cbc:Amount> values from document-level <cac:AllowanceCharge> elements where ChargeIndicator is true.
Invoice total amount without VAT (BT-109) = Σ Invoice line net amount (BT-131) − Sum of allowances on document level (BT-107) + Sum of charges on document level (BT-108).
The tax-exclusive total does not match the formula. A common cause is forgetting to subtract document-level allowances or add document-level charges.
Fix: Recalculate <cbc:TaxExclusiveAmount> = LineExtensionAmount − AllowanceTotalAmount + ChargeTotalAmount. If no allowances or charges exist, TaxExclusiveAmount must equal LineExtensionAmount.
Invoice total VAT amount (BT-110) = Σ VAT category tax amount (BT-117).
The total VAT amount does not match the sum of VAT amounts per category in the tax breakdown. This fires when rounding is applied inconsistently between the breakdown and the total.
Fix: Recalculate the <cbc:TaxAmount> under <cac:TaxTotal> as the exact sum of all <cbc:TaxAmount> values inside <cac:TaxSubtotal> elements. Round each subtotal first, then sum.
Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).
The tax-inclusive total does not equal the tax-exclusive amount plus VAT. Often caused by a rounding discrepancy of one cent.
Fix: Recalculate <cbc:TaxInclusiveAmount> = TaxExclusiveAmount + TaxAmount (from the <cac:TaxTotal> with the document currency).
Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) − Paid amount (BT-113) + Rounding amount (BT-114).
The amount due for payment does not match the formula. This commonly fires when a prepaid amount is specified but not subtracted, or a rounding adjustment is not added.
Fix: Recalculate <cbc:PayableAmount> = TaxInclusiveAmount − PrepaidAmount + PayableRoundingAmount. If no prepayment or rounding exists, PayableAmount must equal TaxInclusiveAmount.
VAT category tax amount (BT-117) = VAT category taxable amount (BT-116) × (VAT category rate (BT-119) / 100), rounded to two decimals.
The tax amount in a VAT breakdown does not equal the taxable amount multiplied by the rate. The most common cause is incorrect rounding: the spec requires rounding the final result to 2 decimals, not truncating.
Fix: For each <cac:TaxSubtotal>, recalculate <cbc:TaxAmount> = round(TaxableAmount × Percent ÷ 100, 2). Use banker’s rounding (round half to even) for consistent results.
An Invoice shall at least have one VAT breakdown group (BG-23).
The invoice has no VAT breakdown. Even zero-rated or exempt invoices need at least one <cac:TaxSubtotal> in the <cac:TaxTotal>.
Fix: Add a <cac:TaxTotal> with at least one <cac:TaxSubtotal> containing <cbc:TaxableAmount>, <cbc:TaxAmount>, and a <cac:TaxCategory> with <cbc:ID> and <cac:TaxScheme>.
If Invoicing period (BG-14) is used, the Invoicing period start date (BT-73) or the Invoicing period end date (BT-74) shall be filled, or both.
An <cac:InvoicePeriod> element exists at the document level but contains neither a start date nor an end date. The period element is meaningless without at least one date.
Fix: Add <cbc:StartDate> (BT-73) and/or <cbc:EndDate> (BT-74) inside <cac:InvoicePeriod>. If the period is not needed, remove the <cac:InvoicePeriod> element entirely.
If Invoice line period (BG-26) is used, the Invoice line period start date (BT-134) or the Invoice line period end date (BT-135) shall be filled, or both.
An <cac:InvoicePeriod> exists on an invoice line but has no start or end date. A line period must contain at least one date to be valid.
Fix: Add <cbc:StartDate> (BT-134) and/or <cbc:EndDate> (BT-135) inside the line-level <cac:InvoicePeriod>, or remove the empty <cac:InvoicePeriod> from the line.
Each Document level allowance (BG-20) shall contain a Document level allowance reason (BT-97) or a Document level allowance reason code (BT-98), or both.
A document-level allowance has neither a reason text nor a reason code. At least one must be present so the allowance can be understood and categorized.
Fix: Add <cbc:AllowanceChargeReason> (BT-97) and/or <cbc:AllowanceChargeReasonCode> (BT-98) to the document-level <cac:AllowanceCharge> where ChargeIndicator is false.
Each Document level charge (BG-21) shall contain a Document level charge reason (BT-104) or a Document level charge reason code (BT-105), or both.
A document-level charge has neither a reason text nor a reason code. At least one must be present so the charge can be understood and categorized.
Fix: Add <cbc:AllowanceChargeReason> (BT-104) and/or <cbc:AllowanceChargeReasonCode> (BT-105) to the document-level <cac:AllowanceCharge> where ChargeIndicator is true.
Each Invoice line allowance (BG-27) shall contain an Invoice line allowance reason (BT-139) or an Invoice line allowance reason code (BT-140), or both.
A line-level allowance has neither a reason text nor a reason code. At least one must be present to describe why the allowance was applied.
Fix: Add <cbc:AllowanceChargeReason> (BT-139) and/or <cbc:AllowanceChargeReasonCode> (BT-140) to the line-level <cac:AllowanceCharge> where ChargeIndicator is false.
Each Invoice line charge (BG-28) shall contain an Invoice line charge reason (BT-144) or an Invoice line charge reason code (BT-145), or both.
A line-level charge has neither a reason text nor a reason code. At least one must be present to describe why the charge was applied.
Fix: Add <cbc:AllowanceChargeReason> (BT-144) and/or <cbc:AllowanceChargeReasonCode> (BT-145) to the line-level <cac:AllowanceCharge> where ChargeIndicator is true.
In case the Amount due for payment (BT-115) is positive, either the Payment due date (BT-9) or the Payment terms (BT-20) shall be present.
The invoice has a positive amount due but specifies neither a payment due date nor payment terms. The buyer needs to know when or how to pay.
Fix: Add <cbc:DueDate> (BT-9) to the root element and/or <cac:PaymentTerms>/<cbc:Note> (BT-20) with the payment terms description. If the amount due is zero or negative (e.g., a credit note), this rule does not apply.
In order for the buyer to automatically identify a supplier, the Seller identifier (BT-29), the Seller legal registration identifier (BT-30) and/or the Seller VAT identifier (BT-31) shall be present.
The seller has no identifying number at all -- no party identification, no legal entity ID, and no VAT number. At least one must be present for automated processing.
Fix: Add at least one of: <cac:PartyIdentification>/<cbc:ID> (BT-29), <cac:PartyLegalEntity>/<cbc:CompanyID> (BT-30), or <cac:PartyTaxScheme>/<cbc:CompanyID> (BT-31) under the seller party.
Decimal rules (BR-DEC-*)
Rules enforcing maximum 2 decimal places on monetary amounts. These fire when amounts like 10.125 appear instead of 10.13.
The allowed maximum number of decimals for the Document level allowance amount (BT-92) is 2.
The document-level allowance amount has more than 2 decimal places. This can happen when computing a percentage-based discount on a base amount that produces 3+ decimals.
Fix: Round <cbc:Amount> inside <cac:AllowanceCharge> (where ChargeIndicator is false) to 2 decimal places.
The allowed maximum number of decimals for the Document level allowance base amount (BT-93) is 2.
The base amount from which a document-level allowance is calculated has more than 2 decimal places. The base amount must be a rounded monetary value.
Fix: Round <cbc:BaseAmount> inside the document-level <cac:AllowanceCharge> (where ChargeIndicator is false) to 2 decimal places.
The allowed maximum number of decimals for the Document level charge amount (BT-99) is 2.
The document-level charge (e.g. shipping or handling fee) has more than 2 decimal places. This can occur when a percentage-based surcharge is applied to a base amount.
Fix: Round <cbc:Amount> inside <cac:AllowanceCharge> (where ChargeIndicator is true) to 2 decimal places.
The allowed maximum number of decimals for the Document level charge base amount (BT-100) is 2.
The base amount for a document-level charge has more than 2 decimal places. All monetary base amounts must be rounded to 2 decimals.
Fix: Round <cbc:BaseAmount> inside the document-level <cac:AllowanceCharge> (where ChargeIndicator is true) to 2 decimal places.
The allowed maximum number of decimals for the Sum of Invoice line net amount (BT-106) is 2.
The sum of all invoice line net amounts has more than 2 decimal places. This typically happens when individual line amounts are not rounded before summing.
Fix: Round <cbc:LineExtensionAmount> in <cac:LegalMonetaryTotal> to 2 decimal places.
The allowed maximum number of decimals for the Sum of allowances on document level (BT-107) is 2.
The total of all document-level allowances has more than 2 decimal places. Ensure each allowance is rounded individually before summing.
Fix: Round <cbc:AllowanceTotalAmount> in <cac:LegalMonetaryTotal> to 2 decimal places.
The allowed maximum number of decimals for the Sum of charges on document level (BT-108) is 2.
The total of all document-level charges has more than 2 decimal places. Ensure each charge is rounded individually before summing.
Fix: Round <cbc:ChargeTotalAmount> in <cac:LegalMonetaryTotal> to 2 decimal places.
The allowed maximum number of decimals for the Invoice total amount without VAT (BT-109) is 2.
The invoice total excluding VAT has more than 2 decimal places. This is the sum of line totals plus charges minus allowances, which must be rounded to 2 decimals.
Fix: Round <cbc:TaxExclusiveAmount> in <cac:LegalMonetaryTotal> to 2 decimal places.
The allowed maximum number of decimals for the Invoice total VAT amount (BT-110) is 2.
The total VAT amount has more than 2 decimals. This often happens when summing VAT amounts per category that individually have 2 decimals but produce a result with more.
Fix: Round <cbc:TaxAmount> in <cac:TaxTotal> to 2 decimal places.
The allowed maximum number of decimals for the Invoice total amount with VAT (BT-112) is 2.
The grand total (net + VAT) has more than 2 decimal places. This is the final invoice amount and must be a clean monetary value.
Fix: Round <cbc:TaxInclusiveAmount> in <cac:LegalMonetaryTotal> to 2 decimal places.
The allowed maximum number of decimals for the Invoice total VAT amount in accounting currency (BT-111) is 2.
The VAT total expressed in the accounting currency (when different from the document currency) has more than 2 decimal places. Currency conversion often introduces extra decimals.
Fix: Round <cbc:TaxAmount> in the second <cac:TaxTotal> (the one with the accounting currency) to 2 decimal places.
The allowed maximum number of decimals for the Paid amount (BT-113) is 2.
The prepaid or previously paid amount has more than 2 decimal places. This is a monetary amount and must be rounded.
Fix: Round <cbc:PrepaidAmount> in <cac:LegalMonetaryTotal> to 2 decimal places.
The allowed maximum number of decimals for the Rounding amount (BT-114) is 2.
The rounding adjustment amount has more than 2 decimal places. The rounding amount itself must be a valid monetary value with at most 2 decimals.
Fix: Round <cbc:PayableRoundingAmount> in <cac:LegalMonetaryTotal> to 2 decimal places.
The allowed maximum number of decimals for the Amount due for payment (BT-115) is 2.
The amount due for payment has more than 2 decimal places. This is the final payable amount (total with VAT minus prepaid, plus rounding) and must be a clean monetary value.
Fix: Round <cbc:PayableAmount> in <cac:LegalMonetaryTotal> to 2 decimal places.
The allowed maximum number of decimals for the VAT category taxable amount (BT-116) is 2.
The taxable base amount for a VAT category has more than 2 decimal places. This is the sum of line net amounts for that VAT category and must be rounded.
Fix: Round <cbc:TaxableAmount> in <cac:TaxSubtotal> to 2 decimal places.
The allowed maximum number of decimals for the VAT category tax amount (BT-117) is 2.
The VAT amount for a specific category has more than 2 decimal places. This often happens when taxable amount × rate produces 3+ decimals (e.g. 33.33 × 21% = 6.9993).
Fix: Round <cbc:TaxAmount> in <cac:TaxSubtotal> to 2 decimal places.
The allowed maximum number of decimals for the Invoice line net amount (BT-131) is 2.
A line-level net amount has more than 2 decimal places. This commonly happens when quantity × price produces a result like 33.333.
Fix: Round each line’s <cbc:LineExtensionAmount> to 2 decimals. Calculate as: round(quantity × price, 2).
The allowed maximum number of decimals for the Invoice line allowance amount (BT-136) is 2.
A line-level allowance (discount) amount has more than 2 decimal places. This can happen when computing a percentage discount on the line amount.
Fix: Round <cbc:Amount> inside the line-level <cac:AllowanceCharge> (where ChargeIndicator is false) to 2 decimal places.
The allowed maximum number of decimals for the Invoice line allowance base amount (BT-137) is 2.
The base amount for a line-level allowance has more than 2 decimal places. The base from which the discount percentage is applied must be a rounded monetary value.
Fix: Round <cbc:BaseAmount> inside the line-level <cac:AllowanceCharge> (where ChargeIndicator is false) to 2 decimal places.
The allowed maximum number of decimals for the Invoice line charge amount (BT-141) is 2.
A line-level charge (surcharge) amount has more than 2 decimal places. This can occur when a percentage-based surcharge is applied to the line amount.
Fix: Round <cbc:Amount> inside the line-level <cac:AllowanceCharge> (where ChargeIndicator is true) to 2 decimal places.
The allowed maximum number of decimals for the Invoice line charge base amount (BT-142) is 2.
The base amount for a line-level charge has more than 2 decimal places. The base from which the surcharge percentage is applied must be a rounded monetary value.
Fix: Round <cbc:BaseAmount> inside the line-level <cac:AllowanceCharge> (where ChargeIndicator is true) to 2 decimal places.
VAT category rules (BR-S, BR-AE, BR-E, BR-G, BR-Z, BR-O, BR-IC, BR-AF, BR-AG)
Rules specific to each VAT category. They ensure the correct combination of tax rate, exemption reason, and seller/buyer VAT identifiers for each category.
An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Reverse charge" shall contain in the VAT Breakdown (BG-23) exactly one VAT category code (BT-118) equal with "VAT reverse charge".
If any line, allowance, or charge uses VAT category AE, the invoice must include exactly one cac:TaxSubtotal with cbc:ID = 'AE' in the VAT breakdown.
Fix: Add a cac:TaxSubtotal inside cac:TaxTotal with cac:TaxCategory/cbc:ID set to 'AE'. Ensure there is exactly one such subtotal.
An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Reverse charge" shall contain the Seller VAT Identifier (BT-31), the Seller Tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48) and/or the Buyer legal registration identifier (BT-47).
Reverse-charge lines require seller tax identification (VAT ID, tax registration, or tax rep VAT ID) and buyer identification (VAT ID or legal registration ID).
Fix: Populate cac:AccountingSupplierParty with cbc:CompanyID (BT-31) or cbc:TaxRegistrationID (BT-32), and populate cac:AccountingCustomerParty with cbc:CompanyID (BT-48) or cbc:LegalRegistrationID (BT-47).
An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Reverse charge" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48) and/or the Buyer legal registration identifier (BT-47).
Same as BR-AE-02 but triggered by a document-level allowance with category AE. Both seller and buyer tax identifiers are required.
Fix: Ensure the seller has BT-31, BT-32, or BT-63 populated, and the buyer has BT-48 or BT-47 populated.
An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Reverse charge" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48) and/or the Buyer legal registration identifier (BT-47).
Same as BR-AE-02 but triggered by a document-level charge with category AE. Both seller and buyer tax identifiers are required.
Fix: Ensure the seller has BT-31, BT-32, or BT-63 populated, and the buyer has BT-48 or BT-47 populated.
In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Reverse charge" the Invoiced item VAT rate (BT-152) shall be 0 (zero).
Reverse-charge invoice lines must have a VAT rate of 0% because the buyer accounts for the VAT.
Fix: Set cbc:Percent to 0 inside cac:ClassifiedTaxCategory for the affected invoice line.
In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Reverse charge" the Document level allowance VAT rate (BT-96) shall be 0 (zero).
Document-level allowances classified as reverse charge must carry a 0% VAT rate.
Fix: Set cbc:Percent to 0 in the cac:TaxCategory of the allowance (cac:AllowanceCharge where ChargeIndicator is false).
In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Reverse charge" the Document level charge VAT rate (BT-103) shall be 0 (zero).
Document-level charges classified as reverse charge must carry a 0% VAT rate.
Fix: Set cbc:Percent to 0 in the cac:TaxCategory of the charge (cac:AllowanceCharge where ChargeIndicator is true).
In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Reverse charge" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Reverse charge".
The cbc:TaxableAmount in the AE tax subtotal must equal Σ line net amounts − Σ allowances + Σ charges for all items categorized as reverse charge.
Fix: Recalculate cbc:TaxableAmount in the AE cac:TaxSubtotal so it equals the sum of BT-131 values minus BT-92 values plus BT-99 values where the category is AE.
The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Reverse charge" shall be 0 (zero).
The seller does not charge VAT on reverse-charge supplies, so cbc:TaxAmount in the AE subtotal must be 0.00.
Fix: Set cbc:TaxAmount to 0.00 in the cac:TaxSubtotal where cac:TaxCategory/cbc:ID is 'AE'.
A VAT breakdown (BG-23) with VAT Category code (BT-118) "Reverse charge" shall have a VAT exemption reason code (BT-121), meaning "Reverse charge" or the VAT exemption reason text (BT-120) "Reverse charge" (or the equivalent standard text in another language).
Reverse-charge subtotals must explain the exemption via cbc:TaxExemptionReasonCode (BT-121) or cbc:TaxExemptionReason (BT-120).
Fix: Add cbc:TaxExemptionReasonCode (e.g., 'vatex-eu-ae') and/or cbc:TaxExemptionReason (e.g., 'Reverse charge') inside the AE cac:TaxCategory.
An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "IGIC" shall contain in the VAT breakdown (BG-23) at least one VAT category code (BT-118) equal with "IGIC".
If any line, allowance, or charge uses VAT category L (IGIC), the VAT breakdown must contain at least one cac:TaxSubtotal with cbc:ID = 'L'.
Fix: Add a cac:TaxSubtotal inside cac:TaxTotal with cac:TaxCategory/cbc:ID set to 'L' for each distinct IGIC rate used.
An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "IGIC" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
IGIC invoice lines require at least one seller tax identifier to be present on the invoice.
Fix: Populate at least one of cac:AccountingSupplierParty cbc:CompanyID (BT-31), tax registration (BT-32), or tax representative VAT ID (BT-63).
An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "IGIC" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Same as BR-AF-02 but triggered by a document-level allowance with IGIC category. At least one seller tax ID is required.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "IGIC" shall contain the Seller VAT Identifier (BT-31), the Seller Tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Same as BR-AF-02 but triggered by a document-level charge with IGIC category. At least one seller tax ID is required.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "IGIC" the invoiced item VAT rate (BT-152) shall be 0 (zero) or greater than zero.
IGIC lines must have a non-negative VAT rate (0% or higher). A missing or negative rate is not allowed.
Fix: Set cbc:Percent to 0 or the applicable IGIC rate (e.g., 7) inside cac:ClassifiedTaxCategory for the line.
In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "IGIC" the Document level allowance VAT rate (BT-96) shall be 0 (zero) or greater than zero.
IGIC allowances must carry a non-negative VAT rate.
Fix: Set cbc:Percent to 0 or the applicable IGIC rate in the allowance's cac:TaxCategory.
In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "IGIC" the Document level charge VAT rate (BT-103) shall be 0 (zero) or greater than zero.
IGIC charges must carry a non-negative VAT rate.
Fix: Set cbc:Percent to 0 or the applicable IGIC rate in the charge's cac:TaxCategory.
For each different value of VAT category rate (BT-119) where the VAT category code (BT-118) is "IGIC", the VAT category taxable amount (BT-116) in a VAT breakdown (BG-23) shall equal the sum of Invoice line net amounts (BT-131) plus the sum of document level charge amounts (BT-99) minus the sum of document level allowance amounts (BT-92) where the VAT category code (BT-151, BT-102, BT-95) is "IGIC" and the VAT rate (BT-152, BT-103, BT-96) equals the VAT category rate (BT-119).
For each distinct IGIC rate, cbc:TaxableAmount must equal Σ line net amounts + Σ charges − Σ allowances for items at that same IGIC rate.
Fix: Recalculate cbc:TaxableAmount in each IGIC cac:TaxSubtotal to match the sum of BT-131 + BT-99 − BT-92 filtered by category L and the matching cbc:Percent.
The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "IGIC" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119).
The cbc:TaxAmount in each IGIC subtotal must equal cbc:TaxableAmount × cbc:Percent / 100, rounded to two decimals.
Fix: Recalculate cbc:TaxAmount as round(cbc:TaxableAmount × cbc:Percent ÷ 100, 2) in the IGIC cac:TaxSubtotal.
A VAT breakdown (BG-23) with VAT Category code (BT-118) "IGIC" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120).
IGIC is a taxed category, so exemption reason fields must not be present in the IGIC subtotal.
Fix: Remove cbc:TaxExemptionReasonCode and cbc:TaxExemptionReason from the cac:TaxCategory where cbc:ID is 'L'.
An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "IPSI" shall contain in the VAT breakdown (BG-23) at least one VAT category code (BT-118) equal with "IPSI".
If any line, allowance, or charge uses VAT category M (IPSI), the VAT breakdown must contain at least one cac:TaxSubtotal with cbc:ID = 'M'.
Fix: Add a cac:TaxSubtotal inside cac:TaxTotal with cac:TaxCategory/cbc:ID set to 'M' for each distinct IPSI rate used.
An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "IPSI" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
IPSI invoice lines require at least one seller tax identifier to be present on the invoice.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "IPSI" shall contain the Seller VAT Identifier (BT-31), the Seller Tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Same as BR-AG-02 but triggered by a document-level allowance with IPSI category. At least one seller tax ID is required.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "IPSI" shall contain the Seller VAT Identifier (BT-31), the Seller Tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Same as BR-AG-02 but triggered by a document-level charge with IPSI category. At least one seller tax ID is required.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "IPSI" the Invoiced item VAT rate (BT-152) shall be 0 (zero) or greater than zero.
IPSI lines must have a non-negative VAT rate (0% or higher). A missing or negative rate is not allowed.
Fix: Set cbc:Percent to 0 or the applicable IPSI rate inside cac:ClassifiedTaxCategory for the line.
In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "IPSI" the Document level allowance VAT rate (BT-96) shall be 0 (zero) or greater than zero.
IPSI allowances must carry a non-negative VAT rate.
Fix: Set cbc:Percent to 0 or the applicable IPSI rate in the allowance's cac:TaxCategory.
In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "IPSI" the Document level charge VAT rate (BT-103) shall be 0 (zero) or greater than zero.
IPSI charges must carry a non-negative VAT rate.
Fix: Set cbc:Percent to 0 or the applicable IPSI rate in the charge's cac:TaxCategory.
For each different value of VAT category rate (BT-119) where the VAT category code (BT-118) is "IPSI", the VAT category taxable amount (BT-116) in a VAT breakdown (BG-23) shall equal the sum of Invoice line net amounts (BT-131) plus the sum of document level charge amounts (BT-99) minus the sum of document level allowance amounts (BT-92) where the VAT category code (BT-151, BT-102, BT-95) is "IPSI" and the VAT rate (BT-152, BT-103, BT-96) equals the VAT category rate (BT-119).
For each distinct IPSI rate, cbc:TaxableAmount must equal Σ line net amounts + Σ charges − Σ allowances for items at that same IPSI rate.
Fix: Recalculate cbc:TaxableAmount in each IPSI cac:TaxSubtotal to match the sum of BT-131 + BT-99 − BT-92 filtered by category M and the matching cbc:Percent.
The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "IPSI" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119).
The cbc:TaxAmount in each IPSI subtotal must equal cbc:TaxableAmount × cbc:Percent / 100, rounded to two decimals.
Fix: Recalculate cbc:TaxAmount as round(cbc:TaxableAmount × cbc:Percent ÷ 100, 2) in the IPSI cac:TaxSubtotal.
A VAT breakdown (BG-23) with VAT Category code (BT-118) "IPSI" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120).
IPSI is a taxed category, so exemption reason fields must not be present in the IPSI subtotal.
Fix: Remove cbc:TaxExemptionReasonCode and cbc:TaxExemptionReason from the cac:TaxCategory where cbc:ID is 'M'.
An Invoice where the VAT category code (BT-151, BT-95 or BT-102) is “Split payment” shall be a domestic Italian invoice.
The split-payment mechanism (category B) is only valid for domestic Italian invoices. Both seller and buyer must be in Italy.
Fix: Ensure cac:AccountingSupplierParty and cac:AccountingCustomerParty country codes (cbc:IdentificationCode) are both 'IT'. If the invoice is not domestic Italian, use a different VAT category.
An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is “Split payment” shall not contain an invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is “Standard rated”.
Split-payment invoices cannot mix category B with standard-rated category S. All lines, allowances, and charges must consistently use the split-payment category.
Fix: Change all cac:TaxCategory/cbc:ID and cac:ClassifiedTaxCategory/cbc:ID values from 'S' to 'B', or remove the split-payment items and use standard rating throughout.
An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Exempt from VAT" shall contain exactly one VAT breakdown (BG-23) with the VAT category code (BT-118) equal to "Exempt from VAT".
If any line, allowance, or charge uses VAT category E, the invoice must include exactly one cac:TaxSubtotal with cbc:ID = 'E' in the VAT breakdown.
Fix: Add a single cac:TaxSubtotal inside cac:TaxTotal with cac:TaxCategory/cbc:ID set to 'E'. Ensure there is exactly one such subtotal.
An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Exempt from VAT" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
VAT-exempt invoice lines require at least one seller tax identifier to be present on the invoice.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Exempt from VAT" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Same as BR-E-02 but triggered by a document-level allowance with exempt category. At least one seller tax ID is required.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Exempt from VAT" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Same as BR-E-02 but triggered by a document-level charge with exempt category. At least one seller tax ID is required.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Exempt from VAT", the Invoiced item VAT rate (BT-152) shall be 0 (zero).
VAT-exempt invoice lines must have a VAT rate of 0% since no VAT applies.
Fix: Set cbc:Percent to 0 inside cac:ClassifiedTaxCategory for the affected invoice line.
In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Exempt from VAT", the Document level allowance VAT rate (BT-96) shall be 0 (zero).
Document-level allowances classified as exempt must carry a 0% VAT rate.
Fix: Set cbc:Percent to 0 in the cac:TaxCategory of the allowance.
In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Exempt from VAT", the Document level charge VAT rate (BT-103) shall be 0 (zero).
Document-level charges classified as exempt must carry a 0% VAT rate.
Fix: Set cbc:Percent to 0 in the cac:TaxCategory of the charge.
In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Exempt from VAT" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Exempt from VAT".
The cbc:TaxableAmount in the exempt subtotal must equal Σ line net amounts − Σ allowances + Σ charges for all items categorized as exempt.
Fix: Recalculate cbc:TaxableAmount in the E cac:TaxSubtotal so it equals BT-131 − BT-92 + BT-99 for category E items.
The VAT category tax amount (BT-117) In a VAT breakdown (BG-23) where the VAT category code (BT-118) equals "Exempt from VAT" shall equal 0 (zero).
No VAT is charged on exempt supplies, so cbc:TaxAmount in the exempt subtotal must be 0.00.
Fix: Set cbc:TaxAmount to 0.00 in the cac:TaxSubtotal where cac:TaxCategory/cbc:ID is 'E'.
A VAT breakdown (BG-23) with VAT Category code (BT-118) "Exempt from VAT" shall have a VAT exemption reason code (BT-121) or a VAT exemption reason text (BT-120).
Exempt subtotals must state why the exemption applies, via cbc:TaxExemptionReasonCode or cbc:TaxExemptionReason.
Fix: Add cbc:TaxExemptionReasonCode (e.g., 'vatex-eu-132') and/or cbc:TaxExemptionReason (e.g., a description of the exemption) inside the E cac:TaxCategory.
An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Export outside the EU" shall contain in the VAT breakdown (BG-23) exactly one VAT category code (BT-118) equal with "Export outside the EU".
If any line, allowance, or charge uses VAT category G, the invoice must include exactly one cac:TaxSubtotal with cbc:ID = 'G' in the VAT breakdown.
Fix: Add a single cac:TaxSubtotal inside cac:TaxTotal with cac:TaxCategory/cbc:ID set to 'G'.
An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Export outside the EU" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63).
Export invoice lines require the seller's VAT ID or tax representative VAT ID. Note: unlike other categories, BT-32 (tax registration) alone is not sufficient.
Fix: Populate cac:AccountingSupplierParty with cac:PartyTaxScheme/cbc:CompanyID (BT-31) or the tax representative's VAT ID (BT-63).
An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Export outside the EU" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63).
Same as BR-G-02 but triggered by a document-level allowance with export category. Seller VAT ID or tax representative VAT ID is required.
Fix: Populate BT-31 or BT-63 on the seller party.
An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Export outside the EU" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63).
Same as BR-G-02 but triggered by a document-level charge with export category. Seller VAT ID or tax representative VAT ID is required.
Fix: Populate BT-31 or BT-63 on the seller party.
In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Export outside the EU" the Invoiced item VAT rate (BT-152) shall be 0 (zero).
Export lines are zero-rated for VAT, so cbc:Percent must be 0.
Fix: Set cbc:Percent to 0 inside cac:ClassifiedTaxCategory for the affected invoice line.
In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Export outside the EU" the Document level allowance VAT rate (BT-96) shall be 0 (zero).
Document-level allowances classified as export must carry a 0% VAT rate.
Fix: Set cbc:Percent to 0 in the cac:TaxCategory of the allowance.
In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Export outside the EU" the Document level charge VAT rate (BT-103) shall be 0 (zero).
Document-level charges classified as export must carry a 0% VAT rate.
Fix: Set cbc:Percent to 0 in the cac:TaxCategory of the charge.
In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Export outside the EU" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Export outside the EU".
The cbc:TaxableAmount in the export subtotal must equal Σ line net amounts − Σ allowances + Σ charges for all items categorized as export.
Fix: Recalculate cbc:TaxableAmount in the G cac:TaxSubtotal so it equals BT-131 − BT-92 + BT-99 for category G items.
The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Export outside the EU" shall be 0 (zero).
Export supplies are zero-rated, so cbc:TaxAmount in the export subtotal must be 0.00.
Fix: Set cbc:TaxAmount to 0.00 in the cac:TaxSubtotal where cac:TaxCategory/cbc:ID is 'G'.
A VAT breakdown (BG-23) with the VAT Category code (BT-118) "Export outside the EU" shall have a VAT exemption reason code (BT-121), meaning "Export outside the EU" or the VAT exemption reason text (BT-120) "Export outside the EU" (or the equivalent standard text in another language).
Export subtotals must explain the zero-rating via cbc:TaxExemptionReasonCode or cbc:TaxExemptionReason.
Fix: Add cbc:TaxExemptionReasonCode (e.g., 'vatex-eu-g') and/or cbc:TaxExemptionReason (e.g., 'Export outside the EU') inside the G cac:TaxCategory.
An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Intra-community supply" shall contain in the VAT breakdown (BG-23) exactly one VAT category code (BT-118) equal with "Intra-community supply".
If any line, allowance, or charge uses VAT category K, the invoice must include exactly one cac:TaxSubtotal with cbc:ID = 'K' in the VAT breakdown.
Fix: Add a single cac:TaxSubtotal inside cac:TaxTotal with cac:TaxCategory/cbc:ID set to 'K'.
An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Intra-community supply" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48).
Intra-community lines require the seller's VAT ID (or tax rep VAT ID) and the buyer's VAT ID. Both parties must be VAT-registered in the EU.
Fix: Populate BT-31 or BT-63 on the seller, and BT-48 on the buyer (cac:AccountingCustomerParty/cac:PartyTaxScheme/cbc:CompanyID).
An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Intra-community supply" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48).
Same as BR-IC-02 but triggered by a document-level allowance. Both seller and buyer VAT IDs are required.
Fix: Populate BT-31 or BT-63 on the seller, and BT-48 on the buyer.
An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Intra-community supply" shall contain the Seller VAT Identifier (BT-31) or the Seller tax representative VAT identifier (BT-63) and the Buyer VAT identifier (BT-48).
Same as BR-IC-02 but triggered by a document-level charge. Both seller and buyer VAT IDs are required.
Fix: Populate BT-31 or BT-63 on the seller, and BT-48 on the buyer.
In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Intracommunity supply" the Invoiced item VAT rate (BT-152) shall be 0 (zero).
Intra-community supply lines are zero-rated because the buyer pays VAT in the destination country.
Fix: Set cbc:Percent to 0 inside cac:ClassifiedTaxCategory for the affected invoice line.
In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Intra-community supply" the Document level allowance VAT rate (BT-96) shall be 0 (zero).
Intra-community allowances must carry a 0% VAT rate.
Fix: Set cbc:Percent to 0 in the cac:TaxCategory of the allowance.
In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Intra-community supply" the Document level charge VAT rate (BT-103) shall be 0 (zero).
Intra-community charges must carry a 0% VAT rate.
Fix: Set cbc:Percent to 0 in the cac:TaxCategory of the charge.
In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Intra-community supply" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Intra-community supply".
The cbc:TaxableAmount in the intra-community subtotal must equal Σ line net amounts − Σ allowances + Σ charges for all items categorized as intra-community.
Fix: Recalculate cbc:TaxableAmount in the K cac:TaxSubtotal so it equals BT-131 − BT-92 + BT-99 for category K items.
The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Intra-community supply" shall be 0 (zero).
No VAT is charged on intra-community supplies, so cbc:TaxAmount must be 0.00.
Fix: Set cbc:TaxAmount to 0.00 in the cac:TaxSubtotal where cac:TaxCategory/cbc:ID is 'K'.
A VAT breakdown (BG-23) with the VAT Category code (BT-118) "Intra-community supply" shall have a VAT exemption reason code (BT-121), meaning "Intra-community supply" or the VAT exemption reason text (BT-120) "Intra-community supply" (or the equivalent standard text in another language).
Intra-community subtotals must explain the zero-rating via cbc:TaxExemptionReasonCode or cbc:TaxExemptionReason.
Fix: Add cbc:TaxExemptionReasonCode (e.g., 'vatex-eu-ic') and/or cbc:TaxExemptionReason (e.g., 'Intra-community supply') inside the K cac:TaxCategory.
In an Invoice with a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Intra-community supply" the Actual delivery date (BT-72) or the Invoicing period (BG-14) shall not be blank.
Intra-community invoices must specify when the goods were delivered or the period covered, for VAT reporting in the destination country.
Fix: Add cac:Delivery/cbc:ActualDeliveryDate (BT-72) or cac:InvoicePeriod with cbc:StartDate and cbc:EndDate (BG-14) to the invoice.
In an Invoice with a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Intra-community supply" the Deliver to country code (BT-80) shall not be blank.
Intra-community invoices must specify the destination country to determine which member state has taxing rights.
Fix: Add cac:Delivery/cac:DeliveryLocation/cac:Address/cac:Country/cbc:IdentificationCode (BT-80) with the destination country ISO code.
An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Not subject to VAT" shall contain exactly one VAT breakdown group (BG-23) with the VAT category code (BT-118) equal to "Not subject to VAT".
If any line, allowance, or charge uses VAT category O, the invoice must include exactly one cac:TaxSubtotal with cbc:ID = 'O' in the VAT breakdown.
Fix: Add a single cac:TaxSubtotal inside cac:TaxTotal with cac:TaxCategory/cbc:ID set to 'O'.
An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Not subject to VAT" shall not contain the Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) or the Buyer VAT identifier (BT-48).
When lines are outside the scope of VAT, the invoice must not contain seller VAT ID, tax representative VAT ID, or buyer VAT ID. This is the opposite of other categories.
Fix: Remove cac:PartyTaxScheme/cbc:CompanyID for the seller (BT-31), tax representative (BT-63), and buyer (BT-48). You may keep BT-32 (seller tax registration) if needed.
An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Not subject to VAT" shall not contain the Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) or the Buyer VAT identifier (BT-48).
Same as BR-O-02 but triggered by a document-level allowance. VAT identifiers for seller and buyer must be absent.
Fix: Remove BT-31, BT-63, and BT-48 from the invoice.
An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Not subject to VAT" shall not contain the Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) or the Buyer VAT identifier (BT-48).
Same as BR-O-02 but triggered by a document-level charge. VAT identifiers for seller and buyer must be absent.
Fix: Remove BT-31, BT-63, and BT-48 from the invoice.
An Invoice line (BG-25) where the VAT category code (BT-151) is "Not subject to VAT" shall not contain an Invoiced item VAT rate (BT-152).
Lines outside the scope of VAT must not specify a VAT rate at all -- not even 0%. The cbc:Percent element must be omitted.
Fix: Remove the cbc:Percent element entirely from cac:ClassifiedTaxCategory on the affected invoice line.
A Document level allowance (BG-20) where VAT category code (BT-95) is "Not subject to VAT" shall not contain a Document level allowance VAT rate (BT-96).
Allowances outside the scope of VAT must not specify a VAT rate. The cbc:Percent element must be omitted.
Fix: Remove the cbc:Percent element from the cac:TaxCategory of the allowance.
A Document level charge (BG-21) where the VAT category code (BT-102) is "Not subject to VAT" shall not contain a Document level charge VAT rate (BT-103).
Charges outside the scope of VAT must not specify a VAT rate. The cbc:Percent element must be omitted.
Fix: Remove the cbc:Percent element from the cac:TaxCategory of the charge.
In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Not subject to VAT" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Not subject to VAT".
The cbc:TaxableAmount in the O subtotal must equal Σ line net amounts − Σ allowances + Σ charges for all items categorized as not subject to VAT.
Fix: Recalculate cbc:TaxableAmount in the O cac:TaxSubtotal so it equals BT-131 − BT-92 + BT-99 for category O items.
The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Not subject to VAT" shall be 0 (zero).
Items outside the scope of VAT have no tax, so cbc:TaxAmount in the O subtotal must be 0.00.
Fix: Set cbc:TaxAmount to 0.00 in the cac:TaxSubtotal where cac:TaxCategory/cbc:ID is 'O'.
A VAT breakdown (BG-23) with VAT Category code (BT-118) "Not subject to VAT" shall have a VAT exemption reason code (BT-121), meaning "Not subject to VAT" or a VAT exemption reason text (BT-120) "Not subject to VAT" (or the equivalent standard text in another language).
The O subtotal must explain why VAT does not apply via cbc:TaxExemptionReasonCode or cbc:TaxExemptionReason.
Fix: Add cbc:TaxExemptionReasonCode (e.g., 'vatex-eu-o') and/or cbc:TaxExemptionReason (e.g., 'Not subject to VAT') inside the O cac:TaxCategory.
An Invoice that contains a VAT breakdown group (BG-23) with a VAT category code (BT-118) "Not subject to VAT" shall not contain other VAT breakdown groups (BG-23).
Category O is exclusive: if the invoice has an O subtotal, no other VAT categories (S, Z, E, AE, etc.) may appear in the breakdown.
Fix: Remove all cac:TaxSubtotal entries that have a cac:TaxCategory/cbc:ID other than 'O', or reclassify the affected items.
An Invoice that contains a VAT breakdown group (BG-23) with a VAT category code (BT-118) "Not subject to VAT" shall not contain an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is not "Not subject to VAT".
When category O is used in the VAT breakdown, every invoice line must also use category O. No mixing is allowed.
Fix: Set cac:ClassifiedTaxCategory/cbc:ID to 'O' on all invoice lines, or remove the O subtotal and use appropriate categories.
An Invoice that contains a VAT breakdown group (BG-23) with a VAT category code (BT-118) "Not subject to VAT" shall not contain Document level allowances (BG-20) where Document level allowance VAT category code (BT-95) is not "Not subject to VAT".
When category O is used in the VAT breakdown, every document-level allowance must also use category O.
Fix: Set cac:TaxCategory/cbc:ID to 'O' on all document-level allowances (cac:AllowanceCharge where ChargeIndicator is false).
An Invoice that contains a VAT breakdown group (BG-23) with a VAT category code (BT-118) "Not subject to VAT" shall not contain Document level charges (BG-21) where Document level charge VAT category code (BT-102) is not "Not subject to VAT".
When category O is used in the VAT breakdown, every document-level charge must also use category O.
Fix: Set cac:TaxCategory/cbc:ID to 'O' on all document-level charges (cac:AllowanceCharge where ChargeIndicator is true).
An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Standard rated" shall contain in the VAT breakdown (BG-23) at least one VAT category code (BT-118) equal with "Standard rated".
If any line, allowance, or charge uses VAT category S, the VAT breakdown must contain at least one cac:TaxSubtotal with cbc:ID = 'S'.
Fix: Add a cac:TaxSubtotal inside cac:TaxTotal with cac:TaxCategory/cbc:ID set to 'S' for each distinct standard VAT rate used.
An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Standard rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Standard-rated invoice lines require at least one seller tax identifier to be present on the invoice.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Standard rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Same as BR-S-02 but triggered by a document-level allowance. At least one seller tax ID is required.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
An Invoice that contains a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Standard rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Same as BR-S-02 but triggered by a document-level charge. At least one seller tax ID is required.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Standard rated" the Invoiced item VAT rate (BT-152) shall be greater than zero.
Standard-rated lines must have a positive VAT rate (e.g., 21%, 19%, 25%). A rate of 0 is not valid for category S.
Fix: Set cbc:Percent to the applicable standard VAT rate (e.g., 21) inside cac:ClassifiedTaxCategory. If the rate is 0, use category Z instead.
In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Standard rated" the Document level allowance VAT rate (BT-96) shall be greater than zero.
Standard-rated allowances must have a positive VAT rate.
Fix: Set cbc:Percent to the applicable standard rate in the allowance's cac:TaxCategory. If the rate should be 0, use category Z.
In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Standard rated" the Document level charge VAT rate (BT-103) shall be greater than zero.
Standard-rated charges must have a positive VAT rate.
Fix: Set cbc:Percent to the applicable standard rate in the charge's cac:TaxCategory. If the rate should be 0, use category Z.
For each different value of VAT category rate (BT-119) where the VAT category code (BT-118) is "Standard rated", the VAT category taxable amount (BT-116) in a VAT breakdown (BG-23) shall equal the sum of Invoice line net amounts (BT-131) plus the sum of document level charge amounts (BT-99) minus the sum of document level allowance amounts (BT-92) where the VAT category code (BT-151, BT-102, BT-95) is "Standard rated" and the VAT rate (BT-152, BT-103, BT-96) equals the VAT category rate (BT-119).
For each distinct standard rate, cbc:TaxableAmount must equal Σ line net amounts + Σ charges − Σ allowances for items at that same standard rate.
Fix: Recalculate cbc:TaxableAmount in each S cac:TaxSubtotal to match the sum of BT-131 + BT-99 − BT-92 filtered by category S and the matching cbc:Percent.
The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "Standard rated" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119).
The cbc:TaxAmount in each standard-rated subtotal must equal cbc:TaxableAmount × cbc:Percent / 100, rounded to two decimals.
Fix: Recalculate cbc:TaxAmount as round(cbc:TaxableAmount × cbc:Percent ÷ 100, 2) in the S cac:TaxSubtotal.
A VAT breakdown (BG-23) with VAT Category code (BT-118) "Standard rate" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120).
Standard-rated VAT is a taxed category, so exemption reason fields must not be present in the S subtotal.
Fix: Remove cbc:TaxExemptionReasonCode and cbc:TaxExemptionReason from the cac:TaxCategory where cbc:ID is 'S'.
An Invoice that contains an Invoice line (BG-25), a Document level allowance (BG-20) or a Document level charge (BG-21) where the VAT category code (BT-151, BT-95 or BT-102) is "Zero rated" shall contain in the VAT breakdown (BG-23) exactly one VAT category code (BT-118) equal with "Zero rated".
If any line, allowance, or charge uses VAT category Z, the invoice must include exactly one cac:TaxSubtotal with cbc:ID = 'Z' in the VAT breakdown.
Fix: Add a single cac:TaxSubtotal inside cac:TaxTotal with cac:TaxCategory/cbc:ID set to 'Z'.
An Invoice that contains an Invoice line where the Invoiced item VAT category code (BT-151) is "Zero rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Zero-rated invoice lines require at least one seller tax identifier to be present on the invoice.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
An Invoice that contains a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Zero rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Same as BR-Z-02 but triggered by a document-level allowance. At least one seller tax ID is required.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
An Invoice that contains a Document level charge where the Document level charge VAT category code (BT-102) is "Zero rated" shall contain the Seller VAT Identifier (BT-31), the Seller tax registration identifier (BT-32) and/or the Seller tax representative VAT identifier (BT-63).
Same as BR-Z-02 but triggered by a document-level charge. At least one seller tax ID is required.
Fix: Populate at least one of BT-31, BT-32, or BT-63 on the seller party.
In an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Zero rated" the Invoiced item VAT rate (BT-152) shall be 0 (zero).
Zero-rated lines must have a VAT rate of exactly 0%.
Fix: Set cbc:Percent to 0 inside cac:ClassifiedTaxCategory for the affected invoice line.
In a Document level allowance (BG-20) where the Document level allowance VAT category code (BT-95) is "Zero rated" the Document level allowance VAT rate (BT-96) shall be 0 (zero).
Zero-rated allowances must carry a 0% VAT rate.
Fix: Set cbc:Percent to 0 in the cac:TaxCategory of the allowance.
In a Document level charge (BG-21) where the Document level charge VAT category code (BT-102) is "Zero rated" the Document level charge VAT rate (BT-103) shall be 0 (zero).
Zero-rated charges must carry a 0% VAT rate.
Fix: Set cbc:Percent to 0 in the cac:TaxCategory of the charge.
In a VAT breakdown (BG-23) where VAT category code (BT-118) is "Zero rated" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amount (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Zero rated".
The cbc:TaxableAmount in the zero-rated subtotal must equal Σ line net amounts − Σ allowances + Σ charges for all items categorized as zero-rated.
Fix: Recalculate cbc:TaxableAmount in the Z cac:TaxSubtotal so it equals BT-131 − BT-92 + BT-99 for category Z items.
The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "Zero rated" shall equal 0 (zero).
Zero-rated supplies have no VAT, so cbc:TaxAmount in the Z subtotal must be 0.00.
Fix: Set cbc:TaxAmount to 0.00 in the cac:TaxSubtotal where cac:TaxCategory/cbc:ID is 'Z'.
A VAT breakdown (BG-23) with VAT Category code (BT-118) "Zero rated" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120).
Zero-rated VAT is a taxed category (at 0%), so exemption reason fields must not be present in the Z subtotal.
Fix: Remove cbc:TaxExemptionReasonCode and cbc:TaxExemptionReason from the cac:TaxCategory where cbc:ID is 'Z'.
Peppol BIS rules (PEPPOL-EN16931-*)
Rules added by the Peppol BIS Billing 3.0 profile on top of EN16931. These enforce Peppol network requirements like electronic addresses, process identifiers, and code list restrictions.
Mime code must be according to subset of IANA code list.
Peppol restricts attachment MIME types to a specific subset of IANA media types (e.g. application/pdf, image/png, image/jpeg, text/csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet). This is stricter than the base EN16931 rules which do not constrain MIME codes.
Fix: Set cbc:EmbeddedDocumentBinaryObject/@mimeCode to one of the Peppol-allowed values such as 'application/pdf', 'image/png', 'image/jpeg', 'text/csv', or 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'.
Reason code MUST be according to subset of UNCL 5189 D.16B.
Peppol requires that allowance reason codes use values from the UN/CEFACT code list 5189 (revision D.16B). This ensures interoperability by restricting allowance reasons to a well-defined, machine-readable set.
Fix: Set cbc:AllowanceChargeReasonCode on allowance entries to a valid UNCL 5189 D.16B code (e.g. '41' for early payment allowance, '42' for damage, '95' for discount).
Reason code MUST be according to UNCL 7161 D.16B.
Charge reason codes must come from the UN/CEFACT code list 7161 (revision D.16B). This is the Peppol-mandated code list for describing why a charge is applied.
Fix: Set cbc:AllowanceChargeReasonCode on charge entries to a valid UNCL 7161 D.16B code (e.g. 'AA' for advertising, 'ABL' for packing, 'FC' for freight, 'FI' for financing).
Invoice period description code must be according to UNCL 2005 D.16B.
When an invoice period description code is provided, it must use a value from UN/CEFACT code list 2005 (revision D.16B). This standardizes how the invoicing period is described (e.g. delivery date, payment date, invoice date).
Fix: Set cbc:DescriptionCode inside cac:InvoicePeriod to a valid UNCL 2005 D.16B value (e.g. '3' for invoice date, '35' for delivery date, '432' for paid to date).
Currency code must be according to ISO 4217:2005.
All currency codes used in the invoice must be valid ISO 4217:2005 three-letter currency codes. Peppol enforces this to guarantee machine-readable currency identification across borders.
Fix: Set cbc:DocumentCurrencyCode and all @currencyID attributes to a valid ISO 4217 code (e.g. 'EUR', 'USD', 'GBP', 'SEK', 'NOK', 'DKK').
Electronic address identifier scheme must be from the codelist "Electronic Address Identifier Scheme".
The @schemeID attribute on buyer and seller electronic addresses must use a value from the Peppol Electronic Address Identifier Scheme code list (e.g. '0088' for EAN/GLN, '0184' for Danish CVR, '0192' for Norwegian organization number). This is a Peppol-specific requirement not present in base EN16931.
Fix: Set cbc:EndpointID/@schemeID to a valid Peppol EAS code such as '0088' (GLN), '0184' (DK:CVR), '0190' (NL:KVK), '0192' (NO:ORG), '0151' (AU:ABN), or '0208' (BE:EN).
A date MUST be formatted YYYY-MM-DD.
Peppol requires all dates to use ISO 8601 format (YYYY-MM-DD) without time components. The base EN16931 rules check date presence but Peppol additionally enforces strict formatting.
Fix: Ensure all date elements (cbc:IssueDate, cbc:DueDate, cbc:TaxPointDate, cbc:StartDate, cbc:EndDate) use the format 'YYYY-MM-DD', e.g. '2025-01-15'.
Invoice type code MUST be set according to the profile.
For Peppol invoices, the invoice type code (BT-3) must be one of the allowed UNCL 1001 subset values for invoices (e.g. 380 for commercial invoice, 383 for debit note, 386 for prepayment invoice). Credit note codes are not allowed here.
Fix: Set cbc:InvoiceTypeCode to a valid Peppol invoice type: '380' (commercial invoice), '383' (debit note), '386' (prepayment invoice), '393' (factored invoice), or '326'/'384' (German-only types).
Credit note type code MUST be set according to the profile.
For Peppol credit notes, the credit note type code (BT-3) must be '381' (credit note) or another allowed value from the Peppol subset. Invoice type codes are not allowed on credit notes.
Fix: Set cbc:CreditNoteTypeCode to '381' (credit note) or another Peppol-allowed credit note type code.
Tax Category G MUST be used when exemption reason code is VATEX-EU-G.
When the VAT exemption reason code is 'VATEX-EU-G' (export outside the EU), the tax category code must be 'G'. Peppol enforces a strict mapping between VATEX codes and tax category codes to ensure consistency.
Fix: Set cac:TaxCategory → cbc:ID to 'G' when cac:TaxCategory → cbc:TaxExemptionReasonCode is 'VATEX-EU-G', or change the exemption reason code to match the tax category.
Tax Category O MUST be used when exemption reason code is VATEX-EU-O.
When the VAT exemption reason code is 'VATEX-EU-O' (not subject to VAT), the tax category code must be 'O'. This ensures that out-of-scope VAT items use the correct category.
Fix: Set cac:TaxCategory → cbc:ID to 'O' when cac:TaxCategory → cbc:TaxExemptionReasonCode is 'VATEX-EU-O', or change the exemption reason code to match.
Tax Category K MUST be used when exemption reason code is VATEX-EU-IC.
When the VAT exemption reason code is 'VATEX-EU-IC' (intra-Community supply), the tax category code must be 'K'. This enforces the Peppol mapping between intra-Community VAT exemptions and tax categories.
Fix: Set cac:TaxCategory → cbc:ID to 'K' when cac:TaxCategory → cbc:TaxExemptionReasonCode is 'VATEX-EU-IC', or change the exemption reason code to match.
Tax Category AE MUST be used when exemption reason code is VATEX-EU-AE.
When the VAT exemption reason code is 'VATEX-EU-AE' (reverse charge), the tax category code must be 'AE'. Peppol requires this specific pairing to flag reverse-charge transactions correctly.
Fix: Set cac:TaxCategory → cbc:ID to 'AE' when cac:TaxCategory → cbc:TaxExemptionReasonCode is 'VATEX-EU-AE', or change the exemption reason code to match.
Tax Category E MUST be used when exemption reason code is VATEX-EU-D.
When the VAT exemption reason code is 'VATEX-EU-D' (intra-Community acquisition from second-hand goods, works of art, collectors' items, and antiques), the tax category must be 'E' (exempt). Peppol maps several distinct EU Directive exemptions to category E.
Fix: Set cac:TaxCategory → cbc:ID to 'E' when cac:TaxCategory → cbc:TaxExemptionReasonCode is 'VATEX-EU-D', or change the exemption reason code to match.
Tax Category E MUST be used when exemption reason code is VATEX-EU-F.
When the VAT exemption reason code is 'VATEX-EU-F' (exemption under Article 132 of the VAT Directive, e.g. medical, educational, and social services), the tax category must be 'E' (exempt).
Fix: Set cac:TaxCategory → cbc:ID to 'E' when cac:TaxCategory → cbc:TaxExemptionReasonCode is 'VATEX-EU-F', or change the exemption reason code to match.
Tax Category E MUST be used when exemption reason code is VATEX-EU-I.
When the VAT exemption reason code is 'VATEX-EU-I' (exemption under Article 135 of the VAT Directive, e.g. financial and insurance services), the tax category must be 'E' (exempt).
Fix: Set cac:TaxCategory → cbc:ID to 'E' when cac:TaxCategory → cbc:TaxExemptionReasonCode is 'VATEX-EU-I', or change the exemption reason code to match.
Tax Category E MUST be used when exemption reason code is VATEX-EU-J.
When the VAT exemption reason code is 'VATEX-EU-J' (exemption under Article 136 of the VAT Directive, e.g. supplies of certain second-hand goods), the tax category must be 'E' (exempt).
Fix: Set cac:TaxCategory → cbc:ID to 'E' when cac:TaxCategory → cbc:TaxExemptionReasonCode is 'VATEX-EU-J', or change the exemption reason code to match.
Invoice type code 326 or 384 are only allowed when both buyer and seller are German organizations.
Invoice type codes 326 (partial invoice) and 384 (corrected invoice) are German CIUS extensions. Peppol only permits them when both trading partners have German country codes, ensuring these national variants do not leak into cross-border exchanges.
Fix: Either change cbc:InvoiceTypeCode to a standard Peppol type (e.g. '380') or ensure both cac:AccountingSupplierParty and cac:AccountingCustomerParty have cac:PostalAddress → cac:Country → cbc:IdentificationCode set to 'DE'.
Business process MUST be provided.
Peppol requires a business process identifier (BT-23) in every invoice. This is not required by base EN16931 but is mandatory in the Peppol BIS profile to enable correct message routing on the Peppol network.
Fix: Add cbc:ProfileID with the appropriate Peppol process identifier, e.g. 'urn:fdc:peppol.eu:2017:poacc:billing:01:1.0'.
No more than one note is allowed on document level, unless both the buyer and seller are German organizations.
Peppol restricts the invoice to a single document-level note (BT-22) to keep invoices concise. An exception is made for German-to-German invoices where multiple notes are allowed per the German CIUS.
Fix: Reduce cbc:Note elements at the document level to one. If multiple notes are needed, concatenate them into a single cbc:Note element, or ensure both parties have country code 'DE'.
A buyer reference or purchase order reference MUST be provided.
Peppol requires either a buyer reference (BT-10) or a purchase order reference (BT-13) to enable the buyer to match the invoice to their internal processes. At least one must be present.
Fix: Add cbc:BuyerReference with the buyer's reference code, or add cac:OrderReference → cbc:ID with the purchase order number.
Specification identifier MUST have the value 'urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0'.
The specification identifier (BT-24) must be the exact Peppol BIS Billing 3.0 customization ID. This tells receivers that the invoice conforms to the Peppol profile of EN16931.
Fix: Set cbc:CustomizationID to exactly 'urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0'.
VAT accounting currency code MUST be different from invoice currency code when provided.
If a tax currency code (BT-6) is provided, it must differ from the document currency code (BT-5). There is no point specifying a separate VAT accounting currency if it is the same as the invoice currency.
Fix: Either remove cbc:TaxCurrencyCode, or set it to a different ISO 4217 code than cbc:DocumentCurrencyCode.
Business process MUST be in the format 'urn:fdc:peppol.eu:2017:poacc:billing:NN:1.0' where NN indicates the process number.
The business process identifier (BT-23) must follow the exact Peppol URN pattern. This validates the format of ProfileID to ensure it matches one of the recognized Peppol billing processes.
Fix: Set cbc:ProfileID to a valid Peppol process URN, e.g. 'urn:fdc:peppol.eu:2017:poacc:billing:01:1.0' for the standard billing process.
Document MUST not contain empty elements.
Peppol forbids empty XML elements (elements with no text content and no meaningful attributes). This is stricter than EN16931 and ensures data quality across the network.
Fix: Remove any empty elements from the invoice XML, or populate them with valid content. Elements like <cbc:Note/> or <cbc:ID></cbc:ID> must either contain a value or be removed entirely.
Buyer electronic address MUST be provided.
Peppol requires the buyer's electronic address (BT-49) with a scheme identifier. This is essential for message routing on the Peppol network and is a Peppol-specific requirement beyond EN16931.
Fix: Add cac:AccountingCustomerParty → cac:Party → cbc:EndpointID with a valid value and @schemeID (e.g. schemeID='0088' for GLN, '0192' for NO:ORG).
Seller electronic address MUST be provided.
Peppol requires the seller's electronic address (BT-34) with a scheme identifier. This enables return messages and is mandatory for Peppol network identification.
Fix: Add cac:AccountingSupplierParty → cac:Party → cbc:EndpointID with a valid value and @schemeID (e.g. schemeID='0088' for GLN, '0192' for NO:ORG).
Allowance/charge amount must equal base amount * percentage/100 if base amount and percentage exists.
When both the base amount and percentage are provided on an allowance or charge, the calculated amount must match: amount = base amount * percentage / 100. Peppol enforces arithmetic consistency.
Fix: Ensure cbc:Amount equals cbc:BaseAmount times cbc:MultiplierFactorNumeric divided by 100 within cac:AllowanceCharge. Correct whichever value is wrong.
Allowance/charge base amount MUST be provided when allowance/charge percentage is provided.
If a percentage is given on an allowance or charge, the base amount it applies to must also be present. You cannot specify a percentage without the base amount to compute from.
Fix: Add cbc:BaseAmount inside cac:AllowanceCharge when cbc:MultiplierFactorNumeric (the percentage) is provided.
Allowance/charge percentage MUST be provided when allowance/charge base amount is provided.
If a base amount is given on an allowance or charge, the percentage must also be present. The base amount and percentage are a pair; you cannot provide one without the other.
Fix: Add cbc:MultiplierFactorNumeric inside cac:AllowanceCharge when cbc:BaseAmount is provided.
Allowance/charge ChargeIndicator value MUST equal 'true' or 'false'.
The ChargeIndicator element must be exactly 'true' (for charges) or 'false' (for allowances). Other boolean representations like '1', '0', 'yes', or 'no' are not accepted.
Fix: Set cbc:ChargeIndicator to exactly 'true' for charges or 'false' for allowances within each cac:AllowanceCharge element.
Charge on price level is NOT allowed. Only value 'false' allowed.
At the price level (cac:Price → cac:AllowanceCharge), only allowances (discounts) are permitted, not charges. The ChargeIndicator must be 'false' to indicate a price discount.
Fix: Set cac:Price → cac:AllowanceCharge → cbc:ChargeIndicator to 'false'. If you need to apply a surcharge, increase the item net price directly instead.
Item net price MUST equal (Gross price - Allowance amount) when gross price is provided.
When a gross price is provided with a price-level allowance, the net price must equal the gross price minus the allowance amount. This ensures pricing arithmetic is consistent.
Fix: Ensure cac:Price → cbc:PriceAmount equals cac:Price → cac:AllowanceCharge → cbc:BaseAmount minus cac:Price → cac:AllowanceCharge → cbc:Amount.
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).
Every @currencyID attribute in the invoice must match the document currency code, except for the tax total that represents VAT in the accounting currency. This prevents mixing currencies within a single invoice.
Fix: Set all @currencyID attributes to the same value as cbc:DocumentCurrencyCode. The only exception is the second cac:TaxTotal → cbc:TaxAmount/@currencyID which uses cbc:TaxCurrencyCode.
Only one tax total with tax subtotals MUST be provided.
An invoice must contain exactly one cac:TaxTotal element that includes cac:TaxSubtotal children. This is the primary tax breakdown in the document currency.
Fix: Ensure there is exactly one cac:TaxTotal element containing cac:TaxSubtotal elements. Remove any duplicate tax totals with subtotals.
Only one tax total without tax subtotals MUST be provided when tax currency code is provided.
When a separate tax currency (BT-6) is specified, there must be exactly one additional cac:TaxTotal element without cac:TaxSubtotal children. This element carries the VAT total in the accounting currency.
Fix: When cbc:TaxCurrencyCode is present, add a second cac:TaxTotal with only cbc:TaxAmount (using the tax currency) and no cac:TaxSubtotal children.
Invoice total VAT amount and Invoice total VAT amount in accounting currency MUST have the same operational sign.
Both the VAT amount in document currency and the VAT amount in accounting currency must be either both positive or both negative (or both zero). A sign mismatch indicates a conversion error.
Fix: Ensure the cbc:TaxAmount in both cac:TaxTotal elements have the same sign (both positive, both negative, or both zero).
Mandate reference MUST be provided for direct debit.
When the payment means code indicates direct debit (code '49'), a mandate reference identifier must be provided. This is required for SEPA direct debit processing.
Fix: Add cac:PaymentMeans → cac:PaymentMandate → cbc:ID with the direct debit mandate reference when cbc:PaymentMeansCode is '49'.
Only one project reference is allowed on document level.
Peppol limits the invoice to a single project reference (BT-11) at the document level. Multiple project references are not supported in the Peppol BIS profile.
Fix: Reduce cac:ProjectReference elements at the document level to one. If multiple projects apply, reference the primary project only.
Only one invoiced object is allowed per line.
Each invoice line may reference at most one invoiced object identifier (BT-128). This Peppol restriction ensures clear one-to-one mapping between lines and referenced objects.
Fix: Ensure each cac:InvoiceLine or cac:CreditNoteLine contains at most one cac:DocumentReference with cbc:DocumentTypeCode = '130' (invoiced object identifier).
Element Document reference can only be used for Invoice line object.
At the line level, cac:DocumentReference is only permitted for referencing an invoiced object (BT-128). Other document reference types must be placed at the document level, not on individual lines.
Fix: Ensure cac:DocumentReference within invoice lines uses cbc:DocumentTypeCode = '130'. Move any other document references to the document level.
Start date of line period MUST be within invoice period.
If both an invoice-level period and a line-level period are specified, the line period start date must fall within (or equal) the invoice period boundaries. This prevents lines from claiming service outside the invoice scope.
Fix: Ensure cac:InvoiceLine → cac:InvoicePeriod → cbc:StartDate is on or after the document-level cac:InvoicePeriod → cbc:StartDate and on or before the document-level cbc:EndDate.
End date of line period MUST be within invoice period.
If both an invoice-level period and a line-level period are specified, the line period end date must fall within (or equal) the invoice period boundaries.
Fix: Ensure cac:InvoiceLine → cac:InvoicePeriod → cbc:EndDate is on or after the document-level cac:InvoicePeriod → cbc:StartDate and on or before the document-level cbc:EndDate.
Invoice line net amount MUST equal (Invoiced quantity * (Item net price/item price base quantity) + Sum of invoice line charge amount - sum of invoice line allowance amount.
The line extension amount (BT-131) must be arithmetically correct: quantity times unit price (adjusted for base quantity), plus line charges, minus line allowances. Peppol enforces this calculation with rounding tolerance.
Fix: Ensure cbc:LineExtensionAmount = cbc:InvoicedQuantity * (cac:Price → cbc:PriceAmount / cac:Price → cbc:BaseQuantity) + line charges - line allowances. Correct any value that breaks this equation.
Base quantity MUST be a positive number above zero.
The price base quantity (BT-149) must be greater than zero. A zero or negative base quantity would make the unit price calculation undefined or nonsensical.
Fix: Set cac:Price → cbc:BaseQuantity to a positive number greater than zero (e.g. '1'). Remove it if you intend the default base quantity of 1.
Unit code of price base quantity MUST be same as invoiced quantity.
The unit of measure on the price base quantity (BT-150) must match the unit on the invoiced quantity (BT-130). You cannot price by kilograms but invoice by pieces.
Fix: Ensure cac:Price → cbc:BaseQuantity/@unitCode matches cbc:InvoicedQuantity/@unitCode (or cbc:CreditedQuantity/@unitCode) on the same invoice line.
Country-specific rules
Rules that apply only when the seller or buyer is in a specific country. These enforce local tax, format, and business requirements on top of the base Peppol rules.
Danish suppliers MUST provide legal entity (CVR-number)
When the seller is located in Denmark, the invoice must include the seller's CVR number (Central Business Register number) as the legal entity identifier.
Fix: Add the seller's 8-digit CVR number in the AccountingSupplierParty/Party/PartyLegalEntity/CompanyID element with schemeID "0184".
If ItemClassification is provided from Danish suppliers, UNSPSC version 19.05.01 or 26.08.01 should be used.
When a Danish supplier provides commodity classification codes on invoice lines, only UNSPSC versions 19.05.01 or 26.08.01 are accepted by the Danish infrastructure.
Fix: Ensure item classification codes use UNSPSC version 19.05.01 (listVersionID="19.0501") or 26.08.01 (listVersionID="26.0801"). Remove or update classifications using other versions.
When specifying non-VAT Taxes for Danish customers, Danish suppliers MUST use the AllowanceChargeReasonCode="ZZZ" and MUST be specified in AllowanceChargeReason; Either as the 4-digit Tax category or must include a #, but the # is not allowed as first and last character
Danish invoices with non-VAT taxes (e.g., environmental or excise taxes) must encode the tax category in allowance/charge reason fields using specific Danish conventions, with reason code ZZZ and a structured reason string.
Fix: Set AllowanceChargeReasonCode to "ZZZ" and provide the AllowanceChargeReason as either the 4-digit Danish tax category code or a description containing '#' (not as the first or last character).
For Danish suppliers the following Payment means codes are allowed: 1, 10, 31, 42, 48, 49, 50, 58, 59, 93 and 97
Only a restricted set of payment means codes are valid for Danish supplier invoices. Other codes such as 30 (credit transfer) are not permitted in the Danish Peppol profile.
Fix: Change PaymentMeansCode to one of the allowed values: 1 (not defined), 10 (cash), 31 (debit transfer), 42 (bank account), 48 (bank card), 49 (direct debit), 50 (Giro), 58 (SEPA credit), 59 (SEPA direct debit), 93 (FIK), or 97 (clearing).
For Danish suppliers bank account and registration account is mandatory if payment means is 31 or 42
When a Danish supplier specifies payment by debit transfer (31) or payment to bank account (42), the bank account number and registration number must be provided.
Fix: Add the PayeeFinancialAccount/ID (bank account number) and PayeeFinancialAccount/FinancialInstitutionBranch/ID (registration number) elements.
For Danish suppliers PaymentMandate/ID and PayerFinancialAccount/ID are mandatory when payment means is 49
When a Danish supplier uses payment means code 49 (direct debit), the direct debit mandate ID and the payer's financial account must be specified.
Fix: Add PaymentMandate/ID (the mandate reference) and PaymentMandate/PayerFinancialAccount/ID (the debtor's account number) to the PaymentMeans element.
For Danish Suppliers PaymentID is mandatory and MUST start with 01#, 04# or 15# (kortartkode), and PayeeFinancialAccount/ID (Giro kontonummer) is mandatory and must be 7 or 8 numerical characters long, when payment means equals 50 (Giro)
Danish Giro payments (code 50) require a structured PaymentID starting with the kortartkode prefix (01#, 04#, or 15#) and a valid 7- or 8-digit Giro account number.
Fix: Set PaymentID to start with "01#", "04#", or "15#" followed by the payment reference, and set PayeeFinancialAccount/ID to the 7- or 8-digit Giro account number.
For Danish Suppliers if the PaymentID is prefixed with 04# or 15# the 16 digits instruction Id must be added to the PaymentID eg. "04#1234567890123456" when Payment means equals 50 (Giro)
When using Danish Giro payments with kortartkode 04 or 15, the PaymentID must include a 16-digit instruction ID after the prefix to form a complete payment reference.
Fix: Append the 16-digit instruction ID directly after the prefix, e.g., "04#1234567890123456" or "15#1234567890123456".
For Danish Suppliers the PaymentID is mandatory and MUST start with 71#, 73# or 75# (kortartkode) and CreditAccount/AccountID (Kreditornummer) is mandatory and MUST be exactly 8 characters long, when Payment means equals 93 (FIK)
Danish FIK payments (code 93) require a structured PaymentID starting with 71#, 73#, or 75# and an 8-character creditor number (Kreditornummer).
Fix: Set PaymentID starting with "71#", "73#", or "75#" and provide the PayeeFinancialAccount/ID as an exactly 8-character creditor number.
For Danish Suppliers if the PaymentID is prefixed with 71# or 75# the 15-16 digits instruction Id must be added to the PaymentID eg. "71#1234567890123456" when payment Method equals 93 (FIK)
When using Danish FIK payments with kortartkode 71 or 75, the PaymentID must include a 15- or 16-digit instruction ID after the prefix.
Fix: Append the 15- or 16-digit instruction ID directly after the prefix, e.g., "71#123456789012345" or "75#1234567890123456".
For Danish Suppliers it is mandatory to use schemeID when PartyIdentification/ID is used for AccountingCustomerParty or AccountingSupplierParty
Danish invoices require that every party identification (for both supplier and customer) includes an explicit schemeID attribute to identify the numbering scheme used.
Fix: Add the schemeID attribute to all PartyIdentification/ID elements on both AccountingSupplierParty and AccountingCustomerParty (e.g., schemeID="0184" for CVR, schemeID="0198" for GLN).
For Danish Suppliers it is mandatory to specify schemeID as "0184" (DK CVR-number) when PartyLegalEntity/CompanyID is used for AccountingSupplierParty
The Danish supplier's legal entity CompanyID must use schemeID "0184", which designates the Danish CVR (Central Business Register) number.
Fix: Set the schemeID attribute on AccountingSupplierParty/Party/PartyLegalEntity/CompanyID to "0184".
For Danish Suppliers, a Credit note cannot have a negative total (PayableAmount)
Danish credit notes must have a zero or positive PayableAmount. A negative total on a credit note is not allowed in the Danish Peppol profile.
Fix: Ensure LegalMonetaryTotal/PayableAmount is zero or positive. If the net effect is a payment to the customer, issue a credit note with a positive amount rather than a negative PayableAmount.
When the Supplier is Greek, the Invoice Id should consist of 6 segments
Greek suppliers must use a structured invoice ID format with 6 segments separated by pipe characters, as required for integration with the Greek IAPR/myDATA tax reporting system.
Fix: Format the invoice ID (BT-1) as 6 pipe-separated segments following the IAPR convention, e.g., "TIN|series|aa|invoiceType|mark|uid".
When the Supplier is Greek, the Invoice Id first segment must be a valid TIN Number and match either the Supplier's or the Tax Representative's Tin Number
The first segment of a Greek invoice ID must be a valid Greek TIN (AFM) that matches the supplier or their tax representative, ensuring consistency with IAPR/myDATA reporting.
Fix: Set the first segment of the invoice ID to the supplier's Greek TIN (AFM) number, or the tax representative's TIN if one is appointed.
For the Greek Suppliers, the VAT must start with 'EL' and must be a valid TIN number
Greek supplier VAT numbers must use the 'EL' country prefix (not 'GR') followed by a valid 9-digit Greek TIN (AFM), as required by the Greek tax authority.
Fix: Set the supplier's VAT number (BT-31) to start with "EL" followed by the 9-digit Greek TIN, e.g., "EL123456789".
When Supplier is Greek, there must be one MARK Number
Greek invoices must include exactly one MARK (Unique Registration Number) assigned by the IAPR/myDATA system, which proves the invoice was reported to the Greek tax authority.
Fix: Add a single AdditionalDocumentReference with DocumentDescription set to the MARK number obtained from the IAPR/myDATA platform.
When Supplier is Greek, the MARK Number must be a positive integer
The MARK number assigned by Greece's IAPR/myDATA system must be a positive integer value, as it is a sequential registration number from the tax authority.
Fix: Ensure the MARK number in AdditionalDocumentReference/ID is a positive whole number with no decimals, spaces, or non-numeric characters.
Greek Suppliers must provide the VAT number of the buyer, if the buyer is Greek
When both supplier and buyer are Greek, the buyer's VAT number (BT-48) must be provided for domestic transaction reporting via IAPR/myDATA.
Fix: Add the buyer's Greek VAT number in AccountingCustomerParty/Party/PartyTaxScheme/CompanyID, prefixed with "EL".
When Supplier is Greek, there should be no more than one invoice url
Greek invoices transmitted via Peppol must not contain more than one invoice URL in the additional document references, as this could cause ambiguity in IAPR/myDATA processing.
Fix: Remove any duplicate invoice URL entries from AdditionalDocumentReference, keeping at most one URL reference.
Greek suppliers that send an invoice through the PEPPOL network must use a correct TIN number as an electronic address according to PEPPOL Electronic Address Identifier scheme (schemeID 9933).
The Greek supplier's Peppol endpoint must use scheme 9933 (Greek TIN-based electronic address) with a valid Greek TIN number.
Fix: Set the seller's EndpointID schemeID to "9933" and the value to the supplier's valid Greek TIN (AFM) number.
Greek Suppliers that send an invoice through the PEPPOL network to a greek buyer must use a correct TIN number as an electronic address according to PEPPOL Electronic Address Identifier scheme (SchemeID 9933)
When a Greek supplier invoices a Greek buyer via Peppol, the buyer's endpoint must also use scheme 9933 with a valid Greek TIN as the electronic address identifier.
Fix: Set the buyer's EndpointID schemeID to "9933" and the value to the buyer's valid Greek TIN (AFM) number.
When Supplier is Greek, there should be one invoice url
Greek suppliers are expected to include an invoice URL in the additional document references, typically linking to the invoice on the IAPR/myDATA platform for verification.
Fix: Add an AdditionalDocumentReference containing the invoice URL that links to the published invoice on the IAPR/myDATA platform.
Greek suppliers must provide their Seller Tax Registration Number, prefixed by the country code
Greek suppliers should include their tax registration number (BT-32) with the 'EL' country prefix for proper identification in Greek tax reporting.
Fix: Add the Seller Tax Registration Identifier (BT-32) in PartyTaxScheme/CompanyID with the "EL" prefix followed by the TIN, e.g., "EL123456789".
If seller is icelandic then invoice type should be 380 or 381
Icelandic suppliers should use invoice type 380 (commercial invoice) or 381 (credit note). Other invoice type codes may not be supported by Icelandic systems.
Fix: Set the InvoiceTypeCode (BT-3) to 380 for invoices or 381 for credit notes.
If seller is icelandic then it shall contain sellers legal id
Icelandic suppliers must provide their kennitala (Icelandic national ID / business registration number) as the seller's legal entity identifier (BT-30).
Fix: Add the seller's 10-digit Icelandic kennitala in PartyLegalEntity/CompanyID (BT-30).
If seller is icelandic then it shall contain his address with street name and zip code
Icelandic suppliers must provide a complete postal address including both street name (BT-35) and postal code (BT-38).
Fix: Add the seller's street name in PostalAddress/StreetName (BT-35) and postal code in PostalAddress/PostalZone (BT-38).
If seller and buyer are icelandic then the invoice shall contain the buyers icelandic legal identifier
When both seller and buyer are located in Iceland, the buyer's kennitala (Icelandic national ID / business registration number) must be included as the buyer's legal entity identifier (BT-47).
Fix: Add the buyer's 10-digit Icelandic kennitala in AccountingCustomerParty/Party/PartyLegalEntity/CompanyID (BT-47).
If seller and buyer are icelandic then the invoice shall contain the buyers address with street name and zip code
When both seller and buyer are Icelandic, the buyer's postal address must include both the street name (BT-50) and postal code (BT-53).
Fix: Add the buyer's street name in PostalAddress/StreetName (BT-50) and postal code in PostalAddress/PostalZone (BT-53).
If seller is icelandic and payment means code is 9 then a 12 digit account id must exist
When an Icelandic supplier uses payment means code 9 (national payment claim / krafa), the payment account must be a 12-digit Icelandic bank account number consisting of bank number, ledger code 66, and account number.
Fix: Set PayeeFinancialAccount/ID (BT-84) to a 12-digit Icelandic account number (4-digit bank number + ledger 66 + account number).
If seller is icelandic and payment means code is 42 then a 12 digit account id must exist
When an Icelandic supplier uses payment means code 42 (bank transfer), the payment account must be a valid 12-digit Icelandic bank account number.
Fix: Set PayeeFinancialAccount/ID (BT-84) to a 12-digit Icelandic bank account number.
If seller is icelandic and invoice contains supporting description EINDAGI then the id form must be YYYY-MM-DD
When an Icelandic supplier includes an EINDAGI (final due date) as a supporting document description, the associated ID must be a valid date in YYYY-MM-DD format.
Fix: Set the ID of the AdditionalDocumentReference with DocumentDescription "EINDAGI" to a date in YYYY-MM-DD format, e.g., "2026-03-15".
If seller is icelandic and invoice contains supporting description EINDAGI invoice must have due date
When an Icelandic invoice includes an EINDAGI (final due date) entry, the invoice must also have a regular due date (BT-9) specified.
Fix: Add the DueDate element (BT-9) to the invoice when an EINDAGI supporting document is present.
If seller is icelandic and invoice contains supporting description EINDAGI the id date must be same or later than due date
The Icelandic EINDAGI (final due date) must be equal to or later than the invoice's regular due date (BT-9), as the final due date cannot precede the standard payment term.
Fix: Ensure the EINDAGI date in AdditionalDocumentReference/ID is on or after the invoice DueDate (BT-9).
BT-32 (Seller tax registration identifier) - For Italian suppliers BT-32 minimum length 11 and maximum length shall be 16.
Italian suppliers must provide a tax registration identifier (BT-32) that is between 11 and 16 characters, accommodating the Italian Codice Fiscale (16 chars) or Partita IVA (11 chars).
Fix: Set the Seller Tax Registration Identifier (BT-32) to the Italian Codice Fiscale (16 characters) or Partita IVA (11 characters prefixed with "IT").
BT-35 (Seller address line 1) - Italian suppliers MUST provide the postal address line 1.
Italian suppliers are required to provide the first line of their postal address (street name) as mandated by Italian e-invoicing regulations.
Fix: Add the seller's street address in PostalAddress/StreetName (BT-35).
BT-37 (Seller city) - Italian suppliers MUST provide the postal address city.
Italian suppliers must include their city name in the postal address, as required by Italian fiscal regulations.
Fix: Add the seller's city in PostalAddress/CityName (BT-37).
BT-38 (Seller post code) - Italian suppliers MUST provide the postal address post code.
Italian suppliers must provide their CAP (Codice di Avviamento Postale / Italian postal code) in the seller's address.
Fix: Add the seller's 5-digit Italian CAP in PostalAddress/PostalZone (BT-38).
For suppliers in the Netherlands, if the document is a creditnote, the document MUST contain an invoice reference (cac:BillingReference/cac:InvoiceDocumentReference/cbc:ID)
Dutch credit notes must always reference the original invoice they relate to. This is a mandatory requirement for Dutch suppliers to enable proper matching of credits to invoices.
Fix: Add a BillingReference/InvoiceDocumentReference/ID element containing the original invoice number that this credit note relates to.
For suppliers in the Netherlands the supplier's address (cac:AccountingSupplierParty/cac:Party/cac:PostalAddress) MUST contain street name (cbc:StreetName), city (cbc:CityName) and post code (cbc:PostalZone)
Dutch suppliers must provide a complete postal address with street name, city, and postal code. Partial addresses are not accepted under Dutch Peppol requirements.
Fix: Add StreetName (BT-35), CityName (BT-37), and PostalZone (BT-38) to the seller's PostalAddress.
For suppliers in the Netherlands, the legal entity identifier MUST be either a KVK or OIN number (schemeID 0106 or 0190)
Dutch suppliers must identify themselves using either a KVK number (Kamer van Koophandel / Chamber of Commerce, schemeID 0106) or an OIN number (Organisatie Identificatie Nummer, schemeID 0190).
Fix: Set PartyLegalEntity/CompanyID with schemeID "0106" for a KVK number or "0190" for an OIN number.
For suppliers in the Netherlands, if the customer is in the Netherlands, the customer address (cac:AccountingCustomerParty/cac:Party/cac:PostalAddress) MUST contain the street name (cbc:StreetName), the city (cbc:CityName) and post code (cbc:PostalZone)
When a Dutch supplier invoices a Dutch customer, the customer's address must also be complete with street name, city, and postal code.
Fix: Add StreetName (BT-50), CityName (BT-52), and PostalZone (BT-53) to the buyer's PostalAddress.
For suppliers in the Netherlands, if the customer is in the Netherlands, the customer's legal entity identifier MUST be either a KVK or OIN number (schemeID 0106 or 0190)
When both parties are Dutch, the buyer must also be identified with either a KVK number (schemeID 0106) or OIN number (schemeID 0190).
Fix: Set the buyer's PartyLegalEntity/CompanyID with schemeID "0106" (KVK) or "0190" (OIN).
For suppliers in the Netherlands, if the fiscal representative is in the Netherlands, the representative's address (cac:TaxRepresentativeParty/cac:PostalAddress) MUST contain street name (cbc:StreetName), city (cbc:CityName) and post code (cbc:PostalZone)
When a Dutch supplier has a Dutch tax representative, that representative's postal address must include street name, city, and postal code.
Fix: Add StreetName, CityName, and PostalZone to the TaxRepresentativeParty/PostalAddress.
For suppliers in the Netherlands, the supplier MUST provide a means of payment (cac:PaymentMeans) if the payment is from customer to supplier
Dutch invoices where the customer owes payment to the supplier must include payment means information. This is mandatory so the buyer knows how to pay.
Fix: Add a PaymentMeans element with the appropriate PaymentMeansCode and payment account details.
For suppliers in the Netherlands, if the customer is in the Netherlands, the payment means code (cac:PaymentMeans/cbc:PaymentMeansCode) MUST be one of 30, 48, 49, 57, 58 or 59
Domestic Dutch-to-Dutch invoices only allow specific payment means codes: credit transfer (30), bank card (48), direct debit (49), standing agreement (57), SEPA credit transfer (58), or SEPA direct debit (59).
Fix: Set PaymentMeansCode to one of the allowed values: 30, 48, 49, 57, 58, or 59.
For suppliers in the Netherlands, if an order line reference (cac:OrderLineReference/cbc:LineID) is used, there must be an order reference on the document level (cac:OrderReference/cbc:ID)
Dutch invoices that reference order line numbers at the line level must also include the order number at the document level, to ensure the line references can be resolved.
Fix: Add an OrderReference/ID element at the document level with the purchase order number, in addition to any OrderLineReference/LineID at the invoice line level.
For Norwegian suppliers, a VAT number MUST be the country code prefix NO followed by a valid Norwegian organization number (nine numbers) followed by the letters MVA.
Norwegian VAT numbers must follow the strict format NO + 9-digit organisation number + MVA (e.g., NO123456789MVA). The organisation number is assigned by the Bronnoysund Register Centre.
Fix: Set the supplier's CompanyID in PartyTaxScheme to the format "NO" + 9-digit org number + "MVA", e.g., "NO987654321MVA".
For Norwegian suppliers, most invoice issuers are required to append "Foretaksregisteret" to their invoice.
Norwegian companies registered as AS (aksjeselskap), ASA (allmennaksjeselskap), or foreign branch companies must include the text "Foretaksregisteret" (the Norwegian Register of Business Enterprises) on their invoices, as required by the Norwegian Business Register Act section 10-2.
Fix: Add "Foretaksregisteret" in the AdditionalDocumentReference or as a note on the invoice, typically in PartyLegalEntity/RegistrationName or an InvoiceNote.
For Swedish suppliers, Swedish VAT-numbers must consist of 14 characters.
Swedish VAT numbers must be exactly 14 characters long, following the format "SE" + 10-digit organisation number + "01" (e.g., SE1234567890 01).
Fix: Set the supplier's VAT number to exactly 14 characters in the format "SE" + 10 digits + "01", e.g., "SE123456789001".
For Swedish suppliers, the Swedish VAT-numbers must have the trailing 12 characters in numeric form
After the "SE" prefix, all remaining 12 characters of a Swedish VAT number must be digits. Letters or special characters in the numeric portion are not allowed.
Fix: Ensure the VAT number after the "SE" prefix contains only digits, e.g., "SE123456789001".
Swedish organisation numbers should be numeric.
Swedish organisation numbers (organisationsnummer) must consist entirely of numeric characters. They are 10-digit numbers assigned by Bolagsverket (Swedish Companies Registration Office).
Fix: Ensure the organisation number contains only digits (0-9) with no spaces, hyphens, or other characters.
Swedish organisation numbers consist of 10 characters.
A Swedish organisation number (organisationsnummer) must be exactly 10 digits long, in the format NNNNNN-NNNN (though without the hyphen in the XML).
Fix: Set the organisation number to exactly 10 digits, e.g., "1234567890". Do not include hyphens or spaces.
For Swedish suppliers, when using Seller tax registration identifier, 'Godkand for F-skatt' must be stated
Swedish suppliers who provide a tax registration identifier (BT-32) must include the text "Godkand for F-skatt" (approved for F-tax), which is a legal requirement for Swedish businesses holding F-tax certification.
Fix: Set the Seller Tax Registration Identifier (BT-32) to the text "Godkand for F-skatt" (or the equivalent with Swedish characters).
For Swedish suppliers, only standard VAT rate of 6, 12 or 25 are used
Sweden has three standard VAT rates: 6% (books, newspapers, transport), 12% (food, hotels, restaurants), and 25% (standard rate). No other non-zero VAT rates are valid.
Fix: Set the VAT rate (BT-119/BT-152) to 6, 12, or 25 for taxable items. Use 0 for exempt or zero-rated categories.
For Swedish suppliers using Plusgiro, the Account ID must be numeric
When a Swedish supplier provides a Plusgiro account number, it must contain only numeric characters.
Fix: Ensure PayeeFinancialAccount/ID contains only digits when using Plusgiro as the payment method.
For Swedish suppliers using Bankgiro, the Account ID must be numeric
When a Swedish supplier provides a Bankgiro account number, it must contain only numeric characters.
Fix: Ensure PayeeFinancialAccount/ID contains only digits when using Bankgiro as the payment method.
For Swedish suppliers using Bankgiro, the Account ID must have 7-8 characters
Swedish Bankgiro account numbers are 7 or 8 digits long. Account IDs outside this range are invalid Bankgiro numbers.
Fix: Set PayeeFinancialAccount/ID to a 7- or 8-digit Bankgiro number.
For Swedish suppliers using Plusgiro, the Account ID must have 2-8 characters
Swedish Plusgiro account numbers are between 2 and 8 digits long. Account IDs outside this range are invalid Plusgiro numbers.
Fix: Set PayeeFinancialAccount/ID to a 2- to 8-digit Plusgiro number.
For Swedish suppliers using Swedish Bankgiro or Plusgiro, the proper way to indicate this is to use Code 30 for PaymentMeans and FinancialInstitutionBranch ID with code SE:BANKGIRO or SE:PLUSGIRO
Swedish Bankgiro and Plusgiro payments must be indicated using payment means code 30 (credit transfer) combined with FinancialInstitutionBranch/ID set to "SE:BANKGIRO" or "SE:PLUSGIRO".
Fix: Set PaymentMeansCode to "30" and FinancialInstitutionBranch/ID to "SE:BANKGIRO" or "SE:PLUSGIRO" as appropriate.
For domestic transactions between Swedish trading partners, credit transfer should be indicated by PaymentMeansCode="30"
Domestic Swedish-to-Swedish invoices should use payment means code 30 (credit transfer) rather than other codes like 58 (SEPA credit transfer).
Fix: Set PaymentMeansCode to "30" for domestic Swedish transactions.
The last digit of a Swedish organization number must be valid according to the Luhn algorithm.
Swedish organisation numbers use a Luhn check digit as the last digit. This rule validates the mathematical correctness of the organisation number to catch typos and invalid numbers.
Fix: Verify the organisation number's check digit using the Luhn algorithm. Correct any transcription errors in the 10-digit organisation number.
Validate your invoice
Upload a UBL XML file to our free Peppol Validator and get instant validation against all EN16931 and Peppol BIS 3.0 rules. Errors link back to this reference.
Common questions
What is the difference between EN16931 and Peppol BIS 3.0 rules?
EN16931 (the BR-* rules) is the European standard for e-invoicing semantics. It defines what a valid European electronic invoice looks like. Peppol BIS Billing 3.0 (the PEPPOL-EN16931-* rules) adds network-specific constraints on top: electronic addresses, process identifiers, code list restrictions, and stricter element requirements. An invoice must pass both layers to be valid on the Peppol network.
Why does my invoice fail BR-CO-10 even though the amounts look correct?
BR-CO-10 checks that the sum of all line net amounts equals the document-level LineExtensionAmount. The most common cause is a rounding mismatch: each line is rounded to 2 decimals independently, and the document total is also rounded. If you calculate the total from unrounded line amounts and then round, you can get a 1-cent difference. Always sum the already-rounded line amounts.
What does PEPPOL-EN16931-R008 (empty elements) mean in practice?
Peppol does not allow empty XML elements. If your system generates <cbc:Note/> or <cbc:PaymentID></cbc:PaymentID> with no text content, the validation will fail. The fix is simple: don't include elements you have no data for. Only add optional elements when you actually have a value to put in them.
Do country-specific rules always apply?
Country-specific rules (NL-R-*, DK-R-*, SE-R-*, IT-R-*, GR-R-*, NO-R-*, IS-R-*) only fire when the seller or buyer is identified as being in that country, based on the country code in their postal address or the scheme of their electronic address. If neither party is in the country, the rule is skipped.
How many decimal places are allowed in monetary amounts?
All monetary amounts (prices, totals, tax amounts, allowances, charges) must have at most 2 decimal places. The BR-DEC-* rules enforce this. Note that unit prices (BT-146) can have more decimals, but all amounts that represent money in the document currency must be rounded to 2. This is a common trap when generating invoices programmatically, always round before writing the XML.
What are EN16931 business term groups (BG-) and information elements (BT-)?
EN16931 defines an invoice as a tree of business term groups (BG) containing information elements (BT). The most-cited groups are: BG-4 SELLER, BG-5 SELLER POSTAL ADDRESS, BG-7 BUYER, BG-8 BUYER POSTAL ADDRESS, BG-10 PAYEE, BG-13 DELIVERY INFORMATION, BG-16 PAYMENT INSTRUCTIONS, BG-22 DOCUMENT TOTALS, BG-23 VAT BREAKDOWN, BG-24 ADDITIONAL SUPPORTING DOCUMENTS, BG-25 INVOICE LINE, BG-30 LINE VAT INFORMATION. The most-cited terms are BT-1 Invoice number, BT-2 Issue date, BT-3 Invoice type code, BT-5 Invoice currency code, BT-31 Seller VAT identifier, BT-121 Supporting document description, BT-122 Supporting document reference, and BT-146 Item net price. BR-* rules reference these IDs in their error messages, so looking up a BG or BT here points to the right field on the invoice.
What does 'AdditionalDocumentReference DocumentTypeCode mandatory' mean?
Inside BG-24 (Additional Supporting Documents), every cac:AdditionalDocumentReference element shall carry a DocumentTypeCode (BT-17 / cbc:DocumentTypeCode) when used to attach a supporting document. Peppol BIS Billing 3.0 enforces this through PEPPOL-EN16931 rules: each additional supporting document shall contain a supporting document reference (BT-122) and a document type code identifying its purpose (e.g. 130 for invoice data, 916 for related document). Omitting DocumentTypeCode or leaving it empty triggers a validation error.
What is the EmbeddedDocumentBinaryObject empty rule?
PEPPOL-EN16931-R008 forbids empty XML elements anywhere in the invoice. The most common offender is cac:Attachment / cbc:EmbeddedDocumentBinaryObject inside BG-24: senders include the element as a placeholder but leave its base64 content empty. The fix is to omit the entire AdditionalDocumentReference when no attachment is included, or populate EmbeddedDocumentBinaryObject with valid base64 data and a mimeCode/filename attribute. Empty <cbc:EmbeddedDocumentBinaryObject/> always fails Peppol validation.
What do the BR-CO calculation rules check (BR-CO-09 to BR-CO-26)?
BR-CO rules verify cross-field calculations on the invoice. BR-CO-09 checks the Seller VAT identifier carries a valid country prefix. BR-CO-10 sums line net amounts to the document LineExtensionAmount. BR-CO-11 to BR-CO-14 verify document-level allowance, charge, taxable, and VAT totals. BR-CO-15 verifies amount including VAT. BR-CO-17 checks per-VAT-category that tax amount equals taxable amount times rate. BR-CO-25 requires payment due date or payment terms when there is a positive amount payable. BR-CO-26 requires a seller legal registration or VAT identifier when none is provided. Most failures are rounding mismatches: always sum the already-rounded line amounts rather than rounding the sum.
What are BR-S, BR-Z, BR-E, BR-AE, BR-IC, BR-O, BR-G VAT category rules?
Each VAT category code in EN16931 has its own rule family that constrains which fields must be present on the invoice line and in the VAT breakdown. BR-S covers Standard rate, BR-Z Zero rated, BR-E Exempt from VAT, BR-AE Reverse charge, BR-IC Intra-community supply, BR-O Not subject to VAT, BR-G Export outside the EU. For each category, rules like BR-S-08, BR-Z-08, BR-E-08 check that a VAT breakdown (BG-23) exists per category code and that the VAT rate in the breakdown matches the rates used on invoice lines (BG-30). Mixing categories on one invoice is allowed, but each category needs its own BG-23 entry.