Peppol Validation Errors

Every EN16931, Peppol BIS Billing 3.0 and XRechnung (BR-DE) 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.

BR-CL-*

EN16931 code list rules. These check coded values against the official lists (e.g. BR-CL-23 for UN/ECE unit codes).

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.

BR-DE-*, BR-DEX-*, BR-TMP-*

XRechnung 3.0 rules from the KoSIT schematron (German CIUS). They apply only to XRechnung files, which are checked against EN16931 + BR-DE instead of the full Peppol BIS rule set (e.g. BR-DE-15 requires the buyer reference / Leitweg-ID). Validate them with the XRechnung validator.

PDF-01 to PDF-21

Checks on the PDF of a ZUGFeRD / Factur-X invoice, not on its XML: the embedded XML, its file specification, the XMP metadata and PDF/A-3 (basic check, not a full PDF/A validation). They run when you upload a PDF (e.g. PDF-03: no embedded invoice XML). Validate them with the ZUGFeRD validator.

ADV-*

Data quality hints, not part of the official rules: values that pass validation but often cause trouble, such as a VAT identifier with spaces or the electronic address "unknown" (e.g. ADV-VAT). The result page lists them in their own section; they never make an invoice invalid.

Error messages name invoice fields by business term number, such as BT-49 (Buyer electronic address) or BT-29 (Seller identifier). Look up any BT in the EN16931 business terms reference.

Document-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.

BR-01fatal

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.

BR-02fatal

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.

BR-03fatal

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.

BR-04fatal

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).

BR-05fatal

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).

BR-06fatal

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.

BR-07fatal

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.

BR-08fatal

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.

BR-09fatal

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.

BR-10fatal

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.

BR-11fatal

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.

BR-12fatal

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.

BR-13fatal

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.

BR-14fatal

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.

BR-15fatal

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.

BR-16fatal

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.

BR-17fatal

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.

BR-18fatal

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.

BR-19fatal

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.

BR-20fatal

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.

BR-21fatal

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).

BR-22fatal

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.

BR-23fatal

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).

BR-24fatal

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.

BR-25fatal

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.

BR-26fatal

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.

BR-27fatal

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.

BR-28fatal

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.

BR-29fatal

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.

BR-30fatal

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.

BR-31fatal

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.

BR-32fatal

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).

BR-33fatal

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).

BR-36fatal

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.

BR-37fatal

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.

BR-38fatal

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).

BR-41fatal

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.

BR-42fatal

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).

BR-43fatal

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.

BR-44fatal

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).

BR-45fatal

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.

BR-46fatal

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.

BR-47fatal

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).

BR-48fatal

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).

BR-49fatal

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).

BR-50fatal

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.

BR-51warning

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.

BR-52fatal

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.

BR-53fatal

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.

BR-54fatal

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.

BR-55fatal

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.

BR-56fatal

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.

BR-57fatal

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.

BR-61fatal

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.

BR-62fatal

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).

BR-63fatal

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).

BR-64fatal

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).

BR-65fatal

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).

BR-66fatal

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.

BR-67fatal

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. The Invoice line net amount (BT-131, cbc:LineExtensionAmount) in Peppol and EN16931 can have at most 2 digits after the decimal point. 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.

Code list rules (BR-CL-*)

Rules that check coded values against the official EN16931 code lists, such as unit codes. These fire when a code is not on the list.

Unit code MUST be coded according to the UN/ECE Recommendation 20 with Rec 21 extension.

Every unitCode attribute on cbc:InvoicedQuantity, cbc:CreditedQuantity and cbc:BaseQuantity must be a code from UN/ECE Recommendation 20, or a Recommendation 21 packaging code with the X prefix. Values like PCE, pcs or Stk are not on the list. In XRechnung the KoSIT rules lower BR-CL-23 to a warning; in Peppol BIS Billing 3.0 it is a fatal error.

Fix: Replace the unitCode value with a valid code, for example C62 (one / unit), H87 (piece), KGM (kilogram), HUR (hour) or XBX (box). Use the same code on cbc:BaseQuantity and the invoiced quantity.

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'.

BR-B-01fatal

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.

BR-B-02fatal

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.

BR-E-01fatal

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.

BR-E-02fatal

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.

BR-E-03fatal

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.

BR-E-04fatal

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.

BR-E-05fatal

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.

BR-E-06fatal

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.

BR-E-07fatal

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.

BR-E-08fatal

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.

BR-E-09fatal

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'.

BR-E-10fatal

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.

BR-G-01fatal

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'.

BR-G-02fatal

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).

BR-G-03fatal

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.

BR-G-04fatal

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.

BR-G-05fatal

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.

BR-G-06fatal

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.

BR-G-07fatal

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.

BR-G-08fatal

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.

BR-G-09fatal

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'.

BR-G-10fatal

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.

BR-O-01fatal

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'.

BR-O-02fatal

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.

BR-O-03fatal

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.

BR-O-04fatal

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.

BR-O-05fatal

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.

BR-O-06fatal

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.

BR-O-07fatal

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.

BR-O-08fatal

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.

BR-O-09fatal

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'.

BR-O-10fatal

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.

BR-O-11fatal

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.

BR-O-12fatal

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.

BR-O-13fatal

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).

BR-O-14fatal

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).

BR-S-01fatal

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.

BR-S-02fatal

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.

BR-S-03fatal

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.

BR-S-04fatal

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.

BR-S-05fatal

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.

BR-S-06fatal

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.

BR-S-07fatal

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.

BR-S-08fatal

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.

BR-S-09fatal

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.

BR-S-10fatal

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'.

BR-Z-01fatal

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'.

BR-Z-02fatal

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.

BR-Z-03fatal

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.

BR-Z-04fatal

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.

BR-Z-05fatal

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.

BR-Z-06fatal

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.

BR-Z-07fatal

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.

BR-Z-08fatal

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.

BR-Z-09fatal

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'.

BR-Z-10fatal

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. In Peppol BIS Billing 3.0 the rule has the flag fatal: it is an error, not a warning, so one empty element makes the whole invoice invalid.

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. For a wrong line net amount, see PEPPOL-EN16931-R120.

Fix: Ensure cac:Price → cbc:BaseQuantity/@unitCode matches cbc:InvoicedQuantity/@unitCode (or cbc:CreditedQuantity/@unitCode) on the same invoice line.

XRechnung rules (BR-DE-*, KoSIT)

German CIUS rules from the KoSIT XRechnung 3.0 schematron. They apply only to invoices whose specification identifier (BT-24) is XRechnung (urn:xeinkauf.de:kosit:xrechnung_3.0), on top of EN 16931. XRechnung files are not checked against the full Peppol BIS rule set; only the few PEPPOL-EN16931 rules that KoSIT adopted into XRechnung (such as R001 and R010) still apply. The official messages are in German, as published by KoSIT.

BR-DE-1fatal

Eine Rechnung (INVOICE) muss Angaben zu "PAYMENT INSTRUCTIONS" (BG-16) enthalten.

XRechnung makes the PAYMENT INSTRUCTIONS group (BG-16) mandatory, although it is optional in EN 16931. German public buyers need to know how to pay before they can approve the invoice, so at least one payment means block with a Payment means type code (BT-81) must be present.

