Peppol-foutmeldingen bij validatie: oorzaken en oplossingen
Door evoicely · Laatst gecontroleerd 21 oktober 2026
Een Peppol BIS Billing 3.0-factuur wordt getoetst aan twee sets regels: de regels van EN 16931 (ID's die met BR- beginnen) en de eigen regels van OpenPeppol (ID's die met PEPPOL- beginnen). Een foutmelding betekent meestal dat een Peppol-specifiek veld ontbreekt of verkeerd gevormd is, of dat de totalen niet exact kloppen.
De fouten waarop UBL uit Stripe-facturen het vaakst strandt, zijn PEPPOL-EN16931-R008 (een leeg element), R010 en R020 (geen elektronisch adres), PEPPOL-COMMON-R043 (een Belgisch ondernemingsnummer in het verkeerde formaat), R003 (geen kopersreferentie of bestelreferentie), R001/R007 (bedrijfsproces), en de regels voor totalen en btw BR-CO-10, BR-CO-15, BR-S-08 en BR-AE-10.
Elke sectie hieronder geeft de officiële regeltekst, waarom de regel afgaat en de XML die eraan voldoet. Wilt u zien welke regels uw eigen bestand overtreedt, laad het dan op in onze gratis validator.
Overzicht
| Regel | Wat ontbreekt of fout is |
|---|---|
| PEPPOL-EN16931-R008 | Een leeg element |
| R020, R010, BR-62/63, CL008 | Elektronisch adres (Peppol-ID) van verkoper of koper |
| PEPPOL-COMMON-R043, R040 | Belgisch ondernemingsnummer of GLN slaagt niet voor de formaatcontrole |
| PEPPOL-EN16931-R003 | Geen kopersreferentie en geen bestelreferentie |
| R001, R007, R004 | Identificatie van bedrijfsproces of specificatie |
| PEPPOL-EN16931-R002 | Meer dan één opmerking op de factuur |
| BR-CO-10, -13, -15, R120 | Lijn- en documenttotalen die niet kloppen |
| BR-S-08, BR-S-09, BR-CO-17 | Btw-uitsplitsing die een korting negeert |
| BR-AE-10, BR-AE-02 | Btw verlegd zonder reden of zonder btw-nummer van de koper |
| BR-CL-23, R051 | Eenheids- en valutacodes |
Dit zijn allemaal fouten, in de regelbestanden gemarkeerd als "fatal". Peppol-accesspoints valideren facturen voordat ze ze versturen, dus een bestand met een van deze fouten wordt geweigerd en gaat niet de deur uit. De regelteksten zijn geciteerd uit de
regels van Peppol BIS Billing 3.0 (release 3.0.21, die geldt sinds 17 augustus 2026) en de
EN 16931-regels voor UBL (1.3.16, uit de validatieartefacten van EN 16931), allemaal Engelstalig.
In de regelbestanden begint elke melding met de regel-ID tussen haken, zoals [BR-CO-15]-; dat voorvoegsel laten we weg.
De XML-fragmenten komen uit één volledige, fictieve factuur van een Belgische verkoper aan een Belgische klant, die al deze regels doorstaat. Van elke foute variant is gecontroleerd dat ze de genoemde regel doet afgaan.
Hoe de regelsets samenhangen en hoe u ze uitvoert, leest u in
Een Peppol BIS 3.0-factuur valideren.
PEPPOL-EN16931-R008: lege elementen
Document MUST not contain empty elements. Peppol weigert elk element zonder inhoud en zonder onderliggende elementen, en een element met alleen spaties telt ook als leeg. Dit is de meest voorkomende Peppol-fout bij zelfgebouwde generatoren: een sjabloon schrijft elk veld uit, en als de waarde in Stripe null is (geen memo, een klant zonder telefoonnummer, een kaart zonder merk), krijgt u iets als:
<cbc:Note></cbc:Note>
<cbc:NetworkID> </cbc:NetworkID>
De oplossing zit in de generator: laat een element weg als er geen waarde is, en laat ook het bovenliggende element weg als al zijn onderliggende elementen weg zijn. De plaats in de foutmelding (bijvoorbeeld …/CardAccount/NetworkID) vertelt u welk element leeg was.
Is het element verplicht, dan voldoet een leeg element ook niet aan die verplichting; u krijgt dan ook de regel voor het ontbrekende veld.
PEPPOL-EN16931-R020 en R010: elektronische adressen
Seller electronic address MUST be provided (R020) en Buyer electronic address MUST be provided (R010). In EN 16931 zijn ze optioneel; Peppol maakt beide verplicht, omdat het de Peppol-ID's zijn waarop het netwerk routeert.
Dat van de verkoper is BT-34, dat van de koper BT-49, beide als cbc:EndpointID bovenaan cac:Party:
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0208">0765432146</cbc:EndpointID>
<cac:PostalAddress>
...
Stripe heeft geen veld voor een Peppol-ID. Die moet dus uit uw eigen instellingen komen (voor de verkoper) en uit de metadata van de klant of een opzoeking (voor de koper). Drie verwante fouten verschijnen als het element er wel staat, maar het schema niet klopt:
- BR-62 / BR-63: The Seller electronic address (BT-34) shall have a Scheme identifier (BR-63 voor de koper). Het attribuut
schemeIDontbreekt. - PEPPOL-EN16931-CL008: Electronic address identifier scheme must be from the codelist "Electronic Address Identifier Scheme". Het schema staat niet op de EAS-codelijst zoals Peppol die gebruikt.
Een vaak voorkomende oorzaak is
EM(e-mail), dat XRechnung aanvaardt maar Peppol niet: een e-mailadres kan geen Peppol-ID zijn.
Gangbare schema's zijn 0208 (Belgisch ondernemingsnummer), 9925 (Belgisch btw-nummer, geschreven met het voorvoegsel BE), 0106 (Nederlands KvK-nummer), 0088 (GLN) en 9930 (Duits btw-nummer).
De ID helpt alleen als de ontvanger er ook echt onder geregistreerd is op Peppol; de validatie kan dat niet controleren, uw accesspoint wel.
PEPPOL-COMMON-R043 en R040: formaatcontroles op identificaties
PEPPOL-COMMON-R043: Belgian enterprise number MUST be stated in the correct format. Telkens schema 0208 gebruikt wordt (in een endpoint, een partij-identificatie of een juridische registratie-ID), moet de waarde precies tien cijfers tellen, waarvan de laatste twee de mod-97-controlecijfers van de eerste acht zijn.
Drie dingen doen de regel afgaan:
- Het voorvoegsel
BE:BE0765432146is het formaat van het btw-nummer. Schrijf met schema 02080765432146, of gebruik schema9925voor het btw-nummer met voorvoegsel. - Punten of spaties, zoals ondernemingsnummers vaak gedrukt worden:
0765.432.146. - Een tikfout, die de controlecijfers opvangen:
0765432147slaagt niet,0765432146wel.
<cbc:EndpointID schemeID="0208">0765432146</cbc:EndpointID>
Neemt u het nummer over uit de tax ID van een Stripe-klant (type eu_vat, waarde BE0765432146), haal dan het landvoorvoegsel en alle leestekens weg voordat u het als 0208-ID gebruikt.
Peppol heeft vergelijkbare controles voor andere nationale schema's; PEPPOL-COMMON-R040 (GLN must have a valid format according to GS1 rules) is die voor schema 0088, waarbij het 13e cijfer een GS1-controlecijfer is.
Release 3.0.21 voegt formaatcontroles voor Nederlandse identificaties toe, als waarschuwingen. U kunt ze zien op facturen aan klanten in Nederland:
- PEPPOL-COMMON-R054: Dutch Chamber of Commerce (KVK) numbers (0106) MUST be stated in the correct format (12345678). Acht cijfers, zonder spaties.
- PEPPOL-COMMON-R056-2: Dutch VAT numbers MUST have the format (NL123456789B12). Deze regel controleert elk btw-nummer dat met
NLbegint, ook het btw-nummer van de koper (BT-48). Een nummer dat met spaties of punten is ingetikt, of zonder het achtervoegsel in de stijl vanB01, doet hem dus afgaan. Schrijf het zonder leestekens.
De release bevat ook R055, R056-1 en R057 voor de Nederlandse schema's 0190, 9944 en 0217.
PEPPOL-EN16931-R003: geen kopersreferentie of bestelreferentie
A buyer reference or purchase order reference MUST be provided. Peppol vereist minstens een van de twee: de kopersreferentie (BT-10) of de bestelreferentie (BT-13), zodat de koper de factuur kan koppelen aan iets in zijn eigen administratie. Stripe heeft voor geen van beide een veld, dus een generator heeft een standaardwaarde nodig. Gaf de klant u een bestelnummer (PO-nummer), gebruik het dan als bestelreferentie; anders volstaat een kopersreferentie zoals zijn klantnummer of de naam van een contactpersoon:
<cbc:BuyerReference>PO-2026-118</cbc:BuyerReference>
Of als bestelreferentie (die komt na cac:InvoicePeriod, vóór de partijen):
<cac:OrderReference>
<cbc:ID>PO-2026-118</cbc:ID>
</cac:OrderReference>
PEPPOL-EN16931-R001, R007 en R004: identificaties van proces en specificatie
- R001: Business process MUST be provided.
- R007: Business process MUST have an approved identifier.
- R004: Specification identifier MUST begin with the value
urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0and follow the format rules for the identifier.
Elke Peppol BIS-factuur begint met deze twee regels. Het profiel (BT-23) voor facturatie is proces 01:
<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>
Een ontbrekende ProfileID geeft R001 en R007 samen. Sinds release 3.0.21 aanvaardt R007 alleen nog een vaste lijst goedgekeurde profielen, in plaats van elke waarde met de juiste vorm; voor gewone facturatie is dat het profiel hierboven.
Een vaak voorkomende oorzaak van R007 is dat de BIS-versie erin staat, …poacc:billing:3.0, in plaats van het procesnummer.
R004 gaat af wanneer de Peppol-regels draaien op een bestand met een andere specificatie-ID, bijvoorbeeld een gewone EN 16931- of een XRechnung-ID; accesspoints passen de Peppol-regels toe op alles wat ze versturen.
Sinds 3.0.21 weigert de regel ook een ID die correct begint maar daarna ergens :: bevat, het teken van een slecht aangeplakte extensie.
Validators die de regels kiezen op basis van de specificatie-ID, zoals de onze, controleren zo'n bestand als de norm die erin genoemd wordt, en tonen er dus geen R004 voor. Wordt een bestand dat voor Peppol bedoeld was, gemeld als "EN 16931" of "XRechnung", kijk dan eerst naar CustomizationID.
PEPPOL-EN16931-R002: meer dan één opmerking
No more than one note is allowed on document level, unless both the buyer and seller are German organizations. UBL laat meerdere cbc:Note-elementen toe; Peppol maar één.
Een Stripe-factuur heeft twee vrije tekstvelden die hier terechtkomen: de memo (description) en de footer. Voeg ze samen tot één opmerking:
<cbc:Note>Thank you! Questions? billing@voorbeeld.example</cbc:Note>
De opmerking komt direct na cbc:InvoiceTypeCode; op elke andere plaats weigert het XML-schema ze.
BR-CO-10, BR-CO-13, BR-CO-15 en PEPPOL-EN16931-R120: totalen
- BR-CO-10: Sum of Invoice line net amount (BT-106) = Σ Invoice line net amount (BT-131).
- BR-CO-13: 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).
- BR-CO-15: Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).
- PEPPOL-EN16931-R120: 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.
De documenttotalen worden tot op de cent gecontroleerd. Ze lopen mis wanneer sommige bedragen uit Stripe worden overgenomen (de subtotal, tax en total) en andere door de generator worden herberekend, met een andere afronding of zonder de korting.
Leid elk totaal af uit de lijnen en de btw-uitsplitsing die u werkelijk uitschrijft:
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">49.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">49.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">59.29</cbc:TaxInclusiveAmount>
<cbc:PrepaidAmount currencyID="EUR">59.29</cbc:PrepaidAmount>
<cbc:PayableAmount currencyID="EUR">0.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
Hier heeft de klant al met een kaart betaald, dus het betaalde bedrag (BT-113) is gelijk aan het totaal en het te betalen bedrag (BT-115) is 0.
R120 is de controle van Peppol op lijnniveau: hoeveelheid × prijs moet het lijnbedrag geven. Ze gaat af op pro-rataregels van Stripe en vergelijkbare aanpassingen, waarbij het lijnbedrag een fractie is van de prijs van het abonnement. Schrijf als prijs het eigen bedrag van de lijn gedeeld door de hoeveelheid, niet de catalogusprijs van het abonnement. R120 laat een kleine afrondingsmarge toe; de regels op documentniveau hierboven niet.
BR-S-08, BR-S-09 en BR-CO-17: btw-uitsplitsing met een korting
BR-S-08: 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) …
De gebruikelijke oorzaak is een Stripe-coupon. Staat de korting als korting op documentniveau op de factuur, dan moet de maatstaf van heffing in de btw-uitsplitsing het bedrag na korting zijn. Een uitsplitsing die nog het bedrag zonder korting, 49.00, toont, krijgt BR-S-08, en omdat de btw dan niet meer gelijk is aan maatstaf × tarief, ook BR-S-09 en BR-CO-17. Voor een coupon van 20% op een abonnement van € 49 met 21% Belgische btw:
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReason>Coupon LAUNCH20</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">9.80</cbc:Amount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21</cbc:Percent>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">8.23</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">39.20</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">8.23</cbc:TaxAmount>
...
De totalen zijn dan 49.00 (lijnen), 9.80 (AllowanceTotalAmount), 39.20 zonder btw en 47.43 met btw. Met meer dan één btw-tarief geeft u elke korting het tarief van de lijnen waarop ze slaat, en schrijft u één uitsplitsing per tarief.
BR-AE-10 en BR-AE-02: btw verlegd
Bij een verkoop aan een onderneming in een ander EU-land met verlegging van heffing is de btw-categorie AE met tarief 0, op de lijnen en in de uitsplitsing.
- BR-AE-10: 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).
- BR-AE-02: een factuur met lijnen waarop de btw verlegd is, moet het btw-nummer van de verkoper (BT-31), zijn fiscale registratie-ID (BT-32) of het btw-nummer van zijn fiscaal vertegenwoordiger (BT-63) bevatten, en het btw-nummer van de koper (BT-48) of zijn juridische registratie-ID (BT-47).
In Stripe is dat een klant met tax_exempt op reverse; het btw-nummer van de koper komt uit de customer_tax_ids van de factuur. Heeft de klant in Stripe geen tax ID, dan gaat BR-AE-02 af. De categorie in de uitsplitsing:
<cac:TaxCategory>
<cbc:ID>AE</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cbc:TaxExemptionReasonCode>VATEX-EU-AE</cbc:TaxExemptionReasonCode>
<cbc:TaxExemptionReason>Reverse charge</cbc:TaxExemptionReason>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:TaxCategory>
Zet de reden alleen in de uitsplitsing, niet op de lijnen: in cac:ClassifiedTaxCategory geeft ze de waarschuwingen UBL-CR-600 en UBL-CR-601.
Of de btw bij een verkoop verlegd wordt, is een fiscale vraag; de regels controleren alleen dat de factuur consistent is zodra u dat beslist hebt.
BR-CL-23 en PEPPOL-EN16931-R051: eenheids- en valutacodes
- BR-CL-23: Unit code MUST be coded according to the UN/ECE Recommendation 20 with Rec 21 extension. Stripe kent geen meeteenheid, en woorden als
monthofpcszijn geen codes. GebruikC62("one") voor een abonnement of licentie die in stuks geteld wordt,MONvoor een hoeveelheid in maanden,HURvoor uren. - PEPPOL-EN16931-R051: 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).
Stripe schrijft valuta in kleine letters (
eur); in de XML moeten ze in hoofdletters staan (EUR), en op elk bedrag dezelfde. Een code in kleine letters doet ook BR-CL-03 en PEPPOL-EN16931-CL007 afgaan.
<cbc:InvoicedQuantity unitCode="C62">1</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">49.00</cbc:LineExtensionAmount>
Uw oplossing controleren
Los telkens één groep fouten op en controleer opnieuw: een ontbrekend bovenliggend element kan fouten in zijn onderliggende elementen verbergen, en de controle tegen het XML-schema faalt eerst als elementen in de verkeerde volgorde staan. Onze validator past de regels van EN 16931 en Peppol BIS 3.0 toe, toont elke melding met de plaats in het document, en geeft de factuur leesbaar weer.
Verwante gidsen
- Een Peppol BIS 3.0-factuur valideren: de regelsets en hoe u ze uitvoert.
- De Peppol-verplichting in België voor ondernemingen die factureren met Stripe.
- Mapping a Stripe invoice to EN 16931 (in het Engels): waar elk veld in Stripe vandaan komt.
- Common XRechnung validation errors (in het Engels): de Duitse BR-DE-regels.
Waar evoicely past
Controleer uw Peppol-factuur op deze fouten, gratis en zonder account. evoicely verstuurt de Stripe-facturen en -creditnota's van Belgische ondernemingen over Peppol, gecontroleerd met deze regels voordat ze vertrekken, en zet ze om naar XRechnung en ZUGFeRD voor Duitse klanten. Ga van start: het is gratis voor 10 e-facturen per maand.
Dit is algemene informatie, geen juridisch of fiscaal advies. Dat een factuur de validatieregels doorstaat, beslist geen vragen zoals welke btw-behandeling van toepassing is; ga met uw boekhouder of belastingadviseur na wat voor uw onderneming geldt.