Een Peppol BIS 3.0-factuur valideren
Door evoicely · Laatst gecontroleerd 20 oktober 2026
Om een Peppol BIS Billing 3.0-factuur te valideren, toetst u de UBL-XML aan drie sets regels: het UBL 2.1-schema, de bedrijfsregels van EN 16931 en de eigen regels van OpenPeppol (PEPPOL-EN16931-* en PEPPOL-COMMON-*, plus landenregels). OpenPeppol publiceert ze allemaal als schematronbestanden bij elke BIS-release. Uw verzendende accesspoint voert dezelfde controles uit voordat het een document tot het netwerk toelaat. Een factuur die hier niet slaagt, wordt dus niet afgeleverd. Wilt u snel controleren zonder iets te installeren, laad het bestand dan op in onze gratis e-factuurvalidator. Die past de officiële regelbestanden toe, toont elke fout met de regel-ID en bewaart uw bestand niet.
Wat "geldig" betekent bij Peppol
Een Peppol BIS Billing 3.0-factuur is een UBL 2.1-Invoice of -CreditNote die de Europese norm EN 16931 volgt, met daarbovenop de beperkingen van OpenPeppol. De controles gebeuren in lagen, en aan het voorvoegsel van een regel-ID ziet u welke laag de fout meldt:
| Laag | Wat ze controleert | Regel-ID's |
|---|---|---|
| XML-schema | Structuur: namen van elementen, volgorde, nesting en datatypes (UBL 2.1). | Schemafouten met een regelnummer |
| EN 16931 | De bedrijfsregels van de Europese norm: verplichte velden, totalen die kloppen, btw-categorieën, codelijsten. Gepubliceerd door CEN. | BR-*, BR-CO-*, BR-S-*, BR-AE-*, BR-CL-*, UBL-* |
| Peppol BIS | De regels van OpenPeppol voor elke Peppol-factuur: bedrijfsproces, referenties, elektronische adressen, geen lege elementen, codelijsten. | PEPPOL-EN16931-R*, -P*, -CL* |
| Identificaties | Formaat en controlecijfers van identificaties van partijen per schema, zoals het Belgische ondernemingsnummer (0208) of een GLN (0088). | PEPPOL-COMMON-R* |
| Landenregels | Extra regels die alleen gelden als de verkoper (en soms de koper) in een bepaald land zit. | DE-R-*, NL-R-*, DK-R-*, SE-R-*, NO-R-*, IT-R-*, GR-R-*, IS-R-* |
De Peppol-regels staan in één bestand, PEPPOL-EN16931-UBL.sch; de EN 16931-regels in CEN-EN16931-UBL.sch. Beide staan in de downloadlijst van de
specificatie van Peppol BIS Billing 3.0 (Engelstalig). België heeft in dat bestand geen eigen blok: Belgische facturen worden gecontroleerd met de gemeenschappelijke regels, bijvoorbeeld de controle van het ondernemingsnummer.
Elke regel heeft een vlag. fatal betekent dat het document ongeldig is en dat een accesspoint het niet verstuurt. warning betekent dat het nog door kan, maar dat er iets niet lijkt te kloppen, zoals een Italiaanse IPA-code in het verkeerde formaat.
De twee identificaties die alles bepalen
Elke Peppol BIS Billing 3.0-factuur begint met een specificatie-ID (BT-24) en een bedrijfsproces (BT-23):
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
De CustomizationID vertelt een validator welke regels hij moet toepassen. Een gewone Peppol-factuur draagt precies de waarde hierboven; een XRechnung bijvoorbeeld draagt een andere waarde en krijgt dan de Duitse regels. Laat u de ProfileID weg, dan krijgt u in één keer twee fatale fouten (de regelteksten van 3.0.21, zoals het script hieronder ze toont):
fatal PEPPOL-EN16931-R001 [PEPPOL-EN16931-R001]-Business process
MUST be provided.
fatal PEPPOL-EN16931-R007 [PEPPOL-EN16931-R007]-Business process
MUST have an approved identifier.
Optie 1: online controleren
Onze gratis validator leest de specificatie-ID en kiest op basis daarvan de regels. Voor een Peppol BIS Billing 3.0-factuur of -creditnota past hij het UBL 2.1-schema toe, de EN 16931-regels (1.3.16) en de OpenPeppol-regels van Peppol BIS Billing 3.0.21, de release die nu verplicht is. Zo gebruikt u hem:
- Open de validator en kies het XML-bestand (tot 10 MB) of plak de XML.
- Klik op Factuur controleren. U krijgt het oordeel "Geldig" of "Niet geldig", de regelsets en versies die zijn toegepast, en elke fout en waarschuwing met de regel-ID, de regeltekst en de plaats in het document waarop ze betrekking heeft.
- Onder het oordeel staat de factuur opgemaakt als een papieren factuur, zodat u ziet wat er werkelijk in de XML staat.
Herkent de validator de identificatie niet, dan meldt hij dat en toetst hij het bestand alleen aan de kernregels van EN 16931. Het bestand wordt in het geheugen gecontroleerd en nooit bewaard.
Slagen betekent dat het bestand voldoet aan de gepubliceerde regels. Het garandeert niet dat de software van de ontvanger het aanvaardt, of dat de ontvanger op Peppol geregistreerd is voor dit documenttype.
Optie 2: de officiële regels zelf draaien
Voer de controles zelf uit als u facturen in grote aantallen aanmaakt of ze in uw build wilt opnemen. De schematronbestanden moeten naar XSLT gecompileerd worden en uitgevoerd met een XSLT 2.0-processor.
Dit Python-script gebruikt Saxon-HE (pip install saxonche) en de compiler SchXslt, en verwacht de twee .sch-bestanden uit de
BIS-downloads in dezelfde map:
# curl -LO https://repo1.maven.org/maven2/name/dmaus/schxslt/schxslt/1.10.1/schxslt-1.10.1.jar
# curl -LO https://docs.peppol.eu/poacc/billing/3.0/files/CEN-EN16931-UBL.sch
# curl -LO https://docs.peppol.eu/poacc/billing/3.0/files/PEPPOL-EN16931-UBL.sch
import sys, tempfile, zipfile
import xml.etree.ElementTree as ET
from saxonche import PySaxonProcessor
SVRL = "{http://purl.oclc.org/dsdl/svrl}"
failed = False
with tempfile.TemporaryDirectory() as tmp, PySaxonProcessor(license=False) as proc:
zipfile.ZipFile("schxslt-1.10.1.jar").extractall(tmp)
xslt = proc.new_xslt30_processor()
compiler = xslt.compile_stylesheet(
stylesheet_file=f"{tmp}/xslt/2.0/pipeline-for-svrl.xsl")
for sch in ("CEN-EN16931-UBL.sch", "PEPPOL-EN16931-UBL.sch"):
rules = xslt.compile_stylesheet(
stylesheet_text=compiler.transform_to_string(source_file=sch))
report = rules.transform_to_string(source_file=sys.argv[1])
for fa in ET.fromstring(report).iter(SVRL + "failed-assert"):
flag = fa.get("flag", "fatal")
failed |= flag == "fatal"
print(flag, fa.get("id"), fa.findtext(SVRL + "text").strip())
sys.exit(1 if failed else 0)
Voer het uit als python peppol_check.py invoice.xml. Het geeft één uitvoerregel per regel die niet slaagt en stopt met exitstatus 1 als er een fatale bij zit. Een CI-job faalt dus bij fouten en slaagt bij waarschuwingen.
Het compileren van de regels duurt enkele seconden; voor veel bestanden compileert u één keer en loopt u daarna over de facturen. Het script controleert alleen de schematronregels. Valideer ook tegen het UBL 2.1-schema (bijvoorbeeld met lxml), want de regels gaan uit van een document dat aan het schema voldoet.
Fouten die u waarschijnlijk tegenkomt
Dit zijn echte resultaten voor een kleine, fictieve Belgische factuur, telkens met één ding fout:
| Regel | Wat er fout is | Oplossing |
|---|---|---|
PEPPOL-EN16931-R003 | Geen referentie van de koper (BT-10) en geen bestelreferentie (BT-13). | Voeg cbc:BuyerReference of cac:OrderReference/cbc:ID toe. Gaf de koper u geen van beide, vraag dan wat u moet invullen. |
PEPPOL-EN16931-R010 | Geen elektronisch adres van de koper (BT-49). | Voeg aan de partij van de koper een cbc:EndpointID met een schemeID toe: de Peppol-ID van de koper. |
PEPPOL-EN16931-R020 | Geen elektronisch adres van de verkoper (BT-34). | Hetzelfde voor uw eigen partij. |
PEPPOL-COMMON-R043 | Een Belgisch ondernemingsnummer (schema 0208) dat geen 10 cijfers telt of waarvan de controlecijfers niet kloppen. | Gebruik het nummer precies zoals het geregistreerd is, zonder punten en zonder het voorvoegsel BE. |
PEPPOL-EN16931-R008 | Ergens in het document staat een leeg element. | Laat optionele elementen weg in plaats van ze leeg op te nemen. |
Zo ziet de fout met het ondernemingsnummer eruit in de XML. De laatste twee cijfers van een Belgisch ondernemingsnummer zijn een controle op de eerste acht (97 min de rest van de deling door 97), dus een verzonnen of verkeerd getypt nummer slaagt niet:
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0208">0987654321</cbc:EndpointID>
…
fatal PEPPOL-COMMON-R043 [PEPPOL-COMMON-R043]-Belgian enterprise
number MUST be stated in the correct format.
Facturen uit Stripe lopen vaak tegen R003 en R010 aan: Stripe heeft geen veld voor een referentie van de koper of een Peppol-ID, dus die moeten ergens anders vandaan komen, bijvoorbeeld uit de metadata van de klant. Onze veldmapping van Stripe naar EN 16931 (in het Engels) toont waar elke waarde vandaan kan komen.
Wat validatie u niet vertelt
- Of de ontvanger de factuur kan ontvangen. De regels controleren dat er een elektronisch adres is en dat het correct gevormd is, niet dat het op Peppol geregistreerd is. Voor levering moet de ID van de ontvanger voor dit documenttype in het Peppol-adresboek (SMP) staan.
- Of de inhoud klopt. Een btw-nummer in het juiste formaat kan nog altijd het verkeerde zijn, en een geldige btw-categorie kan nog altijd de verkeerde behandeling zijn.
- De envelop. Accesspoints verpakken elk document vóór verzending in een envelop voor zakelijke berichten (SBDH). Dat is de taak van het accesspoint; OpenPeppol publiceert daarvoor aparte envelopregels.
OpenPeppol verplicht verzendende accesspoints om uitgaande documenten vóór verzending te valideren tegen de Peppol BIS (Peppol Interoperability Framework, peppol.org, Engelstalig). Als u eerst zelf valideert, ziet u de fouten voordat uw accesspoint het bestand weigert.
Tegen welke versie valideren
Peppol BIS Billing 3.0 krijgt twee releases per jaar, elk met een datum vanaf wanneer ze verplicht is. Versie 3.0.20 is verplicht sinds 23 februari 2026, en versie 3.0.21, gepubliceerd op 20 mei 2026, sinds 17 augustus 2026. 3.0.21 wijzigde de controle van de identificatie (R004), maakte van twee Deense regels voor identificaties fouten in plaats van waarschuwingen, voegde formaatcontroles toe voor meer identificatieschema's en schrapte onbruikbare codes uit de lijst met schema's voor elektronische adressen (release notes van Peppol BIS Billing 3.0, Engelstalig). Accesspoints valideren tegen de verplichte release. Leg uw regels dus vast op die release en werk ze bij zodra de volgende wordt aangekondigd. Onze validator draait 3.0.21 en vermeldt bij elk resultaat welke regelversies hij gebruikt heeft.
Verwante gidsen
- De Peppol-verplichting in België voor ondernemingen die factureren met Stripe: wie Peppol-facturen moet versturen, en hoe u ze uit Stripe krijgt.
- Mapping a Stripe invoice to EN 16931 (in het Engels): de veld-per-veldmapping achter elke Peppol-factuur.
- How to validate an XRechnung (in het Engels): de Duitse tegenhanger, met de KoSIT-validator.
Waar evoicely past
Controleer nu een Peppol-factuur, gratis en zonder account. evoicely verstuurt de Stripe-facturen en -creditnota's van Belgische ondernemingen over Peppol: elk document wordt omgezet naar Peppol BIS Billing 3.0, gecontroleerd met deze officiële regels en verstuurd via Recommand, een Belgisch Peppol-accesspoint. Koppel uw Stripe-account en schakel Peppol in bij uw instellingen; het is gratis voor 10 e-facturen per maand.
Dit is algemene informatie, geen juridisch of fiscaal advies. Een bestand dat de validatie doorstaat, is technisch geldig volgens de gepubliceerde regels; ga met uw boekhouder of belastingadviseur na wat voor uw onderneming geldt.