Fix: Add a cac:PaymentMeans block with cbc:PaymentMeansCode (e.g. 58 for SEPA credit transfer, 30 for credit transfer) and the payee account in cac:PayeeFinancialAccount. In CII, add ram:SpecifiedTradeSettlementPaymentMeans under ram:ApplicableHeaderTradeSettlement.

BR-DE-2fatal

Die Gruppe "SELLER CONTACT" (BG-6) muss übermittelt werden.

XRechnung requires the SELLER CONTACT group (BG-6), so the buyer always has a named contact with phone and email for queries. In EN 16931 this group is optional; in XRechnung it is mandatory and its sub-elements are checked by BR-DE-5, BR-DE-6 and BR-DE-7.

Fix: Add cac:Contact under cac:AccountingSupplierParty → cac:Party with cbc:Name, cbc:Telephone and cbc:ElectronicMail. In CII, add ram:DefinedTradeContact under ram:ApplicableHeaderTradeAgreement → ram:SellerTradeParty with ram:PersonName, ram:TelephoneUniversalCommunication/ram:CompleteNumber and ram:EmailURIUniversalCommunication/ram:URIID.

BR-DE-3fatal

Das Element "Seller city" (BT-37) muss übermittelt werden.

XRechnung requires the Seller city (BT-37) in the seller postal address. EN 16931 only requires the country code, but German public buyers need the full address.

Fix: Add a non-empty cbc:CityName to cac:AccountingSupplierParty → cac:Party → cac:PostalAddress. In CII, add ram:CityName to ram:ApplicableHeaderTradeAgreement → ram:SellerTradeParty → ram:PostalTradeAddress.

BR-DE-4fatal

Das Element "Seller post code" (BT-38) muss übermittelt werden.

XRechnung requires the Seller post code (BT-38) in the seller postal address, in addition to the country code that EN 16931 requires.

Fix: Add a non-empty cbc:PostalZone to cac:AccountingSupplierParty → cac:Party → cac:PostalAddress. In CII, add ram:PostcodeCode to ram:ApplicableHeaderTradeAgreement → ram:SellerTradeParty → ram:PostalTradeAddress.

BR-DE-5fatal

Das Element "Seller contact point" (BT-41) muss übermittelt werden.

The seller contact (BG-6) must name a Seller contact point (BT-41): a person or department the buyer can contact about the invoice.

Fix: Add a non-empty cbc:Name inside cac:AccountingSupplierParty → cac:Party → cac:Contact. In CII, add ram:PersonName or ram:DepartmentName inside ram:SellerTradeParty → ram:DefinedTradeContact.

BR-DE-6fatal

Das Element "Seller contact telephone number" (BT-42) muss übermittelt werden.

XRechnung requires the Seller contact telephone number (BT-42) in the seller contact (BG-6). BR-DE-27 additionally expects at least three digits in the value.

Fix: Add a non-empty cbc:Telephone inside cac:AccountingSupplierParty → cac:Party → cac:Contact. In CII, add ram:TelephoneUniversalCommunication → ram:CompleteNumber inside ram:SellerTradeParty → ram:DefinedTradeContact.

BR-DE-7fatal

Das Element "Seller contact email address" (BT-43) muss übermittelt werden.

XRechnung requires the Seller contact email address (BT-43) in the seller contact (BG-6). BR-DE-28 additionally checks that the value looks like a valid email address.

Fix: Add a non-empty cbc:ElectronicMail inside cac:AccountingSupplierParty → cac:Party → cac:Contact. In CII, add ram:EmailURIUniversalCommunication → ram:URIID inside ram:SellerTradeParty → ram:DefinedTradeContact.

BR-DE-8fatal

Das Element "Buyer city" (BT-52) muss übermittelt werden.

XRechnung requires the Buyer city (BT-52) in the buyer postal address. EN 16931 only requires the buyer country code.

Fix: Add a non-empty cbc:CityName to cac:AccountingCustomerParty → cac:Party → cac:PostalAddress. In CII, add ram:CityName to ram:ApplicableHeaderTradeAgreement → ram:BuyerTradeParty → ram:PostalTradeAddress.

BR-DE-9fatal

Das Element "Buyer post code" (BT-53) muss übermittelt werden.

XRechnung requires the Buyer post code (BT-53) in the buyer postal address.

Fix: Add a non-empty cbc:PostalZone to cac:AccountingCustomerParty → cac:Party → cac:PostalAddress. In CII, add ram:PostcodeCode to ram:ApplicableHeaderTradeAgreement → ram:BuyerTradeParty → ram:PostalTradeAddress.

Das Element "Deliver to city" (BT-77) muss übermittelt werden, wenn die Gruppe "DELIVER TO ADDRESS" (BG-15) übermittelt wird.

If the invoice contains a DELIVER TO ADDRESS (BG-15), XRechnung requires the Deliver to city (BT-77) in it. An address without a city is not usable for the receiving authority.

Fix: Add a non-empty cbc:CityName to cac:Delivery → cac:DeliveryLocation → cac:Address, or remove the empty delivery address. In CII, add ram:CityName to ram:ApplicableHeaderTradeDelivery → ram:ShipToTradeParty → ram:PostalTradeAddress.

Das Element "Deliver to post code" (BT-78) muss übermittelt werden, wenn die Gruppe "DELIVER TO ADDRESS" (BG-15) übermittelt wird.

If the invoice contains a DELIVER TO ADDRESS (BG-15), XRechnung requires the Deliver to post code (BT-78) in it.

Fix: Add a non-empty cbc:PostalZone to cac:Delivery → cac:DeliveryLocation → cac:Address. In CII, add ram:PostcodeCode to ram:ApplicableHeaderTradeDelivery → ram:ShipToTradeParty → ram:PostalTradeAddress.

Das Element "VAT category rate" (BT-119) muss übermittelt werden.

Every VAT breakdown (BG-23) must carry a VAT category rate (BT-119) in XRechnung, although EN 16931 itself makes this element optional. Use 0 when no VAT is charged in that category.

Fix: Add cbc:Percent inside cac:TaxTotal → cac:TaxSubtotal → cac:TaxCategory for every subtotal (e.g. 19, 7 or 0). In CII, add ram:RateApplicablePercent to each ram:ApplicableTradeTax under ram:ApplicableHeaderTradeSettlement.

Das Element "Buyer reference" (BT-10) muss übermittelt werden.

XRechnung requires the Buyer reference (BT-10) on every invoice. For invoices to German public authorities this is normally the Leitweg-ID, the routing identifier the buyer gives you (format like 991-12345-67). Without it the invoice cannot be routed to the correct office and is usually rejected. For non-public buyers, use the reference the buyer asked for.

Fix: Add a non-empty cbc:BuyerReference at the Invoice (or CreditNote) root, after cbc:DocumentCurrencyCode, with the Leitweg-ID from the buyer. In CII, add ram:BuyerReference under ram:ApplicableHeaderTradeAgreement.

Wenn in einer Rechnung die Steuercodes S, Z, E, AE, K, G, L oder M verwendet werden, muss mindestens eines der Elemente "Seller VAT identifier" (BT-31), "Seller tax registration identifier" (BT-32) oder "SELLER TAX REPRESENTATIVE PARTY" (BG-11) übermittelt werden.

