> ## Documentation Index
> Fetch the complete documentation index at: https://docs.invopop.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Public sector invoicing in France

> Send invoices to French public entities through Chorus Pro, and receive theirs, with the same PA workflows used for B2B.

export const frPaSendInvoiceB2GWorkflow = {
  "name": "PPF send document (public sector)",
  "description": "Send an invoice via Chorus Pro or Peppol depending on the buyer, and record it with PPF",
  "app_id": "gov-fr",
  "country": "fr",
  "steps": [{
    "id": "067bc16d-c1a7-11f1-8390-4eb134dbe674",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `processing`{.state .processing}",
    "config": {
      "state": "processing"
    }
  }, {
    "id": "067e5b0d-c1a7-11f1-a890-4eb134dbe674",
    "name": "Sign envelope",
    "provider": "silo.close"
  }, {
    "id": "067e5bad-c1a7-11f1-a27a-4eb134dbe674",
    "name": "Document is an invoice?",
    "provider": "silo.if",
    "next": [{
      "status": "NA",
      "code": "true",
      "steps": [{
        "id": "067e5bf8-c1a7-11f1-a34e-4eb134dbe674",
        "name": "Generate UBL document",
        "provider": "ubl.generate",
        "summary": "Peppol France CIUS v1",
        "config": {
          "attach_invoice_pdf": false,
          "doc_type": "peppol-fr-cius",
          "private": false,
          "validate_ubl": false
        }
      }]
    }, {
      "status": "NA",
      "code": "false",
      "steps": [{
        "id": "067e5c2f-c1a7-11f1-a517-4eb134dbe674",
        "name": "Generate CDAR Status",
        "provider": "cii.generate",
        "summary": "France CTC Flow 6 CDAR (lifecycle status/payment)",
        "config": {
          "attach_invoice_pdf": false,
          "doc_type": "fr-ctc-cdar-flow6",
          "validate_cii": false
        }
      }]
    }],
    "config": {
      "expr": "doc['$schema'] endsWith 'bill/invoice'",
      "scope": "env"
    }
  }, {
    "id": "067e5c5e-c1a7-11f1-9b94-4eb134dbe674",
    "name": "Record outgoing document for e-invoicing",
    "provider": "gov-fr.directory.record.outgoing"
  }, {
    "id": "067e5ddf-c1a7-11f1-aff3-4eb134dbe674",
    "name": "Is B2G?",
    "provider": "gov-fr.chorus-pro.lookup",
    "summary": "Chorus Pro for a public buyer, Peppol otherwise",
    "next": [{
      "status": "NA",
      "code": "true",
      "steps": [{
        "id": "067e5daf-c1a7-11f1-a744-4eb134dbe674",
        "name": "Send to Chorus Pro",
        "provider": "gov-fr.chorus-pro.send",
        "summary": "Deliver to the public sphere"
      }, {
        "id": "067e5d67-c1a7-11f1-875f-4eb134dbe674",
        "name": "Forward document to PPF",
        "provider": "gov-fr.directory.forward"
      }]
    }, {
      "status": "NA",
      "code": "false",
      "steps": [{
        "id": "067e5c7f-c1a7-11f1-96f3-4eb134dbe674",
        "name": "Verify document can be sent",
        "provider": "peppol.validate.endpoint",
        "next": [{
          "code": "true",
          "steps": [{
            "id": "067e5ca2-c1a7-11f1-a3ed-4eb134dbe674",
            "name": "Send Peppol document",
            "provider": "peppol.send"
          }, {
            "id": "067e5cc1-c1a7-11f1-99dd-4eb134dbe674",
            "name": "Forward document to PPF",
            "provider": "gov-fr.directory.forward"
          }]
        }, {
          "code": "false",
          "steps": [{
            "id": "067e5ce6-c1a7-11f1-81bc-4eb134dbe674",
            "name": "Forward document to PPF",
            "provider": "gov-fr.directory.forward",
            "summary": "Forward to PPF (déposée – non transmise)",
            "config": {
              "not_transmitted": true
            }
          }]
        }]
      }]
    }]
  }, {
    "id": "067e5d0b-c1a7-11f1-af09-4eb134dbe674",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `completed`{.state .completed}",
    "config": {
      "state": "completed"
    }
  }],
  "rescue": [{
    "id": "067e6072-c1a7-11f1-ba65-4eb134dbe674",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `error`{.state .error}",
    "config": {
      "state": "error"
    }
  }]
};

