> ## Documentation Index
> Fetch the complete documentation index at: https://invopop-dk.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# NemHandel issuing invoices guide

> Issue OIOUBL invoices and credit notes in Denmark over the NemHandel network, and import received documents.

export const dkImportWorkflow = {
  "name": "NemHandel import invoice",
  "description": "Import a received OIOUBL document delivered via NemHandel",
  "schema": "bill/invoice",
  "steps": [{
    "id": "a1c0f2df-4f6a-11f1-9c2d-0242ac120010",
    "name": "Import invoice from NemHandel",
    "provider": "gov-dk.import",
    "summary": "Fetches, parses OIOUBL, and converts to GOBL in one step"
  }, {
    "id": "a1c0f2e2-4f6a-11f1-9c2d-0242ac120010",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `registered`{.state .registered}",
    "config": {
      "state": "registered"
    }
  }],
  "rescue": [{
    "id": "a1c0f2e3-4f6a-11f1-9c2d-0242ac120010",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `error`{.state .error}",
    "config": {
      "state": "error"
    }
  }]
};

export const dkSendWorkflow = {
  "name": "NemHandel send invoice",
  "description": "Convert an invoice to OIOUBL and send it over the NemHandel network",
  "schema": "bill/invoice",
  "steps": [{
    "id": "e3ad87b2-88d1-11f1-8000-920007eb4d91",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `processing`{.state .processing}",
    "config": {
      "state": "processing"
    }
  }, {
    "id": "e3add26c-88d1-11f1-8000-920007eb4d91",
    "name": "Add sequential code",
    "provider": "sequence.enumerate",
    "summary": "Dynamic · NemHandel · 000001",
    "config": {
      "name": "NemHandel",
      "padding": 6,
      "start": 1
    }
  }, {
    "id": "e3ae403a-88d1-11f1-8000-920007eb4d91",
    "name": "Sign Envelope",
    "provider": "silo.close"
  }, {
    "id": "e3afc3a6-88d1-11f1-8000-920007eb4d91",
    "name": "Generate OIOUBL",
    "provider": "gov-dk.convert",
    "summary": "OIOUBL 2.1 Invoice/CreditNote"
  }, {
    "id": "e3aea606-88d1-11f1-8000-920007eb4d91",
    "name": "Send to NemHandel",
    "provider": "gov-dk.send",
    "summary": "Submits and queues until eCourier confirms delivery"
  }, {
    "id": "e3af29be-88d1-11f1-8000-920007eb4d91",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `sent`{.state .sent}",
    "config": {
      "state": "sent"
    }
  }],
  "rescue": [{
    "id": "e3af4e58-88d1-11f1-8000-920007eb4d91",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `error`{.state .error}",
    "config": {
      "state": "error"
    }
  }]
};