If any VAT category code S, Z, E, AE, K, G, L or M is used (on the document, on a document-level allowance or charge, or on a line), the seller must be identifiable for tax purposes: provide the Seller VAT identifier (BT-31), the Seller tax registration identifier (BT-32, the German Steuernummer) or a SELLER TAX REPRESENTATIVE PARTY (BG-11).

Fix: Add cac:AccountingSupplierParty → cac:Party → cac:PartyTaxScheme with cbc:CompanyID (e.g. DE123456789) and cac:TaxScheme/cbc:ID = VAT for BT-31, or with cac:TaxScheme/cbc:ID other than VAT (e.g. FC) for the Steuernummer (BT-32), or add cac:TaxRepresentativeParty. In CII, add ram:SpecifiedTaxRegistration with ram:ID schemeID="VA" (BT-31) or schemeID="FC" (BT-32) under ram:SellerTradeParty.

BR-DE-17warning

Mit dem Element "Invoice type code" (BT-3) sollen ausschließlich folgende Codes aus der Codeliste UNTDID 1001 übermittelt werden: 326 (Partial invoice), 380 (Commercial invoice), 384 (Corrected invoice), 389 (Self-billed invoice) und 381 (Credit note),875 (Partial construction invoice), 876 (Partial final construction invoice), 877 (Final construction invoice).

XRechnung only expects a subset of UNTDID 1001 invoice type codes (BT-3): 326 partial invoice, 380 commercial invoice, 384 corrected invoice, 389 self-billed invoice, 381 credit note, and 875, 876, 877 for construction invoices. Other codes produce this warning.

Fix: Set cbc:InvoiceTypeCode (or cbc:CreditNoteTypeCode) to one of 326, 380, 381, 384, 389, 875, 876 or 877. In CII, set rsm:ExchangedDocument → ram:TypeCode.

Skonto Zeilen in [Element] müssen diesem regulärem Ausdruck entsprechen: [XR-SKONTO-REGEX]. Die Informationen zur Gewährung von Skonto müssen wie folgt im Element "Payment terms" (BT-20) übermittelt werden: Anzugeben ist im ersten Segment "SKONTO", im zweiten "TAGE=n", im dritten "PROZENT=n". Prozentzahlen sind ohne Vorzeichen sowie mit Punkt getrennt von zwei Nachkommastellen anzugeben. Liegt dem zu berechnenden Betrag nicht BT-115, "fälliger Betrag" zugrunde, sondern nur ein Teil des fälligen Betrags der Rechnung, ist der Grundwert zur Berechnung von Skonto als viertes Segment "BASISBETRAG=n" gemäß dem semantischen Datentypen Amount anzugeben. Jeder Eintrag beginnt mit einer #, die Segmente sind mit einer # getrennt und eine Zeile schließt mit einer # ab. Am Ende einer vollständigen Skontoangabe muss ein XML-konformer Zeilenumbruch folgen. Alle Angaben zur Gewährung von Skonto müssen in Großbuchstaben gemacht werden. Zusätzliches Whitespace (Leerzeichen, Tabulatoren oder Zeilenumbrüche) ist nicht zulässig. Andere Zeichen oder Texte als in den oberen Vorgaben genannt sind nicht zulässig.

XRechnung defines a machine-readable syntax for cash discount (Skonto) terms in Payment terms (BT-20). Each Skonto line must look like #SKONTO#TAGE=14#PROZENT=2.00# with an optional #BASISBETRAG=n.nn# segment, in upper case, without extra spaces, and the text must end with a line break after the last Skonto line.

Fix: Write each Skonto line in cac:PaymentTerms → cbc:Note exactly as #SKONTO#TAGE=14#PROZENT=2.00# (two decimals, dot separator), one per line, and end the note with a newline. In CII, use ram:SpecifiedTradePaymentTerms → ram:Description under ram:ApplicableHeaderTradeSettlement. Put free-text terms on lines that do not start with #.

BR-DE-19warning

"Payment account identifier" (BT-84) soll eine korrekte IBAN enthalten, wenn in "Payment means type code" (BT-81) mit dem Code 58 SEPA als Zahlungsmittel gefordert wird.

When the Payment means type code (BT-81) is 58 (SEPA credit transfer), the Payment account identifier (BT-84) should be a valid IBAN. The rule checks the format and the IBAN check digits.

Fix: Put a valid IBAN without spaces in cac:PaymentMeans → cac:PayeeFinancialAccount → cbc:ID. In CII, use ram:PayeePartyCreditorFinancialAccount → ram:IBANID. If the account is not an IBAN, use code 30 instead of 58.

BR-DE-20warning

"Debited account identifier" (BT-91) soll eine korrekte IBAN enthalten, wenn in "Payment means type code" (BT-81) mit dem Code 59 SEPA als Zahlungsmittel gefordert wird.

When the Payment means type code (BT-81) is 59 (SEPA direct debit), the Debited account identifier (BT-91) should be a valid IBAN of the buyer's account.

Fix: Put a valid IBAN without spaces in cac:PaymentMeans → cac:PaymentMandate → cac:PayerFinancialAccount → cbc:ID. In CII, use ram:PayerPartyDebtorFinancialAccount → ram:IBANID.

BR-DE-21warning

Das Element "Specification identifier" (BT-24) soll syntaktisch der Kennung des Standards XRechnung entsprechen.

The Specification identifier (BT-24) should be the XRechnung identifier, so receivers know the invoice follows the German CIUS. For XRechnung 3.0 the value is urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0 (or the extension or CVD variants). This validator runs the KoSIT rules only when BT-24 contains the XRechnung 3.0 URN, so here the warning means the value is close but not exactly one of the three valid identifiers (standard, extension, CVD), for example because of surrounding whitespace or an extra suffix.

Fix: Set cbc:CustomizationID to urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0. In CII, set rsm:ExchangedDocumentContext → ram:GuidelineSpecifiedDocumentContextParameter → ram:ID to the same value. If you send via Peppol, use the XRechnung identifier together with the Peppol ProfileID.

Das "filename"-Attribut aller "EmbeddedDocumentBinaryObject"-Elemente muss eindeutig sein

Every embedded attachment (BT-125) must have a unique filename attribute. Duplicate file names make it impossible for the receiver to store or reference attachments reliably.

Fix: Give each cbc:EmbeddedDocumentBinaryObject in cac:AdditionalDocumentReference → cac:Attachment a distinct @filename. In CII, make each ram:AttachmentBinaryObject/@filename unique.

Wenn BT-81 "Payment means type code" einen Schlüssel für Überweisungen enthält (30, 58), muss BG-17 "CREDIT TRANSFER" übermittelt werden.

When the Payment means type code (BT-81) is a credit transfer code (30 or 58), the CREDIT TRANSFER group (BG-17) must be present, so the buyer knows which account to pay into.

Fix: Add cac:PayeeFinancialAccount with cbc:ID (the IBAN) inside the cac:PaymentMeans that has code 30 or 58. In CII, add ram:PayeePartyCreditorFinancialAccount → ram:IBANID (or ram:ProprietaryID) inside ram:SpecifiedTradeSettlementPaymentMeans.

Wenn BT-81 "Payment means type code" einen Schlüssel für Überweisungen enthält (30, 58), dürfen BG-18 und BG-19 nicht übermittelt werden.

A credit transfer (code 30 or 58) cannot also carry PAYMENT CARD INFORMATION (BG-18) or DIRECT DEBIT (BG-19) data in the same payment means.

