E-invoicing in Denmark in short
Invoices to the Danish public sector are electronic: they travel on NemHandel, the Danish e-invoicing infrastructure, and 99% of them arrive as e-invoices. The format is OIOUBL, the Danish adaptation of UBL (version 2.1 since 2022), or Peppol BIS Billing 3.0.
Between businesses e-invoicing is not required. Instead, the bookkeeping act has made digital bookkeeping systems mandatory step by step from 2022 to 2026, and these systems must be able to send and receive e-invoices. Under Executive Order 811 of 22 September 2026, registered systems let their users confirm their identity with MitID and show the e-invoice option by 1 March 2027, with the remaining requirements from 1 January 2028; a business is then signed up to receive e-invoices unless it declines within four weeks. Cross-border invoices between EU businesses become electronic by 1 July 2030 at the latest, under the ViDA directive.
How to check an OIOUBL document
- Open the validator with the OIOUBL invoice profile, or the credit note or reminder one. A file with the CustomizationID OIOUBL-2.1 picks the right one by itself.
- Paste the XML or drop the file, then press Validate.
- Click a rule id for what it checks.
What is checked
The UBL 2.1 schema, then NemHandel's OIOUBL Schematron 1.17.2. The rules name themselves in their messages, F- for errors and W- for warnings, and that is how they are shown here: the CustomizationID and profile (F-LIB002), an order reference for the profiles that need one (F-INV002), the payable amount against the totals (F-INV133), amounts with two decimals (F-INV149), the tax currency (F-INV016), party identifiers such as CVR and EAN numbers, and the code lists.
A Peppol BIS Billing 3.0 invoice runs the Peppol rules, which have Danish rules for Danish suppliers and customers, such as the CVR number (DK-R-002, DK-R-014).
Profiles to check with
- Denmark OIOUBL 2.1 Invoice: A Danish OIOUBL 2.1 invoice, checked against the UBL 2.1 schema and the OIOUBL Schematron of NemHandel. Validate
- Denmark OIOUBL 2.1 Credit Note: A Danish OIOUBL 2.1 credit note (kreditnota), checked against the UBL 2.1 CreditNote schema and the OIOUBL Schematron. Validate
- Denmark OIOUBL 2.1 Reminder: A Danish payment reminder (rykker) in OIOUBL 2.1, checked against the UBL 2.1 Reminder schema and the OIOUBL Schematron. Validate
- Peppol BIS Billing 3.0 Invoice: A Peppol invoice checked the way an access point does: UBL 2.1 schema, EN 16931 rules and the Peppol BIS Billing 3.0 rules. Validate
- Peppol BIS Billing 3.0 Credit Note: A Peppol credit note checked against the UBL 2.1 schema, the EN 16931 rules and the Peppol BIS Billing 3.0 rules. Validate
Rules invoices break most
Each one has a page with what it checks, its test and, for many, how to fix it.
F-LIB002: Invalid CustomizationID. Must be either 'OIOUBL-2.01', 'OIOUBL-2.02' or 'OIOUBL-2.1'F-INV002: There must be an OrderReference class for this profileIDF-INV133: PayableAmount is calculated incorrectly - PayableAmount ('…' ) don't match total calculation ('…' )F-INV149: Invalid LineExtensionAmount. Must have at least 2 decimalsF-INV016: TaxCurrencyCode must be either DKK or EURDK-R-002: Danish suppliers MUST provide legal entity (CVR-number)DK-R-014: For Danish Suppliers it is mandatory to specify schemeID as "0184" (DK CVR-number) when PartyLegalEntity/CompanyID is used for AccountingSupplierParty
Questions
Is the invoice uploaded?
No. The schema check and the rules both run in your browser. Only the API and URL monitors validate on our servers.
Why do the rule ids look like F-INV133?
OIOUBL's Schematron puts its rule id and level at the start of each message, such as [F-INV133]. We use that id for the rule and its page, and F or W for its level.
Which version of the rules is used?
The OIOUBL Schematron 1.17.2 (May 2026). A weekly check tells us when a newer release is out.
Can I check invoices from code?
Yes: the API and the command-line client with --schema dk-oioubl-invoice, or --schema auto for a folder of mixed documents.
Official sources
- Erhvervsstyrelsen: e-invoicing (in Danish)
- Erhvervsstyrelsen: new requirements for registered bookkeeping systems (in Danish)
- OIOUBL 2.1 documentation (in Danish)
- NemHandel: releases (in Danish)
Other countries
- French e-invoice validator
- German e-invoice validator: XRechnung and ZUGFeRD
- Belgian e-invoice validator: Peppol BIS
- KSeF invoice validator: FA(3)
- Croatian eRačun validator
- RO e-Factura validator
- FatturaPA validator
- UAE e-invoice validator (PINT AE)
- InvoiceNow validator (PINT SG)
- JP PINT validator
- Australian e-invoice validator (PINT A-NZ)
- Spanish e-invoice validator
- Dutch e-invoice validator: SI-UBL 2.0 and NLCIUS
- Norwegian e-invoice validator: EHF
- Swedish e-invoice validator: Peppol BIS
- Finnish e-invoice validator: Finvoice
- Austrian e-invoice validator for e-Rechnung.gv.at
- Czech e-invoice validator: ISDOC
- Portuguese e-invoice validator: CIUS-PT
- ZATCA e-invoice validator (FATOORA)