Peppol BIS Billing 3.0 Validator

Drop an invoice XML. Problems are explained in plain language, with the official rule ID.

Local: yes. Your input stays on your device and is not sent to an external service for this tool.

Parsed on your device. The file is never uploaded.

What the validator checks

Peppol BIS Billing 3.0 is the Peppol profile of the European e-invoicing standard EN 16931, carried as UBL 2.1 XML. Access points reject invoices that break its business rules. This validator implements the rules behind most real rejections in JavaScript, so the invoice never leaves your browser, and explains each problem in plain language with the official rule ID:

  • Mandatory content (BR-01 to BR-27): customization and profile ID, invoice number, issue date, currency, seller and buyer names and addresses, electronic addresses, at least one line.
  • Arithmetic: line net amount = quantity × net price (PEPPOL-EN16931-R120), sum of lines and document totals (BR-CO-10 to BR-CO-16), VAT per category (BR-CO-17, BR-S-08), and amounts rounded to two decimals.
  • VAT categories: S standard rate, Z zero, E exempt, AE reverse charge, K intra-community, G export, O outside scope, including the exemption reason that E, AE, K, G and O require.
  • Belgian checks: modulo-97 on 0208 endpoints and enterprise numbers, Belgian VAT numbers, Belgian VAT rates (6, 12, 21 and 0%), IBAN checksum, and OGM or RF check digits on the payment reference.

Sample findings

✗ BR-CO-15  Invoice total with VAT (1,210.00) ≠ total without VAT (1,000.00)
            + VAT total (201.00)
✗ PEPPOL-EN16931-R120  Line 2: 3 × 49.95 = 149.85, line amount says 149.80
✗ BE  EndpointID 0208:0417497107 fails the enterprise-number check (expected 06)
! BR-E-10  Category E line without an exemption reason

Edge cases

  • Rounding. EN 16931 rounds each line and then each VAT subtotal; computing VAT per line and summing can differ by a cent and fail BR-CO-17.
  • Credit notes use CreditNote as root element with positive amounts; a negative invoice is not a credit note.
  • Reverse charge (AE) needs the buyer's VAT number and 0% VAT on the line.
  • Undeliverable endpoint. A valid-looking but wrong 0208 number passes XML checks yet cannot be routed; this is why the Belgian checksum is checked.

This is not the complete official Schematron set and the XML is not checked against the XSD, so run a sample through your access point before going live. Read a received invoice in the UBL invoice viewer, build one with the Peppol invoice builder, or see the Peppol and UBL guide.

Frequently asked questions

Is this the official Peppol validator?

No. It implements the EN 16931 and Peppol BIS rules that cause most rejections, plus Belgian identifier checks, in your browser. It does not run the full official Schematron or XSD validation, so test with your access point before going live.

What does BR-CO-15 mean?

The invoice total including VAT must equal the total without VAT plus the total VAT amount. A mismatch is usually a rounding or summing error.

Which VAT categories need an exemption reason?

Lines and breakdowns with category E (exempt), AE (reverse charge), K (intra-community), G (export) and O (outside scope) need an exemption reason text or code.

Does it check the Belgian enterprise number in the endpoint?

Yes. A 0208 endpoint or party ID must be a 10-digit enterprise number that passes the modulo-97 check, because a wrong number makes the invoice undeliverable on Peppol.

Is my invoice uploaded?

No. The XML is read and validated in your browser and is not sent to gratistools.be.