> ## Documentation Index
> Fetch the complete documentation index at: https://invopop-claude-workflow-updates-file-deletion-6bb67f.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# SIREN registration in France

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

export const frPaUnregisterWorkflow = {
  "name": "PPF unregister supplier",
  "description": "Unregister a supplier from Peppol and the French Directory",
  "schema": "org/party",
  "steps": [{
    "id": "453beac0-70a7-11f1-aca9-697108ec55ef",
    "name": "Unregister supplier from Peppol",
    "provider": "peppol.unregister"
  }, {
    "id": "13c84e60-5452-11f1-baf5-4f2c2882107f",
    "name": "Disable party in Directory",
    "provider": "gov-fr.directory.disable"
  }, {
    "id": "c91ae086-f830-425b-b67c-72af00efc22c",
    "name": "Disable party for reporting",
    "provider": "gov-fr.reporting.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"
    }
  }]
};

export const frPaRegisterWorkflow = {
  "name": "PPF register supplier",
  "description": "Register a supplier with the French Directory and Peppol",
  "schema": "org/party",
  "steps": [{
    "id": "0adf46e0-8fdb-11f0-a8fb-61ec9e5a76ba",
    "name": "Sign PPF agreement",
    "provider": "gov-fr.agreement.sign",
    "notes": "Generates the PA mandate to authorize Invopop to act on behalf of the supplier"
  }, {
    "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 PPF agreement upload",
    "provider": "gov-fr.agreement.wait.approval",
    "notes": "Pauses until the signed agreement is uploaded and accepted"
  }, {
    "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",
    "notes": "Submits the SIREN to the French Annuaire for invoice routing"
  }, {
    "id": "7a5a4db0-0fae-11f0-b37b-0be1c251a274",
    "name": "Register party on Peppol",
    "provider": "peppol.register",
    "summary": "Enabled · groups: france",
    "config": {
      "directory": true,
      "disable": false,
      "doc_groups": ["france"],
      "visibility": "smp+sml+peppol"
    },
    "notes": "Publishes the party, enabling Peppol routing for sending and receiving"
  }, {
    "id": "b523ae4a-7b39-4410-abaa-b03a4e33f7bd",
    "name": "Register party for reporting",
    "provider": "gov-fr.reporting.register",
    "notes": "Registers the SIREN for reporting"
  }, {
    "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"
    }
  }]
};

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-fi": "https://assets.invopop.com/flags/fi.svg",
    "gov-fr": "https://assets.invopop.com/flags/fr.svg",
    "chorus-pro": "https://assets.invopop.com/apps/chroruspro/icon.svg",
    "gov-es": "https://assets.invopop.com/apps/gov-es/icon.svg",
    "gov-es.sii": "https://assets.invopop.com/apps/sii/icon.svg",
    "gov-es.ticketbai": "https://assets.invopop.com/apps/ticketbai/icon.svg",
    "gov-es.facturae": "https://assets.invopop.com/apps/facturae/icon.svg",
    verifactu: "https://assets.invopop.com/apps/verifactu/icon.svg",
    "gov-pl": "https://assets.invopop.com/apps/ksef/icon.svg",
    "gov-sa": "https://assets.invopop.com/apps/zatca/icon.svg",
    "gov-ar": "https://assets.invopop.com/apps/arca/icon.svg",
    "at-pt": "https://assets.invopop.com/apps/at-pt/icon.svg",
    "sat-mx": "https://assets.invopop.com/apps/sat-mexico/icon.svg",
    "sw-sapien": "https://assets.invopop.com/apps/sw-sapien/icon.svg",
    "sdi-it": "https://assets.invopop.com/apps/sdi-italy/icon.svg",
    "ticket-it": "https://assets.invopop.com/apps/agenzia-entrate/icon.svg",
    "nfe-br": "https://assets.invopop.com/apps/notas-fiscais-eletronicas-brazil/icon.svg",
    chargebee: "https://assets.invopop.com/apps/chargebee/icon.svg",
    stripe: "https://assets.invopop.com/apps/stripe/icon.svg",
    email: "https://assets.invopop.com/apps/email/icon.svg",
    cron: "https://assets.invopop.com/apps/cron/icon.svg",
    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>;
};

