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

# France PA — registration

> Register a party in the French Annuaire and on the Peppol network.

<Note>
  Registration is required for any French SIREN that will issue or receive invoices through Invopop as its Plateforme Agréée. It is a prerequisite for the invoicing and status flows.
</Note>

Each party (a SIREN) is registered once. The workflow collects a signed agreement, registers the party in the French Annuaire, and publishes it on the Peppol network. After it completes, the party can both send and receive invoices.

The Annuaire requires every entry to be receive-capable, so there is no send-only option as in other Peppol countries. Internally, the workflow extends the standard [Peppol registration](/guides/peppol) with French-specific steps (`gov-fr.directory.register`) before the Peppol registration.

## How it works

<Frame>
  <img src="https://mintcdn.com/invopop-fr-pa-registration-form/2ckdgf-oSzbBXDjA/assets/guides/fr-register.png?fit=max&auto=format&n=2ckdgf-oSzbBXDjA&q=85&s=32fda1a66486ca38c60e1b0dfdfe5ff6" width="1320" height="828" data-path="assets/guides/fr-register.png" />
</Frame>

<Steps>
  <Step title="Sign agreement for France">
    Generates the French PA mandate so the party can authorise Invopop to act on its behalf (`gov-fr.agreement.sign`).
  </Step>

  <Step title="Set State → processing">
    Moves the silo entry into a visible "in progress" state so operator dashboards reflect that registration is underway.
  </Step>

  <Step title="Wait for French agreement upload">
    Pauses until the signed agreement is uploaded and accepted (`gov-fr.agreement.wait.approval`). This is a **manual gate** — the party stays in <Badge color="yellow">processing</Badge> and the workflow does not advance until someone opens the agreement form and signs it. See [Complete the agreement](#complete-the-agreement) below.
  </Step>

  <Step title="Set State → completed">
    Marks the agreement step as completed before the directory and Peppol registrations run.
  </Step>

  <Step title="Register Party in Directory">
    Submits the party's SIREN to the French Annuaire so other PAs can route invoices to it (`gov-fr.directory.register`).
  </Step>

  <Step title="Register Peppol Party">
    Publishes the party in SMP/SML with the `france` document group, enabling Peppol-level routing for sending and receiving.
  </Step>

  <Step title="Set State → registered">
    Marks the party as fully onboarded.
  </Step>
</Steps>

<Tabs>
  <Tab title="Template">
    <Card iconType="duotone" title="France PA register party workflow" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=fr-fr-pa-register" cta="Add to my workspace">
      Registers a party in the Annuaire and on the Peppol network for sending and receiving invoices.
    </Card>
  </Tab>

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

    ```json France PA register party workflow theme={null} theme={"system"}
    {
        "name": "Directory register supplier",
        "description": "Onboards participants before they can issue or receive invoices",
        "schema": "org/party",
        "steps": [
            {
                "id": "0adf46e0-8fdb-11f0-a8fb-61ec9e5a76ba",
                "name": "Sign agreement for France",
                "provider": "gov-fr.agreement.sign"
            },
            {
                "id": "0e44b900-8fdb-11f0-a8fb-61ec9e5a76ba",
                "name": "Set State",
                "provider": "silo.state",
                "summary": "Set state to `processing`{.state .processing}",
                "config": {
                    "state": "processing"
                }
            },
            {
                "id": "12aaf950-8fdb-11f0-a8fb-61ec9e5a76ba",
                "name": "Wait for French agreement upload",
                "provider": "gov-fr.agreement.wait.approval"
            },
            {
                "id": "b194f710-5451-11f1-baf5-4f2c2882107f",
                "name": "Set State",
                "provider": "silo.state",
                "summary": "Set state to `completed`{.state .completed}",
                "config": {
                    "state": "completed"
                }
            },
            {
                "id": "d10a4680-1e29-11f1-8bfb-2beaa1df60f0",
                "name": "Register Party in Directory",
                "provider": "gov-fr.directory.register"
            },
            {
                "id": "7a5a4db0-0fae-11f0-b37b-0be1c251a274",
                "name": "Register Peppol Party",
                "provider": "peppol.register",
                "summary": "Sending and Receiving with groups: france",
                "config": {
                    "directory": true,
                    "disable": false,
                    "doc_groups": [
                        "france"
                    ],
                    "visibility": "smp+sml+peppol"
                }
            },
            {
                "id": "7c2fa9f0-0fae-11f0-b37b-0be1c251a274",
                "name": "Set State",
                "provider": "silo.state",
                "summary": "Set state to `registered`{.state .registered}",
                "config": {
                    "state": "registered"
                }
            }
        ],
        "rescue": [
            {
                "id": "a34e83f0-25dc-11f0-b641-350e77c28eed",
                "name": "Set State",
                "provider": "silo.state",
                "summary": "Set state to `error`{.state .error}",
                "config": {
                    "state": "error"
                }
            }
        ]
    }
    ```
  </Tab>
</Tabs>

## Complete the agreement

After the workflow reaches **Wait for French agreement upload**, the party sits in <Badge color="yellow">processing</Badge> until the PA mandate is signed. **This step is manual and required** — the party cannot be accepted, registered in the Annuaire, or published on Peppol until it is done.

### Sign in Console

The agreement form is surfaced as a link on the party itself:

<Steps>
  <Step title="Open the party entry">
    In Console, open the party (silo entry) that the register workflow is running on.
  </Step>

  <Step title="Go to the Meta tab">
    Open the **Meta** tab. The **Sign agreement for France** step publishes an agreement link there (meta key `approval-link`).
  </Step>

  <Step title="Open and sign the agreement form">
    Click the link to open the French PA agreement form. Review the mandate that authorises Invopop to act as the party's Plateforme Agréée, sign it, and submit.
  </Step>
</Steps>

### Sign through the API

You can also complete the agreement programmatically — useful when you embed the onboarding in your own product instead of sending the signer to the Invopop form. Once the workflow has paused at **Wait for French agreement upload**:

1. [Download the unsigned agreement PDF](/api-ref/apps/gov-fr/agreement-fetch) `GET /apps/gov-fr/v1/entry/{silo_entry_id}/agreement`<br />
   The mandate PDF is generated from the party's data for the signer to review and sign.

2. [Upload the signed agreement](/api-ref/apps/gov-fr/agreement-upload) `POST /apps/gov-fr/v1/entry/{silo_entry_id}/agreement`<br />
   Send the signed PDF together with the signature method: `esignature` for an electronic (PAdES) signature, or `identity` for a handwritten one.

3. [Upload identity images](/api-ref/apps/gov-fr/identity-upload) `POST /apps/gov-fr/v1/entry/{silo_entry_id}/identity`<br />
   Only required when the signature method is `identity`. Upload one image per view: `front` and `back` for an ID card, or `page` for a passport.

4. [Confirm the submission](/api-ref/apps/gov-fr/confirm) `POST /apps/gov-fr/v1/entry/{silo_entry_id}/confirm`<br />
   Marks the submission as complete and wakes the waiting workflow task.

Whichever way the agreement is signed, once it is submitted and accepted, **Wait for French agreement upload** resolves and the workflow continues to the directory and Peppol registration steps, ending in <Badge color="purple">registered</Badge>.

<Note>
  If you don't open the Meta tab and sign the agreement, the party stays in <Badge color="yellow">processing</Badge> indefinitely — it is never automatically accepted.
</Note>

## Unregistration

Run the unregister workflow to revoke a party's registrations when it should no longer issue or receive invoices through Invopop.

<Steps>
  <Step title="Unregister Peppol Party">
    Disables the party in SMP/SML so Peppol traffic no longer routes to it.
  </Step>

  <Step title="Unregister from Directory">
    Removes the party from the French Annuaire.
  </Step>

  <Step title="Set State → void">
    Marks the party as unregistered.
  </Step>
</Steps>

<Tabs>
  <Tab title="Template">
    <Card iconType="duotone" title="France PA unregister party workflow" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=fr-fr-pa-unregister" cta="Add to my workspace">
      Revokes Peppol and Annuaire registrations so the party can no longer issue or receive invoices.
    </Card>
  </Tab>

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

    ```json France PA unregister party workflow theme={null} theme={"system"}
    {
        "name": "France PA unregister party",
        "description": "Revokes Peppol and French Directory registrations so the party can no longer issue or receive invoices",
        "schema": "org/party",
        "steps": [
            {
                "id": "0a1f4b30-5452-11f1-baf5-4f2c2882107f",
                "name": "Unregister Peppol Party",
                "provider": "peppol.register",
                "summary": "Disable Party",
                "config": {
                    "disable": true,
                    "visibility": "smp+sml+peppol",
                    "doc_groups": []
                }
            },
            {
                "id": "13c84e60-5452-11f1-baf5-4f2c2882107f",
                "name": "Unregister from Directory",
                "provider": "gov-fr.directory.disable"
            },
            {
                "id": "1b8a6b80-5452-11f1-baf5-4f2c2882107f",
                "name": "Set State",
                "provider": "silo.state",
                "summary": "Set state to `void`{.state .void}",
                "config": {
                    "state": "void"
                }
            }
        ],
        "rescue": [
            {
                "id": "23e0d3a0-5452-11f1-baf5-4f2c2882107f",
                "name": "Set State",
                "provider": "silo.state",
                "summary": "Set state to `error`{.state .error}",
                "config": {
                    "state": "error"
                }
            }
        ]
    }
    ```
  </Tab>
</Tabs>

<Note>
  Unregistering does not delete historical data already submitted to the PPF.
</Note>

## FAQ

<AccordionGroup>
  <Accordion title="How do I onboard a new supplier in France?">
    For B2B PA flows: register the supplier via the France PA Register Party workflow (publishes the SIREN to the Annuaire and Peppol). For Chorus Pro: register the supplier with their SIRET on Chorus Pro's portal and link credentials in the Chorus Pro app.
  </Accordion>

  <Accordion title="How are supplier credentials stored in Invopop for France?">
    France PA does not require supplier-side certificates — Peppol uses Invopop's AP cert. Chorus Pro uses an OAuth token bound to the supplier's account; the token is encrypted at rest in Invopop.
  </Accordion>

  <Accordion title="How do I register a supplier with France PA?">
    Run the France PA Register Party workflow with the supplier's SIREN. Invopop publishes them to the Annuaire and the Peppol SMP — they are then routable for both invoicing and e-reporting through Invopop.
  </Accordion>

  <Accordion title="What certificates does France PA require to authenticate a supplier?">
    None at the supplier level. The Plateforme Agréée holds an OpenPeppol-issued mTLS certificate (Invopop's), and the PA-to-PPF channel uses additional DGFiP credentials managed by Invopop.
  </Accordion>

  <Accordion title="How do I register for a Peppol inbox in Invopop?">
    Upload the company as a party (Console → Parties → Suppliers → + New Supplier, or via the Create an Entry API) with name, tax\_id, address, and email. Then run it through the party registration workflow — the contact will receive a registration wizard link to provide proof of ownership.

    Once approved, the party is registered on the Peppol network (SMP+SML+Peppol visibility by default with the `ubl-invoice` doc group) and ready to receive invoices.
  </Accordion>

  <Accordion title="I get 'XXXX:XXXXXXXXX is already registered' when registering a supplier — what now?">
    A supplier with that Participant ID already exists in your workspace. Either reuse the existing party or, if it really is a new entity, check whether it should be registered under an alternative scheme (for example Belgium's `9925` VAT scheme rather than the default `0208`).
  </Accordion>

  <Accordion title="How do I assign multiple inboxes to a single supplier?">
    Register them through different silo entries, even though they represent the same legal party. The supplier must upload proof of ownership for each inbox.
  </Accordion>

  <Accordion title="What are Participant IDs?">
    Unique identifiers for entities on the Peppol network, made up of two parts:

    * **Scheme** — identifies the type of identifier (e.g. `9920` for Spanish VAT, `0208` for Belgian KBO/BCE)
    * **Code** — the actual identification number

    Participant IDs are usually based on VAT numbers or local business identifiers, and Invopop can derive them automatically from a Tax ID. Some countries support multiple schemes — Belgium, for example, defaults to `0208` but some entities are only registered under `9925` (VAT). If you hit a "receiver not found" error, the recipient may be registered under an alternative scheme.
  </Accordion>

  <Accordion title="What visibility level should I set on my Peppol Party?">
    Peppol Party visibility determines what you can send and receive:

    * `smp` — SMP only, for testing
    * `smp+sml` — SMP and SML, useful when you only want to send
    * `smp+sml+peppol` — SMP, SML, and the Peppol Directory, recommended for both sending and receiving (and for being discoverable in the Directory)

    In general, use the highest visibility available.
  </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>
