Skip to main content

Introduction

The workflow steps and API used in this guide are subject to change. We are actively working on new approaches to event handling for a more global use case. The examples here are functional and can be used today, but expect updates before the September 2026 mandate.
France handles e-invoicing through approved PA (Plateforme Agréée) platforms as part of its electronic invoicing reform. Invopop is an officially approved PA platform, as listed on the French government’s official list of approved platforms. Invopop is Plateforme Agréée (Approved Platform) by the French tax administration, meaning we have successfully provided all necessary documentation for the registration procedure and passed the technical compliance verification.

Prerequisites

To use the France PA integration, you will need:
  • Invopop workspace with the Peppol and France apps enabled.
  • French company registration details including SIREN/SIRET numbers.
  • Understanding of your invoicing flows (B2B, B2C, domestic, cross-border) to plan registration and reporting requirements.
  • Business processes for status updates to implement the mandatory lifecycle status workflow.

Key Concepts

AnnuaireThe French e-invoicing directory where parties must be registered to participate in regulated e-invoicing flows.
PPFPortail Public de Facturation — the French government system that receives mandatory invoice data and lifecycle updates. Invopop handles all communications with the PPF automatically.
Regulated FlowAn invoice exchange where both the sender and receiver are registered in the annuaire. These follow the complete French e-invoicing process including Peppol transmission and PPF reporting.
Non-Regulated FlowAn invoice exchange where only one party is registered in the annuaire. Invoices are stored for e-reporting to the PPF but may not be transmitted via Peppol.
E-ReportingFrance requires two types: real-time reporting for B2B national (regulated) flows via F1 format; and periodic reporting for non-regulated flows and B2C transactions.
CDARCross Domain Acknowledgement and Response. The format used for lifecycle status updates (“cycle de vie”) in France, communicated between parties and to the PPF.
F1 InvoiceSimplified UBL format used for e-reporting to the PPF for regulated flows. Generated automatically by Invopop.

Registration workflow

The registration process prepares parties to send and receive invoices in France. It builds on the standard Peppol registration workflow with additional French-specific steps.
1

Approval

Standard approval process to verify party details and authorization.
2

Register in Annuaire

Register the party in the annuaire (French e-invoicing directory) under Invopop’s name. Required for the party to participate in French e-invoicing.
3

Register for Peppol

Complete standard Peppol registration. Invopop uses Peppol as the designated method for sending and receiving invoices in the French PA system.
4

Enable Reporting

Optional Enable e-reporting for the party to comply with French tax reporting requirements.

Sending workflow

The workflow steps below are subject to change. We are working on new methods of handling events for a more global use case. This example is functional today, but expect refinements before the September 2026 mandate.
The sending workflow records the invoice for France PA compliance, transmits it via Peppol, and then forwards it to the PPF. The same workflow handles both French and non-French invoices — the France-specific steps are automatically skipped when the sender is not registered in the annuaire.

How it works

  1. Set state to Processing — marks the job as in progress.
  2. Sign the envelope — locks the GOBL document against further modification.
  3. Record Invoice (France) — registers the invoice with the France PA system. Determines whether this is a regulated or non-regulated flow based on annuaire registration status of both parties.
  4. Generate UBL Document — produces a Peppol France CIUS–compliant UBL invoice or credit note.
  5. Send via Peppol — transmits the invoice to the receiver’s PA platform over the Peppol network.
  6. Set state to Sent — marks successful Peppol delivery.
  7. Forward to PPF — sends the F1 invoice and the mandatory déposée (deposited) status to the government data concentrator. For non-regulated flows, records the invoice for periodic reporting instead.
  8. Set state to Completed — marks full completion including PPF reporting.

Workflow code

France PA send invoice workflow

Records and sends a France-compliant invoice via Peppol and the PPF.

Status update workflow