Fix: Remove cac:CardAccount and cac:PaymentMandate from the cac:PaymentMeans with code 30 or 58, or use a separate payment means with the correct code. In CII, remove ram:ApplicableTradeSettlementFinancialCard, ram:DirectDebitMandateID, ram:CreditorReferenceID and ram:PayerPartyDebtorFinancialAccount.

Wenn BT-81 "Payment means type code" einen Schlüssel für Kartenzahlungen enthält (48, 54, 55), muss genau BG-18 "PAYMENT CARD INFORMATION" übermittelt werden.

When the Payment means type code (BT-81) is a card payment code (48, 54 or 55), the PAYMENT CARD INFORMATION group (BG-18) must be present.

Fix: Add cac:CardAccount with cbc:PrimaryAccountNumberID (only the last 4 to 6 digits) and cbc:NetworkID inside the cac:PaymentMeans. In CII, add ram:ApplicableTradeSettlementFinancialCard inside ram:SpecifiedTradeSettlementPaymentMeans.

Wenn BT-81 "Payment means type code" einen Schlüssel für Kartenzahlungen enthält (48, 54, 55), dürfen BG-17 und BG-19 nicht übermittelt werden.

A card payment (code 48, 54 or 55) cannot also carry CREDIT TRANSFER (BG-17) or DIRECT DEBIT (BG-19) data in the same payment means.

Fix: Remove cac:PayeeFinancialAccount and cac:PaymentMandate from the cac:PaymentMeans with a card code. In CII, remove ram:PayeePartyCreditorFinancialAccount and the direct debit elements.

Wenn BT-81 "Payment means type code" einen Schlüssel für Lastschriften enthält (59), muss genau BG-19 "DIRECT DEBIT" übermittelt werden.

When the Payment means type code (BT-81) is 59 (SEPA direct debit), the DIRECT DEBIT group (BG-19) must be present.

Fix: Add cac:PaymentMandate with cbc:ID (mandate reference) and cac:PayerFinancialAccount → cbc:ID (debited IBAN) inside the cac:PaymentMeans. In CII, add ram:DirectDebitMandateID, ram:CreditorReferenceID and ram:PayerPartyDebtorFinancialAccount → ram:IBANID under ram:ApplicableHeaderTradeSettlement.

Wenn BT-81 "Payment means type code" einen Schlüssel für Lastschriften enthält (59), dürfen BG-17 und BG-18 nicht übermittelt werden.

A direct debit (code 59) cannot also carry CREDIT TRANSFER (BG-17) or PAYMENT CARD INFORMATION (BG-18) data in the same payment means.

Fix: Remove cac:PayeeFinancialAccount and cac:CardAccount from the cac:PaymentMeans with code 59. In CII, remove ram:PayeePartyCreditorFinancialAccount, the financial institution elements and ram:ApplicableTradeSettlementFinancialCard.

BR-DE-26warning

Wenn im Element "Invoice type code" (BT-3) der Code 384 (Corrected invoice) übergeben wird, soll PRECEDING INVOICE REFERENCE BG-3 mind. einmal vorhanden sein.

A corrected invoice (Invoice type code BT-3 = 384) should reference the invoice it corrects through PRECEDING INVOICE REFERENCE (BG-3).

Fix: Add cac:BillingReference → cac:InvoiceDocumentReference → cbc:ID (and preferably cbc:IssueDate) with the original invoice number. In CII, add ram:InvoiceReferencedDocument → ram:IssuerAssignedID under ram:ApplicableHeaderTradeSettlement.

BR-DE-27warning

In BT-42 sollen mindestens drei Ziffern enthalten sein.

The Seller contact telephone number (BT-42) should contain at least three digits. Placeholder values such as "-" or "n/a" trigger this warning.

Fix: Put a real phone number in cac:AccountingSupplierParty → cac:Party → cac:Contact → cbc:Telephone (e.g. +49 30 1234567). In CII, use ram:TelephoneUniversalCommunication → ram:CompleteNumber.

BR-DE-28warning

In BT-43 soll genau ein @-Zeichen enthalten sein, welches nicht von einem Leerzeichen, einem Punkt, aber mindestens zwei Zeichen auf beiden Seiten flankiert werden soll. Ein Punkt sollte nicht am Anfang oder am Ende stehen.

The Seller contact email address (BT-43) should be a plausible email address: exactly one @, no spaces, and a domain with at least one dot that does not start or end with a dot.

Fix: Put a valid address in cac:AccountingSupplierParty → cac:Party → cac:Contact → cbc:ElectronicMail (e.g. invoices@example.de). In CII, use ram:EmailURIUniversalCommunication → ram:URIID.

Wenn "DIRECT DEBIT" BG-19 vorhanden ist, dann muss "Bank assigned creditor identifier" BT-90 übermittelt werden.

If DIRECT DEBIT (BG-19) is present, the Bank assigned creditor identifier (BT-90, the SEPA creditor ID) must be given, because the buyer's bank needs it to execute the debit.

Fix: Add cac:PartyIdentification → cbc:ID with schemeID="SEPA" (the creditor ID, e.g. DE98ZZZ09999999999) under cac:AccountingSupplierParty → cac:Party or cac:PayeeParty. In CII, add ram:CreditorReferenceID under ram:ApplicableHeaderTradeSettlement.

Wenn "DIRECT DEBIT" BG-19 vorhanden ist, dann muss "Debited account identifier" BT-91 übermittelt werden.

If DIRECT DEBIT (BG-19) is present, the Debited account identifier (BT-91) must be given: the buyer's account that will be debited.

Fix: Add cac:PaymentMeans → cac:PaymentMandate → cac:PayerFinancialAccount → cbc:ID with the buyer's IBAN. In CII, add ram:PayerPartyDebtorFinancialAccount → ram:IBANID inside ram:SpecifiedTradeSettlementPaymentMeans.

Das Element "Contract reference" (BT-12) muss übermittelt werden.

Applies only to XRechnung invoices that declare the CVD (Clean Vehicles Directive) specification identifier. These invoices must carry a Contract reference (BT-12) so the vehicle procurement can be reported.

Fix: Add cac:ContractDocumentReference → cbc:ID with the contract number. In CII, add ram:ContractReferencedDocument → ram:IssuerAssignedID under ram:ApplicableHeaderTradeAgreement.

Das Element "Tender or lot reference" (BT-17) muss übermittelt werden.

Applies only to CVD (Clean Vehicles Directive) XRechnung invoices. They must carry the Tender or lot reference (BT-17) of the procurement.

Fix: Add cac:OriginatorDocumentReference → cbc:ID with the tender or lot number. In CII, add ram:AdditionalReferencedDocument with ram:TypeCode 50 and ram:IssuerAssignedID.

In einer Rechnung muss mindestens eine INVOICE LINE (BG-25) enthalten sein, in der der Scheme identifier von "Item classification identifier" (BT-158) den Wert 'CVD' und der "Item attribute name" (BT-160) den Wert 'cva' enthält.

A CVD (Clean Vehicles Directive) invoice must contain at least one invoice line (BG-25) that identifies a vehicle: an Item classification identifier (BT-158) with scheme CVD and an item attribute (BT-160) named cva.

