Skip to content

France

Send and receive domestic French B2B invoices under the 2026 e-invoicing reform.

Availability. The regulated French flow (DGFiP clearance and live French statuses) is being validated with pilot partners on production infrastructure — it is not yet generally available. Everything on this page that runs in sandbox uses the standard Peppol BIS flow. Want in early? Ask about the France pilot programme.

How France works on getpeppr

France's B2B e-invoicing reform routes every domestic invoice through government-accredited platforms (plateformes agréées, PA) that clear documents with the tax authority (DGFiP). getpeppr is not a plateforme agréée: it is the developer layer — API, SDK, dashboard — built on Storecove, which is an accredited platform. You can verify accredited platforms on the official DGFiP list at impots.gouv.fr. Your integration stays the same JSON-in, webhooks-out contract you use for every other country.

Date Obligation Who
1 Sept 2026 Receive electronic invoices All VAT-subject companies in France
1 Sept 2026 Issue electronic invoices Large companies and mid-caps (ETI)
1 Sept 2027 Issue electronic invoices SMEs and micro-enterprises
These dates are set by law and may evolve. getpeppr helps you prepare the technical integration; your company's own compliance obligations are yours to confirm with a tax adviser.

Set up a French company

A Legal Entity's country is fixed at creation — it cannot be changed later. If your existing organization is registered in another country, create a new organization for your French entity and complete onboarding with country: FR.

French companies are addressed by their SIREN or SIRET. Three identifier schemes are available when you add a Peppol Identifier:

Scheme Value Use it for
0002 SIRENE 9-digit SIREN or 14-digit SIRET Your company identity — the recommended default
0009 SIRET 14-digit SIRET Establishment-level addressing
0225 FR:CTC 9-digit SIREN Your electronic address for the French reform (directory registration)

In production, French identifiers are verified against official registries (VIES and INSEE SIRENE) before sending is enabled, and getpeppr derives your French VAT identifier from your SIREN automatically once it can be proven correct. You never submit a VAT number by hand.

Register in the French directory

Receiving domestic French B2B invoices requires a directory entry: the 0225 FR:CTC identifier is your company's electronic address for the reform, registered with your bare 9-digit SIREN. Adding it from the console (or the Legal Entities API) registers it on the network and advertises it for France-specific documents — the entry in the DGFiP directory (annuaire) itself is part of the regulated flow being validated in the pilot.

Propagation takes 20–60 minutes. A freshly registered identifier is not routable immediately — senders get a delivery failure until directory propagation settles. And route with the scheme the recipient actually registered: sending to 0002:… when the recipient is registered under 0225:… does not resolve, even after propagation.

Send an invoice to France

Sending to a French buyer is a standard send() call. Use 0002 (SIRENE) or 0009 (SIRET) as the routing scheme — these are the recommended receiver identifiers for French B2B. French VAT rates: standard 20%, reduced 10% / 5.5% / 2.1%.

Not sure which scheme a buyer is registered under? Check with the free Peppol participant lookup or the directory search API.
import { Peppol } from "@getpeppr/sdk";

const peppol = new Peppol({ apiKey: "sk_live_..." });

// Route with the scheme the buyer is registered under —
// SIRENE (0002) or SIRET (0009) are the recommended routing schemes.
const invoice = await peppol.invoices.send({
  number: "INV-2026-042",
  to: {
    name: "Fournitures Dupont SARL",
    peppolId: "0009:73282932000074", // 0009 = SIRET (14 digits)
    street: "12 Rue de la Paix",
    city: "Paris",
    postalCode: "75002",
    country: "FR",
  },
  lines: [
    { description: "Consulting — June", quantity: 1, unitPrice: 1200, vatRate: 20 },
  ],
});

console.log(invoice.status); // "submitted"

Track French invoice statuses

French invoices carry lifecycle statuses defined by the reform. getpeppr keeps the canonical status vocabulary identical for every country and exposes the French detail — dated, structured, with the native label preserved — in the detail field of statuses, webhooks, and the dashboard.

French status Meaning Where it lands
Déposée Deposited — the invoice entered the regulated flow detail.platformFiscal
Rejetée Technical rejection (format, directory, authority checks) detail.platformFiscal
Refusée Business refusal — the buyer declined the invoice detail.businessDisposition
Encaissée Payment received — reported for VAT on collection detail.settlement
Rejection is not refusal. Rejetée is a technical failure you fix and resend; Refusée is a business decision by your buyer. The two arrive on different axes so your code never has to guess. Live French statuses are confirmed during the pilot.
const invoice = await peppol.invoices.getStatus(invoiceId);

// Canonical status — the same vocabulary for every country
console.log(invoice.status); // e.g. "rejected"

// The raw pre-coercion status string is always preserved
console.log(invoice.rawStatus);

// Structured national detail, when the gateway exposes it.
// Native labels are preserved, never over-translated.
const fiscal = invoice.detail?.platformFiscal;
if (fiscal) {
  console.log(fiscal.label);        // e.g. "Rejetée"
  console.log(fiscal.jurisdiction); // "FR"
}

Report a payment (encaissement)

For services, French VAT is due when the payment is collected, not when the invoice is issued — so the reform requires sellers to report payments received. When a French CTC invoice gets paid, report it with markAs(id, "paid"): getpeppr files the payment report through the accredited platform, exactly once, even if you retry.

Payment reporting applies to invoices sent under the French mandate only. Calling it on any other invoice returns 422 not_applicable — nothing is filed.
// French VAT on services is due on collection (encaissement):
// when the buyer pays, the seller reports the payment.
// One call files the payment report through the accredited platform.
const result = await peppol.invoices.markAs(invoiceId, "paid");

// The settlement detail ("Encaissée") lands on the invoice
// via webhook once the platform confirms the report.

E-reporting FAQ

Do I need to e-report my domestic B2B transactions separately?

No. For domestic B2B invoices sent through the regulated flow, the transaction data reaches the DGFiP through the electronic invoice itself — that is the point of the reform. Do not submit a separate transaction e-report for these invoices.

So e-reporting is fully automatic?

Not entirely — payment reporting stays your responsibility. When a French CTC invoice for services is paid, you report the encaissement with markAs(id, "paid"). Transactions: automatic. Payments: one API call from you.

What about B2C or cross-border transactions?

B2C and international transactions fall under separate e-reporting obligations that getpeppr does not cover today. The current French scope is domestic B2B: send, receive, and payment reporting.

Is getpeppr a plateforme agréée (PA)?

No. getpeppr is a developer layer (API/SDK) built on Storecove, an accredited platform — you can verify accredited platforms on the DGFiP's official list. Storecove carries the regulated role; getpeppr gives you the integration.

Can I test the French flow in sandbox?

Partially. Sandbox exercises directory registration, sending, receiving, and webhooks over the standard Peppol BIS flow. The regulated DGFiP clearance flow and live French statuses are only exercised on production infrastructure and are being validated with pilot partners.