> ## 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.

# Chorus Pro Guide

> Issue invoices to French public institutions with Chorus Pro.

## 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 Invopop workflows:
   * Supplier registration workflow
   * Invoice submission workflow
3. Preparing the Chorus Pro platform and creating credentials
4. Registering a supplier with Chorus Pro
5. 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.

| -            | Sandbox                                             | Live                             |
| ------------ | --------------------------------------------------- | -------------------------------- |
| **Supplier** | Test Chorus Pro account (qualif.chorus-pro.gouv.fr) | Real Chorus Pro account required |
| **Accounts** | Downloadable CSV with test accounts                 | —                                |

## Setup

Configure your Invopop Workspace for Chorus Pro invoicing.

Complete these steps:

<Steps>
  <Step title="Connect the required apps">
    1. Go to **Configuration** > **Apps** in the Console.
    2. Find **UN/CEFACT CII** in the app list and click **Connect** to activate the app.
    3. Find **Chorus Pro** in the app list and click **Connect** to activate the app.

    After connecting, you'll see both UN/CEFACT CII and Chorus Pro listed in the Enabled Apps section.

    <Frame>
      <img width="100%" src="https://mintcdn.com/invopop/-KQ2_uysex-mWyqz/assets/guides/fr-chorus-pro-apps.png?fit=max&auto=format&n=-KQ2_uysex-mWyqz&q=85&s=b45e25ec6d37d1e512a2ea8b16553342" alt="Chorus Pro app connected" data-path="assets/guides/fr-chorus-pro-apps.png" />
    </Frame>
  </Step>

  <Step title="Configure the supplier registration workflow">
    Add a new workflow to your workspace for registering suppliers. You can start with the template below.

    <Tabs>
      <Tab title="Template">
        <Card iconType="duotone" title="Chorus Pro supplier registration workflow" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=chorus-pro-registration" cta="Add to my workspace">
          This workflow will issue a registration request for a supplier to complete.
        </Card>
      </Tab>

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

        ```json Example Chorus Pro register supplier workflow theme={"system"}
        {
            "name": "Chorus Pro register supplier",
            "description": "Register a supplier with Chorus Pro",
            "schema": "org/party",
            "steps": [
                {
                    "id": "9ed27c40-4ced-11f0-bcdc-61b84b5eeae8",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `processing`{.state .processing}",
                    "config": {
                        "state": "processing"
                    }
                },
                {
                    "id": "b8d3dc10-4ba3-11f0-a0a5-bbd7c9d8117a",
                    "name": "Register supplier with Chorus Pro",
                    "provider": "chorus-pro.register"
                },
                {
                    "id": "a3d43940-4ced-11f0-bcdc-61b84b5eeae8",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `registered`{.state .registered}",
                    "config": {
                        "state": "registered"
                    }
                }
            ],
            "rescue": [
                {
                    "id": "a6c4f090-4ced-11f0-bcdc-61b84b5eeae8",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `error`{.state .error}",
                    "config": {
                        "state": "error"
                    }
                }
            ]
        }
        ```
      </Tab>

      <Tab title="Build from scratch">
        Before starting, review the [workflows guide](/guides/features/workflows) to understand the general setup process.

        In [Console](https://console.invopop.com), create a new workflow and choose [Empty Party workflow]() as the base. Name the workflow with a descriptive label such as "Chorus Pro Supplier Registration".

        The new workflow performs a single step:

        1. **Register supplier with Chorus Pro**

        Add any additional steps you need such as error handling, and save the new workflow.
      </Tab>
    </Tabs>

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

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

    <Tabs>
      <Tab title="Template">
        <Card iconType="duotone" title="Chorus Pro invoice workflow" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=chorus-pro-invoice" cta="Add to my workspace">
          This workflow will issue an invoice through Chorus Pro.
        </Card>
      </Tab>

      <Tab title="Code">
        Copy and paste this code into a new [Empty Invoice workflow]() code view.

        ```json Example Chorus Pro issue invoice workflow theme={"system"}
        {
            "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>

      <Tab title="Build from scratch">
        In [Console](https://console.invopop.com) create a new workflow and select [Empty Invoice workflow]() in the template selector. Add the following steps:

        1. **Generate CII document** - Select *Chorus Pro V1* as the `Invoice Output Document Type`.
        2. **Send invoice to Chorus Pro**.

        In the Error Handling section, add the **Set state** action and select `Error`.
      </Tab>
    </Tabs>

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

## Chorus Pro Credentials

This section explains what suppliers need to configure within their Chorus Pro account to enable integration with Invopop.

To configure Chorus Pro, complete these steps:

<Steps>
  <Step title="Create a Chorus Pro account">
    Sign up for a [Chorus Pro](https://portail.chorus-pro.gouv.fr/aife_csm?id=aife_enrollment) account if you don't have one.

    <Info>
      To test in sandbox mode, create an account in the [Chorus Pro sandbox](https://qualif.chorus-pro.gouv.fr/aife_qual). Download a CSV file with test accounts. Use one of the accounts to log in. For more information, visit the [Chorus Pro documentation](https://portail.chorus-pro.gouv.fr/aife_documentation?sys_kb_id=8ea00d85c398ea1477c2530ed40131e2\&id=kb_article_view\&sysparm_rank=1\&sysparm_tsqueryId=66f41ea033de625056688539bd5c7bd9).
    </Info>
  </Step>

  <Step title="Navigate to API settings">
    Once logged in to your Chorus Pro account, navigate to the API configuration area:

    1. Go to **Domains** > **Connections** in the main menu

    <Frame caption="Navigate to Domains → Connections">
      <img width="450" src="https://mintcdn.com/invopop/-KQ2_uysex-mWyqz/assets/guides/fr-chorus-pro-connections.png?fit=max&auto=format&n=-KQ2_uysex-mWyqz&q=85&s=24c140adfeb71d7f6bbe9552120be996" alt="Navigate to Domains → Connections" data-path="assets/guides/fr-chorus-pro-connections.png" />
    </Frame>

    2. Click **Access Service** in the Technical Account section (bottom left)

    <Frame caption="Navigate to Technical Account">
      <img width="450" src="https://mintcdn.com/invopop/fWniCD0icTwRKXxR/assets/guides/fr-chorus-pro-access-service.png?fit=max&auto=format&n=fWniCD0icTwRKXxR&q=85&s=870627636d53a0561499abb4fc5c142d" alt="Navigate to Technical Account" data-path="assets/guides/fr-chorus-pro-access-service.png" />
    </Frame>

    This opens a new page where you can manage your technical accounts.
  </Step>

  <Step title="Create a technical account">
    Set up the technical account credentials, this opens a form to create a technical account:

    * Set the type of request to **Creation of a technical account**

    * Select your company in the company field

    * This creates a login and password. **Copy these credentials as you'll need them when registering with Invopop**

          <Frame caption="Technical Account Creation">
            <img width="100%" src="https://mintcdn.com/invopop/-KQ2_uysex-mWyqz/assets/guides/fr-chorus-pro-technical-account.png?fit=max&auto=format&n=-KQ2_uysex-mWyqz&q=85&s=07b8df21f5f90e1fb437eb3eae8309bf" alt="Technical Account Creation" data-path="assets/guides/fr-chorus-pro-technical-account.png" />
          </Frame>

    Click **Submit** to complete the setup
  </Step>
</Steps>

Return to Invopop for the next steps.

## Running

Now you'll learn how to register a supplier and issue Chorus Pro invoices:

### Register a Supplier

Now that you have a technical account, you can register a supplier with Chorus Pro.

<Steps>
  <Step title="Upload a Supplier">
    Use the [Create an entry](/api-ref/silo/entries/create-an-entry-put) endpoint to upload a new supplier. Include a [party](https://docs.gobl.org/draft-0/org/party) object in the [data](/api-ref/silo/entries/create-an-entry-put#body-data) field. For this step, you only need the VAT number.

    After successful upload, you'll see the supplier in the **Parties** section with status `Empty`.

    <Frame caption="Supplier registration">
      <img width="100%" src="https://mintcdn.com/invopop/-KQ2_uysex-mWyqz/assets/guides/fr-chorus-pro-supplier-1.png?fit=max&auto=format&n=-KQ2_uysex-mWyqz&q=85&s=2071e5e8b89b8790f3322769937b9070" alt="Supplier registration in progress" data-path="assets/guides/fr-chorus-pro-supplier-1.png" />
    </Frame>
  </Step>

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

    * The supplier's silo entry UUID from the previous step
    * The Supplier Registration workflow ID from the [Setup](#setup) section

    This workflow generates a unique URL for the supplier to access and complete the registration process. The URL is stored in the supplier's metadata.

    <Frame>
      <img width="450" src="https://mintcdn.com/invopop/-KQ2_uysex-mWyqz/assets/guides/fr-chorus-pro-supplier-2.png?fit=max&auto=format&n=-KQ2_uysex-mWyqz&q=85&s=0bffdefc441493ff62656bc13aa5517a" alt="Supplier registration in progress" data-path="assets/guides/fr-chorus-pro-supplier-2.png" />
    </Frame>
  </Step>

  <Step title="Complete Chorus Pro Authentication">
    The workflow stays in progress until the supplier completes the registration process. The supplier must access the link and add the credentials they created previously.

    <Frame>
      <img width="450" src="https://mintcdn.com/invopop/-KQ2_uysex-mWyqz/assets/guides/fr-chorus-pro-supplier-3.png?fit=max&auto=format&n=-KQ2_uysex-mWyqz&q=85&s=78002bd397b9ef11eb582de969d93f24" alt="Supplier registration in progress" data-path="assets/guides/fr-chorus-pro-supplier-3.png" />
    </Frame>

    The supplier's status will change to `Registered` when authentication is complete.

    <Note>
      You can fill the form via API by sending a PUT request to the registration link. The payload should be a JSON object with the following fields:

      * `username` (string): The supplier's Chorus Pro username.
      * `password` (string): The supplier's Chorus Pro password.
    </Note>
  </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 (`chorus-pro-b2g.min.mdx`) contains only the essential fields required to create the B2G invoice,
        * the [`fr-chorus-pro-v1`](https://docs.gobl.org/addons/fr-chorus-pro-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 (`chorus-pro-b2g.mdx`) 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 above €25,000 must be submitted through Chorus Pro.

        <CodeGroup>
          ```json Chorus Pro B2G Invoice theme={"system"}
          {
              "$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={"system"}
          {
          	"$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"
          			}
          		],
          		"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"
          			}
          		],
          		"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={"system"}
          {
              "$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={"system"}
          {
          	"$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>
    </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 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/-KQ2_uysex-mWyqz/assets/guides/fr-chorus-pro-xml.png?fit=max&auto=format&n=-KQ2_uysex-mWyqz&q=85&s=a0f7d3065f8b070e499da82c4fa84daf" alt="Invoice sent to Chorus Pro" data-path="assets/guides/fr-chorus-pro-xml.png" />
      </Frame>
    </Step>
  </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" /> [ChorusPro France](/apps/choruspro-france)                                                                                        |
    | Guides     | <Icon icon="book" /> [ChorusPro Guide](/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>