Fix: On the vehicle line, add cac:Item → cac:CommodityClassification → cbc:ItemClassificationCode with listID="CVD" (e.g. M1) and cac:AdditionalItemProperty with cbc:Name = cva and cbc:Value = clean, zero-emission or other. In CII, use ram:DesignatedProductClassification → ram:ClassCode listID="CVD" and ram:ApplicableProductCharacteristic with ram:Description = cva.

Ein "Item classification identifier" (BT-158) mit dem Scheme identifier 'CVD' muss einen Wert aus der Liste der zulässigen Fahrzeugkategorien enthalten.

In a CVD invoice, an Item classification identifier (BT-158) with scheme CVD must be a permitted vehicle category: M1, M2, M3, N1, N2 or N3.

Fix: Set cbc:ItemClassificationCode with listID="CVD" (CII: ram:ClassCode listID="CVD") to one of M1, M2, M3, N1, N2, N3.

Wenn innerhalb von ITEM ATTRIBUTES (BG-32) der "Item attribute name" (BT-160) den Wert 'cva' hat, muss der "Item attribute value" (BT-161) einen der zulässigen Werte enthalten.

In a CVD invoice, the item attribute named cva (BT-160) must have one of the permitted values (BT-161): clean, zero-emission or other.

Fix: Set cac:AdditionalItemProperty → cbc:Value (where cbc:Name = cva) to clean, zero-emission or other. In CII, set ram:ApplicableProductCharacteristic → ram:Value.

Wenn der Scheme identifier von "Item classification identifier" (BT-158) mit dem Wert 'CVD' angegeben ist, muss in derselben Rechnungszeile genau ein "Item attribute name" (BT-160) mit dem Wert 'cva' vorhanden sein.

In a CVD invoice, a line with a CVD item classification (BT-158) must have exactly one item attribute named cva (BT-160).

Fix: On each line that has an ItemClassificationCode with listID="CVD", add exactly one cac:AdditionalItemProperty with cbc:Name = cva (CII: one ram:ApplicableProductCharacteristic with ram:Description = cva).

Wenn "Item attribute name" (BT-160) mit dem Wert 'cva' angegeben ist, muss in derselben Rechnungszeile genau ein "Item classification identifier" (BT-158) mit dem Scheme identifier 'CVD' vorhanden sein.

In a CVD invoice, a line with an item attribute named cva (BT-160) must have exactly one item classification (BT-158) with scheme CVD.

Fix: On each line with a cva attribute, add exactly one cac:CommodityClassification → cbc:ItemClassificationCode with listID="CVD" (CII: one ram:DesignatedProductClassification → ram:ClassCode listID="CVD").

BR-DE-TMP-32information

Eine Rechnung sollte zur Angabe des Liefer-/Leistungsdatums entweder BT-72 "Actual delivery date", BG-14 "Invoicing period" oder in jeder Rechnungsposition BG-26 "Invoice line period" enthalten.

German VAT law requires the date of delivery or service on an invoice. XRechnung therefore recommends one of: Actual delivery date (BT-72), an Invoicing period (BG-14), or an Invoice line period (BG-26) on every line. This is an information-level hint and does not make the invoice invalid.

Fix: Add cac:Delivery → cbc:ActualDeliveryDate, or cac:InvoicePeriod with cbc:StartDate and cbc:EndDate at document level, or cac:InvoicePeriod on every line. In CII, use ram:ActualDeliverySupplyChainEvent → ram:OccurrenceDateTime or ram:BillingSpecifiedPeriod.

Das Element [Element] "Attached Document" (BT-125) benutzt einen nicht zulässigen MIME-Code: [mimeCode]. Im Falle einer Extension darf zusätzlich zu der Liste der mime codes (definiert in Abschnitt 8.2, "Binary Object") der MIME-Code application/xml genutzt werden.

Applies only to invoices that declare the XRechnung extension identifier. Attached documents (BT-125) may use the standard MIME codes (application/pdf, image/png, image/jpeg, text/csv, xlsx, ods) plus application/xml. Other MIME codes are rejected.

Fix: Set @mimeCode on cbc:EmbeddedDocumentBinaryObject (CII: ram:AttachmentBinaryObject) to one of application/pdf, image/png, image/jpeg, text/csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.oasis.opendocument.spreadsheet or application/xml.

BR-DEX-02warning

Der Wert von "Invoice line net amount" (BT-131) einer "INVOICE LINE" (BG-25) oder einer "SUB INVOICE LINE" (BG-DEX-01) soll der Summe der "Invoice line net amount" (BT-131) der direkt darunterliegenden "SUB INVOICE LINE" (BG-DEX-01) entsprechen.

XRechnung extension invoices can use sub invoice lines (BG-DEX-01). The Invoice line net amount (BT-131) of a line that has sub lines should equal the sum of the net amounts of its direct sub lines.

Fix: Recalculate cbc:LineExtensionAmount on each cac:InvoiceLine and cac:SubInvoiceLine so it equals the sum of cbc:LineExtensionAmount of its direct cac:SubInvoiceLine children.

Eine Sub Invoice Line (BG-DEX-01) muss genau eine "SUB INVOICE LINE VAT INFORMATION" (BG-DEX-06) enthalten.

In an XRechnung extension invoice, every sub invoice line (BG-DEX-01) must carry exactly one VAT information block (BG-DEX-06).

Fix: Add exactly one cac:ClassifiedTaxCategory (with cbc:ID, cbc:Percent and cac:TaxScheme) inside cac:SubInvoiceLine → cac:Item.

Any scheme identifier in [Element] MUST be coded using one of the ISO 6523 ICD list.

In an XRechnung extension invoice, the schemeID of a party identifier must be an ISO 6523 ICD code (the SEPA scheme is also allowed for the seller and payee creditor ID).

Fix: Set @schemeID on cac:PartyIdentification → cbc:ID (CII: ram:GlobalID) to a valid ISO 6523 ICD code such as 0088 (GLN) or 0204 (Leitweg-ID), or remove the attribute.

Any scheme identifier in [Element] MUST be coded using one of the ISO 6523 ICD list.

In an XRechnung extension invoice, the schemeID of a legal registration identifier must be an ISO 6523 ICD code.

Fix: Set @schemeID on cac:PartyLegalEntity → cbc:CompanyID (CII: ram:ID in the legal organization) to a valid ISO 6523 ICD code, or remove the attribute.

Any scheme identifier in [Element] MUST be coded using one of the ISO 6523 ICD list.

In an XRechnung extension invoice, the schemeID of an item standard identifier must be an ISO 6523 ICD code (e.g. 0160 for GTIN).

Fix: Set @schemeID on cac:StandardItemIdentification → cbc:ID (CII: ram:SpecifiedTradeProduct → ram:GlobalID) to a valid ISO 6523 ICD code such as 0160.

Any scheme identifier for an Endpoint Identifier in [Element] MUST belong to the CEF EAS code list.

In an XRechnung extension invoice, the schemeID of an electronic address (endpoint) must be a code from the CEF EAS code list (e.g. EM for email, 0204 for Leitweg-ID, 9930 for German VAT number).

Fix: Set @schemeID on cbc:EndpointID (CII: ram:URIUniversalCommunication → ram:URIID) to a valid EAS code.

Any scheme identifier for a Delivery location identifier in [Element] MUST be coded using one of the ISO 6523 ICD list.