The workflow steps below are subject to change. We are working on new methods of handling events for a more global use case. This example is functional today, but expect refinements before the September 2026 mandate.
France requires mandatory lifecycle status updates to be reported to the PPF for B2B national invoices. You must implement workflows for the two statuses that are your responsibility:
StatusCodeTrigger
Encaissée (cashed/paid)212Invoice has been paid
Refusée (refused by buyer)210Buyer refuses the invoice (business rejection)
The following statuses are handled automatically by Invopop and do not require a workflow:
StatusCodeWhen
Déposée (deposited)200Sent automatically when the invoice is created
Rejetée (rejected by platform)213Sent automatically on processing failure
You can also send additional non-mandatory statuses (e.g. 205 Approuvée, 207 En litige) for lifecycle tracking. The status workflow below handles all of these.

How it works

  1. Generate Status (France) — creates a CDAR document with the specified status code and reason code. The status_code, reason_code, and optional reason_text are configured per workflow or passed as job arguments.
  2. Send via Peppol — transmits the CDAR to the counterparty over Peppol.
  3. Forward to PPF — for mandatory statuses (210, 212), sends the notification to the PPF in the required format.

Using job arguments

Instead of hardcoding the status in the workflow configuration, you can pass the status details as job arguments when creating the job. Arguments take priority over the workflow’s configured values, so you can use a single workflow for multiple status types. The supported arguments are:
ArgumentDescription
codeStatus code (200213). Overrides status_code in the workflow config.
reason-codeReason code (e.g. MONTANTTOTAL_ERR). Overrides reason_code in the workflow config. If omitted, a default reason code is applied based on the status code.
reason-textOptional free-text explanation. Overrides reason_text in the workflow config.
For example, to trigger a Refusée (refused) status using a workflow that is configured with a different default:
{
  "args": {
    "code": "210",
    "reason-code": "DOUBLON",
    "reason-text": "Duplicate invoice already processed"
  }
}
This approach is useful when you want a single status workflow that can handle multiple status types dynamically, driven by your business logic.

Workflow code

The example below is configured for status 207 (En litige / Disputed) with reason code MONTANTTOTAL_ERR. Change status_code and reason_code to match your use case, or override them at runtime using job arguments as described above.

France PA send status workflow

Generates and forwards a lifecycle status update (CDAR) via Peppol and the PPF.
We recommend creating a separate workflow for each mandatory status type (paid, refused) with the appropriate code pre-configured, rather than a single generic workflow. This keeps your operational runbooks simple and reduces the risk of sending the wrong code.

Available status codes

CodeFrenchEnglishMandatory to PPF
200DéposéeDepositedYes (automatic)
205ApprouvéeAcceptedNo
206Partiellement approuvéePartially ApprovedNo
207En litigeDisputedNo
208SuspendueSuspendedNo
209ComplétéeCompletedNo
210RefuséeRefused by buyerYes (manual)
211Paiement transmisPayment transmittedNo
212EncaisséeCashed/PaidYes (manual)
213RejetéeRejected by platformYes (automatic)

Reason codes by status

