{
  "id": 10155789,
  "title": "Adding Peppol e-invoicing (EN 16931) to a self-hosted Flask app",
  "url": "https://urgent.news/2026/09/27/adding-peppol-e-invoicing-en-16931-to-a-self-hosted-flask-app",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-09-27T06:09:02.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/drytrix/adding-peppol-e-invoicing-en-16931-to-a-self-hosted-flask-app-4fhj"
  },
  "original_language": "en",
  "account": "Since January 1, 2026, Belgian businesses are required to exchange B2B invoices as structured e-invoices over the Peppol network. TimeTracker, an open-source self-hosted time tracker that generates invoices, needed to adapt to this change. EN 16931 is the European semantic standard that defines the data required in an e-invoice, including seller, buyer, VAT breakdown, and totals. UBL 2.1 and CII are XML syntaxes that can carry EN 16931 data, while Peppol BIS Billing 3.0 outlines the Peppol network's rules for e-invoicing over the EN 16931 standard. The process involves generating UBL and POSTing it to an adapter URL, which forwards it to a certified Access Point provider. The adapter returns a message ID for tracking purposes. A small peppol-bridge service facilitates the process, handling provider differences and storing send history.",
  "summary": "Since 1 January 2026 , Belgian businesses have to exchange B2B invoices as structured e-invoices over the Peppol network. A PDF by email no longer counts. I maintain TimeTracker , an open-source, self-hosted time tracker that also generates invoices. I'm based in Belgium and so are many of the people it's built for, so the mandate turned a nice-to-have into a must-have. This post covers what I…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}