In an XRechnung extension invoice, the schemeID of a delivery location identifier must be an ISO 6523 ICD code.

Fix: Set @schemeID on cac:DeliveryLocation → cbc:ID (CII: ram:ShipToTradeParty → ram:GlobalID) to a valid ISO 6523 ICD code such as 0088, or remove the attribute.

Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) - Paid amount (BT-113) + Rounding amount (BT-114) + Σ Third party payment amount (BT-DEX-002).

In an XRechnung extension invoice, the Amount due for payment (BT-115) must equal Invoice total with VAT (BT-112) minus Paid amount (BT-113) plus Rounding amount (BT-114) plus the sum of third party payments (BT-DEX-002).

Fix: Recalculate cac:LegalMonetaryTotal → cbc:PayableAmount as TaxInclusiveAmount − PrepaidAmount + PayableRoundingAmount + the sum of cac:PrepaidPayment → cbc:PaidAmount, rounded to two decimals.

Das Element "Third party payment type" BT-DEX-001 muss übermittelt werden, wenn die Gruppe "THIRD PARTY PAYMENT" (BG-DEX-09) übermittelt wird.

In an XRechnung extension invoice, each THIRD PARTY PAYMENT group (BG-DEX-09) must state the Third party payment type (BT-DEX-001).

Fix: Add a non-empty cbc:ID inside each cac:PrepaidPayment.

Das Element "Third party payment amount" BT-DEX-002 muss übermittelt werden, wenn die Gruppe "THIRD PARTY PAYMENT" (BG-DEX-09) übermittelt wird.

In an XRechnung extension invoice, each THIRD PARTY PAYMENT group (BG-DEX-09) must state the Third party payment amount (BT-DEX-002).

Fix: Add a non-empty cbc:PaidAmount with currencyID inside each cac:PrepaidPayment.

Das Element "Third party payment description" BT-DEX-003 muss übermittelt werden, wenn die Gruppe "THIRD PARTY PAYMENT" (BG-DEX-09) übermittelt wird.

In an XRechnung extension invoice, each THIRD PARTY PAYMENT group (BG-DEX-09) must have a Third party payment description (BT-DEX-003).

Fix: Add a non-empty cbc:InstructionID inside each cac:PrepaidPayment.

Die maximale Anzahl zulässiger Nachkommastellen für das Element "Third party payment amount" (BT-DEX-002) ist 2.

The Third party payment amount (BT-DEX-002) may have at most two decimal places, like all other amounts in EN 16931.

Fix: Round cac:PrepaidPayment → cbc:PaidAmount to two decimals.

Die Währungsangabe von "Third party payment amount" BT-DEX-002 muss BT-5 ("Invoice currency code") entsprechen.

The currency of the Third party payment amount (BT-DEX-002) must be the Invoice currency code (BT-5).

Fix: Set cac:PrepaidPayment → cbc:PaidAmount/@currencyID to the same value as cbc:DocumentCurrencyCode.

BR-DEX-15warning

This CII file might use the concept of Sub Invoice Lines. However XRechnung does not support this.

In a CII file with the XRechnung extension identifier, ram:ParentLineID suggests sub invoice lines. XRechnung only supports sub invoice lines in UBL, so the hierarchy will not be understood by receivers.

Fix: Remove ram:ParentLineID from ram:AssociatedDocumentLineDocument and send flat lines, or switch to UBL if you need sub invoice lines.

BT-124 "External document location" muss eine absolute URL mit gültigem Schema enthalten.

The External document location (BT-124) must be an absolute URL with a valid scheme, such as https://example.de/delivery-note.pdf. Relative paths or bare host names are rejected.

