BambooForge Labs

E-Invoicing All in One for Factur-X and ZUGFeRD

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€318Community & Enterprise

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

Odoo 16.0Odoo 17.0Odoo 18.0Odoo 19.0Odoo 20.0
Screens and walkthrough for
Transcript of the walkthrough (Odoo 20)

E-Invoicing All in One for Factur-X and ZUGFeRD. Decide which Factur-X or ZUGFeRD profile each customer's invoice PDF claims to be, and check the invoice really carries what it promises. 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.

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. In the next few minutes: what this is for, then the five profiles, then where the profile lives, then what gets checked, then how we make sure it works. Then what this app deliberately does not do, so you can tell before you buy whether it fits. 1.

Copy bambooforge_facturx into your addons path and update the app list, or install the ZIP from the Odoo Apps Store. 2. Install 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. EN 16931 is the safe default: it is the European semantic standard, and every receiver understands it.

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. 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.

Findings appear in the same pre-flight list as the European rules. 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. How we make sure it works.

Before every release, 9 automated checks run against this app on Odoo 16, 17, 18, 19 and 20. Among them: A summary profile does not demand line detail. A complete invoice on en16931 passes the profile rules. A line profile demands quantity price and tax.

The customer profile wins over the company one. The profile can be overridden on one invoice. The complete list is in the source you receive. Questions people ask.

Which Odoo versions does it run on? Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing. Community or Enterprise? Both.

It needs no Enterprise app. Now the part most videos leave out: what this does not do. 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. The complete manual is at docs dot bambooforge dot dev, the demo database is linked from the store page, and support answers within twenty-four hours. Links are in the description.

Customer - bambooforge_facturx
Customer
Invoice - bambooforge_facturx
Invoice

Key facts

What it is
Decide which Factur-X or ZUGFeRD profile each customer's invoice PDF claims to be, and check the invoice really carries what it promises.
For
Accounting
Odoo versions
16.0, 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
Runs on
Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
Price
318 EUR, one-time, on the Odoo Apps Store
Technical name
bambooforge_facturx
Not for
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.
Manual
https://docs.bambooforge.dev/bambooforge_facturx/
Live demo
https://demo20.bambooforge.dev/odoo/action-account.action_move_out_invoice_type
Store page
https://apps.odoo.com/apps/modules/20.0/bambooforge_facturx
Manual last updated
2026-10-15

E-Invoicing All in One for Factur-X and ZUGFeRD

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.

How we make sure it works

Before every release, 9 automated checks run against this app on Odoo 16, 17, 18, 19 and 20. Among them:

  • A summary profile does not demand line detail.

  • A complete invoice on en16931 passes the profile rules.

  • A line profile demands quantity price and tax.

  • The customer profile wins over the company one.

  • The profile can be overridden on one invoice.

The complete list is in the source you receive.

Install

  1. Copy bambooforge_facturx into your addons path and update the app list, or install the ZIP from the Odoo Apps Store.

  2. Install Factur-X & ZUGFeRD Profiles.

Questions people ask

Which Odoo versions does it run on?

Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

Community or Enterprise?

Both. It needs no Enterprise app.

What does it need?

The standard Web; einvoice (BambooForge) must be installed first app. No extra Python package.

Does anything leave my server?

No. It makes no call outside your Odoo server: no telemetry, no licence check, no third-party service.

What happens if I uninstall it?

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.