BFBambooForge Labs

Factur-X & ZUGFeRD Profiles

Decide which Factur-X or ZUGFeRD profile each customer's invoice PDF claims to be, and check the invoice really carries what it promises.

Buy on the Odoo Apps StoreOpen the live demoAccounting€464Community & Enterprise

Available for Odoo 16.0, Odoo 17.0, Odoo 18.0, Odoo 19.0. Technical name bambooforge_facturx.

Odoo 16.0Odoo 17.0Odoo 18.0Odoo 19.0
Full walkthrough on a live Odoo 19.0 database, with subtitles. It ends with what this app deliberately does not do.

Factur-X & ZUGFeRD Profiles

What this is for

Odoo silently embeds a Factur-X file inside every invoice PDF. Which profile that file claims to be is not a detail — each profile is a different promise about what the document contains, and a receiver expecting one will reject another.

The five profiles

  • MINIMUM and BASIC WL carry no lines. They are accounting summaries. France and Germany do not accept them as an invoice for VAT purposes, which is usually discovered by the customer's accountant months later.

  • BASIC, EN 16931 and EXTENDED promise a quantity, a unit price and a tax category on every line. A file that promises them and does not carry them fails on parse.

EN 16931 is the safe default: it is the European semantic standard, and every receiver understands it.

Where the profile lives

Agreed per customer (their system, their expectation), defaulted per company on the company record, and overridable per invoice for the occasional exception.

What gets checked

  • no profile agreed with this customer — a warning, because the default may be perfectly fine;

  • MINIMUM used for a real invoice — a warning, with the VAT consequence spelled out;

  • a line-level profile chosen while the lines are thin — blocking, naming the line and what it is missing;

  • a tax line in a different currency from the invoice — blocking. Factur-X carries one tax currency, and when they differ the receiver's parser reads the wrong number.

Findings appear in the same pre-flight list as the European rules.

Known limits

  • The profile is recorded and checked here; producing the embedded file is Odoo's own job.

  • EXTENDED has more optional content than is checked. What is checked is what causes rejections.

Screens

Customer - bambooforge_facturx
Customer
Invoice - bambooforge_facturx
Invoice