Fix: Put an absolute URL (with scheme, e.g. https://) in cac:AdditionalDocumentReference → cac:Attachment → cac:ExternalReference → cbc:URI. In CII, use ram:AdditionalReferencedDocument → ram:URIID.

Wenn BT-149 (Item price base quantity) sowohl in GrossPriceProductTradePrice als auch in NetPriceProductTradePrice vorhanden ist, müssen die Werte identisch sein. Wenn BT-150 (unit of measure code) auf dem NetPrice-Pfad vorhanden ist, muss es auch auf dem GrossPrice-Pfad vorhanden und identisch sein.

CII only. If the Item price base quantity (BT-149) is given on both the gross price and the net price, the two values must be the same. If the net price carries a unit of measure (BT-150), the gross price must carry the same unit.

Fix: Make ram:GrossPriceProductTradePrice → ram:BasisQuantity equal to ram:NetPriceProductTradePrice → ram:BasisQuantity, including the @unitCode, or remove the base quantity from the gross price.

BR-TMP-4warning

BT-123 "Supporting document description" (ram:Name) darf innerhalb von "Additional supporting documents" (BG-24) höchstens einmal vorkommen.

CII only. Within an additional supporting document (BG-24, type code 916), the Supporting document description (BT-123, ram:Name) may occur at most once.

Fix: Keep a single ram:Name in each ram:AdditionalReferencedDocument with ram:TypeCode 916.

BR-TMP-5warning

BT-125 "Attached document" (ram:AttachmentBinaryObject) darf innerhalb von "Additional Supporting documents" (BG-24) höchstens einmal vorkommen.

CII only. Within an additional supporting document (BG-24, type code 916), the Attached document (BT-125, ram:AttachmentBinaryObject) may occur at most once.

Fix: Use one ram:AdditionalReferencedDocument per attachment, each with a single ram:AttachmentBinaryObject.

BR-TMP-6warning

Datumsangaben in UBL müssen im Format JJJJ-MM-TT (YYYY-MM-DD) übermittelt werden.

UBL only. Dates must be written as YYYY-MM-DD without time or time zone. The rule checks cbc:IssueDate, cbc:DueDate, cbc:StartDate, cbc:EndDate, cbc:ActualDeliveryDate, cbc:TaxPointDate and cbc:PaymentDueDate.

Fix: Write all dates as plain YYYY-MM-DD, e.g. 2026-10-15. Remove time parts and offsets such as T00:00:00 or +02:00.

BR-TMP-7warning

Datumsangaben in UNCEFACT/CII müssen das Attribut format="102" tragen und im Format JJJJMMTT (YYYYMMDD) übermittelt werden.

CII only. Date values must carry format="102" and be written as YYYYMMDD.

Fix: Write dates as <udt:DateTimeString format="102">20261015</udt:DateTimeString>. Do not use other format codes or separators.

Das Bildungsschema für "Item classification identifier" (BT-158) ist aus der Codeliste UNTDID 7143 zu wählen.

In a CVD invoice, the scheme of an Item classification identifier (BT-158) must come from the UNTDID 7143 code list, with CVD added as an allowed value.

Fix: Set @listID on cbc:ItemClassificationCode (CII: ram:ClassCode) to a valid UNTDID 7143 code or to CVD.

Allowance/charge ChargeIndicator value MUST equal 'true' or 'false'.

KoSIT adopted Peppol rule R043 into the XRechnung CII schematron and split it in two. R043-1 checks document-level and line-level allowances and charges (ram:SpecifiedTradeAllowanceCharge): the charge indicator must be exactly 'true' (charge) or 'false' (allowance). Values such as '1', '0', 'yes' or an empty indicator fail.

Fix: In each ram:SpecifiedTradeAllowanceCharge, set ram:ChargeIndicator → udt:Indicator to exactly true for a charge or false for an allowance.

Allowance/charge ChargeIndicator value MUST equal 'true' or 'false'.

The second half of the KoSIT CII version of Peppol rule R043. It checks the price discount on an item price (ram:AppliedTradeAllowanceCharge in ram:GrossPriceProductTradePrice, BT-147): the charge indicator must be exactly 'true' or 'false'. For a price discount it is normally 'false'.

Fix: In each ram:AppliedTradeAllowanceCharge, set ram:ChargeIndicator → udt:Indicator to exactly false (price discount) or true.

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".

DK-R-003warning

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.

GR-S-008-1warning

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.

GR-S-011warning

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".

IS-R-001warning

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".

NO-R-002warning

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.

SE-R-007warning

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.

SE-R-008warning

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.

SE-R-009warning

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.

SE-R-010warning

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.

SE-R-011warning

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.

SE-R-012warning

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.

ZUGFeRD / Factur-X PDF rules (PDF-01 – PDF-21)

Checks on the PDF of a ZUGFeRD or Factur-X invoice: the embedded invoice XML and its file specification, the XMP metadata and PDF/A-3 (basic check). These are not a full PDF/A validation.

PDF-01fatal

The PDF cannot be read

The file starts like a PDF, but its structure (cross-reference table, objects or the embedded file stream) cannot be parsed, so no invoice XML can be taken from it.

Fix: Export the PDF again from the invoicing software, or repair it with a PDF tool, and check that it opens in a PDF viewer.

PDF-02fatal

The PDF is encrypted

The PDF has an /Encrypt dictionary (a password or permissions). PDF/A-3, and so ZUGFeRD and Factur-X, do not allow encryption, and the embedded invoice XML cannot be read.

Fix: Create the PDF without a password and without permission restrictions.

PDF-03fatal

No invoice XML is embedded in the PDF

A ZUGFeRD or Factur-X PDF carries the invoice as an embedded file named factur-x.xml (Factur-X, ZUGFeRD 2.1 and later), xrechnung.xml (XRECHNUNG profile of ZUGFeRD 2.1.1), zugferd-invoice.xml (ZUGFeRD 2.0) or ZUGFeRD-invoice.xml (ZUGFeRD 1.0). None was found in the /EmbeddedFiles name tree or the catalog /AF array, and the XMP names no other embedded file.

Fix: Embed the invoice XML under its standard file name. A plain PDF invoice is not an e-invoice; to check the XML on its own, upload the .xml file.

PDF-04fatal

More than one invoice XML is embedded

The PDF embeds more than one file with an invoice XML name. A ZUGFeRD or Factur-X PDF holds exactly one invoice XML, so a receiver cannot tell which one is the invoice. The one named in the XMP DocumentFileName is checked.

Fix: Embed only one invoice XML. Other attachments (for example a timesheet) must not use an invoice XML file name.

PDF-05fatal

The invoice XML does not have the file name its standard requires

The file name of the embedded invoice XML must match the standard declared in the XMP: factur-x.xml for Factur-X and ZUGFeRD 2.1 and later (xrechnung.xml is also accepted with ConformanceLevel XRECHNUNG), zugferd-invoice.xml for ZUGFeRD 2.0 and ZUGFeRD-invoice.xml for ZUGFeRD 1.0. Receivers look the XML up by this name.

Fix: Rename the embedded file (and the XMP DocumentFileName) to the name of the standard, for example factur-x.xml.

PDF-06fatal

The file specification has no valid /AFRelationship

PDF/A-3 requires every embedded file to state its relationship to the document (/AFRelationship). ZUGFeRD and Factur-X allow Alternative, Source or Data for the invoice XML (Alternative for the EN 16931 based profiles in Germany, Data or Source in France).

Fix: Set /AFRelationship /Alternative (or /Source, /Data) on the file specification of the invoice XML.

PDF-07fatal

The invoice XML is not listed in the catalog /AF array

PDF/A-3 associates an embedded file with the document through the /AF (associated files) array of the document catalog. ZUGFeRD and Factur-X require the invoice XML to be associated this way.

Fix: Add a reference to the file specification of the invoice XML to the /AF array of the catalog.

PDF-08fatal

The embedded invoice XML has no MIME type

PDF/A-3 requires the embedded file stream to state its MIME type in /Subtype. For the invoice XML it is text/xml.

Fix: Set /Subtype /text#2Fxml (the name text/xml) on the embedded file stream.

PDF-09warning

The MIME type of the invoice XML is not text/xml

ZUGFeRD and Factur-X give the invoice XML the MIME type text/xml. Another value (for example application/xml, or a name with a stray #) is accepted by most receivers, but does not follow the specification.

Fix: Set /Subtype /text#2Fxml on the embedded file stream.

PDF-10fatal

The PDF has no readable XMP metadata

The document catalog must have a /Metadata stream with XMP. It declares PDF/A-3 and the ZUGFeRD / Factur-X properties (DocumentType, DocumentFileName, Version, ConformanceLevel). The stream is missing or is not well-formed XML.

Fix: Write the XMP metadata with the PDF/A identification and the Factur-X extension schema, as the ZUGFeRD / Factur-X specification shows.

PDF-11fatal

A ZUGFeRD / Factur-X property is missing from the XMP

The XMP must have the Factur-X (urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#) or ZUGFeRD properties DocumentType, DocumentFileName, Version and ConformanceLevel. Receivers read the profile and the file name from them.

Fix: Add the missing property to the rdf:Description of the Factur-X namespace in the XMP.

PDF-12fatal

The XMP DocumentType is not INVOICE

For an invoice or credit note, DocumentType in the XMP is INVOICE.

Fix: Set DocumentType to INVOICE.

PDF-13fatal

The XMP Version is not a known value

Version in the XMP is the version of the XMP schema: 1.0 for Factur-X and ZUGFeRD (1p0 and 2p0 occur in older files), or the XRechnung version (1.2 to 3.0) for the XRECHNUNG profile.

Fix: Set Version to 1.0 (or the XRechnung version for the XRECHNUNG profile).

PDF-14fatal

The XMP ConformanceLevel is not a known profile

ConformanceLevel in the XMP names the profile: MINIMUM, BASIC WL, BASIC, EN 16931 (COMFORT in ZUGFeRD 1.0), EXTENDED, EXTENDED-CTC-FR or XRECHNUNG.

Fix: Set ConformanceLevel to the profile of the XML, spelled as in the specification (for example EN 16931 with a space).

PDF-15fatal

The XMP ConformanceLevel does not match the profile of the XML

The profile in the XMP must be the profile of the embedded XML, given by its specification identifier (BT-24, ram:GuidelineSpecifiedDocumentContextParameter/ram:ID). For example urn:cen.eu:en16931:2017 is EN 16931 and urn:factur-x.eu:1p0:basicwl is BASIC WL.

Fix: Make the XMP ConformanceLevel and BT-24 in the XML name the same profile.

PDF-16fatal

The XMP DocumentFileName does not match the embedded XML

DocumentFileName in the XMP must be the file name of the embedded invoice XML.

Fix: Set DocumentFileName to the name of the embedded file, for example factur-x.xml.

PDF-17fatal

The XMP does not declare PDF/A-3

ZUGFeRD and Factur-X are PDF/A-3 files: the XMP must have pdfaid:part 3 and pdfaid:conformance A, B or U. Only PDF/A-3 allows embedded XML files. This checks the declaration only, not that the PDF meets PDF/A-3.

Fix: Create the PDF as PDF/A-3 (for example PDF/A-3b) with a tool that writes the PDF/A identification.

PDF-18warning

The XMP has no PDF/A extension schema for the ZUGFeRD / Factur-X properties

PDF/A allows XMP properties outside the standard schemas only when the XMP describes them in a PDF/A extension schema (pdfaExtension:schemas with pdfaSchema:namespaceURI). The ZUGFeRD / Factur-X specification includes this block; without it a PDF/A validator rejects the file.

Fix: Add the pdfaExtension:schemas block of the specification, with the namespace URI of the properties used.

PDF-19warning

No PDF/A output intent for the device colours used

The pages use device colours (DeviceGray, DeviceRGB or DeviceCMYK), so PDF/A requires an output intent in the catalog: /OutputIntents with /S /GTS_PDFA1 and an ICC profile (/DestOutputProfile). Default colour spaces (DefaultGray, DefaultRGB, DefaultCMYK) on the page are accepted instead. Content streams are scanned in a basic way only.

Fix: Add an sRGB output intent (GTS_PDFA1 with an sRGB ICC profile) when creating the PDF/A.

PDF-20warning

A font is not embedded

PDF/A requires every font used to show text to be embedded (FontFile, FontFile2 or FontFile3 in its font descriptor), so the invoice looks the same everywhere. This checks the fonts in the resources of the pages and their form XObjects; Type 3 fonts need no embedding.

Fix: Embed all fonts when creating the PDF (for PDF/A export most tools do this; standard fonts such as Helvetica must be embedded too).

PDF-21fatal

The embedded XML is ZUGFeRD 1.0, which is not checked

ZUGFeRD 1.0 uses its own XML (CrossIndustryDocument), not the EN 16931 CII syntax (CrossIndustryInvoice), and does not meet EN 16931. It is no longer a valid e-invoice in Germany or France, so the XML checks do not run on it.

Fix: Create the invoice as ZUGFeRD 2.3 / Factur-X 1.07 (factur-x.xml) with an EN 16931 based profile.

Data quality hints (ADV-*), not official rules

Hints about values that pass the official rules but often cause trouble: empty elements where no rule set checks them, VAT identifiers and IBANs not in their compact or national format, electronic addresses that cannot be used. They are not part of EN 16931, Peppol BIS, XRechnung or Factur-X and never make an invoice invalid.

ADV-EMPTYdata quality hint

Empty element

An element has no value and no child elements (attributes do not count). EN 16931 has no rule against empty elements, so a plain EN 16931 CII invoice or a Factur-X MINIMUM or BASIC WL invoice with one passes the official rules. Peppol BIS, XRechnung and the Factur-X BASIC, EN 16931 and EXTENDED rules report them (PEPPOL-EN16931-R008), so this hint runs only where that rule does not. Many receivers read an empty element as an error or as a missing value. ram:ApplicableHeaderTradeDelivery is not flagged: the CII schema requires it even without delivery information.

Fix: Leave out elements you have no value for, such as an empty ram:SpecifiedLegalOrganization, instead of writing them empty.

ADV-VATdata quality hint

VAT identifier not in its compact form or not in the format of its country

Checks the Seller VAT identifier (BT-31), the Buyer VAT identifier (BT-48) and the Seller tax representative VAT identifier (BT-63). The official rules check only the two-letter prefix (BR-CO-09); a few country rules check more. A VAT identifier with spaces, dots or hyphens, or one without the format of its country, is not found in VIES or in the receiver's master data. The formats are those VIES uses for the EU member states (Greece: EL, Northern Ireland: XI), and the known formats for GB, NO (with MVA) and CH (CHE, optionally with MWST, TVA or IVA; the official notation CHE-123.456.789 MWST is fine too). A field an official rule already reports (NO-R-001, SE-R-001, SE-R-002, GR-R-003) gets no hint. This checks the format only, not whether the number is registered.

Fix: Write the VAT identifier in its compact form, the prefix followed by the number without spaces, dots or hyphens (e.g. BE0403170701), and check the number in VIES.

ADV-IBANdata quality hint

IBAN with spaces or hyphens, the wrong length or wrong check digits

Checks the Payment account identifier (BT-84) and the Debited account identifier (BT-91) when they look like an IBAN (two letters of a country that has IBANs, then two digits): UBL cac:PayeeFinancialAccount/cbc:ID and cac:PaymentMandate/cac:PayerFinancialAccount/cbc:ID under any payment means code, and CII ram:IBANID. Other account numbers, such as a Swedish Bankgiro, are not checked. ISO 13616 writes the IBAN without spaces or hyphens in electronic form, with a fixed length per country and check digits that pass the mod 97 test. The official rules do not check the IBAN, except KoSIT BR-DE-19/20 and Peppol DE-R-019/020 for German invoices; where one of them reports an account, it gets no hint.

Fix: Write the IBAN without spaces or hyphens (e.g. BE71096123456769) and compare it with the account details from the bank.

ADV-ENDPOINTdata quality hint

Unusable electronic address

Checks the Seller electronic address (BT-34) and the Buyer electronic address (BT-49) for a placeholder (unknown, n/a, none, test, - or 0), for scheme 0204 a Leitweg-ID with the wrong syntax or check digit, and for scheme EM a value that is not an email address. The official rules check the scheme (BR-CL-25) and the value only for some schemes (e.g. 0088 GLN, 0208 Belgian enterprise number), so such an address can pass, but no invoice can be delivered to it. Whether an address is registered in the Peppol network is not checked.

Fix: Use the real electronic address of the party, such as its Peppol participant identifier or, for a German public buyer, its Leitweg-ID (scheme 0204). Check a Leitweg-ID with the Leitweg-ID checker.

Validate your invoice

Upload a UBL or CII XML file, or a ZUGFeRD / Factur-X PDF, to our free Peppol Validator and get instant validation against all EN16931 and Peppol BIS 3.0 rules, or the KoSIT XRechnung (BR-DE) rules for XRechnung files. A PDF gets the PDF checks too. 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. R008 is a fatal error in Peppol BIS Billing 3.0, not a warning.

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-29 Seller identifier, BT-31 Seller VAT identifier, BT-49 Buyer electronic address, 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.

What are BR-DE rules and when do they apply?

BR-DE-* rules (plus BR-DEX-* and BR-TMP-*) come from the KoSIT XRechnung 3.0 schematron, the German CIUS of EN 16931. They apply only when the specification identifier (BT-24, cbc:CustomizationID or ram:GuidelineSpecifiedDocumentContextParameter) is XRechnung, e.g. urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0. Such files are checked against EN 16931 and the KoSIT XRechnung schematron, not against the full Peppol BIS rule set, so PEPPOL-EN16931-R004 does not fire on a valid XRechnung. A few Peppol rules that KoSIT adopted (such as PEPPOL-EN16931-R001 and R010) still apply. The most common BR-DE errors are BR-DE-15 (Buyer reference BT-10, usually the Leitweg-ID), BR-DE-1 (payment instructions BG-16), BR-DE-2 (seller contact BG-6) and BR-DE-21 (XRechnung specification identifier).