export const WorkflowDiagram = ({workflow}) => {
  const stateColors = {
    processing: "yellow",
    sent: "blue",
    received: "blue",
    registered: "green",
    completed: "green",
    error: "red"
  };
  const StateChip = ({state, label}) => <Badge size="sm" color={stateColors[state] || "gray"} icon="square-small" iconType="solid">
      {label.charAt(0).toUpperCase() + label.slice(1)}
    </Badge>;
  const providerIcons = {
    "silo.state": "https://silo.invopop.com/images/status.svg",
    "silo.close": "https://silo.invopop.com/images/check-badge.svg",
    "silo.if": "https://assets.invopop.com/apps/silo/if.svg",
    "silo.folder": "https://silo.invopop.com/images/folder.svg",
    "silo.modify": "https://silo.invopop.com/images/modify.svg",
    "silo.correct": "https://silo.invopop.com/images/replace.svg",
    "silo.sleep": "https://assets.invopop.com/icons/sleep.svg",
    silo: "https://assets.invopop.com/apps/silo/icon.svg",
    "sequence.enumerate": "https://sequence.invopop.com/images/enumerate.svg",
    "transform.job.create": "https://transform.invopop.com/images/jobs.svg",
    webhook: "https://webhook.invopop.com/icon.svg",
    lookup: "https://lookup.invopop.com/icon.png",
    dropbox: "https://dropbox.invopop.com/icon.png",
    pdf: "https://pdf.invopop.com/file-pdf.svg",
    peppol: "https://assets.invopop.com/apps/peppol/icon.svg",
    ubl: "https://assets.invopop.com/apps/ubl/logo.svg",
    cii: "https://assets.invopop.com/apps/cii/logo.svg",
    "gov-dk": "https://assets.invopop.com/flags/dk.svg",
    "gov-fi": "https://assets.invopop.com/flags/fi.svg",
    "gov-fr": "https://assets.invopop.com/flags/fr.svg",
    "chorus-pro": "https://assets.invopop.com/apps/chroruspro/icon.svg",
    "gov-es": "https://assets.invopop.com/apps/gov-es/icon.svg",
    "gov-es.sii": "https://assets.invopop.com/apps/sii/icon.svg",
    "gov-es.ticketbai": "https://assets.invopop.com/apps/ticketbai/icon.svg",
    "gov-es.facturae": "https://assets.invopop.com/apps/facturae/icon.svg",
    verifactu: "https://assets.invopop.com/apps/verifactu/icon.svg",
    "gov-pl": "https://assets.invopop.com/apps/ksef/icon.svg",
    "gov-sa": "https://assets.invopop.com/apps/zatca/icon.svg",
    "gov-ar": "https://assets.invopop.com/apps/arca/icon.svg",
    "at-pt": "https://assets.invopop.com/apps/at-pt/icon.svg",
    "sat-mx": "https://assets.invopop.com/apps/sat-mexico/icon.svg",
    "sw-sapien": "https://assets.invopop.com/apps/sw-sapien/icon.svg",
    "sdi-it": "https://assets.invopop.com/apps/sdi-italy/icon.svg",
    "ticket-it": "https://assets.invopop.com/apps/agenzia-entrate/icon.svg",
    "nfe-br": "https://assets.invopop.com/apps/notas-fiscais-eletronicas-brazil/icon.svg",
    chargebee: "https://assets.invopop.com/apps/chargebee/icon.svg",
    stripe: "https://assets.invopop.com/apps/stripe/icon.svg",
    email: "https://assets.invopop.com/apps/email/icon.svg",
    cron: "https://assets.invopop.com/apps/cron/icon.svg",
    ilyda: "https://assets.invopop.com/apps/ilyda/icon.svg",
    invoicexpress: "https://assets.invopop.com/apps/invoicexpress/icon.svg",
    plemsi: "https://assets.invopop.com/flags/co.svg"
  };
  const iconFor = provider => {
    const parts = (provider || "").split(".");
    for (let i = parts.length; i > 0; i--) {
      const url = providerIcons[parts.slice(0, i).join(".")];
      if (url) return url;
    }
    return null;
  };
  const StepIcon = ({provider}) => {
    const url = iconFor(provider);
    return <span title={provider} className="flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-gray-950/10 bg-white dark:border-white/10 dark:bg-white/5">
        {url ? <img src={url} alt="" className="h-4 w-4" /> : null}
      </span>;
  };
  const renderSummary = summary => {
    const nodes = [];
    const re = /`([^`]+)`(\{[^}]*\})?/g;
    let last = 0;
    let m;
    let k = 0;
    while ((m = re.exec(summary)) !== null) {
      if (m.index > last) nodes.push(summary.slice(last, m.index));
      const attrs = m[2] || "";
      if (attrs.indexOf(".state") >= 0) {
        const state = (attrs.match(/\.state\s+\.([\w-]+)/) || [])[1] || m[1];
        nodes.push(<StateChip key={k++} state={state} label={m[1]} />);
      } else if (attrs) {
        nodes.push(<span key={k++} className="text-sm font-medium text-gray-700 dark:text-gray-300">
            {m[1]}
          </span>);
      } else {
        nodes.push(<code key={k++} className="text-sm rounded bg-gray-100 px-1 font-mono text-sm dark:bg-white/10">
            {m[1]}
          </code>);
      }
      last = m.index + m[0].length;
    }
    if (last < summary.length) nodes.push(summary.slice(last));
    return nodes;
  };
  const NoteRow = ({text}) => <div className="mt-4 mb-1 font-mono text-sm leading-5 text-gray-400 dark:text-gray-500">{"// " + text}</div>;
  const renderSteps = (steps, counter) => (steps || []).map(step => {
    counter.n += 1;
    const n = counter.n;
    const branches = (step.next || []).filter(b => b.steps && b.steps.length > 0);
    return <div key={step.id || "step-" + n}>
          {step.notes ? <NoteRow text={step.notes} /> : null}
          <div className="mt-2.5 flex items-center">
            <span className="absolute left-0 w-10 text-center font-mono text-sm text-gray-400 select-none dark:text-gray-500">
              {n}
            </span>
            <div className="flex min-w-0 flex-1 items-center gap-2 rounded-xl border border-gray-950/5 bg-white px-2 py-2 dark:border-white/10 dark:bg-gray-900">
              <StepIcon provider={step.provider} />
              <span className="text-sm shrink-0 font-medium text-gray-900 dark:text-gray-100">{step.name}</span>
              {step.summary ? <span className="text-sm min-w-0 truncate text-gray-500 dark:text-gray-400">{renderSummary(step.summary)}</span> : null}
            </div>
          </div>
          {branches.length > 0 ? <div className="ml-5 border-l border-gray-200 -my-1 py-1 pl-6 dark:border-white/10">
              {branches.map((branch, bi) => <div key={branch.code || branch.status || bi}>
                  <div className="mt-4">
                    <span className="rounded-md bg-gray-200/70 px-2 py-1 font-mono text-sm text-gray-600 dark:bg-white/10 dark:text-gray-300">
                      {branch.code || branch.status}
                    </span>
                  </div>
                  {renderSteps(branch.steps, counter)}
                </div>)}
            </div> : null}
        </div>;
  });
  const counter = {
    n: 0
  };
  const wf = workflow || ({});
  return <div className="not-prose relative my-5 rounded-2xl border border-gray-950/5 bg-gray-50 py-3 pr-4 pb-5 pl-12 dark:border-white/10 dark:bg-white/[0.03]">
      {renderSteps(wf.steps, counter)}
      {wf.rescue && wf.rescue.length > 0 ? <div className="mt-6 border-t border-dashed border-gray-300 dark:border-white/10">
          <NoteRow text="If any step fails" />
          {renderSteps(wf.rescue, counter)}
        </div> : null}
    </div>;
};

## Introduction

[NemHandel](https://erhvervsstyrelsen.dk/nemhandel) is Denmark's national e-invoicing network, managed by the Danish Business Authority (Erhvervsstyrelsen). Invoices to Danish public authorities must be submitted through it — mandatory since 2005 — and Danish businesses exchange B2B invoices over the same infrastructure. Documents travel as **OIOUBL 2.1**, Denmark's UBL-based national format.

The NemHandel Denmark app converts [GOBL](https://docs.gobl.org) invoices and credit notes to OIOUBL, delivers them over the network, and imports documents your suppliers receive. For onboarding suppliers, see the companion guide: [Denmark: Supplier registration](/guides/dk-nemhandel-supplier).

| -               | Sandbox                             | Live                         |
| --------------- | ----------------------------------- | ---------------------------- |
| **Supplier**    | Registered against the test network | Registered supplier required |
| **Environment** | Official NemHandel test network     | NemHandel production         |

Please refer to the docs of [GOBL's Denmark tax regime](https://docs.gobl.org/regimes/dk) to learn about the specifics of Danish GOBL documents.

## Prerequisites

In order to complete this guide, you will need:

* **A registered supplier**: follow the [NemHandel supplier registration guide](/guides/dk-nemhandel-supplier) to connect the NemHandel Denmark app, sign the authorization agreement, and register the supplier on the network before issuing.
* Customer routing details: the EAN/GLN number for public institutions, or the CVR number for Danish companies.
* Line and item details, including quantity, price, and description. Denmark applies a single 25% VAT rate (moms) with no reduced rates.

## Setup

<Info>
  The supplier must already be registered on NemHandel — this is covered in the [supplier registration guide](/guides/dk-nemhandel-supplier).
</Info>

All of the following steps must be carried out from the [Invopop Console](https://console.invopop.com).

<Steps>
  <Step title="Create the send workflow">
    This workflow numbers and signs the invoice, converts it to OIOUBL 2.1, and submits it to the network, holding until the delivery is confirmed.

    <Card iconType="duotone" title="NemHandel send invoice workflow" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=dk-dk-send" horizontal>
      Add to my workspace →
    </Card>

    <Tabs>
      <Tab title="Workflow">
        <WorkflowDiagram workflow={dkSendWorkflow} />
      </Tab>

      <Tab title="Code">
        Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view.

        ```json Example NemHandel send invoice workflow theme={"system"}
        {
            "name": "NemHandel send invoice",
            "description": "Convert an invoice to OIOUBL and send it over the NemHandel network",
            "schema": "bill/invoice",
            "steps": [
                {
                    "id": "e3ad87b2-88d1-11f1-8000-920007eb4d91",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `processing`{.state .processing}",
                    "config": {
                        "state": "processing"
                    }
                },
                {
                    "id": "e3add26c-88d1-11f1-8000-920007eb4d91",
                    "name": "Add sequential code",
                    "provider": "sequence.enumerate",
                    "summary": "Dynamic · NemHandel · 000001",
                    "config": {
                        "name": "NemHandel",
                        "padding": 6,
                        "start": 1
                    }
                },
                {
                    "id": "e3ae403a-88d1-11f1-8000-920007eb4d91",
                    "name": "Sign Envelope",
                    "provider": "silo.close"
                },
                {
                    "id": "e3afc3a6-88d1-11f1-8000-920007eb4d91",
                    "name": "Generate OIOUBL",
                    "provider": "gov-dk.convert",
                    "summary": "OIOUBL 2.1 Invoice/CreditNote"
                },
                {
                    "id": "e3aea606-88d1-11f1-8000-920007eb4d91",
                    "name": "Send to NemHandel",
                    "provider": "gov-dk.send",
                    "summary": "Submits and queues until eCourier confirms delivery"
                },
                {
                    "id": "e3af29be-88d1-11f1-8000-920007eb4d91",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `sent`{.state .sent}",
                    "config": {
                        "state": "sent"
                    }
                }
            ],
            "rescue": [
                {
                    "id": "e3af4e58-88d1-11f1-8000-920007eb4d91",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `error`{.state .error}",
                    "config": {
                        "state": "error"
                    }
                }
            ]
        }
        ```
      </Tab>
    </Tabs>
  </Step>

  <Step title="Create the import workflow">
    <Info>You can skip this step if you don't plan to receive invoices.</Info>

    This workflow runs once for each document delivered to one of your registered suppliers: it fetches the OIOUBL from the network, converts it to GOBL, and stores it as a new silo entry with the original XML and any embedded attachments.

    <Card iconType="duotone" title="NemHandel import invoice workflow" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=dk-dk-import" horizontal>
      Add to my workspace →
    </Card>

    <Tabs>
      <Tab title="Workflow">
        <WorkflowDiagram workflow={dkImportWorkflow} />
      </Tab>

      <Tab title="Code">
        Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view.

        ```json Example NemHandel import invoice workflow theme={"system"}
        {
            "name": "NemHandel import invoice",
            "description": "Import a received OIOUBL document delivered via NemHandel",
            "schema": "bill/invoice",
            "steps": [
                {
                    "id": "a1c0f2df-4f6a-11f1-9c2d-0242ac120010",
                    "name": "Import invoice from NemHandel",
                    "provider": "gov-dk.import",
                    "summary": "Fetches, parses OIOUBL, and converts to GOBL in one step"
                },
                {
                    "id": "a1c0f2e2-4f6a-11f1-9c2d-0242ac120010",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `registered`{.state .registered}",
                    "config": {
                        "state": "registered"
                    }
                }
            ],
            "rescue": [
                {
                    "id": "a1c0f2e3-4f6a-11f1-9c2d-0242ac120010",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `error`{.state .error}",
                    "config": {
                        "state": "error"
                    }
                }
            ]
        }
        ```
      </Tab>
    </Tabs>
  </Step>

  <Step title="Configure the NemHandel Denmark app">
    <Info>You can skip this step if you don't plan to receive invoices.</Info>

    In **Configuration** → **Apps** → **NemHandel Denmark**, select the import workflow you just created as the **incoming workflow**. Every document received on the network for one of your registered suppliers is handed to it automatically. See the [NemHandel Denmark app](/apps/nemhandel-denmark) page for the full list of actions it provides.
  </Step>
</Steps>

## Send an invoice

Upload an invoice to the silo and run the **NemHandel send invoice** workflow on it, either from the Console or via the API.

<Info>
  The recommended approach for running jobs is to perform two steps: first upload the document to the [silo](/api-ref/silo/entries/create-an-entry-put), then [create a job](/api-ref/transform/jobs/create-a-job-post).
</Info>

The workflow queues after submission until the delivery is confirmed, so an entry in the `sent` state means the recipient's access point accepted the document.

### Correct an invoice

There is no cancellation mechanism on the NemHandel network. To correct a delivered invoice, issue a **credit note** referencing the original in its `preceding` array and run the same send workflow on it — OIOUBL requires non-negative totals, so corrections are always credit notes in Denmark. See the [example credit note](#example-invoices) below.

## Example invoices

The following examples are [GOBL](https://docs.gobl.org) documents you can copy and paste directly into the [Invopop Console](https://console.invopop.com) or store via the API as silo entries. Then, run the NemHandel send invoice workflow created during setup.

[GOBL Invoices](https://docs.gobl.org/draft-0/bill/invoice) sent to NemHandel require the following properties:

* `$schema` to be set to `https://gobl.org/draft-0/bill/invoice`
* `supplier.tax_id.country` to be set to `DK`, with the supplier's 8-digit CVR number as the code
* customer routing: an explicit `GLN:` endpoint for public institutions, or a Danish `tax_id` from which the participant is derived
* the [`dk-oioubl-v2`](https://github.com/invopop/gobl.dk.oioubl) addon; the app adds it automatically during conversion if it's missing, but declaring it up front validates the document at upload time

<AccordionGroup>
  <Accordion title="Example invoice to a public institution (B2G)">
    In this example, we're issuing an invoice from a Danish supplier to a public institution — the classic NemHandel use case. Public entities are identified by their EAN/GLN number in the NemHandelsregisteret.

    Notice:

    * The `dk-oioubl-v2` addon validates and normalizes the document using the OIOUBL 2.1 rules, and pulls in the `eu-en16931-v2017` addon automatically.
    * The customer carries a GLN legal identity and a `GLN:` endpoint — this is how the document is routed to the institution on the NemHandel network.
    * The supplier only sets its CVR number as the tax ID; the addon derives the `DK:CVR` endpoint from it automatically.
    * The `debit-transfer` payment key maps to UNTDID payment means `31` (IBAN transfer), one of the codes OIOUBL allows. A BIC is required alongside the IBAN.
    * There are no totals or calculations; all these will be made automatically when uploading.

    <CodeGroup>
      ```json B2G invoice (GLN customer) theme={"system"}
      {
        "$schema": "https://gobl.org/draft-0/bill/invoice",
        "$addons": [
          "dk-oioubl-v2"
        ],
        "series": "NH",
        "code": "0042",
        "currency": "DKK",
        "supplier": {
          "name": "Tavleleverandøren ApS",
          "tax_id": {
            "country": "DK",
            "code": "16356700"
          },
          "people": [
            {
              "name": {
                "given": "Hugo Jensen"
              }
            }
          ],
          "addresses": [
            {
              "num": "11",
              "street": "Leverandørvej",
              "locality": "Dyssegård",
              "code": "2870",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@tavleleverandoren.dk"
            }
          ]
        },
        "customer": {
          "name": "Den Lille Skole",
          "identities": [
            {
              "scope": "legal",
              "code": "5798009883735",
              "ext": {
                "iso-scheme-id": "GLN"
              }
            }
          ],
          "endpoints": [
            {
              "uri": "GLN:5798009883735"
            }
          ],
          "people": [
            {
              "name": {
                "given": "Hans Hansen"
              }
            }
          ],
          "addresses": [
            {
              "num": "10",
              "street": "Fredericiavej",
              "locality": "Helsingør",
              "code": "3000",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@denlilleskole.dk"
            }
          ]
        },
        "lines": [
          {
            "quantity": "1",
            "item": {
              "name": "Hejsetavle",
              "price": "5000.00",
              "unit": "item"
            },
            "taxes": [
              {
                "cat": "VAT",
                "rate": "standard"
              }
            ]
          },
          {
            "quantity": "2",
            "item": {
              "name": "Beslag",
              "price": "25.00",
              "unit": "item"
            },
            "taxes": [
              {
                "cat": "VAT",
                "rate": "standard"
              }
            ]
          }
        ],
        "ordering": {
          "cost": "5250124502"
        },
        "payment": {
          "instructions": {
            "key": "debit-transfer",
            "credit_transfer": [
              {
                "iban": "DK5000400440116243",
                "bic": "DABADKKK"
              }
            ]
          }
        }
      }
      ```

      ```json Built version theme={"system"}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "DK",
      	"$addons": [
      		"eu-en16931-v2017",
      		"dk-oioubl-v2"
      	],
      	"type": "standard",
      	"series": "NH",
      	"code": "0042",
      	"issue_date": "2026-07-28",
      	"currency": "DKK",
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"untdid-document-type": "380"
      		}
      	},
      	"supplier": {
      		"name": "Tavleleverandøren ApS",
      		"tax_id": {
      			"country": "DK",
      			"code": "16356700"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "16356700"
      			}
      		],
      		"people": [
      			{
      				"name": {
      					"given": "Hugo Jensen"
      				}
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:16356700"
      			}
      		],
      		"addresses": [
      			{
      				"num": "11",
      				"street": "Leverandørvej",
      				"locality": "Dyssegård",
      				"code": "2870",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@tavleleverandoren.dk"
      			}
      		]
      	},
      	"customer": {
      		"name": "Den Lille Skole",
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "5798009883735",
      				"ext": {
      					"iso-scheme-id": "GLN"
      				}
      			}
      		],
      		"people": [
      			{
      				"name": {
      					"given": "Hans Hansen"
      				}
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "GLN:5798009883735"
      			}
      		],
      		"addresses": [
      			{
      				"num": "10",
      				"street": "Fredericiavej",
      				"locality": "Helsingør",
      				"code": "3000",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@denlilleskole.dk"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "1",
      			"item": {
      				"name": "Hejsetavle",
      				"price": "5000.00",
      				"unit": "item"
      			},
      			"sum": "5000.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "standard",
      					"rate": "general",
      					"percent": "25.0%"
      				}
      			],
      			"total": "5000.00"
      		},
      		{
      			"i": 2,
      			"quantity": "2",
      			"item": {
      				"name": "Beslag",
      				"price": "25.00",
      				"unit": "item"
      			},
      			"sum": "50.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "standard",
      					"rate": "general",
      					"percent": "25.0%"
      				}
      			],
      			"total": "50.00"
      		}
      	],
      	"ordering": {
      		"cost": "5250124502"
      	},
      	"payment": {
      		"instructions": {
      			"key": "debit-transfer",
      			"credit_transfer": [
      				{
      					"iban": "DK5000400440116243",
      					"bic": "DABADKKK"
      				}
      			],
      			"ext": {
      				"untdid-payment-means": "31"
      			}
      		}
      	},
      	"totals": {
      		"sum": "5050.00",
      		"total": "5050.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "standard",
      							"base": "5050.00",
      							"percent": "25.0%",
      							"amount": "1262.50"
      						}
      					],
      					"amount": "1262.50"
      				}
      			],
      			"sum": "1262.50"
      		},
      		"tax": "1262.50",
      		"total_with_tax": "6312.50",
      		"payable": "6312.50"
      	}
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="Example invoice between businesses (B2B)">
    In this example, we're issuing an invoice from one Danish company to another. Both parties are identified by their CVR numbers alone.

    Notice:

    * Neither party declares endpoints or inboxes explicitly; the `dk-oioubl-v2` addon derives each participant identifier (`DK:CVR:<number>`) from the Danish tax ID.
    * Only the [VAT rate](https://docs.gobl.org/regimes/dk) (`standard`) is specified on the lines; Denmark's single 25% rate and the amounts are calculated on build.
    * There are no totals or calculations; all these will be made automatically when uploading.

    <CodeGroup>
      ```json B2B invoice (CVR customer) theme={"system"}
      {
        "$schema": "https://gobl.org/draft-0/bill/invoice",
        "$addons": [
          "dk-oioubl-v2"
        ],
        "series": "NH",
        "code": "0043",
        "currency": "DKK",
        "supplier": {
          "name": "Tavleleverandøren ApS",
          "tax_id": {
            "country": "DK",
            "code": "16356700"
          },
          "people": [
            {
              "name": {
                "given": "Hugo Jensen"
              }
            }
          ],
          "addresses": [
            {
              "num": "11",
              "street": "Leverandørvej",
              "locality": "Dyssegård",
              "code": "2870",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@tavleleverandoren.dk"
            }
          ]
        },
        "customer": {
          "name": "Nordisk Handel A/S",
          "tax_id": {
            "country": "DK",
            "code": "13585628"
          },
          "people": [
            {
              "name": {
                "given": "Mette Sørensen"
              }
            }
          ],
          "addresses": [
            {
              "num": "42",
              "street": "Østergade",
              "locality": "København K",
              "code": "1100",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "bogholderi@nordiskhandel.dk"
            }
          ]
        },
        "lines": [
          {
            "quantity": "20",
            "item": {
              "name": "Konsulenttimer",
              "price": "900.00",
              "unit": "h"
            },
            "taxes": [
              {
                "cat": "VAT",
                "rate": "standard"
              }
            ]
          }
        ],
        "payment": {
          "instructions": {
            "key": "debit-transfer",
            "credit_transfer": [
              {
                "iban": "DK5000400440116243",
                "bic": "DABADKKK"
              }
            ]
          }
        }
      }
      ```

      ```json Built version theme={"system"}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "DK",
      	"$addons": [
      		"eu-en16931-v2017",
      		"dk-oioubl-v2"
      	],
      	"type": "standard",
      	"series": "NH",
      	"code": "0043",
      	"issue_date": "2026-07-28",
      	"currency": "DKK",
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"untdid-document-type": "380"
      		}
      	},
      	"supplier": {
      		"name": "Tavleleverandøren ApS",
      		"tax_id": {
      			"country": "DK",
      			"code": "16356700"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "16356700"
      			}
      		],
      		"people": [
      			{
      				"name": {
      					"given": "Hugo Jensen"
      				}
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:16356700"
      			}
      		],
      		"addresses": [
      			{
      				"num": "11",
      				"street": "Leverandørvej",
      				"locality": "Dyssegård",
      				"code": "2870",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@tavleleverandoren.dk"
      			}
      		]
      	},
      	"customer": {
      		"name": "Nordisk Handel A/S",
      		"tax_id": {
      			"country": "DK",
      			"code": "13585628"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "13585628"
      			}
      		],
      		"people": [
      			{
      				"name": {
      					"given": "Mette Sørensen"
      				}
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:13585628"
      			}
      		],
      		"addresses": [
      			{
      				"num": "42",
      				"street": "Østergade",
      				"locality": "København K",
      				"code": "1100",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "bogholderi@nordiskhandel.dk"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "20",
      			"item": {
      				"name": "Konsulenttimer",
      				"price": "900.00",
      				"unit": "h"
      			},
      			"sum": "18000.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "standard",
      					"rate": "general",
      					"percent": "25.0%"
      				}
      			],
      			"total": "18000.00"
      		}
      	],
      	"payment": {
      		"instructions": {
      			"key": "debit-transfer",
      			"credit_transfer": [
      				{
      					"iban": "DK5000400440116243",
      					"bic": "DABADKKK"
      				}
      			],
      			"ext": {
      				"untdid-payment-means": "31"
      			}
      		}
      	},
      	"totals": {
      		"sum": "18000.00",
      		"total": "18000.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "standard",
      							"base": "18000.00",
      							"percent": "25.0%",
      							"amount": "4500.00"
      						}
      					],
      					"amount": "4500.00"
      				}
      			],
      			"sum": "4500.00"
      		},
      		"tax": "4500.00",
      		"total_with_tax": "22500.00",
      		"payable": "22500.00"
      	}
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="Example credit note">
    In this example, we're issuing a credit note that corrects a previously sent invoice. Corrections in Denmark are always credit notes — OIOUBL requires non-negative totals, so a negative invoice is not allowed.

    Notice:

    * The `type` is set to `credit-note`, which maps to UNTDID document type `381` on build.
    * The `preceding` array references the original invoice by `series`, `code`, and `issue_date`.
    * There are no totals or calculations; all these will be made automatically when uploading.

    <CodeGroup>
      ```json Credit note theme={"system"}
      {
        "$schema": "https://gobl.org/draft-0/bill/invoice",
        "$addons": [
          "dk-oioubl-v2"
        ],
        "type": "credit-note",
        "series": "NH",
        "code": "0044",
        "currency": "DKK",
        "preceding": [
          {
            "series": "NH",
            "code": "0043",
            "issue_date": "2026-07-01"
          }
        ],
        "supplier": {
          "name": "Tavleleverandøren ApS",
          "tax_id": {
            "country": "DK",
            "code": "16356700"
          },
          "people": [
            {
              "name": {
                "given": "Hugo Jensen"
              }
            }
          ],
          "addresses": [
            {
              "num": "11",
              "street": "Leverandørvej",
              "locality": "Dyssegård",
              "code": "2870",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "faktura@tavleleverandoren.dk"
            }
          ]
        },
        "customer": {
          "name": "Nordisk Handel A/S",
          "tax_id": {
            "country": "DK",
            "code": "13585628"
          },
          "people": [
            {
              "name": {
                "given": "Mette Sørensen"
              }
            }
          ],
          "addresses": [
            {
              "num": "42",
              "street": "Østergade",
              "locality": "København K",
              "code": "1100",
              "country": "DK"
            }
          ],
          "emails": [
            {
              "addr": "bogholderi@nordiskhandel.dk"
            }
          ]
        },
        "lines": [
          {
            "quantity": "2",
            "item": {
              "name": "Konsulenttimer",
              "price": "900.00",
              "unit": "h"
            },
            "taxes": [
              {
                "cat": "VAT",
                "rate": "standard"
              }
            ]
          }
        ]
      }
      ```

      ```json Built version theme={"system"}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "DK",
      	"$addons": [
      		"eu-en16931-v2017",
      		"dk-oioubl-v2"
      	],
      	"type": "credit-note",
      	"series": "NH",
      	"code": "0044",
      	"issue_date": "2026-07-28",
      	"currency": "DKK",
      	"preceding": [
      		{
      			"issue_date": "2026-07-01",
      			"series": "NH",
      			"code": "0043"
      		}
      	],
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"untdid-document-type": "381"
      		}
      	},
      	"supplier": {
      		"name": "Tavleleverandøren ApS",
      		"tax_id": {
      			"country": "DK",
      			"code": "16356700"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "16356700"
      			}
      		],
      		"people": [
      			{
      				"name": {
      					"given": "Hugo Jensen"
      				}
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:16356700"
      			}
      		],
      		"addresses": [
      			{
      				"num": "11",
      				"street": "Leverandørvej",
      				"locality": "Dyssegård",
      				"code": "2870",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "faktura@tavleleverandoren.dk"
      			}
      		]
      	},
      	"customer": {
      		"name": "Nordisk Handel A/S",
      		"tax_id": {
      			"country": "DK",
      			"code": "13585628"
      		},
      		"identities": [
      			{
      				"scope": "legal",
      				"code": "13585628"
      			}
      		],
      		"people": [
      			{
      				"name": {
      					"given": "Mette Sørensen"
      				}
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "DK:CVR:13585628"
      			}
      		],
      		"addresses": [
      			{
      				"num": "42",
      				"street": "Østergade",
      				"locality": "København K",
      				"code": "1100",
      				"country": "DK"
      			}
      		],
      		"emails": [
      			{
      				"addr": "bogholderi@nordiskhandel.dk"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "2",
      			"item": {
      				"name": "Konsulenttimer",
      				"price": "900.00",
      				"unit": "h"
      			},
      			"sum": "1800.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "standard",
      					"rate": "general",
      					"percent": "25.0%"
      				}
      			],
      			"total": "1800.00"
      		}
      	],
      	"totals": {
      		"sum": "1800.00",
      		"total": "1800.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "standard",
      							"base": "1800.00",
      							"percent": "25.0%",
      							"amount": "450.00"
      						}
      					],
      					"amount": "450.00"
      				}
      			],
      			"sum": "450.00"
      		},
      		"tax": "450.00",
      		"total_with_tax": "2250.00",
      		"payable": "2250.00"
      	}
      }
      ```
    </CodeGroup>
  </Accordion>
