Naar de inhoud

    UBL-factuur: wat het is en hoe je er een maakt

    Een UBL-factuur is je factuur als XML-bestand, zodat de boekhoudsoftware van je klant hem zonder overtypen inleest. Hieronder hoe zo'n bestand eruitziet.

    Een UBL-factuur is dezelfde factuur die je klant als PDF zou krijgen, maar dan opgeschreven in XML: een tekstbestand waarin elk gegeven — het factuurnummer, het btw-tarief, het totaalbedrag — in zijn eigen benoemde veld staat. Daardoor kan een boekhoudpakket hem inlezen en boeken zonder dat iemand de bedragen overtypt.

    UBL staat voor Universal Business Language, een open standaard van OASIS die niet alleen facturen beschrijft maar ook orders, pakbonnen en creditnota's. In Nederland kom je hem in de praktijk vooral tegen als factuurformaat, meestal in versie 2.1.

    Hieronder staat wat er precies in zo'n bestand zit, hoe het eruitziet, hoe je er een maakt, en waarom “mijn PDF omzetten naar UBL” een vraag is met een teleurstellend antwoord.

    UBL, XML, Peppol en EN 16931 uit elkaar gehaald

    Deze vier woorden worden door elkaar gebruikt alsof ze hetzelfde betekenen, en dat is de belangrijkste reden dat e-facturatie ingewikkelder lijkt dan het is. Ze zitten in werkelijkheid op vier verschillende lagen, en als je die uit elkaar houdt valt de rest op zijn plek.

    • XML is de schrijfwijze. Gegevens tussen tags, net als HTML. Zegt niets over facturen — het is alleen de manier waarop het bestand op papier staat.
    • UBL is de woordenlijst. Het legt vast dat het factuurnummer in een veld met de naam cbc:ID staat en het totaalbedrag in cbc:PayableAmount, zodat elk systeem dezelfde velden op dezelfde plek verwacht.
    • EN 16931 is de Europese norm die bepaalt welke van die velden verplicht zijn voor een factuur. UBL kent honderden velden; de norm zegt welke je écht moet invullen.
    • Peppol is het netwerk waarover het bestand verstuurd wordt, met Peppol BIS Billing 3.0 als het profiel dat de norm nog verder aanscherpt. Vergelijk het met e-mail: UBL is de brief, Peppol is de post.
    • NLCIUS is de Nederlandse invulling van EN 16931, met de extra afspraken die hier gelden — bijvoorbeeld dat je KvK-nummer erin hoort.

    Zo ziet een UBL-factuur er van binnen uit

    Hieronder staat een echte, ingekorte UBL 2.1-factuur volgens Peppol BIS Billing 3.0: tien uur installatiewerk à € 125, samen € 1.250 exclusief, 21% btw, € 1.512,50 te betalen. Het klantblok en een paar adresvelden zijn weggelaten om het leesbaar te houden, de rest is precies wat er over de lijn gaat.

    <?xml version="1.0" encoding="UTF-8"?>
    <Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
             xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
             xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
    
      <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>2026-0184</cbc:ID>                       <!-- factuurnummer -->
      <cbc:IssueDate>2026-08-22</cbc:IssueDate>        <!-- factuurdatum -->
      <cbc:DueDate>2026-09-05</cbc:DueDate>            <!-- vervaldatum -->
      <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>   <!-- 380 factuur, 381 creditnota -->
      <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
    
      <cac:AccountingSupplierParty>
        <cac:Party>
          <cbc:EndpointID schemeID="0106">12345678</cbc:EndpointID>
          <cac:PartyLegalEntity>
            <cbc:RegistrationName>Jansen Installatietechniek</cbc:RegistrationName>
            <cbc:CompanyID schemeID="0106">12345678</cbc:CompanyID>      <!-- KvK -->
          </cac:PartyLegalEntity>
          <cac:PartyTaxScheme>
            <cbc:CompanyID>NL001234567B01</cbc:CompanyID>                <!-- btw-id -->
            <cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
          </cac:PartyTaxScheme>
        </cac:Party>
      </cac:AccountingSupplierParty>
    
      <cac:TaxTotal>
        <cbc:TaxAmount currencyID="EUR">262.50</cbc:TaxAmount>
        <cac:TaxSubtotal>
          <cbc:TaxableAmount currencyID="EUR">1250.00</cbc:TaxableAmount>
          <cbc:TaxAmount currencyID="EUR">262.50</cbc:TaxAmount>
          <cac:TaxCategory>
            <cbc:ID>S</cbc:ID>                          <!-- S = standaardtarief -->
            <cbc:Percent>21</cbc:Percent>
            <cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
          </cac:TaxCategory>
        </cac:TaxSubtotal>
      </cac:TaxTotal>
    
      <cac:LegalMonetaryTotal>
        <cbc:LineExtensionAmount currencyID="EUR">1250.00</cbc:LineExtensionAmount>
        <cbc:TaxExclusiveAmount currencyID="EUR">1250.00</cbc:TaxExclusiveAmount>
        <cbc:TaxInclusiveAmount currencyID="EUR">1512.50</cbc:TaxInclusiveAmount>
        <cbc:PayableAmount currencyID="EUR">1512.50</cbc:PayableAmount>
      </cac:LegalMonetaryTotal>
    
      <cac:InvoiceLine>
        <cbc:ID>1</cbc:ID>
        <cbc:InvoicedQuantity unitCode="HUR">10</cbc:InvoicedQuantity>   <!-- HUR = uur -->
        <cbc:LineExtensionAmount currencyID="EUR">1250.00</cbc:LineExtensionAmount>
        <cac:Item>
          <cbc:Name>Installatiewerk</cbc:Name>
          <cac:ClassifiedTaxCategory>
            <cbc:ID>S</cbc:ID>
            <cbc:Percent>21</cbc:Percent>
            <cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
          </cac:ClassifiedTaxCategory>
        </cac:Item>
        <cac:Price><cbc:PriceAmount currencyID="EUR">125.00</cbc:PriceAmount></cac:Price>
      </cac:InvoiceLine>
    
    </Invoice>

    De opbouw in vijf blokken

    Elke UBL-factuur volgt dezelfde volgorde, en die volgorde is niet vrij: het schema schrijft hem voor. Een bestand met de blokken door elkaar wordt afgekeurd, ook als alle gegevens kloppen.

    • De identificatie: CustomizationID en ProfileID vertellen de ontvanger welk profiel je volgt, gevolgd door factuurnummer, datums en valuta.
    • De partijen: AccountingSupplierParty is de verkoper, AccountingCustomerParty de koper. De EndpointID is het adres waarop de partij bereikbaar is op het netwerk — voor Nederlandse bedrijven meestal het KvK-nummer met schemeID 0106.
    • De btw-specificatie: TaxTotal met per tarief een TaxSubtotal. De categoriecode is verplicht — S voor het standaardtarief, AE voor verlegde btw, K voor intracommunautaire levering, E voor vrijgesteld, Z voor het nultarief.
    • De totalen: LegalMonetaryTotal, waarin het bedrag exclusief, het bedrag inclusief en het te betalen bedrag apart staan. Die moeten tot op de cent optellen bij de regels en de btw-specificatie.
    • De regels: een InvoiceLine per factuurregel, met aantal, eenheidscode, regelbedrag en het btw-tarief van díé regel.

    Een UBL-factuur maken

    Met de hand een UBL-bestand typen kan, maar is zelden verstandig: de norm kent honderden regels waarvan je er maar een handvol ziet in het voorbeeld hierboven. Bedragen moeten tot op de cent kloppen met de regels, de btw-categoriecode moet bij het tarief passen, en een ontbrekend verplicht veld levert een afkeuring op in plaats van een foutmelding die je zelf leest.

    In de praktijk laat je je factuurprogramma de XML genereren uit de gegevens die je toch al invoert. AanvraX doet dat bij het definitief maken van een factuur: het schrijft UBL 2.1 weg volgens Peppol BIS Billing 3.0, met de juiste documentcode (380 voor een factuur, 381 voor een creditnota) en een volledige btw-specificatie, en controleert vooraf of alle verplichte velden gevuld zijn.

    Wat je zelf moet regelen is de invoer waar de norm om vraagt en een PDF-factuur niet: een geldig btw-identificatienummer van je zakelijke klant, een volledig adres met landcode, en een doorlopende factuurnummering. Bij een PDF valt een gat pas op als iemand het leest; bij UBL valt het bestand er meteen op om.

    Kun je een PDF omzetten naar UBL?

    Dit is de meest gestelde vraag rond UBL, en het eerlijke antwoord is: niet echt. Een PDF bevat geen gestructureerde gegevens, alleen tekst op posities. Er staat nergens in het bestand “dit getal is het btw-bedrag” — dat weet jij omdat je het woord btw ernaast ziet staan, en dat is precies wat software niet weet.

    Conversiediensten bestaan wel, en ze doen serieus werk: ze herkennen de tekst en leiden per veld af wat het betekent, vaak met een menselijke controle erachter. Voor het verwerken van facturen die je ontvángt is dat prima. Voor de facturen die je zelf verstuurt is het de verkeerde weg: je hebt de gegevens al netjes gestructureerd in je administratie staan, en je gooit die structuur weg door er een PDF van te maken om hem er daarna weer uit te laten afleiden.

    De oplossing voor het onderliggende probleem — je klant wil een leesbare factuur, hun software wil data — is de hybride PDF: een gewone, leesbare PDF met het XML-bestand als bijlage ingesloten in datzelfde bestand. De mens ziet de factuur, de software haalt de XML eruit. Eén bijlage in de mail, beide doelgroepen bediend. De bekendste vorm hiervan is Factur-X, in Duitsland ZUGFeRD; die norm gebruikt overigens CII als XML-taal en niet UBL.

    UBL-facturen ontvangen en verwerken

    Krijg je zelf een UBL-bestand binnen, dan open je het niet met dubbelklikken — je browser toont dan een boom met tags, of vraagt wat hij ermee moet. Dat is geen fout: het bestand is voor een systeem bedoeld, niet voor het oog. Wil je alleen even zien wat erin staat, dan is elke teksteditor genoeg; de veldnamen zijn leesbaar.

    Voor de administratie importeer je het in je boekhoudpakket, dat de leverancier, de datums, de regels en de btw er in één keer uit haalt. Dat is het hele punt van het formaat: geen bedrag overtypen betekent geen typefout, en een inkoopfactuur die in seconden geboekt is in plaats van in minuten.

    Wanneer heb je UBL echt nodig?

    Voor particuliere klanten nooit. Die hebben geen boekhoudsysteem dat XML inleest, en een UBL-bestand in hun mailbox levert alleen een vraag op. Een PDF is daar het juiste antwoord.

    Voor de overheid wel. Aanbestedende diensten in Nederland moeten elektronische facturen kunnen ontvangen volgens EN 16931, en bij de Rijksoverheid is e-factureren de aangewezen route voor leveranciers. Een PDF per mail volstaat daar niet.

    Voor grotere zakelijke klanten steeds vaker, omdat hun crediteurenadministratie erop is ingericht. En vanaf 1 juli 2030 wordt e-facturatie verplicht voor grensoverschrijdende B2B-transacties binnen de EU, via het ViDA-pakket. Er is geen Nederlandse binnenlandse B2B-verplichting, en ook geen aangekondigde — wat je daarover in 2027 of 2028 leest, gaat over België of Duitsland.

    De verstandige tussenweg: zorg dat je factuurprogramma UBL kán uitleveren, en gebruik het wanneer erom gevraagd wordt. Dan hoef je op het moment dat een opdracht ervan afhangt niets meer te regelen.

    Veelgestelde vragen

    Wat is een UBL-bestand?
    Een XML-tekstbestand waarin een zakelijk document — meestal een factuur — veld voor veld is opgeschreven volgens de Universal Business Language. Elk gegeven staat in een benoemde tag, zodat software het factuurnummer, het btw-bedrag en de regels zonder overtypen kan overnemen.
    Wat is het verschil tussen een XML-factuur en een UBL-factuur?
    Geen, in de praktijk. XML is de schrijfwijze, UBL is de afspraak over welke veldnamen je gebruikt. Als iemand in Nederland om een XML-factuur vraagt, bedoelt hij vrijwel altijd een UBL-factuur.
    Kan ik een PDF-factuur omzetten naar UBL?
    Alleen door de tekst te laten herkennen en per veld te laten afleiden wat het betekent, met de foutkans die daarbij hoort. Voor facturen die je zelf verstuurt is het beter om de UBL rechtstreeks uit je factuurprogramma te laten genereren, of een hybride PDF te gebruiken met de XML erin ingesloten.
    Hoe open ik een UBL-factuur?
    Om even te kijken wat erin staat: met elke teksteditor, de veldnamen zijn leesbaar. Om hem te verwerken: importeren in je boekhoudpakket, dat de gegevens er automatisch uithaalt. Dubbelklikken opent hem meestal in je browser als een boom met tags.
    Is een UBL-factuur verplicht?
    Niet voor gewone facturen aan bedrijven en particulieren in Nederland. Wel als je factureert aan de overheid, en vanaf 1 juli 2030 voor grensoverschrijdende B2B-transacties binnen de EU via het ViDA-pakket.
    UBL 2.0 of UBL 2.1?
    2.1. Dat is de versie waarop EN 16931, NLCIUS en Peppol BIS Billing 3.0 gebouwd zijn en die je in Nederland overal tegenkomt. UBL 2.0 is ouder en wordt voor facturatie niet meer gebruikt.
    Heb ik Peppol nodig om een UBL-factuur te versturen?
    Niet per se. Je mag een UBL-bestand ook gewoon meesturen als bijlage bij een e-mail, en veel ontvangers verwerken het dan prima. Peppol heb je nodig zodra de ontvanger — meestal een overheidsinstantie — aanlevering via dat netwerk verlangt.