Registration on the French Directory is required for any SIREN that will issue, report or receive invoices through Invopop as its Plateforme Agréée. Each party (a SIREN) is registered once. The workflow collects a signed agreement, registers the party in the French Annuaire, publishes it on the Peppol network and registers for Reporting. After registration is completed, the party can both send and receive invoices as well as report transactions. The Annuaire requires every entry to be receive-capable, so there is no send-only option as in other Peppol countries. For parties that only need to receive invoices for now — most SMEs and micro-businesses until September 2027 — see [Registering without e-reporting](#registering-without-e-reporting).

| -                | Sandbox                                                                                       | Live                                                                    |
| ---------------- | --------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| **Supplier**     | Use a checksum valid [generated SIREN](https://www.onsubmit.io/french-siret-siren-generator/) | Requires a valid SIREN and the signature of the company representative. |
| **Approval**     | Automatic                                                                                     | Automatic, but can be flagged for human review                          |
| **Registration** | Peppol SMK  and PPF's *environnement de qualification*                                        | Peppol SML and Annuaire production                                      |

<Accordion title="French supplier" defaultOpen="true">
  This example shows a French supplier party. Key points to note:

  * The `tax_id` contains the French TVA number without the `FR` prefix: a 2-digit control key followed by the company's 9-digit SIREN.
  * The `SIREN` identity uses the `iso-scheme-id` extension `0002` (SIRENE), and must match the last 9 digits of the TVA number.
  * The person in `people` is the company representative required to sign the *mandat de facturation* (billing mandate), including their `role` and passport/document id number.
  * The `peppol` inbox uses scheme `0225` (French CTC electronic address) with the SIREN as the code.
    * If no inbox is specified, the Register for Peppol step will assign one based on the supplier's SIREN.

  ```json France supplier example expandable theme={null}
  {
      "$schema": "https://gobl.org/draft-0/org/party",
      "name": "Marseille Commerce SAS",
      "tax_id": {
          "country": "FR",
          "code": "83526018155"
      },
      "identities": [
          {
              "type": "SIREN",
              "code": "526018155",
              "ext": {
                  "iso-scheme-id": "0002"
              }
          }
      ],
      "people": [
          {
              "name": {
                  "given": "Claire",
                  "surname": "Moreau"
              },
              "role": "Directrice",
              "identities": [{
                  "label": "Passport/document number",
                  "code": "123456"
              }]
          }
      ],
      "inboxes": [
          {
              "key": "peppol",
              "scheme": "0225",
              "code": "526018155"
          }
      ],
      "addresses": [
          {
              "num": "25",
              "street": "Avenue des Champs-Élysées",
              "locality": "Paris",
              "code": "75008",
              "country": "FR"
          }
      ],
      "emails": [
          {
              "addr": "facturation@marseillecommerce.fr"
          }
      ],
      "telephones": [
          {
              "num": "+33100200300"
          }
      ]
  }
  ```
</Accordion>

## PPF register supplier workflow

<Card iconType="duotone" title="PPF register supplier" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=fr-fr-pa-register" horizontal>
  Add to my workspace →
</Card>

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

  <Tab title="Code">
    ```json PPF register supplier workflow theme={null}
    {
        "name": "PPF register supplier",
        "description": "Register a supplier with the French Directory and Peppol",
        "schema": "org/party",
        "steps": [
            {
                "id": "0adf46e0-8fdb-11f0-a8fb-61ec9e5a76ba",
                "name": "Sign PPF agreement",
                "provider": "gov-fr.agreement.sign",
                "notes": "Generates the PA mandate to authorize Invopop to act on behalf of the supplier"
            },
            {
                "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 PPF agreement upload",
                "provider": "gov-fr.agreement.wait.approval",
                "notes": "Pauses until the signed agreement is uploaded and accepted"
            },
            {
                "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",
                "notes": "Submits the SIREN to the French Annuaire for invoice routing"
            },
            {
                "id": "7a5a4db0-0fae-11f0-b37b-0be1c251a274",
                "name": "Register party on Peppol",
                "provider": "peppol.register",
                "summary": "Enabled · groups: france",
                "config": {
                    "directory": true,
                    "disable": false,
                    "doc_groups": [
                        "france"
                    ],
                    "visibility": "smp+sml+peppol"
                },
                "notes": "Publishes the party, enabling Peppol routing for sending and receiving"
            },
            {
                "id": "b523ae4a-7b39-4410-abaa-b03a4e33f7bd",
                "name": "Register party for reporting",
                "provider": "gov-fr.reporting.register",
                "notes": "Registers the SIREN for reporting"
            },
            {
                "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>

## Agreement signing

The `gov-fr.agreement.sign` step generates the mandate and publishes a `link_url` under the `approval-link` key in the silo entry meta. The party representative can complete signing through the registration wizard, or platforms that want full control can use the [entry API](#entry-api) directly.

### Registration wizard

Once the workflow step runs, find the `link_url` in the `approval-link` meta entry of the silo entry. In console, it appears in the Meta tab of the entry's right sidebar.

<Accordion title="Example approval-link meta entry">
  ```json theme={null}
  {
    "src": "gov-fr",
    "key": "approval-link",
    "ref": "EgDeG3pDBDe",
    "link_url": "https://gouv-fr.invopop.com/reg/EgDeG3pDBDe/start",
    "link_scope": "public",
    "indexed": true,
    "shared": true
  }
  ```
</Accordion>

Forward the `link_url` to the party representative, or embed it as an `iframe` to keep them within your platform.

The wizard walks the representative through each step:

<Steps>
  <Step title="Party details">
    Review and confirm the pre-filled company and signer information.
  </Step>

  <Step title="Identity document">
    Upload a photo of the signer's ID card (front and back) or passport page.
  </Step>

  <Step title="Sign mandate">
    Sign the pre-filled mandate directly in the browser, or upload a pre-signed PDF.
  </Step>

  <Step title="Confirm">
    Submit for Invopop review. The party status moves to `submitted` until a decision is made.
  </Step>
</Steps>

### Entry API

For platforms that want to drive the signing process programmatically, use the entry API (all endpoints under `/apps/gov-fr/v1/entry/{silo_entry_id}/`). Identity verification is required on both paths.

<Tabs>
  <Tab title="In-app signing">
    The customer signs the mandate directly. Invopop stamps the signature and verifies identity.

    <Steps>
      <Step title="Download mandate">
        `GET /agreement` returns the mandate PDF pre-filled with the party's details. Fails with `422` if any required signer field is missing.
      </Step>

      <Step title="Upload identity document">
        `POST /identity` uploads one face at a time: `front` + `back` for an ID card, or `page` for a passport.
      </Step>

      <Step title="Sign the mandate">
        `POST /sign` stamps the signature. Pass a drawn PNG or JPEG image in `signature` (≤ 4 MB), or omit it to render the signer's name as a typed signature.
      </Step>

      <Step title="Confirm">
        `POST /confirm` finalises the submission and returns a `status` field. `submitted` means the party is under approval review before registration continues.
      </Step>
    </Steps>
  </Tab>

  <Tab title="Pre-signed PDF">
    The customer signs the mandate externally and uploads the result.

    <Steps>
      <Step title="Download mandate">
        `GET /agreement` returns the pre-filled mandate PDF for the customer to sign externally.
      </Step>

      <Step title="Upload identity document">
        `POST /identity` uploads one face at a time: `front` + `back` for an ID card, or `page` for a passport.
      </Step>

      <Step title="Upload signed PDF">
        `POST /agreement` stores the signed PDF (≤ 4 MB).
      </Step>

      <Step title="Confirm">
        `POST /confirm` finalises the submission and returns a `status` field. `submitted` means the party is under approval review before registration continues.
      </Step>
    </Steps>
  </Tab>
</Tabs>

### Taking over a line from another Plateforme Agréée

If a SIREN's Annuaire line is already held by another Plateforme Agréée (PA), the party must specify the former PA line under the `fr-former-matricule` meta key. This adds an additional section to the signed agreement asking for consent to take over the line.

<Warning>
  Due to recent changes in how PA migrations work, taking over a line is no longer performed automatically. Registration fails and asks the party to contact support, who will complete the switch manually. This is temporary, until further notice.
</Warning>

## Registering without e-reporting

Obligations under the French mandate kick in separately: from 1 September 2026 every business must be registered in the Annuaire to *receive* e-invoices, but SMEs and micro-businesses are not required to issue e-invoices or e-report until 1 September 2027 (see the [timeline](/guides/fr-pa#timeline)). If you onboard many smaller suppliers, most of them initially need only an Annuaire line and a Peppol inbox — not a reporting registration.

The default template registers the party for everything, including reporting. To register parties for receiving only, create a modified copy of the template:

<Steps>
  <Step title="Add the template">
    Add the [PPF register supplier](#ppf-register-supplier-workflow) template to your workspace and rename the copy, e.g. "PPF register supplier — Annuaire only".
  </Step>

  <Step title="Remove the reporting step">
    Delete the **Register party for reporting** (`gov-fr.reporting.register`) step. Keep the Directory and Peppol steps — every Annuaire entry is receive-capable, so nothing else needs to change.
  </Step>

  <Step title="Run it for receive-only parties">
    Use this workflow for parties that don't yet have issuing or reporting obligations, and keep the unmodified template for those that do. Receive-only parties appear in the [Parties tab](#reading-parties-registrations) with a dash in the Reporting column.
  </Step>
</Steps>

When a party's e-reporting obligations begin — for example when the September 2027 mandate reaches SMEs and micro-businesses — complete its registration by running the **Register party for reporting** step against the party's silo entry: create a workflow containing just that step and run it on the already-registered party. The [VAT regime](/guides/fr-pa-reporting#picking-a-vat-regime-at-supplier-registration) is picked the same way as in the full registration.

<Note>
  A party registered without the reporting step is not on any reporting cadence: Invopop only generates and files Flux 10 reports for parties registered for reporting. The signed agreement is the same in both cases, so no new mandate is needed when reporting is added later.
</Note>

## PPF unregister supplier workflow

<Card iconType="duotone" title="PPF unregister supplier" icon="code-branch" href="https://console.invopop.com/redirect/workflows/new?template=fr-fr-pa-unregister" horizontal>
  Add to my workspace →
</Card>

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

  <Tab title="Code">
    ```json PPF unregister supplier workflow theme={null}
    {
        "name": "PPF unregister supplier",
        "description": "Unregister a supplier from Peppol and the French Directory",
        "schema": "org/party",
        "steps": [
            {
                "id": "453beac0-70a7-11f1-aca9-697108ec55ef",
                "name": "Unregister supplier from Peppol",
                "provider": "peppol.unregister"
            },
            {
                "id": "13c84e60-5452-11f1-baf5-4f2c2882107f",
                "name": "Disable party in Directory",
                "provider": "gov-fr.directory.disable"
            },
            {
                "id": "c91ae086-f830-425b-b67c-72af00efc22c",
                "name": "Disable party for reporting",
                "provider": "gov-fr.reporting.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>

## Reading parties registrations

The France dashboard's **Parties** tab shows the registration state of every SIREN in the workspace. In the Console, open the **Apps** view and select the **France** app. The dashboard opens on this tab.

Each row carries the party's Name, its number of Annuaire entries, the SIREN, the registration State, the Silo entry that holds the party, whether Reporting is enabled, the VAT regime selected at registration, and the date the approval was Decided.

| State                                 | Meaning                                                                                  |
| ------------------------------------- | ---------------------------------------------------------------------------------------- |
| <Badge color="yellow">Pending</Badge> | The registration workflow has started but the signed mandate has not been submitted yet. |
| <Badge color="blue">Submitted</Badge> | The mandate and identity document are under approval review.                             |
| <Badge color="green">Approved</Badge> | The party is registered: its Annuaire line is live and published on Peppol.              |
| <Badge color="red">Rejected</Badge>   | The submission was declined during review.                                               |

A check mark in the Reporting column means the party is also [registered for e-reporting](/guides/fr-pa-reporting); a dash marks a party registered only for e-invoicing. The VAT regime pill shows the [cadence](/guides/fr-pa-reporting#picking-a-vat-regime-at-supplier-registration) its reports follow.

<Note>
  Clicking a row opens a side panel with the party's Annuaire lines: one block per directory entry with its Endpoint (the electronic address), the registered Name, and the Silo entry id. Every value has a copy button. Lines that have been unregistered appear greyed out and carry a **Disabled at** row with their deactivation date.
</Note>

Filter the table by **SIREN**, **State**, or whether **Reporting** is enabled.

## 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="Can I register a supplier to receive invoices without enabling e-reporting?">
    Yes. Copy the PPF register supplier template and remove the **Register party for reporting** step. The party gets its Annuaire line and Peppol inbox and can receive invoices, but no reporting cadence starts. When its obligations begin, run the removed step against the party to complete the registration. See [Registering without e-reporting](/guides/fr-pa-registration#registering-without-e-reporting).
  </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" /> [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>