export const WorkflowDiagram = ({workflow}) => {
  const stateColors = {
    processing: "yellow",
    sent: "blue",
    received: "blue",
    registered: "green",
    completed: "green",
    error: "red"
  };
  const StateChip = ({state, label}) => <Badge size="sm" color={stateColors[state] || "gray"} icon="square-small" iconType="solid">
      {label.charAt(0).toUpperCase() + label.slice(1)}
    </Badge>;
  const providerIcons = {
    "silo.state": "https://silo.invopop.com/images/status.svg",
    "silo.close": "https://silo.invopop.com/images/check-badge.svg",
    "silo.if": "https://assets.invopop.com/apps/silo/if.svg",
    "silo.folder": "https://silo.invopop.com/images/folder.svg",
    "silo.modify": "https://silo.invopop.com/images/modify.svg",
    "silo.correct": "https://silo.invopop.com/images/replace.svg",
    "silo.sleep": "https://assets.invopop.com/icons/sleep.svg",
    silo: "https://assets.invopop.com/apps/silo/icon.svg",
    "sequence.enumerate": "https://sequence.invopop.com/images/enumerate.svg",
    "transform.job.create": "https://transform.invopop.com/images/jobs.svg",
    webhook: "https://webhook.invopop.com/icon.svg",
    lookup: "magnifying-glass",
    dropbox: "https://dropbox.invopop.com/icon.png",
    pdf: "https://pdf.invopop.com/file-pdf.svg",
    peppol: "https://assets.invopop.com/apps/peppol/icon.svg",
    ubl: "https://assets.invopop.com/apps/ubl/logo.svg",
    cii: "https://assets.invopop.com/apps/cii/logo.svg",
    "gov-co": "https://assets.invopop.com/flags/co.svg",
    "gov-dk": "https://assets.invopop.com/flags/dk.svg",
    "gov-fi": "https://assets.invopop.com/flags/fi.svg",
    "gov-fr": "https://assets.invopop.com/flags/fr.svg",
    "chorus-pro": "https://assets.invopop.com/apps/chroruspro/icon.svg",
    "gov-es": "https://assets.invopop.com/apps/gov-es/icon.svg",
    "gov-es.sii": "https://assets.invopop.com/apps/sii/icon.svg",
    "gov-es.ticketbai": "https://assets.invopop.com/apps/ticketbai/icon.svg",
    "gov-es.facturae": "https://assets.invopop.com/apps/facturae/icon.svg",
    verifactu: "https://assets.invopop.com/apps/verifactu/icon.svg",
    "gov-pl": "https://assets.invopop.com/apps/ksef/icon.svg",
    "gov-sa": "https://assets.invopop.com/apps/zatca/icon.svg",
    "gov-ar": "https://assets.invopop.com/apps/arca/icon.svg",
    "at-pt": "https://assets.invopop.com/apps/at-pt/icon.svg",
    "sat-mx": "https://assets.invopop.com/apps/sat-mexico/icon.svg",
    "sw-sapien": "https://assets.invopop.com/apps/sw-sapien/icon.svg",
    "sdi-it": "https://assets.invopop.com/apps/sdi-italy/icon.svg",
    "ticket-it": "https://assets.invopop.com/apps/agenzia-entrate/icon.svg",
    "nfe-br": "https://assets.invopop.com/apps/notas-fiscais-eletronicas-brazil/icon.svg",
    chargebee: "https://assets.invopop.com/apps/chargebee/icon.svg",
    stripe: "https://assets.invopop.com/apps/stripe/icon.svg",
    email: "https://assets.invopop.com/apps/email/icon.svg",
    cron: "https://assets.invopop.com/apps/cron/icon.svg",
    tables: "https://assets.invopop.com/apps/tables/icon.svg",
    ilyda: "https://assets.invopop.com/apps/ilyda/icon.svg",
    invoicexpress: "https://assets.invopop.com/apps/invoicexpress/icon.svg"
  };
  const iconFor = provider => {
    const parts = (provider || "").split(".");
    for (let i = parts.length; i > 0; i--) {
      const url = providerIcons[parts.slice(0, i).join(".")];
      if (url) return url;
    }
    return null;
  };
  const StepIcon = ({provider}) => {
    const url = iconFor(provider);
    return <span title={provider} className="flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-gray-950/10 bg-white dark:border-white/10 dark:bg-white/5">
        {url && url.startsWith("http") ? <img src={url} alt="" className="h-4 w-4" /> : null}
        {url && !url.startsWith("http") ? <Icon icon={url} iconType="solid" size={14} /> : null}
      </span>;
  };
  const renderSummary = summary => {
    const nodes = [];
    const re = /`([^`]+)`(\{[^}]*\})?/g;
    let last = 0;
    let m;
    let k = 0;
    while ((m = re.exec(summary)) !== null) {
      if (m.index > last) nodes.push(summary.slice(last, m.index));
      const attrs = m[2] || "";
      if (attrs.indexOf(".state") >= 0) {
        const state = (attrs.match(/\.state\s+\.([\w-]+)/) || [])[1] || m[1];
        nodes.push(<StateChip key={k++} state={state} label={m[1]} />);
      } else if (attrs) {
        nodes.push(<span key={k++} className="text-sm font-medium text-gray-700 dark:text-gray-300">
            {m[1]}
          </span>);
      } else {
        nodes.push(<code key={k++} className="text-sm rounded bg-gray-100 px-1 font-mono text-sm dark:bg-white/10">
            {m[1]}
          </code>);
      }
      last = m.index + m[0].length;
    }
    if (last < summary.length) nodes.push(summary.slice(last));
    return nodes;
  };
  const NoteRow = ({text}) => <div className="mt-4 mb-1 font-mono text-sm leading-5 text-gray-400 dark:text-gray-500">{"// " + text}</div>;
  const renderSteps = (steps, counter) => (steps || []).map(step => {
    counter.n += 1;
    const n = counter.n;
    const branches = (step.next || []).filter(b => b.steps && b.steps.length > 0);
    return <div key={step.id || "step-" + n}>
          {step.notes ? <NoteRow text={step.notes} /> : null}
          <div className="mt-2.5 flex items-center">
            <span className="absolute left-0 w-10 text-center font-mono text-sm text-gray-400 select-none dark:text-gray-500">
              {n}
            </span>
            <div className="flex min-w-0 flex-1 items-center gap-2 rounded-xl border border-gray-950/5 bg-white px-2 py-2 dark:border-white/10 dark:bg-gray-900">
              <StepIcon provider={step.provider} />
              <span className="text-sm shrink-0 font-medium text-gray-900 dark:text-gray-100">{step.name}</span>
              {step.summary ? <span className="text-sm min-w-0 truncate text-gray-500 dark:text-gray-400">{renderSummary(step.summary)}</span> : null}
            </div>
          </div>
          {branches.length > 0 ? <div className="ml-5 border-l border-gray-200 -my-1 py-1 pl-6 dark:border-white/10">
              {branches.map((branch, bi) => <div key={branch.code || branch.status || bi}>
                  <div className="mt-4">
                    <span className="rounded-md bg-gray-200/70 px-2 py-1 font-mono text-sm text-gray-600 dark:bg-white/10 dark:text-gray-300">
                      {branch.code || branch.status}
                    </span>
                  </div>
                  {renderSteps(branch.steps, counter)}
                </div>)}
            </div> : null}
        </div>;
  });
  const counter = {
    n: 0
  };
  const wf = workflow || ({});
  return <div className="not-prose relative my-5 rounded-2xl border border-gray-950/5 bg-gray-50 py-3 pr-4 pb-5 pl-12 dark:border-white/10 dark:bg-white/[0.03]">
      {renderSteps(wf.steps, counter)}
      {wf.rescue && wf.rescue.length > 0 ? <div className="mt-6 border-t border-dashed border-gray-300 dark:border-white/10">
          <NoteRow text="If any step fails" />
          {renderSteps(wf.rescue, counter)}
        </div> : null}
    </div>;
};

Invoices to French public entities (the State, local authorities, hospitals, public establishments) have had to go through **Chorus Pro**, the government's invoicing portal, since 2020. Under the 2026 reform, Chorus Pro becomes one more platform on the French Directory, listed under its own matricule, so a public entity is simply a customer whose Annuaire line points to it.

That is what makes B2G invoicing in Invopop the same as B2B invoicing. A B2G invoice is [recorded](/guides/fr-pa-invoicing#sending) like any other, its F1 copy and `200` Déposée status reach the PPF unchanged, and the same [send workflow](#setup) handles every customer. Only delivery differs: the invoice goes to Chorus Pro instead of Peppol. Invopop holds the connection with Chorus Pro, so there is nothing to register on the public portal.

This guide covers:

* [Who this guide is for](#who-this-guide-is-for): French companies on the PA use this path; foreign entities use the standalone Chorus Pro app.
* [How routing works](#how-routing-works): the record step decides whether a customer is a public entity, and the workflow branches on it.
* [Setup](#setup): the send workflow with the public-sector branch.
* [What a public buyer needs](#what-a-public-buyer-needs): the SIRET, service code and commitment number, and the limits Chorus Pro adds on top of the norm.
* [Following the invoice](#following-the-invoice): the Chorus Pro lifecycle and how the job reports it.
* [Receiving from a public entity (G2B)](#receiving-from-a-public-entity-g2b): public bodies can now invoice you through the same channel.
* [Testing in sandbox](#testing-in-sandbox) and [example invoices](#example-invoices).

## Who this guide is for

There are two ways to reach Chorus Pro through Invopop, and which one applies depends on the supplier, not the customer.

| Supplier | Use | Why |
| - | - | - |
| **French company** with a SIREN, registered in the Annuaire through Invopop | This guide, with the [France app](/apps/france) | Invopop is the company's Plateforme Agréée. Chorus Pro is reached through the PA connection, with the F1 copy reported to the PPF as the mandate requires. |
| **Foreign entity** without a French SIREN invoicing a French public body | The standalone [Chorus Pro app](/apps/choruspro-france) and its [supplier registration](/guides/fr-chorus-pro-supplier) and [issuing](/guides/fr-chorus-pro) guides | A company outside the French mandate has no Annuaire line. It submits directly to Chorus Pro with its own Chorus Pro credentials. |

<Warning>
  Don't combine the two. A French company that already uses the standalone Chorus Pro app should move its public-sector invoicing to the PA path described here, so that every domestic invoice is recorded and reported the same way.
</Warning>

| - | Sandbox | Live |
| - | - | - |
| **Supplier** | Any party registered in the sandbox Annuaire | Party registered in the Annuaire through the [registration guide](/guides/fr-pa-registration) |
| **Chorus Pro** | Qualification environment | Production |
| **Annuaire** | Qualification directory | Production directory |

## Prerequisites

* **A registered supplier**: follow the [registration guide](/guides/fr-pa-registration) to connect the France app and register the party in the Annuaire. The same registration serves B2B and B2G.
* **The public entity's identifiers**: its SIRET and, where the entity requires them, a service code and a commitment number. The public entity gives you these; see [What a public buyer needs](#what-a-public-buyer-needs).
* **The invoicing guide**: this page builds on the [Invoicing in France](/guides/fr-pa-invoicing) guide and assumes you know how recording, formats and the PPF copy work.

## How routing works

You do not mark an invoice as B2G yourself. When the **Record outgoing document** step records an invoice, it looks the customer up in the Annuaire. A customer whose line is routed to Chorus Pro's public sphere, under matricule `9999`, is a public entity, and the invoice is flagged `b2g`. The flag is only set while the line is in force, so a party that leaves Chorus Pro stops being B2G.

The **Is B2G?** step then reads that flag and answers `true` or `false`, so the workflow can branch on it the same way it branches on [Directory lookup](/guides/fr-lookup):

| Result | Meaning | Deliver with |
| - | - | - |
| `true` | The customer's Annuaire line points to Chorus Pro | **Send to Chorus Pro** |
| `false` | Everything else | **Send Peppol document** |

Keep **Is B2G?** after the record step, which is where the answer comes from. For a document that has not been recorded, the step asks the Annuaire directly. Everything after the branch is shared: both paths **Forward document to PPF**.

<Steps>
  <Step title="Record">
    The invoice is validated against the French rules, the customer is checked in the Annuaire, and the invoice is flagged `b2g` when the customer is a public entity. The [Chorus Pro rules](#rules-checked-at-record) are applied at this point, so a breach is reported here rather than minutes later by Chorus Pro.
  </Step>

  <Step title="Is B2G?">
    Reads the flag and branches.
  </Step>

  <Step title="Send to Chorus Pro">
    Deposits the invoice with Chorus Pro and waits for its answer. The job stays queued until Chorus Pro has received the invoice and made it available to the public entity. See [Following the invoice](#following-the-invoice).
  </Step>

  <Step title="Forward document to PPF">
    Sends the F1 copy and the `200` Déposée status to the PPF, exactly as for a B2B invoice.
  </Step>
</Steps>

## Setup

All of the following steps must be carried out from the [Invopop Console](https://console.invopop.com).

The **PPF send document (public sector)** template is the regular [send workflow](/guides/fr-pa-invoicing#sending) with the **Is B2G?** branch inserted after the record step. Use it in place of the regular one: it handles every customer, public or not, so you need only one send workflow.

<Card iconType="duotone" title="PPF send document (public sector)" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=fr-fr-pa-send-invoice-b2g" horizontal>
  Add to my workspace →
</Card>

<Tabs>
  <Tab title="Workflow">
    <WorkflowDiagram workflow={frPaSendInvoiceB2GWorkflow} />
  </Tab>

  <Tab title="Code">
    Copy and paste into a new [Empty Invoice workflow](https://console.invopop.com/redirect/workflows/new?template=empty-invoice) code view.

    ```json PPF send document (public sector) workflow theme={"system"}
    {
        "name": "PPF send document (public sector)",
        "description": "Send an invoice via Chorus Pro or Peppol depending on the buyer, and record it with PPF",
        "app_id": "gov-fr",
        "country": "fr",
        "steps": [
            {
                "id": "067bc16d-c1a7-11f1-8390-4eb134dbe674",
                "name": "Set state",
                "provider": "silo.state",
                "summary": "Set state to `processing`{.state .processing}",
                "config": {
                    "state": "processing"
                }
            },
            {
                "id": "067e5b0d-c1a7-11f1-a890-4eb134dbe674",
                "name": "Sign envelope",
                "provider": "silo.close"
            },
            {
                "id": "067e5bad-c1a7-11f1-a27a-4eb134dbe674",
                "name": "Document is an invoice?",
                "provider": "silo.if",
                "next": [
                    {
                        "status": "NA",
                        "code": "true",
                        "steps": [
                            {
                                "id": "067e5bf8-c1a7-11f1-a34e-4eb134dbe674",
                                "name": "Generate UBL document",
                                "provider": "ubl.generate",
                                "summary": "Peppol France CIUS v1",
                                "config": {
                                    "attach_invoice_pdf": false,
                                    "doc_type": "peppol-fr-cius",
                                    "private": false,
                                    "validate_ubl": false
                                }
                            }
                        ]
                    },
                    {
                        "status": "NA",
                        "code": "false",
                        "steps": [
                            {
                                "id": "067e5c2f-c1a7-11f1-a517-4eb134dbe674",
                                "name": "Generate CDAR Status",
                                "provider": "cii.generate",
                                "summary": "France CTC Flow 6 CDAR (lifecycle status/payment)",
                                "config": {
                                    "attach_invoice_pdf": false,
                                    "doc_type": "fr-ctc-cdar-flow6",
                                    "validate_cii": false
                                }
                            }
                        ]
                    }
                ],
                "config": {
                    "expr": "doc['$schema'] endsWith 'bill/invoice'",
                    "scope": "env"
                }
            },
            {
                "id": "067e5c5e-c1a7-11f1-9b94-4eb134dbe674",
                "name": "Record outgoing document for e-invoicing",
                "provider": "gov-fr.directory.record.outgoing"
            },
            {
                "id": "067e5ddf-c1a7-11f1-aff3-4eb134dbe674",
                "name": "Is B2G?",
                "provider": "gov-fr.chorus-pro.lookup",
                "summary": "Chorus Pro for a public buyer, Peppol otherwise",
                "next": [
                    {
                        "status": "NA",
                        "code": "true",
                        "steps": [
                            {
                                "id": "067e5daf-c1a7-11f1-a744-4eb134dbe674",
                                "name": "Send to Chorus Pro",
                                "provider": "gov-fr.chorus-pro.send",
                                "summary": "Deliver to the public sphere"
                            },
                            {
                                "id": "067e5d67-c1a7-11f1-875f-4eb134dbe674",
                                "name": "Forward document to PPF",
                                "provider": "gov-fr.directory.forward"
                            }
                        ]
                    },
                    {
                        "status": "NA",
                        "code": "false",
                        "steps": [
                            {
                                "id": "067e5c7f-c1a7-11f1-96f3-4eb134dbe674",
                                "name": "Verify document can be sent",
                                "provider": "peppol.validate.endpoint",
                                "next": [
                                    {
                                        "code": "true",
                                        "steps": [
                                            {
                                                "id": "067e5ca2-c1a7-11f1-a3ed-4eb134dbe674",
                                                "name": "Send Peppol document",
                                                "provider": "peppol.send"
                                            },
                                            {
                                                "id": "067e5cc1-c1a7-11f1-99dd-4eb134dbe674",
                                                "name": "Forward document to PPF",
                                                "provider": "gov-fr.directory.forward"
                                            }
                                        ]
                                    },
                                    {
                                        "code": "false",
                                        "steps": [
                                            {
                                                "id": "067e5ce6-c1a7-11f1-81bc-4eb134dbe674",
                                                "name": "Forward document to PPF",
                                                "provider": "gov-fr.directory.forward",
                                                "summary": "Forward to PPF (déposée – non transmise)",
                                                "config": {
                                                    "not_transmitted": true
                                                }
                                            }
                                        ]
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                "id": "067e5d0b-c1a7-11f1-af09-4eb134dbe674",
                "name": "Set state",
                "provider": "silo.state",
                "summary": "Set state to `completed`{.state .completed}",
                "config": {
                    "state": "completed"
                }
            }
        ],
        "rescue": [
            {
                "id": "067e6072-c1a7-11f1-ba65-4eb134dbe674",
                "name": "Set state",
                "provider": "silo.state",
                "summary": "Set state to `error`{.state .error}",
                "config": {
                    "state": "error"
                }
            }
        ]
    }
    ```
  </Tab>
</Tabs>

<Info>
  The recommended approach for running jobs is to perform two steps: first upload the document to the [silo](/api-ref/silo/entries/create-an-entry-put), then [create a job](/api-ref/transform/jobs/create-a-job-post).
</Info>

The workflow is shared with [status documents](/guides/fr-pa-status). The **Is B2G?** step resolves a status or payment to the invoice it answers, so it follows the same channel as that invoice.

## What a public buyer needs

A B2G invoice is a regular [`fr-ctc-flow2-v1`](https://docs.gobl.org/addons/fr-ctc-flow2-v1) invoice. Chorus Pro needs a few more things on it to find the public entity and route the invoice to the right department.

| Data | GOBL field | Notes |
| - | - | - |
| **Customer SIRET** | `customer.identities[]` with `type` `SIRET` | Chorus Pro identifies public entities by SIRET, not SIREN. The add-on tags it with ISO scheme `0009` and derives the SIREN. Rule `BR-FR-CPRO-10`. |
| **Supplier SIRET** | `supplier.identities[]` with `type` `SIRET` | Same reason. A supplier giving only a SIREN is refused by Chorus Pro (`BR-FR-CPRO-09`). |
| **Service code** (*code service*, also called *code routage*) | `customer.identities[]` with `key` `private-id` | The department within the public entity. Many entities require it; the add-on tags it with scheme `0224`. |
| **Commitment number** (*numéro d'engagement juridique*) | `ordering.purchases[0].code` | The purchase order reference, BT-13. Required by entities that work with commitments. 50 characters or fewer. |
| **Contract reference** (*numéro de marché*) | `ordering.contracts[0].code` | BT-12. 50 characters or fewer. |
| **Billing mode** | `tax.ext.fr-ctc-billing-mode` | As for B2B. `S3` (subcontracting with direct payment) is specific to public contracts and not yet supported. |

Ask the public entity which of the service code and commitment number it requires. Chorus Pro publishes each entity's requirements, and an invoice missing a required one is rejected by Chorus Pro after deposit.

<Tip>
  Invopop cannot yet check whether a given public entity requires a service code or a commitment number, because the Annuaire does not carry that information. Collect it from the buyer when you take the order.
</Tip>

### Rules checked at record

Chorus Pro adds its own management rules on top of the norm, `BR-FR-CPRO-01` to `50`, and they apply only to invoices bound for the public sphere. None of them is covered by the standard schematrons, so without a local check the first time you hear of a breach is Chorus Pro's rejection, which names a rule but not the field.

Once an invoice is flagged `b2g`, the record step enforces the rules below and reports **every** breach at once, so a single round of fixes is enough.

| Group | Rules | What is checked |
| - | - | - |
| Length caps | `02`, `14`, `15`, `30`–`37`, `39`, `41`–`44` | Invoice number and preceding invoice reference 20 characters; contract, purchase order and supporting document references 50; party names and trade names 99; address line and city 400; notes, item descriptions and payment terms 1024; attachment file names 50 |
| Identifiers | `09`, `10`, `17` | Supplier, customer and payee each give a SIRET |
| Cardinality | `19`, `20`, `26`, `27` | Fewer than one million lines, one preceding invoice reference, one contact per party |
| Payment | `48`, `49` | IBAN of exactly 27 characters, counted as written, so no spaces; BIC of 8 to 11 characters |
| Billing framework | `24`, `47` | `S5` is refused, as are the multi-vendor modes `B8`, `S8` and `M8` |

The IBAN rule is the one that catches most people. Chorus Pro counts the IBAN as written, so `FR76 3000 6000 0112 3456 7890 189` is 33 characters and is refused. Write it without spaces.

Rules that depend on data Invopop does not hold (whether the entity requires a service code or commitment number, `11` to `13`), that the norm itself marks as unverifiable, or that turn on the `S3` billing mode are not checked locally and remain enforced by Chorus Pro.

## Following the invoice

**Send to Chorus Pro** deposits the invoice and then waits. Chorus Pro first acknowledges the deposit as a whole, then walks the invoice through its own lifecycle, which is richer than the PPF's accepted or rejected pair. Invopop keeps the codes as Chorus Pro sends them, so the workflow and the France dashboard show the same vocabulary as the Chorus Pro portal.

| Answer | Meaning | Job |
| - | - | - |
| Receipt `500` | The deposit was readable and accepted for processing | Keeps waiting |
| Receipt `501` | The deposit was *irrecevable*: a file Chorus Pro could not read. The invoice never entered a lifecycle | **KO** |
| <Badge color="blue">202</Badge> Reçue | Chorus Pro has received the invoice | Keeps waiting |
| <Badge color="blue">203</Badge> Mise à disposition | The invoice is available to the public entity | **OK** |
| <Badge color="blue">204</Badge> Prise en charge, <Badge color="blue">205</Badge> Approuvée | The entity is processing or has approved it | **OK** |
| <Badge color="yellow">208</Badge> Suspendue | The entity needs more information | Keeps waiting |
| <Badge color="yellow">209</Badge> Complétée | The missing information was supplied | **OK** |
| <Badge color="red">210</Badge> Refusée, <Badge color="red">213</Badge> Rejetée | Refused by the entity, or rejected by Chorus Pro's own checks | **KO** |
| <Badge color="green">211</Badge> Mandatée, <Badge color="green">212</Badge> Mise en paiement | Payment ordered, then paid | **OK** |

The job completes as soon as Chorus Pro has made the invoice available (`203`) or any later code arrives. Later statuses keep updating the invoice after the job has finished, and each is visible on the invoice in the [France dashboard](/guides/fr-pa-invoicing#reading-submitted-invoices). Chorus Pro does not always deliver statuses in the order it applied them, so the invoice keeps whichever carries the latest timestamp.

A `213` from Chorus Pro names the rule that failed. If it is one of the [rules checked at record](#rules-checked-at-record), the invoice was flagged `b2g` after the fact; otherwise fix the field the rule names and send a new invoice.

<Note>
  For an invoice you issued, the public entity drives the lifecycle through Chorus Pro. Statuses you build on such an invoice are not forwarded: Chorus Pro rules on the invoices it receives, and Invopop does not answer them. Statuses you send only travel to Chorus Pro for invoices a public entity sent **to you**, described next.
</Note>

## Receiving from a public entity (G2B)

G2B is the same exchange in reverse: a French public entity issues an invoice to your business. It is new with the 2026 reform. Public bodies previously had no route to invoice the private sector electronically.

The path differs from a B2B invoice in where it comes from, not in what you do with it:

1. The public entity submits the invoice to Chorus Pro, in UBL or Factur-X.
2. Chorus Pro delivers it to Invopop, addressed to the Annuaire line your party is registered under. That line decides which workspace receives it, so the party must be [registered](/guides/fr-pa-registration) before any public entity can invoice it.
3. **Receive document from Chorus Pro** converts it to GOBL and hands it to your [receive workflow](/guides/fr-pa-invoicing#receiving), which records it against your party with the same controls as an inbound Peppol invoice.

From there it behaves like any other received invoice: it appears in the France dashboard, and you answer with [status updates](/guides/fr-pa-status) as it is accepted, disputed or paid. Build each status as you would for a B2B invoice and run it through the send workflow. **Is B2G?** resolves it to the invoice it answers, and **Send to Chorus Pro** deposits it on the public circuit.

The statuses you send back follow the AFNOR norm rather than Chorus Pro's own vocabulary. Chorus Pro translates its internal codes before they reach you, so a rejection arrives as `210` and its own motifs arrive as their AFNOR equivalents.

## Testing in sandbox

A sandbox workspace delivers B2G invoices to Chorus Pro's **qualification environment**, and the record step reads the **qualification Annuaire** to decide whether a customer is a public entity. Both are separate from production, so a public entity you find in the production Annuaire is unknown there, and the invoice routes to Peppol instead.

To exercise the Chorus Pro branch in sandbox, use a customer registered as a public entity in the qualification Annuaire. [Contact us](https://invopop.com/contact) for test buyer details if you don't have any.

## Example invoices

<AccordionGroup>
  <Accordion title="PA B2G invoice (public buyer)">
    An invoice from a French company to a French public entity. It uses the same [`fr-ctc-flow2-v1`](https://docs.gobl.org/addons/fr-ctc-flow2-v1) add-on as a domestic B2B invoice, with the data Chorus Pro needs on top.

    Notice:

    * both parties give a `SIRET` identity, which the add-on tags with `iso-scheme-id` `0009` and from which it derives the `SIREN`,
    * the customer carries a `private-id` identity with the public entity's service code, which the add-on tags with scheme `0224`,
    * `ordering.purchases[0].code` holds the *numéro d'engagement juridique* and `ordering.contracts[0].code` the contract reference, each 50 characters or fewer,
    * the invoice number is 20 characters or fewer and the IBAN is written as 27 characters without spaces, as Chorus Pro requires.

    <CodeGroup>
      ```json PA B2G invoice (public buyer) theme={"system"}
      {
          "$schema": "https://gobl.org/draft-0/bill/invoice",
          "$regime": "FR",
          "$addons": [
              "fr-ctc-flow2-v1"
          ],
          "type": "standard",
          "series": "FAC",
          "code": "2026-00042",
          "issue_date": "2026-10-14",
          "currency": "EUR",
          "tax": {
              "ext": {
                  "fr-ctc-billing-mode": "S1",
                  "untdid-document-type": "380"
              }
          },
          "supplier": {
              "name": "Fournisseur Example SARL",
              "tax_id": {
                  "country": "FR",
                  "code": "732829320"
              },
              "identities": [
                  {
                      "type": "SIRET",
                      "code": "73282932000009"
                  }
              ],
              "inboxes": [
                  {
                      "key": "peppol",
                      "scheme": "0225",
                      "code": "732829320"
                  }
              ],
              "addresses": [
                  {
                      "num": "123",
                      "street": "Rue de la Paix",
                      "locality": "Paris",
                      "code": "75001",
                      "country": "FR"
                  }
              ],
              "emails": [
                  {
                      "addr": "facturation@fournisseur.fr"
                  }
              ]
          },
          "customer": {
              "name": "Commune Example",
              "tax_id": {
                  "country": "FR",
                  "code": "356000000"
              },
              "identities": [
                  {
                      "type": "SIRET",
                      "code": "35600000000006"
                  },
                  {
                      "key": "private-id",
                      "code": "SERVICE01"
                  }
              ],
              "addresses": [
                  {
                      "num": "1",
                      "street": "Place de la Mairie",
                      "locality": "Example",
                      "code": "75002",
                      "country": "FR"
                  }
              ],
              "inboxes": [
                  {
                      "key": "peppol",
                      "scheme": "0225",
                      "code": "356000000"
                  }
              ]
          },
          "ordering": {
              "purchases": [
                  {
                      "code": "EJ2026-0001"
                  }
              ],
              "contracts": [
                  {
                      "code": "MARCHE-2026-12"
                  }
              ]
          },
          "lines": [
              {
                  "quantity": "10",
                  "item": {
                      "name": "Prestation de conseil",
                      "price": "150.00",
                      "unit": "h"
                  },
                  "taxes": [
                      {
                          "cat": "VAT",
                          "rate": "standard"
                      }
                  ]
              }
          ],
          "payment": {
              "terms": {
                  "key": "due-date",
                  "due_dates": [
                      {
                          "date": "2026-11-13",
                          "percent": "100%"
                      }
                  ]
              },
              "instructions": {
                  "key": "credit-transfer",
                  "credit_transfer": [
                      {
                          "iban": "FR7630006000011234567890189",
                          "bic": "AGRIFRPP"
                      }
                  ]
              }
          }
      }
      ```

      ```json Built version theme={"system"}
      {
      	"$schema": "https://gobl.org/draft-0/bill/invoice",
      	"$regime": "FR",
      	"$addons": [
      		"eu-en16931-v2017",
      		"fr-ctc-flow2-v1"
      	],
      	"type": "standard",
      	"series": "FAC",
      	"code": "2026-00042",
      	"issue_date": "2026-10-14",
      	"currency": "EUR",
      	"tax": {
      		"rounding": "currency",
      		"ext": {
      			"fr-ctc-billing-mode": "S1",
      			"untdid-document-type": "380"
      		}
      	},
      	"supplier": {
      		"name": "Fournisseur Example SARL",
      		"tax_id": {
      			"country": "FR",
      			"code": "44732829320"
      		},
      		"identities": [
      			{
      				"type": "SIRET",
      				"code": "73282932000009",
      				"ext": {
      					"iso-scheme-id": "0009"
      				}
      			},
      			{
      				"scope": "legal",
      				"type": "SIREN",
      				"code": "732829320",
      				"ext": {
      					"iso-scheme-id": "0002"
      				}
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "iso6523-actorid-upis::0225:732829320"
      			}
      		],
      		"inboxes": [
      			{
      				"key": "peppol",
      				"scheme": "0225",
      				"code": "732829320"
      			}
      		],
      		"addresses": [
      			{
      				"num": "123",
      				"street": "Rue de la Paix",
      				"locality": "Paris",
      				"code": "75001",
      				"country": "FR"
      			}
      		],
      		"emails": [
      			{
      				"addr": "facturation@fournisseur.fr"
      			}
      		]
      	},
      	"customer": {
      		"name": "Commune Example",
      		"tax_id": {
      			"country": "FR",
      			"code": "39356000000"
      		},
      		"identities": [
      			{
      				"type": "SIRET",
      				"code": "35600000000006",
      				"ext": {
      					"iso-scheme-id": "0009"
      				}
      			},
      			{
      				"key": "private-id",
      				"code": "SERVICE01",
      				"ext": {
      					"iso-scheme-id": "0224"
      				}
      			},
      			{
      				"scope": "legal",
      				"type": "SIREN",
      				"code": "356000000",
      				"ext": {
      					"iso-scheme-id": "0002"
      				}
      			}
      		],
      		"endpoints": [
      			{
      				"uri": "iso6523-actorid-upis::0225:356000000"
      			}
      		],
      		"inboxes": [
      			{
      				"key": "peppol",
      				"scheme": "0225",
      				"code": "356000000"
      			}
      		],
      		"addresses": [
      			{
      				"num": "1",
      				"street": "Place de la Mairie",
      				"locality": "Example",
      				"code": "75002",
      				"country": "FR"
      			}
      		]
      	},
      	"lines": [
      		{
      			"i": 1,
      			"quantity": "10",
      			"item": {
      				"name": "Prestation de conseil",
      				"price": "150.00",
      				"unit": "h"
      			},
      			"sum": "1500.00",
      			"taxes": [
      				{
      					"cat": "VAT",
      					"key": "standard",
      					"rate": "general",
      					"percent": "20%",
      					"ext": {
      						"untdid-tax-category": "S"
      					}
      				}
      			],
      			"total": "1500.00"
      		}
      	],
      	"ordering": {
      		"contracts": [
      			{
      				"code": "MARCHE-2026-12"
      			}
      		],
      		"purchases": [
      			{
      				"code": "EJ2026-0001"
      			}
      		]
      	},
      	"payment": {
      		"terms": {
      			"key": "due-date",
      			"due_dates": [
      				{
      					"date": "2026-11-13",
      					"amount": "1800.00",
      					"percent": "100%"
      				}
      			]
      		},
      		"instructions": {
      			"key": "credit-transfer",
      			"credit_transfer": [
      				{
      					"iban": "FR7630006000011234567890189",
      					"bic": "AGRIFRPP"
      				}
      			],
      			"ext": {
      				"untdid-payment-means": "30"
      			}
      		}
      	},
      	"totals": {
      		"sum": "1500.00",
      		"total": "1500.00",
      		"taxes": {
      			"categories": [
      				{
      					"code": "VAT",
      					"rates": [
      						{
      							"key": "standard",
      							"ext": {
      								"untdid-tax-category": "S"
      							},
      							"base": "1500.00",
      							"percent": "20%",
      							"amount": "300.00"
      						}
      					],
      					"amount": "300.00"
      				}
      			],
      			"sum": "300.00"
      		},
      		"tax": "300.00",
      		"total_with_tax": "1800.00",
      		"payable": "1800.00"
      	},
      	"notes": [
      		{
      			"key": "payment",
      			"text": "Conditions de paiement selon les conditions générales de vente.",
      			"ext": {
      				"untdid-text-subject": "PMT"
      			}
      		},
      		{
      			"key": "payment-method",
      			"text": "Pénalités et indemnités de retard applicables conformément aux conditions générales de vente.",
      			"ext": {
      				"untdid-text-subject": "PMD"
      			}
      		},
      		{
      			"key": "payment-term",
      			"text": "Aucun escompte n'est accordé pour paiement anticipé.",
      			"ext": {
      				"untdid-text-subject": "AAB"
      			}
      		}
      	]
      }
      ```
    </CodeGroup>
  </Accordion>
</AccordionGroup>

## FAQ

Invoicing questions

<AccordionGroup>
  <Accordion title="How do I configure my workspace for French invoicing?">
    Two channels depending on the recipient: B2G uses Chorus Pro (CII format); B2B from September 2026 uses the Plateforme Agréée model (UBL, CII, or Factur-X via Peppol). Invopop is an approved PA — install the France PA app for B2B and the Chorus Pro app for B2G.
  </Accordion>

  <Accordion title="How can I view an XML attached to a PDF?">
    In Factur-X PDFs, the XML file is embedded within the PDF itself. To extract and view it, use the `Attachments` section in Adobe Acrobat Reader, or a tool like the [SysTools PDF Extractor](https://www.systoolsgroup.com/pdf/extractor/).
  </Accordion>

  <Accordion title="Is Invopop ready for the September 2026 mandate?">
    Invopop is an [officially approved Plateforme Agréée](https://www.impots.gouv.fr/je-consulte-la-liste-des-plateformes-agreees) under the DGFiP mandate. Registration, invoicing, and lifecycle status are available today; e-reporting (Flow 10) is in active development. See the [PA hub readiness matrix](/guides/fr-pa) for the current state.
  </Accordion>

  <Accordion title="What GOBL addons are required for France PA?">
    The base [FR tax regime](https://docs.gobl.org/regimes/fr) plus the EN 16931 profile. For Peppol delivery, `peppol-bis-v3`. The forthcoming `fr-ctc-flow10-v1` addon covers e-reporting payloads — separate from the e-invoicing flow.
  </Accordion>

  <Accordion title="Is a self-billed invoice a different document type in France?">
    No. Most Peppol countries treat self-billing as a document type of its own, but France models it as a **standard invoice** with the `untdid-document-type` extension set to `389`. In GOBL you never set the code yourself: add the `self-billed` tag and the [`fr-ctc-flow2-v1`](https://docs.gobl.org/addons/fr-ctc-flow2-v1#standard-self-billed) add-on applies it automatically. See [Self-billing](/guides/fr-pa-invoicing#self-billing) for the full flow.
  </Accordion>

  <Accordion title="Why was my VAT-exempt invoice never sent to the PPF?">
    Transactions exempt under articles 261 to 261 E of the CGI — insurance, medical care, education and the rest of that range — sit outside the e-invoicing mandate, and the PPF rejects them if you deposit one. When an invoice's whole VAT breakdown is exempt and carries a `VATEX-FR-CGI261*` code, Invopop records it but sends no F1 and raises no lifecycle status, and the dashboard shows it as <Badge color="blue">Exempt</Badge>. Keep issuing the invoice to your customer as usual. An invoice that mixes exempt and taxable lines is still sent normally, and so is `VATEX-FR-FRANCHISE`. See [VAT-exempt invoices](/guides/fr-pa-invoicing#vat-exempt-invoices).
  </Accordion>

  <Accordion title="How many pops does a B2B e-invoice through France PA cost?">
    Each invoice or lifecycle status sent through France PA costs **5 pops**: 1 pop for the conversion to UBL/CII, 2 pops to send it over Peppol, 1 pop to forward it to the PPF, and 1 pop for the silo entry. See [Pops & pricing](/get-started/pricing) for how pops work.
  </Accordion>

  <Accordion title="What does the record document step check against the Annuaire?">
    Before an invoice is recorded, the **PPF record document** step looks up both the supplier and the customer SIREN in the Annuaire. What each party must satisfy depends on the workflow's role:

    | Role | Annuaire state | Outcome |
    | - | - | - |
    | Both | The SIREN has no effective entry | **Rejected** |
    | Receiving | The SIREN has at least one effective entry | **Accepted** |
    | Sending | The SIREN's only entry is the PPF's default line (matricule `9998`) | **Accepted** |
    | Sending | The party's `0225` peppol endpoint matches one of the SIREN's entries | **Accepted** |
    | Sending | The party's `0225` peppol endpoint matches none of the SIREN's entries | **Rejected** |

    Sandbox invoices skip the Annuaire check entirely.
  </Accordion>

  <Accordion title="What should I do if the customer isn't registered in the Annuaire?">
    Don't block the sale. An exchange where only one party has an
    effective Annuaire entry is a
    [non-regulated flow](/guides/fr-pa#key-concepts): it leaves
    e-invoicing (flux 2) and is covered by
    [e-reporting](/guides/fr-pa-reporting) (flux 10) instead.

    In practice:

    * Run a [Directory lookup](/guides/fr-lookup) against the
      customer's SIREN before you generate the invoice — ideally in a
      separate validation workflow run against customer data, so you
      can prompt them to fix their registration ahead of time.
    * If the SIREN has no effective entry, route the invoice through
      your reporting workflow rather than the PA send workflow.
    * If it slips through, the send workflow degrades rather than
      failing: the **Verify document can be sent** step branches and
      forwards the invoice to the PPF as *déposée – non transmise*.

    A missing entry is common and not necessarily an error. A SIREN
    visible in the public
    [annuaire-entreprises](https://annuaire-entreprises.data.gouv.fr)
    registry is not the same as an effective entry in the DGFiP
    Annuaire, which only covers entities in scope of the mandate. It
    can also be absent because the buyer hasn't yet appointed a PA, or
    because their tax records don't match.
  </Accordion>

  <Accordion title="Should I check the Annuaire at order time or at invoice time?">
    Both, for different reasons. A lookup at order or onboarding time
    is a data-quality check: it lets you warn the customer and get
    their SIREN or PA sorted before invoicing. A lookup at invoice
    time is the one that decides the flow, because registrations are
    added and withdrawn continuously and a party found at checkout may
    no longer be routable days later (and vice versa).

    Treat the early result as advisory, resolve again at generation,
    and store the resolved electronic address on the transaction —
    the routing address isn't always the bare SIREN. See
    [Directory lookup](/guides/fr-lookup).
  </Accordion>

  <Accordion title="How do I know whether an invoice is B2G?">
    You don't decide it yourself. When the invoice is recorded, Invopop looks the customer up in the Annuaire: a party whose line is routed to Chorus Pro is a public entity, and the invoice is marked B2G. The **Is B2G?** workflow step reads that answer and branches to **Send to Chorus Pro** instead of Peppol. See the [public sector guide](/guides/fr-pa-b2g).
  </Accordion>

  <Accordion title="Do I need a Chorus Pro account to invoice French public entities?">
    Not if your company has a French SIREN and is registered in the Annuaire through Invopop. Invopop holds the connection with Chorus Pro, so B2G invoices use the same [send workflow](/guides/fr-pa-b2g#setup) as any other French invoice. Only foreign entities without a French SIREN still go through the standalone [Chorus Pro app](/apps/choruspro-france), which requires Chorus Pro credentials.
  </Accordion>

  <Accordion title="Where do I put the service code and the numéro d'engagement on a B2G invoice?">
    The service code (*code service* or *code routage*) is a `private-id` identity on the customer, and the commitment number (*numéro d'engagement juridique*) is the purchase order reference in `ordering.purchases[0].code`. Both are supplied by the public entity. The [public sector guide](/guides/fr-pa-b2g#what-a-public-buyer-needs) lists every field.
  </Accordion>
</AccordionGroup>

Receiving questions

<AccordionGroup>
  <Accordion title="How do I import received invoices in France?">
    Register the recipient with Invopop as their Plateforme Agréée. Inbound documents (UBL, CII, Factur-X) are converted to GOBL and stored in the Expenses folder. Chorus Pro inbound flow is separate and routes via the Chorus Pro app.
  </Accordion>

  <Accordion title="How does Invopop convert received French invoices into GOBL?">
    UBL via [`gobl.peppol`](https://github.com/invopop/gobl.peppol); CII and Factur-X via [`gobl.cii`](https://github.com/invopop/gobl.cii). The original structured XML (or PDF/A-3 with embedded XML) is preserved as a silo entry attachment.
  </Accordion>

  <Accordion title="How do I import received invoices via France PA?">
    Register the recipient via Invopop as their PA. Inbound UBL/CII/Factur-X documents are routed to the configured Import workflow and become GOBL silo entries. Lifecycle status updates (CDAR) feed back to the issuer through the same channel.
  </Accordion>

  <Accordion title="What format do received France PA invoices arrive in?">
    UBL, CII, or Factur-X (PDF with embedded CII XML), all conforming to EN 16931 and the French CTC profile. Invopop preserves the original and exposes the GOBL conversion.
  </Accordion>

  <Accordion title="Can I receive invoices at more than one platform (PDP) for the same company?">
    Yes. A single company can be reachable at several destinations by registering different routing identifiers (electronic addresses) in the Annuaire — one per PDP or inbox. Invoices addressed to a given identifier are delivered to the platform registered against it, so you can route some invoices to Invopop and others to a different PDP (for example a travel-and-expense tool) for the same SIREN.

    The Annuaire supports several address formats that map to increasingly granular destinations within the same company:

    * `SIREN` — the company as a whole.
    * `SIREN_SIRET` — a specific establishment.
    * `SIREN_SIRET_ROUTINGCODE` — a site, department, or workflow within an establishment.
    * `SIREN_SUFFIX` — a custom routing suffix.

    Give each PDP or inbox a distinct identifier and share the matching address with each issuer, so their invoices reach the intended destination. You can [look up an electronic address](/guides/fr-lookup) in the Annuaire to confirm where it currently routes.
  </Accordion>

  <Accordion title="What is checked before a received invoice is recorded?">
    An invoice arriving from another platform goes through three controls, run in the order the PPF applies them:

    * **Syntax** — the invoice XML against the Flux 2 schematron for its syntax.
    * **Addressing** — both parties carry a SIREN registered in the Annuaire, the transport addresses belong to the parties the invoice names, and the invoice is addressed to a party registered in your workspace.
    * **Unicity** — the invoice is not already recorded for this party, number and year.

    An invoice that passes every control is recorded on the receiving side. Only invoices are validated this way; incoming lifecycle statuses are simply recorded.
  </Accordion>

  <Accordion title="What reason does a rejected invoice come back with?">
    Each control rejects under its own CDAR motif, carried on the [`213` Rejetée](/guides/fr-pa-status#issued-by-the-platform) status returned to the platform that sent the invoice:

    * `REJ_SEMAN` — *rejet pour erreur sémantique*, when the invoice fails the Flux 2 schematron.
    * `ADR_ERR` — *adresse de facturation électronique erronée*, when the addressing control fails.
    * `REJ_UNI` — *rejet sur contrôle unicité*, when the invoice is already recorded.
  </Accordion>
</AccordionGroup>

More available in our [France FAQ](/faq/france) section

***

<AccordionGroup>
  <Accordion title="🇫🇷 Invopop resources for France">
    | | |
    | - | - |
    | Compliance | <Icon icon="https://assets.invopop.com/flags/fr.svg" /> [Invoicing compliance in France](/compliance/france)<br /> <Icon icon="timeline" /> [Compliance timeline](/timelines/france) |
    | Apps | <Icon icon="https://assets.invopop.com/flags/fr.svg" /> [France](/apps/france)<br /><Icon icon="https://assets.invopop.com/apps/peppol/icon.svg" /> [Peppol](/apps/peppol)<br /><Icon icon="https://assets.invopop.com/apps/chroruspro/icon.svg" /> [Chorus Pro France](/apps/choruspro-france) |
    | Guides | <Icon icon="book" /> Chorus Pro — [Supplier registration](/guides/fr-chorus-pro-supplier) · [Issuing invoices](/guides/fr-chorus-pro)<br /><Icon icon="book" /> [PA Guide](/guides/fr-pa) — [Registration](/guides/fr-pa-registration) · [Invoicing](/guides/fr-pa-invoicing) · [Status](/guides/fr-pa-status) · [Reporting](/guides/fr-pa-reporting) · [Public sector](/guides/fr-pa-b2g) |
    | FAQ | <Icon icon="square-question" /> [France FAQ](/faq/france) |
    | GOBL | <Icon icon="https://assets.invopop.com/icons/gobl.svg" />  [France Tax Regime](https://docs.gobl.org/regimes/fr)<br /> <Icon icon="https://assets.invopop.com/icons/gobl.svg" /> [Chorus Pro Addon](https://docs.gobl.org/addons/fr-choruspro-v1)<br /> <Icon icon="https://assets.invopop.com/icons/gobl.svg" /> [French Factur-X Addon](https://docs.gobl.org/addons/fr-facturx-v1) |
    | GitHub | <Icon icon="github" /> [gobl.xinvoice](https://github.com/invopop/gobl.xinvoice) |
  </Accordion>
</AccordionGroup>

<Card title="Participate in our community" icon="forumbee" href="https://community.invopop.com" arrow="true" horizontal>
  Ask and answer questions about invoicing in France →
</Card>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.