Each status code accepts specific reason codes. Statuses not listed below (e.g. 205, 209, 211, 212) do not require a reason code.
Reason CodeDescription
NON_TRANSMISEDestinataire non connecté
Default: NON_TRANSMISE
Reason CodeDescription
AUTREAutre
TX_TVA_ERRTaux de TVA erroné
MONTANTTOTAL_ERRMontant total erroné
CALCUL_ERRErreur de calcul de la facture
NON_CONFORMEMention légale manquante
DOUBLONFacture en doublon
DEST_ERRErreur de destinataire
TRANSAC_INCTransaction inconnue
EMMET_INCÉmetteur inconnu
CONTRAT_TERMContrat terminé
DOUBLE_FACTDouble facture
CMD_ERRN° de commande incorrect ou manquant
ADR_ERRAdresse de facturation électronique erronée
SIRET_ERRSIRET erroné ou absent
CODE_ROUTAGE_ERRCODE_ROUTAGE absent ou erroné
REF_CT_ABSENTRéférence contractuelle nécessaire
REF_ERRRéférence incorrecte
PU_ERRPrix unitaires incorrects
REM_ERRRemise erronée
QTE_ERRQuantité facturée incorrecte
ART_ERRArticle facturé incorrect
MODPAI_ERRModalités de paiement incorrectes
QUALITE_ERRQualité d’article livré incorrecte
LIVR_INCOMPProblème de livraison
Default: AUTRE
Reason CodeDescription
AUTREAutre
TX_TVA_ERRTaux de TVA erroné
MONTANTTOTAL_ERRMontant total erroné
CALCUL_ERRErreur de calcul de la facture
NON_CONFORMEMention légale manquante
DOUBLONFacture en doublon
DEST_ERRErreur de destinataire
TRANSAC_INCTransaction inconnue
EMMET_INCÉmetteur inconnu
CONTRAT_TERMContrat terminé
DOUBLE_FACTDouble facture
CMD_ERRN° de commande incorrect ou manquant
Default: AUTRE
Reason CodeDescription
JUSTIF_ABSJustificatif absent ou insuffisant
SIRET_ERRSIRET erroné ou absent
CODE_ROUTAGE_ERRCODE_ROUTAGE absent ou erroné
REF_CT_ABSENTRéférence contractuelle nécessaire
REF_ERRRéférence incorrecte
CMD_ERRN° de commande incorrect ou manquant
ADR_ERRAdresse de facturation électronique erronée
Default: JUSTIF_ABS
Reason CodeDescription
COORD_BANC_ERRErreur de coordonnées bancaires
TX_TVA_ERRTaux de TVA erroné
MONTANTTOTAL_ERRMontant total erroné
CALCUL_ERRErreur de calcul de la facture
NON_CONFORMEMention légale manquante
DOUBLONFacture en doublon
DEST_ERRErreur de destinataire
TRANSAC_INCTransaction inconnue
EMMET_INCÉmetteur inconnu
CONTRAT_TERMContrat terminé
DOUBLE_FACTDouble facture
CMD_ERRN° de commande incorrect ou manquant
ADR_ERRAdresse de facturation électronique erronée
SIRET_ERRSIRET erroné ou absent
CODE_ROUTAGE_ERRCODE_ROUTAGE absent ou erroné
REF_CT_ABSENTRéférence contractuelle nécessaire
REF_ERRRéférence incorrecte
PU_ERRPrix unitaires incorrects
REM_ERRRemise erronée
QTE_ERRQuantité facturée incorrecte
ART_ERRArticle facturé incorrect
MODPAI_ERRModalités de paiement incorrectes
QUALITE_ERRQualité d’article livré incorrecte
LIVR_INCOMPProblème de livraison
Default: TRANSAC_INC
Reason CodeDescription
REJ_SEMANRejet pour erreur sémantique
REJ_UNIRejet sur contrôle unicité
REJ_COHRejet sur contrôle cohérence de données
REJ_ADRRejet sur contrôle d’adressage
REJ_CONT_B2GRejet sur contrôles métier B2G
REJ_REF_PJRejet sur référence de PJ
REJ_ASS_PJRejet sur erreur d’association de la PJ
IRR_VIDE_FContrôle de non vide sur les fichiers du flux
IRR_TYPE_FContrôle de type et extension des fichiers
IRR_SYNTAXContrôle syntaxique des fichiers du flux
IRR_TAILLE_PJContrôle de taille des PJ
IRR_NOM_PJContrôle du nom des PJ
IRR_VID_PJContrôle de PJ non vide
IRR_EXT_DOCContrôle de l’extension des PJ
IRR_TAILLE_FContrôle de taille max des fichiers
IRR_ANTIVIRUSContrôle anti-virus
DEST_INCDestinataire inconnu
ADR_ERRAdresse de facturation électronique erronée
DOUBLONFacture en doublon
CALCUL_ERRErreur de calcul de la facture
TX_TVA_ERRTaux de TVA erroné
MONTANTTOTAL_ERRMontant total erroné
Default: REJ_SEMAN

Receiving

Receiving invoices and incoming status updates via Peppol is supported by the France app, but documentation is not yet available. It will be published ahead of the September 2026 mandate.

France FAQ

Find answers to frequently asked questions about invoicing in France →

Participate in our community

Ask and answer questions about invoicing in France →