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

Lint Test Go Go Report Card codecov GoDoc Latest Tag Ask DeepWiki

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/flow10 plus the fr-ctc-v1 meta-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 $addons values in the JSON Schema. The runtime check stays strict, however: a document declaring an fr-ctc-* addon will fail validation with add-on must be registered unless 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.