France
Send and receive domestic French B2B invoices under the 2026 e-invoicing reform.
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 |
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.
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%.
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 |
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.
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.