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

# Chorus Pro issuing invoices guide

> Issue invoices to French public institutions with Chorus Pro.

export const frChorusProInvoiceWorkflow = {
  "name": "Chorus Pro issue invoice",
  "description": "Issue a B2G invoice through Chorus Pro using CII",
  "schema": "bill/invoice",
  "steps": [{
    "id": "241c1b60-4cec-11f0-bcdc-61b84b5eeae8",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `processing`{.state .processing}",
    "config": {
      "state": "processing"
    }
  }, {
    "id": "0dba81f0-4ba1-11f0-a0a5-bbd7c9d8117a",
    "name": "Sign envelope",
    "provider": "silo.close"
  }, {
    "id": "3d048690-4ba1-11f0-a0a5-bbd7c9d8117a",
    "name": "Generate CII document",
    "provider": "cii.generate",
    "summary": "Chorus Pro v1",
    "config": {
      "doc_type": "choruspro-v1"
    }
  }, {
    "id": "2cd30490-4ba1-11f0-a0a5-bbd7c9d8117a",
    "name": "Send invoice to Chorus Pro",
    "provider": "chorus-pro.send"
  }, {
    "id": "282dac00-4cec-11f0-bcdc-61b84b5eeae8",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `sent`{.state .sent}",
    "config": {
      "state": "sent"
    }
  }],
  "rescue": [{
    "id": "2b9c6cf0-4cec-11f0-bcdc-61b84b5eeae8",
    "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: "https://lookup.invopop.com/icon.png",
    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-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",
    ilyda: "https://assets.invopop.com/apps/ilyda/icon.svg",
    invoicexpress: "https://assets.invopop.com/apps/invoicexpress/icon.svg",
    plemsi: "https://assets.invopop.com/flags/co.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 ? <img src={url} alt="" className="h-4 w-4" /> : 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>;
};

## Introduction

In this guide, you'll learn how to issue invoices to French public institutions using [Chorus Pro](https://portail.chorus-pro.gouv.fr/). It will walk you through:

1. Understanding Chorus Pro and its format requirements
2. Setting up the invoice submission workflow
3. Submitting your first invoice to a French public institution

### What is Chorus Pro?

Chorus Pro is a mandatory service provided by the French government for invoicing French public institutions. The platform allows businesses to upload invoices in multiple e-invoicing formats and track them throughout the French public administration process. All invoices to French public sector entities must be submitted through Chorus Pro.

The platform supports various e-invoicing formats including [Cross Industry Invoice (CII)](https://unece.org/trade/uncefact/e-invoice), and implements the [European Norm 16931 (EN16931)](https://ec.europa.eu/digital-building-blocks/sites/display/DIGITAL/European+Standard+and+Specifications) European standard for electronic invoicing with additional French-specific requirements.

### Understanding Chorus Pro format requirements

Chorus Pro accepts invoices in CII format based on the EN16931 European standard. However, it adds specific French extensions and validation requirements:

**EN16931 Standard**
The EN16931 defines the semantic data model for electronic invoices. The standard ensures interoperability across European Union (EU) member states while allowing for country-specific extensions.

**Chorus Pro Extensions**
Chorus Pro extends the base EN16931 standard with additional French requirements:

* SIRET number validation for French entities
* Specific invoice types for different purposes
* Service codes for government departments

In GOBL, these formats are handled via addons that you must add to each invoice. You'll see examples of this further below.

## Prerequisites

To issue invoices through Chorus Pro, you will need:

* **A registered supplier**: follow the [Chorus Pro supplier registration guide](/guides/fr-chorus-pro-supplier) to connect the required apps, create the Chorus Pro credentials, and register the supplier before issuing.
* Customer details, including the SIRET number of the public institution being invoiced.

## Setup

Configure your Invopop Workspace for Chorus Pro invoicing.

<Info>
  These instructions apply to both the sandbox and live environments. The UN/CEFACT CII and Chorus Pro apps must already be connected and the supplier registered — this is covered in the [supplier registration guide](/guides/fr-chorus-pro-supplier).
</Info>

<Steps>
  <Step title="Configure invoice workflow">
    Add a new workflow to your workspace for issuing invoices. You can start with the template below.

    <Card iconType="duotone" title="Chorus Pro invoice workflow" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=chorus-pro-invoice" horizontal>
      Add to my workspace →
    </Card>

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

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

        ```json Example Chorus Pro issue invoice workflow theme={null}
        {
            "name": "Chorus Pro issue invoice",
            "description": "Issue a B2G invoice through Chorus Pro using CII",
            "schema": "bill/invoice",
            "steps": [
                {
                    "id": "241c1b60-4cec-11f0-bcdc-61b84b5eeae8",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `processing`{.state .processing}",
                    "config": {
                        "state": "processing"
                    }
                },
                {
                    "id": "0dba81f0-4ba1-11f0-a0a5-bbd7c9d8117a",
                    "name": "Sign envelope",
                    "provider": "silo.close"
                },
                {
                    "id": "3d048690-4ba1-11f0-a0a5-bbd7c9d8117a",
                    "name": "Generate CII document",
                    "provider": "cii.generate",
                    "summary": "Chorus Pro v1",
                    "config": {
                        "doc_type": "choruspro-v1"
                    }
                },
                {
                    "id": "2cd30490-4ba1-11f0-a0a5-bbd7c9d8117a",
                    "name": "Send invoice to Chorus Pro",
                    "provider": "chorus-pro.send"
                },
                {
                    "id": "282dac00-4cec-11f0-bcdc-61b84b5eeae8",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `sent`{.state .sent}",
                    "config": {
                        "state": "sent"
                    }
                }
            ],
            "rescue": [
                {
                    "id": "2b9c6cf0-4cec-11f0-bcdc-61b84b5eeae8",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `error`{.state .error}",
                    "config": {
                        "state": "error"
                    }
                }
            ]
        }
        ```
      </Tab>
    </Tabs>

    Keep the workflow ID at hand as you'll need it later.
  </Step>
</Steps>

## Send an invoice

Once a supplier is registered, you can send invoices to French public institutions through Chorus Pro.

<Steps>
  <Step title="Create an Invoice">
    Use the [Create an entry](/api-ref/silo/entries/create-an-entry-put) endpoint to create a new invoice. Include an [invoice](https://docs.gobl.org/draft-0/bill/invoice) object in the [data](/api-ref/silo/entries/create-an-entry-put#body-data) field.

    <AccordionGroup>
      <Accordion title="Chorus Pro B2G Invoice">
        In this example, we're issuing a Chorus Pro invoice for business-to-government transactions in France. Chorus Pro is the mandatory platform for submitting invoices to French public sector entities.

        Notice:

        * the minimal version in the first tab contains only the essential fields required to create the B2G invoice,
        * the [`fr-choruspro-v1`](https://docs.gobl.org/addons/fr-choruspro-v1) addon ensures the document will be validated using the Chorus Pro rules built into the [GOBL](https://docs.gobl.org) library,
        * the customer must be a French public sector entity with a valid SIRET number,
        * specific Chorus Pro extensions and identifiers are required for public procurement (such as service codes and commitment numbers),
        * there are no totals or calculations in the minimal version; all these will be calculated automatically when running `gobl build`,
        * the built version in the second tab shows the normalized document with calculated totals, line item sums, TVA breakdowns, and automatically generated fields,
        * the invoice will be formatted according to Chorus Pro requirements and submitted through the platform, and,
        * all invoices to French public entities must be submitted through Chorus Pro.

        <CodeGroup>
          ```json Chorus Pro B2G Invoice theme={null}
          {
              "$schema": "https://gobl.org/draft-0/bill/invoice",
              "$regime": "FR",
              "$addons": [
                  "eu-en16931-v2017",
                  "fr-choruspro-v1"
              ],
              "uuid": "019783e7-33b1-7000-a1a5-6139e214b447",
              "type": "standard",
              "series": "SAMPLE",
              "code": "2345",
              "issue_date": "2025-06-18",
              "currency": "EUR",
              "supplier": {
                  "name": "Provide One Inc.",
                  "tax_id": {
                      "country": "FR",
                      "code": "43498927917"
                  },
                  "identities": [
                      {
                          "type": "SIRET",
                          "code": "49892791768734"
                      }
                  ],
                  "addresses": [
                      {
                          "num": "42",
                          "street": "Calle Pradillo",
                          "locality": "Madrid",
                          "region": "Madrid",
                          "code": "28002",
                          "country": "ES"
                      }
                  ],
                  "emails": [
                      {
                          "addr": "billing@example.com"
                      }
                  ]
              },
              "customer": {
                  "name": "Sample Consumer",
                  "tax_id": {
                      "country": "FR",
                      "code": "39356000000"
                  },
                  "identities": [
                      {
                          "type": "SIRET",
                          "code": "35600000012345"
                      }
                  ],
                  "addresses": [
                      {
                          "num": "1",
                          "street": "Rue Sundacsakn",
                          "locality": "Saint-Germain-En-Laye",
                          "code": "75050",
                          "country": "FR"
                      }
                  ],
                  "emails": [
                      {
                          "addr": "email@sample.com"
                      }
                  ]
              },
              "lines": [
                  {
                      "i": 1,
                      "quantity": "20",
                      "item": {
                          "name": "Development services",
                          "price": "90.00",
                          "unit": "h"
                      },
                      "sum": "1800.00",
                      "discounts": [
                          {
                              "reason": "Special discount",
                              "percent": "10%",
                              "amount": "180.00"
                          }
                      ],
                      "taxes": [
                          {
                              "cat": "VAT",
                              "rate": "standard"
                          }
                      ],
                      "total": "1620.00"
                  }
              ],
              "payment": {
                  "advances": [
                      {
                          "description": "Paid in full",
                          "percent": "100%",
                          "amount": "1944.00"
                      }
                  ],
                  "instructions": {
                      "key": "card"
                  }
              }
          }
          ```

          ```json Built version theme={null}
          {
          	"$schema": "https://gobl.org/draft-0/bill/invoice",
          	"$regime": "FR",
          	"$addons": [
          		"eu-en16931-v2017",
          		"fr-choruspro-v1"
          	],
          	"uuid": "019783e7-33b1-7000-a1a5-6139e214b447",
          	"type": "standard",
          	"series": "SAMPLE",
          	"code": "2345",
          	"issue_date": "2025-06-18",
          	"currency": "EUR",
          	"tax": {
          		"ext": {
          			"fr-choruspro-framework": "A1",
          			"untdid-document-type": "380"
          		}
          	},
          	"supplier": {
          		"name": "Provide One Inc.",
          		"tax_id": {
          			"country": "FR",
          			"code": "43498927917"
          		},
          		"identities": [
          			{
          				"type": "SIRET",
          				"code": "49892791768734",
          				"ext": {
          					"iso-scheme-id": "0009"
          				}
          			}
          		],
          		"addresses": [
          			{
          				"num": "42",
          				"street": "Calle Pradillo",
          				"locality": "Madrid",
          				"region": "Madrid",
          				"code": "28002",
          				"country": "ES"
          			}
          		],
          		"emails": [
          			{
          				"addr": "billing@example.com"
          			}
          		],
          		"ext": {
          			"fr-choruspro-scheme": "1"
          		}
          	},
          	"customer": {
          		"name": "Sample Consumer",
          		"tax_id": {
          			"country": "FR",
          			"code": "39356000000"
          		},
          		"identities": [
          			{
          				"type": "SIRET",
          				"code": "35600000012345",
          				"ext": {
          					"iso-scheme-id": "0009"
          				}
          			}
          		],
          		"addresses": [
          			{
          				"num": "1",
          				"street": "Rue Sundacsakn",
          				"locality": "Saint-Germain-En-Laye",
          				"code": "75050",
          				"country": "FR"
          			}
          		],
          		"emails": [
          			{
          				"addr": "email@sample.com"
          			}
          		],
          		"ext": {
          			"fr-choruspro-scheme": "1"
          		}
          	},
          	"lines": [
          		{
          			"i": 1,
          			"quantity": "20",
          			"item": {
          				"name": "Development services",
          				"price": "90.00",
          				"unit": "h"
          			},
          			"sum": "1800.00",
          			"discounts": [
          				{
          					"reason": "Special discount",
          					"percent": "10%",
          					"amount": "180.00"
          				}
          			],
          			"taxes": [
          				{
          					"cat": "VAT",
          					"key": "standard",
          					"rate": "general",
          					"percent": "20%",
          					"ext": {
          						"untdid-tax-category": "S"
          					}
          				}
          			],
          			"total": "1620.00"
          		}
          	],
          	"payment": {
          		"advances": [
          			{
          				"description": "Paid in full",
          				"percent": "100%",
          				"amount": "1944.00"
          			}
          		],
          		"instructions": {
          			"key": "card",
          			"ext": {
          				"untdid-payment-means": "48"
          			}
          		}
          	},
          	"totals": {
          		"sum": "1620.00",
          		"total": "1620.00",
          		"taxes": {
          			"categories": [
          				{
          					"code": "VAT",
          					"rates": [
          						{
          							"key": "standard",
          							"ext": {
          								"untdid-tax-category": "S"
          							},
          							"base": "1620.00",
          							"percent": "20%",
          							"amount": "324.00"
          						}
          					],
          					"amount": "324.00"
          				}
          			],
          			"sum": "324.00"
          		},
          		"tax": "324.00",
          		"total_with_tax": "1944.00",
          		"payable": "1944.00",
          		"advance": "1944.00",
          		"due": "0.00"
          	}
          }
          ```
        </CodeGroup>
      </Accordion>

      <Accordion title="Chorus Pro cross-border invoice (DE → FR)">
        A non-French supplier invoicing a French public sector entity through Chorus Pro. Chorus Pro accepts foreign suppliers — the customer's SIRET is what anchors the document to the right administration.

        Notice:

        * the supplier carries a DE tax ID and address, while the customer keeps its `SIRET` identity,
        * the `fr-choruspro-v1` add-on still applies — Chorus Pro routing rules are driven by the receiver, not the issuer,
        * VAT is reported as standard French VAT because the place of supply is France; cross-border reverse-charge cases would set the line tax accordingly.

        <CodeGroup>
          ```json Chorus Pro Cross-Border Invoice (DE → FR) theme={null}
          {
              "$schema": "https://gobl.org/draft-0/bill/invoice",
              "$regime": "FR",
              "$addons": [
                  "fr-choruspro-v1"
              ],
              "type": "standard",
              "series": "SAMPLE",
              "code": "001",
              "issue_date": "2022-02-01",
              "currency": "EUR",
              "supplier": {
                  "name": "Provide One Inc.",
                  "tax_id": {
                      "country": "DE",
                      "code": "111111125"
                  },
                  "addresses": [
                      {
                          "num": "42",
                          "street": "Berliner Strasse",
                          "locality": "Berlin",
                          "code": "10117",
                          "country": "DE"
                      }
                  ],
                  "emails": [
                      {
                          "addr": "billing@example.com"
                      }
                  ]
              },
              "customer": {
                  "name": "Sample Public Entity",
                  "tax_id": {
                      "country": "FR",
                      "code": "732829320"
                  },
                  "identities": [
                      {
                          "type": "SIRET",
                          "code": "73282932012345"
                      }
                  ],
                  "addresses": [
                      {
                          "num": "1",
                          "street": "Rue Sundacsakn",
                          "locality": "Saint-Germain-En-Laye",
                          "code": "75050",
                          "country": "FR"
                      }
                  ],
                  "emails": [
                      {
                          "addr": "email@sample.com"
                      }
                  ]
              },
              "lines": [
                  {
                      "quantity": "20",
                      "item": {
                          "name": "Development services",
                          "price": "90.00",
                          "unit": "h"
                      },
                      "discounts": [
                          {
                              "percent": "10%",
                              "reason": "Special discount"
                          }
                      ],
                      "taxes": [
                          {
                              "cat": "VAT",
                              "rate": "standard"
                          }
                      ]
                  }
              ],
              "payment": {
                  "terms": {
                      "detail": "Please pay within 10 days"
                  }
              }
          }
          ```

          ```json Built version theme={null}
          {
          	"$schema": "https://gobl.org/draft-0/bill/invoice",
          	"$regime": "FR",
          	"$addons": [
          		"eu-en16931-v2017",
          		"fr-choruspro-v1"
          	],
          	"type": "standard",
          	"series": "SAMPLE",
          	"code": "001",
          	"issue_date": "2022-02-01",
          	"currency": "EUR",
          	"tax": {
          		"ext": {
          			"fr-choruspro-framework": "A1",
          			"untdid-document-type": "380"
          		}
          	},
          	"supplier": {
          		"name": "Provide One Inc.",
          		"tax_id": {
          			"country": "DE",
          			"code": "111111125"
          		},
          		"addresses": [
          			{
          				"num": "42",
          				"street": "Berliner Strasse",
          				"locality": "Berlin",
          				"code": "10117",
          				"country": "DE"
          			}
          		],
          		"emails": [
          			{
          				"addr": "billing@example.com"
          			}
          		],
          		"ext": {
          			"fr-choruspro-scheme": "2"
          		}
          	},
          	"customer": {
          		"name": "Sample Public Entity",
          		"tax_id": {
          			"country": "FR",
          			"code": "44732829320"
          		},
          		"identities": [
          			{
          				"type": "SIRET",
          				"code": "73282932012345",
          				"ext": {
          					"iso-scheme-id": "0009"
          				}
          			}
          		],
          		"addresses": [
          			{
          				"num": "1",
          				"street": "Rue Sundacsakn",
          				"locality": "Saint-Germain-En-Laye",
          				"code": "75050",
          				"country": "FR"
          			}
          		],
          		"emails": [
          			{
          				"addr": "email@sample.com"
          			}
          		],
          		"ext": {
          			"fr-choruspro-scheme": "1"
          		}
          	},
          	"lines": [
          		{
          			"i": 1,
          			"quantity": "20",
          			"item": {
          				"name": "Development services",
          				"price": "90.00",
          				"unit": "h"
          			},
          			"sum": "1800.00",
          			"discounts": [
          				{
          					"reason": "Special discount",
          					"percent": "10%",
          					"amount": "180.00"
          				}
          			],
          			"taxes": [
          				{
          					"cat": "VAT",
          					"key": "standard",
          					"rate": "general",
          					"percent": "20%",
          					"ext": {
          						"untdid-tax-category": "S"
          					}
          				}
          			],
          			"total": "1620.00"
          		}
          	],
          	"payment": {
          		"terms": {
          			"notes": "Please pay within 10 days"
          		}
          	},
          	"totals": {
          		"sum": "1620.00",
          		"total": "1620.00",
          		"taxes": {
          			"categories": [
          				{
          					"code": "VAT",
          					"rates": [
          						{
          							"key": "standard",
          							"ext": {
          								"untdid-tax-category": "S"
          							},
          							"base": "1620.00",
          							"percent": "20%",
          							"amount": "324.00"
          						}
          					],
          					"amount": "324.00"
          				}
          			],
          			"sum": "324.00"
          		},
          		"tax": "324.00",
          		"total_with_tax": "1944.00",
          		"payable": "1944.00"
          	}
          }
          ```
        </CodeGroup>
      </Accordion>

      <Accordion title="Chorus Pro Credit Note">
        A credit note (avoir) reversing part of a previously submitted Chorus Pro invoice.

        Notice:

        * the `type` is set to `credit-note`, so the document is rendered with the UNTDID document type `381`,
        * the `preceding` array references the original invoice by `series`, `code`, and `issue_date`, with a `reason` for the correction — Chorus Pro links the avoir to the original submission through this reference,
        * both parties keep their `SIRET` identities, exactly as on the original invoice, and,
        * the lines describe only the amounts being credited; totals are calculated automatically when running `gobl build`.

        <CodeGroup>
          ```json Chorus Pro Credit Note theme={null}
          {
              "$schema": "https://gobl.org/draft-0/bill/invoice",
              "$regime": "FR",
              "$addons": [
                  "eu-en16931-v2017",
                  "fr-choruspro-v1"
              ],
              "uuid": "019783e7-33b1-7000-a1a5-6139e214b448",
              "type": "credit-note",
              "series": "SAMPLE-CN",
              "code": "2346",
              "issue_date": "2025-06-25",
              "currency": "EUR",
              "preceding": [
                  {
                      "type": "standard",
                      "series": "SAMPLE",
                      "code": "2345",
                      "issue_date": "2025-06-18",
                      "reason": "Partial refund for undelivered services"
                  }
              ],
              "supplier": {
                  "name": "Provide One Inc.",
                  "tax_id": {
                      "country": "FR",
                      "code": "43498927917"
                  },
                  "identities": [
                      {
                          "type": "SIRET",
                          "code": "49892791768734"
                      }
                  ],
                  "addresses": [
                      {
                          "num": "42",
                          "street": "Calle Pradillo",
                          "locality": "Madrid",
                          "region": "Madrid",
                          "code": "28002",
                          "country": "ES"
                      }
                  ],
                  "emails": [
                      {
                          "addr": "billing@example.com"
                      }
                  ]
              },
              "customer": {
                  "name": "Sample Consumer",
                  "tax_id": {
                      "country": "FR",
                      "code": "39356000000"
                  },
                  "identities": [
                      {
                          "type": "SIRET",
                          "code": "35600000012345"
                      }
                  ],
                  "addresses": [
                      {
                          "num": "1",
                          "street": "Rue Sundacsakn",
                          "locality": "Saint-Germain-En-Laye",
                          "code": "75050",
                          "country": "FR"
                      }
                  ],
                  "emails": [
                      {
                          "addr": "email@sample.com"
                      }
                  ]
              },
              "lines": [
                  {
                      "quantity": "5",
                      "item": {
                          "name": "Development services",
                          "price": "90.00",
                          "unit": "h"
                      },
                      "taxes": [
                          {
                              "cat": "VAT",
                              "rate": "standard"
                          }
                      ]
                  }
              ],
              "payment": {
                  "instructions": {
                      "key": "card"
                  }
              }
          }
          ```

          ```json Built version theme={null}
          {
          	"$schema": "https://gobl.org/draft-0/bill/invoice",
          	"$regime": "FR",
          	"$addons": [
          		"eu-en16931-v2017",
          		"fr-choruspro-v1"
          	],
          	"uuid": "019783e7-33b1-7000-a1a5-6139e214b448",
          	"type": "credit-note",
          	"series": "SAMPLE-CN",
          	"code": "2346",
          	"issue_date": "2025-06-25",
          	"currency": "EUR",
          	"preceding": [
          		{
          			"type": "standard",
          			"issue_date": "2025-06-18",
          			"series": "SAMPLE",
          			"code": "2345",
          			"reason": "Partial refund for undelivered services"
          		}
          	],
          	"tax": {
          		"ext": {
          			"fr-choruspro-framework": "A1",
          			"untdid-document-type": "381"
          		}
          	},
          	"supplier": {
          		"name": "Provide One Inc.",
          		"tax_id": {
          			"country": "FR",
          			"code": "43498927917"
          		},
          		"identities": [
          			{
          				"type": "SIRET",
          				"code": "49892791768734",
          				"ext": {
          					"iso-scheme-id": "0009"
          				}
          			}
          		],
          		"addresses": [
          			{
          				"num": "42",
          				"street": "Calle Pradillo",
          				"locality": "Madrid",
          				"region": "Madrid",
          				"code": "28002",
          				"country": "ES"
          			}
          		],
          		"emails": [
          			{
          				"addr": "billing@example.com"
          			}
          		],
          		"ext": {
          			"fr-choruspro-scheme": "1"
          		}
          	},
          	"customer": {
          		"name": "Sample Consumer",
          		"tax_id": {
          			"country": "FR",
          			"code": "39356000000"
          		},
          		"identities": [
          			{
          				"type": "SIRET",
          				"code": "35600000012345",
          				"ext": {
          					"iso-scheme-id": "0009"
          				}
          			}
          		],
          		"addresses": [
          			{
          				"num": "1",
          				"street": "Rue Sundacsakn",
          				"locality": "Saint-Germain-En-Laye",
          				"code": "75050",
          				"country": "FR"
          			}
          		],
          		"emails": [
          			{
          				"addr": "email@sample.com"
          			}
          		],
          		"ext": {
          			"fr-choruspro-scheme": "1"
          		}
          	},
          	"lines": [
          		{
          			"i": 1,
          			"quantity": "5",
          			"item": {
          				"name": "Development services",
          				"price": "90.00",
          				"unit": "h"
          			},
          			"sum": "450.00",
          			"taxes": [
          				{
          					"cat": "VAT",
          					"key": "standard",
          					"rate": "general",
          					"percent": "20%",
          					"ext": {
          						"untdid-tax-category": "S"
          					}
          				}
          			],
          			"total": "450.00"
          		}
          	],
          	"payment": {
          		"instructions": {
          			"key": "card",
          			"ext": {
          				"untdid-payment-means": "48"
          			}
          		}
          	},
          	"totals": {
          		"sum": "450.00",
          		"total": "450.00",
          		"taxes": {
          			"categories": [
          				{
          					"code": "VAT",
          					"rates": [
          						{
          							"key": "standard",
          							"ext": {
          								"untdid-tax-category": "S"
          							},
          							"base": "450.00",
          							"percent": "20%",
          							"amount": "90.00"
          						}
          					],
          					"amount": "90.00"
          				}
          			],
          			"sum": "90.00"
          		},
          		"tax": "90.00",
          		"total_with_tax": "540.00",
          		"payable": "540.00"
          	}
          }
          ```
        </CodeGroup>
      </Accordion>
    </AccordionGroup>

    Review the example above. Notice that you need both the [`eu-en16931-v2017`](https://docs.gobl.org/addons/eu-en16931-v2017) and the [`fr-choruspro-v1`](https://docs.gobl.org/addons/fr-choruspro-v1) addon. These addons enable all the necessary validations in your GOBL invoice.
  </Step>

  <Step title="Send to Chorus Pro">
    Send the invoice to Chorus Pro using the [Create a job](/api-ref/transform/jobs/create-a-job-post) endpoint. Use:

    * The invoice's silo entry UUID from the previous step
    * The Chorus Pro Invoice workflow ID from the [Setup](#setup) section

    The system generates a CII XML file with Chorus Pro extensions and submits it to the platform.

    <Frame>
      <img width="450" src="https://mintcdn.com/invopop-link-fix/1lP6Ab0d1FMqmHMb/assets/guides/fr-chorus-pro-xml.png?fit=max&auto=format&n=1lP6Ab0d1FMqmHMb&q=85&s=8238a4dff32c945368cc1dbfbd090321" alt="Invoice sent to Chorus Pro" data-path="assets/guides/fr-chorus-pro-xml.png" />
    </Frame>
  </Step>

  <Step title="Track Invoice Status">
    After submission, track your invoice in [Chorus Pro](https://cpro.chorus-pro.gouv.fr/cpp/rechercheFacturesEmises) using the invoice identifier (series plus code).

    <Info>
      Chorus Pro allows document modifications after submission. If a document is rejected or contains errors, update the GOBL details and resubmit to the same workflow until the document is accepted.
      Once accepted, do not modify the invoice.
    </Info>
  </Step>
</Steps>

<Note>
  The invoice identifier in Chorus Pro corresponds to your GOBL invoice series and code combined. This identifier helps you locate and track invoices across both systems.
</Note>

## FAQ

<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="What invoice formats does Chorus Pro support?">
    Chorus Pro primarily supports CII format based on EN16931. Invopop currently focuses on CII with plans to add additional formats in the future.
  </Accordion>

  <Accordion title="Do I need a SIRET number to use Chorus Pro?">
    French businesses need a SIRET number. Foreign businesses can use their local tax identifier, but should verify acceptance with the receiving French institution.
  </Accordion>

  <Accordion title="Can I modify invoices after sending to Chorus Pro?">
    Yes, you can modify and resubmit invoices until the receiving institution accepts them. Once accepted, invoices become locked and cannot be modified.
  </Accordion>

  <Accordion title="How do I find my invoice in Chorus Pro?">
    Use your GOBL invoice series and code combined as the invoice identifier in the Chorus Pro portal to locate your submitted invoices.
  </Accordion>

  <Accordion title="Are there file size limits for Chorus Pro invoices?">
    Chorus Pro has specific file size and format requirements. Invopop handles these automatically when generating CII XML files from your GOBL invoices.
  </Accordion>

  <Accordion title="What GOBL fields are required for Chorus Pro?">
    The recipient's SIRET (or equivalent identifier) plus a Chorus Pro service code where applicable. Invopop generates EN 16931 CII XML by default — UBL is also accepted by Chorus Pro.
  </Accordion>

  <Accordion title="What should we do if the customer doesn't belong to the Peppol network?">
    In countries where Peppol is the standard but not mandatory, you may still need to issue an e-invoice when the recipient isn't on the network. Both parties can agree on an alternative transfer method, but the invoice must still be EN16931 compliant.

    Recommended approach:

    * Set up a separate workflow that generates the XML without the send-Peppol-document step
    * Or reuse your existing workflow without the customer Peppol ID — the send step is automatically skipped
    * Fetch the generated XML and deliver it through the agreed channel, typically email
  </Accordion>

  <Accordion title="How do I handle B2C invoices in Peppol?">
    B2C invoices typically lack the structured customer information required for Peppol delivery, and most consumers don't have inboxes. Use a conditional workflow:

    1. Add an **If/Else** step that checks for a customer inbox using `count(customer.inboxes, true) > 0`.
    2. On the `false` branch, generate a PDF and email it to the customer, then stop the flow.

    This routes B2B invoices through Peppol while keeping a smooth path for consumers.
  </Accordion>

  <Accordion title="How do I handle 'Receiver Not Found' errors?">
    If a job fails with `KO` and `receiver not found in the peppol network`, treat it like an invalid email address — the recipient simply isn't reachable on Peppol. Add the **Lookup Participant ID** step (ideally in a separate validation workflow run against customer data) so you catch missing IDs before generating the invoice.
  </Accordion>

  <Accordion title="Should I set the `$regime` field when using Peppol?">
    No. The regime is automatically derived from the supplier's settings, which is the recommended approach for Peppol — leave it unset on the document.
  </Accordion>

  <Accordion title="Where do I find Peppol GOBL documentation?">
    See the [`oasis-ubl-v2`](https://docs.gobl.org/addons/oasis-ubl-v2) addon and the [Peppol app reference](/apps/peppol) for required fields, supported document types, and Participant ID schemes.
  </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)                                 |
    | 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>
