GOBL ➡️ French CTC
June 3, 2026 · View on GitHub
French Continuous Transaction Control (CTC) addon for GOBL.
Released under the Apache 2.0 LICENSE, Copyright 2026 Invopop S.L..
This module implements the French e-invoicing / e-reporting reform as a set of GOBL tax addons covering the three exchange flows:
- Flow 2 (
fr-ctc-flow2-v1) — B2B clearance of domestic invoices between two French parties. - Flow 6 (
fr-ctc-flow6-v1) — "Cycle de Vie" lifecycle statuses and payment messages (bill.Status,bill.Payment). - Flow 10 (
fr-ctc-flow10-v1) — e-reporting for B2C and cross-border B2B.
A meta-addon (fr-ctc-v1) auto-dispatches an invoice or payment to the correct
flow based on its parties.
Unlike the format converters in the GOBL ecosystem, this is a true addon: it registers extensions, normalizers, and validation rules into GOBL's global registry. It lives in its own module so that only projects handling French CTC documents take on its weight.
Layout
addon/— the GOBL addon: extensions, normalizers, scenarios, and validation rules that register into GOBL on import (addon/flow2,addon/flow6,addon/flow10plus thefr-ctc-v1meta-addon). This package is kept dependency- light so importing it never pulls in conversion tooling.- the module root (and future subpackages) is reserved for converters and other CTC logic that build on the addon.
Usage
Add a blank import of the addon so it registers itself, then use GOBL as normal:
import (
"github.com/invopop/gobl"
_ "github.com/invopop/gobl.fr.ctc/addon"
)
Declare the addon on a document (or let the regime/scenario add it) and
Calculate + Validate will run the full CTC normalization and rules.
Note: the
fr-ctc-*keys are listed in GOBL core's approved external-addon registry, so they are recognised as valid$addonsvalues in the JSON Schema. The runtime check stays strict, however: a document declaring anfr-ctc-*addon will fail validation withadd-on must be registeredunless this module is imported. Any service that processes French CTC documents must import it.
Development
The addon builds on core GOBL features (the bill lifecycle and the approved
external-addon registry) that are not yet in a tagged release. The go.mod
therefore pins github.com/invopop/gobl to a commit on the core branch (a
pseudo-version); bump it to the release tag once core is published.
go test ./...
Examples
examples/ holds sample documents for each flow, with their expected JSON
envelopes under examples/out/. They are verified via GOBL's shared
pkg/examples helpers. Regenerate the golden output after intentional changes
with:
go test . -run TestExamples -update
License
Apache 2.0 — see LICENSE.