De volledige opbouw van een UBL-factuur stap voor stap uitgelegd: van header en partijen tot factuurregels en BTW-totalen.
Een UBL-factuur is opgebouwd uit een vaste set bouwblokken. Of je nu facturen verstuurt via het eConnect-platform, via de PSB API, of een eigen koppeling bouwt: het helpt enorm om te weten welke onderdelen een UBL-factuur bevat en in welke volgorde ze staan. Dit artikel loopt de structuur van begin tot eind door.
Een UBL Invoice (versie 2.1) bestaat uit vier hoofdgebieden, altijd in deze volgorde:
Binnen elk hoofdgebied staan elementen in een vaste XML-volgorde. Die volgorde is door de UBL-standaard voorgeschreven. Verwissel je de volgorde, dan wordt de factuur bij validatie afgekeurd.
Elke factuur begint met een handvol verplichte elementen die de factuur als geheel identificeren:
<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>
<cbc:ID>F-2026-00042</cbc:ID>
<cbc:IssueDate>2026-03-08</cbc:IssueDate>
<cbc:DueDate>2026-04-07</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
Het CustomizationID vertelt de ontvanger welk profiel de factuur volgt (bijvoorbeeld NLCIUS of BIS Billing V3). Het ProfileID identificeert het bedrijfsproces. Het InvoiceTypeCode geeft aan of het een reguliere factuur (380), een creditnota-variant (381) of een self-billing factuur (389) betreft.
Tip: eConnect herkent het profiel automatisch op basis van het CustomizationID. Je hoeft hier zelf niets voor in te stellen.
Na de identificatie volgen optionele verwijzingen. De meest voorkomende is het ordernummer (OrderReference), maar je kunt ook verwijzen naar een contract, project of eerder verzonden factuur:
<cac:OrderReference>
<cbc:ID>PO-2026-1234</cbc:ID>
</cac:OrderReference>
<cac:ContractDocumentReference>
<cbc:ID>CT-2025-5678</cbc:ID>
</cac:ContractDocumentReference>
Voor ontvangende organisaties die facturen automatisch verwerken (denk aan grote corporates en overheden) is het ordernummer vaak verplicht. Zonder ordernummer wordt de factuur niet geaccepteerd.
Let op: Peppol BIS Billing V3 staat maximaal één
OrderReferenceper factuur toe. Factureer je voor meerdere orders? Dan moet je per order een aparte factuur versturen, of de orderverwijzingen per factuurregel opnemen viaOrderLineReference. Zie Verzamelfacturen voor de details.
Veel facturen bevatten een PDF als visuele bijlage. Die wordt als base64-gecodeerd bestand opgenomen in het AdditionalDocumentReference-element. eConnect kan deze bijlage automatisch toevoegen bij het verzenden.
Een UBL-factuur kent minimaal twee partijen, en optioneel een derde en vierde.
De verzender van de factuur. Verplichte gegevens zijn de naam, het adres en minimaal een fiscaal identificatienummer (BTW-nummer of KVK-nummer). In Nederland is het KVK-nummer het primaire Peppol-ID:
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0106">12345678</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Voorbeeldbedrijf B.V.</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Kerkstraat 1</cbc:StreetName>
<cbc:CityName>Woerden</cbc:CityName>
<cbc:PostalZone>3441 AB</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>NL</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>NL123456789B01</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Voorbeeldbedrijf B.V.</cbc:RegistrationName>
<cbc:CompanyID schemeID="0106">12345678</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
De ontvanger van de factuur. De structuur is identiek aan die van de leverancier. Het EndpointID is het Peppol-adres waarnaar de factuur wordt gerouteerd.
In sommige gevallen zijn er extra partijen:
Dit blok beschrijft hoe de factuur betaald moet worden. Het bevat de betalingsmethode (overschrijving, incasso), het bankrekeningnummer en optioneel een betalingskenmerk:
<cac:PaymentMeans>
<cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
<cbc:PaymentID>RF71 2348 2367</cbc:PaymentID>
<cac:PayeeFinancialAccount>
<cbc:ID>NL91ABNA0417164300</cbc:ID>
<cbc:Name>Voorbeeldbedrijf B.V.</cbc:Name>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>
Code 30 staat voor overschrijving, 49 voor automatische incasso, 58 voor SEPA-overschrijving en 59 voor SEPA-incasso. De volledige codelijst is gedefinieerd in UNCL4461.
Een vrij tekstveld waarin betalingscondities worden beschreven. Sommige systemen gebruiken dit ook voor betalingskorting (skonto).
Optioneel. Bevat de leveringsdatum en het afleveradres, relevant bij goederenleveranties.
Vóór de BTW-totalen komen eventuele factuurkortingen of toeslagen. Elk item heeft een indicator (true = toeslag, false = korting), een bedrag en een BTW-categorie:
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Korting</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">50.00</cbc:Amount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
AllowanceCharge kan ook voorkomen binnen het Price-element van een factuurregel, om het verschil tussen de brutoprijs en de netto eenheidsprijs te tonen. Op dat prijsniveau geldt een beperking: uitsluitend kortingen (ChargeIndicator=false) zijn toegestaan, geen toeslagen. Daarnaast schrijft validatieregel BR-28 voor dat de brutoprijs niet negatief mag zijn. Meer details staan in het artikel over toeslagen en kortingen.
De BTW wordt samengevat per tarief. Elk tarief krijgt een eigen TaxSubtotal met de grondslag en het berekende BTW-bedrag:
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">42.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">200.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">42.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
De BTW-categorie S staat voor het standaardtarief. Andere veelgebruikte codes zijn Z (nultarief), E (vrijgesteld), AE (BTW verlegd binnenland), K (intracommunautair) en G (export).
Het sluitstuk van de factuur. Hier staan alle bedragen die samen het te betalen bedrag vormen:
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">250.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">200.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">242.00</cbc:TaxInclusiveAmount>
<cbc:AllowanceTotalAmount currencyID="EUR">50.00</cbc:AllowanceTotalAmount>
<cbc:PayableAmount currencyID="EUR">242.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
De berekening is: LineExtensionAmount (som van alle regelbedragen) minus AllowanceTotalAmount (kortingen) plus ChargeTotalAmount (toeslagen) = TaxExclusiveAmount. Daar bovenop de BTW = TaxInclusiveAmount. Minus eventueel vooruitbetaald (PrepaidAmount) = PayableAmount. Deze berekening moet exact kloppen, anders faalt de validatie.
Elke factuur heeft minimaal een regel. Een regel bevat een volgnummer, het gefactureerde aantal, het regelbedrag, een artikelomschrijving en BTW-informatie:
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="EA">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">250.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Consultancy-uren maart 2026</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">25.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
Een factuurregel kan ook een korting of toeslag bevatten (via een genest AllowanceCharge-element), verwijzen naar een orderregel, en aanvullende artikelgegevens bevatten zoals artikelnummers of boekingsinformatie.
Technisch: het veld
AccountingCostop de factuurregel wordt vaak gebruikt om een kostenplaats of dimensie mee te geven. Ontvangende systemen zoals AFAS, Unit4 en SAP kunnen dit veld uitlezen voor automatische doorboeking. Een bijzondere toepassing is het Referentiegrootboekschema (RGS): door een RGS-referentienummer inAccountingCostop te nemen, kan de ontvangende boekhoudsoftware het bedrag automatisch op de juiste grootboekrekening boeken. De PSB transporteert hetAccountingCost-element ongewijzigd mee in de UBL.
De kracht van een UBL-factuur zit in de interne consistentie. De BTW-totalen moeten exact aansluiten op de BTW per regel. De factuurtotalen moeten exact de som zijn van de regelbedragen minus kortingen plus toeslagen. Wijkt er een cent af, dan wordt de factuur bij validatie afgekeurd.
eConnect valideert elke factuur automatisch bij het insturen en geeft bij afwijkingen een duidelijke foutmelding. Waar mogelijk worden kleine afwijkingen (zoals een ontbrekend veld dat uit de context kan worden afgeleid) automatisch gerepareerd.
eConnect geeft bij afwijkingen een duidelijke foutmelding die aangeeft welk element niet klopt. Veelvoorkomende oorzaken zijn rekenfouten in BTW-totalen, ontbrekende verplichte velden of ongeldige codes. Kleine afwijkingen (zoals een afleidbaar ontbrekend veld) worden waar mogelijk automatisch gerepareerd.
Dat hangt af van hoe je factureert. Als je facturen aanmaakt in het eConnect-platform, worden alle verplichte elementen automatisch ingevuld. Bij het aanleveren via de API moet je de vereiste velden zelf meesturen, maar eConnect valideert alles en geeft duidelijke feedback bij ontbrekende of onjuiste gegevens.
Ja. Elke factuurregel heeft een eigen BTW-categorie en -percentage. In het TaxTotal-blok worden de tarieven automatisch gegroepeerd in aparte TaxSubtotals. Zo kun je op één factuur regels combineren met 21%, 9%, 0% of vrijgestelde BTW.
Wil je een specifiek onderdeel van de factuur beter begrijpen? De artikelen hieronder gaan dieper in op veelvoorkomende scenario's.
Tip: gebruik de gratis eConnect Validator om je factuur te controleren voordat je hem verstuurt. De validator controleert niet alleen de schema-structuur, maar ook alle rekenregels en codelijsten.
Valideer je factuur