</AccordionGroup>

## FAQ

Invoicing questions

<AccordionGroup>
  <Accordion title="How are invoices routed to the right recipient?">
    Documents on NemHandel are addressed by participant identifier. If the customer declares an endpoint (for example `GLN:5798009883735` for a public institution's EAN/GLN number), that identifier is used. If a Danish customer only carries a CVR number in its tax ID, the `dk-oioubl-v2` GOBL addon derives the participant identifier (`DK:CVR:<number>`) automatically. Explicit endpoints always win over derived ones.
  </Accordion>

  <Accordion title="How do I correct or cancel an invoice sent to NemHandel?">
    Issue a credit note referencing the original invoice in the `preceding` array. OIOUBL requires non-negative totals, so corrections in Denmark are always credit notes — a negative invoice will fail validation. There is no cancellation mechanism on the network itself: once delivered, a document can only be countered by a credit note.
  </Accordion>

  <Accordion title="Which payment means does OIOUBL support?">
    OIOUBL restricts the UNTDID 4461 payment means codes to a fixed list. The most common mappings from GOBL are `debit-transfer` for IBAN bank transfers (code `31`, requires a BIC), domestic Danish bank transfers (code `42`, account number plus bank registration number), Giro (code `50`), and FIK (code `93`). A generic `credit-transfer` (code `30`) is rejected by the format.
  </Accordion>

  <Accordion title="When is an invoice considered sent?">
    The send step submits the OIOUBL document to the network and then queues until the delivery is confirmed by Invopop's NemHandel access point. The workflow's state only advances to `sent` once the network reports the document as delivered, so a `sent` entry means the recipient's access point accepted it.
  </Accordion>
</AccordionGroup>

Receiving questions

<AccordionGroup>
  <Accordion title="How do invoices received via NemHandel reach my workspace?">
    Once a party is registered, documents addressed to its participant identifier are delivered to Invopop's access point. Each delivery triggers the import workflow you selected in the NemHandel Denmark app's configuration: the import step fetches the OIOUBL document, converts it to GOBL, creates the silo entry, and attaches the original XML along with any embedded binary attachments (such as PDFs).
  </Accordion>

  <Accordion title="What happens if a received document fails to import?">
    Deliveries are only acknowledged to the network after the import completes, so a transient failure leaves the document ready to be retried. An hourly reconciliation loop also picks up any deliveries missed by the real-time path. Documents that can never be processed are flagged for review instead of being retried forever.
  </Accordion>
</AccordionGroup>

More available in our [Denmark FAQ](/faq/denmark) section

***

<AccordionGroup>
  <Accordion title="🇩🇰 Invopop resources for Denmark">
    |            |                                                                                                                                                                                                                                                                                        |
    | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | Compliance | <Icon icon="https://assets.invopop.com/flags/dk.svg" /> [Invoicing compliance in Denmark](/compliance/denmark)<br /> <Icon icon="timeline" /> [Compliance timeline](/timelines/denmark)                                                                                                |
    | Apps       | <Icon icon="https://assets.invopop.com/flags/dk.svg" /> [NemHandel Denmark](/apps/nemhandel-denmark)<br /> <Icon icon="https://assets.invopop.com/apps/peppol/icon.svg" /> [Peppol](/apps/peppol)                                                                                      |
    | Guides     | <Icon icon="book" /> [Supplier registration guide](/guides/dk-nemhandel-supplier)<br /> <Icon icon="book" /> [Issuing invoices guide](/guides/dk-nemhandel)<br /> <Icon icon="book" /> [Peppol guide](/guides/peppol)<br /> <Icon icon="book" /> [Chargebee guide](/guides/cb-denmark) |
    | FAQ        | <Icon icon="square-question" /> [Denmark FAQ](/faq/denmark)                                                                                                                                                                                                                            |
    | GOBL       | <Icon icon="https://assets.invopop.com/icons/gobl.svg" /> [Denmark Tax Regime](https://docs.gobl.org/regimes/dk)<br /> <Icon icon="https://assets.invopop.com/icons/gobl.svg" /> [EU EN 16931 Addon](https://docs.gobl.org/addons/eu-en16931-v2017)                                    |
    | GitHub     | <Icon icon="github" /> [gobl.dk.oioubl](https://github.com/invopop/gobl.dk.oioubl)<br /> <Icon icon="github" /> [gobl.ubl](https://github.com/invopop/gobl.ubl)                                                                                                                        |
  </Accordion>
</AccordionGroup>

<Card title="Participate in our community" icon="forumbee" href="https://community.invopop.com" arrow="true" horizontal>
  Ask and answer questions about invoicing in Denmark →
</Card>
