fatal UBL auto-fix
A Peppol BIS Billing 3.0 rule (OpenPeppol): an extra requirement for invoices sent over the Peppol network, for example electronic addresses (BT-34, BT-49), the business process (BT-23) or code values. This is an error: the invoice is rejected until it is fixed.
Automatic fix: 9 € per file (excl. VAT where applicable). An invoice type code (BT-3) that is valid in UNTDID 1001 but not allowed in the Peppol billing process (e.g. 389 self-billed, 385 consolidated) is mapped to 380 (commercial invoice). Optional, Peppol profile only; the customer confirms the document type. The result page shows which errors the repair removes and whether the corrected file then passes — before you pay. Many files? Pilot and Repair API.
[PEPPOL-EN16931-P0100]-Invoice type code MUST be set according to the profile.
An invoice type code (BT-3) that is valid in UNTDID 1001 but not allowed in the Peppol billing process (e.g. 389 self-billed, 385 consolidated) is mapped to 380 (commercial invoice). Optional, Peppol profile only; the customer confirms the document type.
This rule is in the deterministic set of our repair engine (UBL 2.1; measured 2026-10-23: XRechnung 15 broken test invoices accepted after repair, 45 valid invoices unchanged; Peppol BIS Billing 3: 10 official examples unchanged, 40 mutated invoices: 36 accepted after repair, 4 rejected as expected — one documented limit, two with the repair parameter switched off, one where no address could be derived; profile conversion of 33 XRechnung test invoices to Peppol: 30 accepted). For UN/CEFACT CII (Factur-X / ZUGFeRD EN 16931 XML, XRechnung CII) the engine repairs the totals chain, VAT breakdown, rounding, decimals and element order (measured 2026-10-24: 53 valid CEN and XRechnung CII invoices unchanged; 28 broken invoices: 27 accepted after repair, 1 rejected as expected because a VAT exemption reason cannot be derived). Single files: 9 € on the result page; many files: the Repair API — see Pricing.
| Syntax | Severity | Context (XPath) | Test (XPath) |
|---|---|---|---|
| Peppol-UBL | fatal | cbc:InvoiceTypeCode | not($profile = ('01','02')) or (some $code in tokenize('71 80 82 84 102 218 219 326 331 380 382 383 384 386 388 393 395 553 575 623 780 817 870 875 876 877', '\s') satisfies normalize-space(text()) = $code) |
Source: Peppol BIS Billing 3.0 Schematron, UBL (OpenPeppol, docs.peppol.eu validation artefacts 3.0.21).