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

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