Manage DGFiP electronic invoicing in B2Brouter
The French e-invoicing reform requires all French VAT-registered companies to transmit B2B invoices and VAT data through a Plateforme Agréée (PA) certified by the DGFiP. B2Brouter is a certified PA: you connect to us and we take care of PPF registration, document transmission, VAT reports, and the full status lifecycle.
Free pilot until September 2026 — Before the mandatory start date, any company that joins the pilot gets free access to the platform to run real tests. Invoices and reports sent during the pilot do not count towards later accounting resets. On top of that, you’ll have full access to B2Brouter during the pilot: you can manage integrations and automations through our connectors and our API.
B2B ≠ B2G — DGFiP handles B2B over the Peppol network with scheme 0225 (FRCTC). Chorus Pro is the B2G channel for invoicing French public administrations. These are two independent channels: a company can invoice B2B via DGFiP and B2G via Chorus Pro in parallel.
PA and PDP mean the same thing — In official DGFiP documents, in the Portail Public de Facturation and in other industry software, you’ll see the terms PA (Plateforme Agréée) and PDP (Plateforme de Dématérialisation Partenaire) used interchangeably. They refer to the same role. The official and current term is PA.
Two usage modes
Section titled “Two usage modes”When you activate DGFiP you pick one of two modes. You can switch between them at any time.
Reception only (Annuaire only) — the default mode when activating. You want to receive invoices from your suppliers but you’re not yet issuing through DGFiP. B2Brouter registers your SIREN in the PPF Annuaire with a Peppol 0225 transport. It does not generate VAT reports or CDAR messages. It does not force you to issue via Peppol.
Full e-Reporting — pilot (opt-in) until 2026-09-01; mandatory from that date onwards. You want to issue B2B invoices through DGFiP and automatically generate the VAT reports. Everything above plus generation and submission to the PPF of Flux 1 reports (domestic B2B) and Flux 10 reports (B2C, cross-border).
1 · Activate DGFiP
Section titled “1 · Activate DGFiP”Prerequisites
Section titled “Prerequisites”- A B2Brouter account.
- The SIREN (9 digits) or SIRET (14 digits) of your company. If you have several establishments (different SIRETs sharing the same SIREN), they are modelled as organisational units inside the same account — not as separate accounts. One SIREN = one account.
- ⚙ Account settings → Taxes → e-Reporting France.
- Add → DGFiP.
- Fill in the form:
- Start date — when VAT reporting begins. Today or later.
- Mode — Reception only (default) or Full e-Reporting. You can change it later.
- If you pick Full e-Reporting, also fill in:
- Operation type —
Services,GoodsorMixed(if in doubt:Mixed). - NAF code — INSEE activity code (e.g.
62for IT services). It appears on your Kbis extract. - Enterprise size —
Micro,PME,ETIorGrande Entreprise, based on headcount and turnover.
- Operation type —
- Declarant email — will receive tax notifications.
- Save.
Annuaire registration — Publishing your SIREN to the PPF Annuaire can take up to 24 hours, in production and in staging alike. This is a DGFiP infrastructure constraint, not a B2Brouter delay. You won’t be able to issue or receive DGFiP invoices until it has propagated.
Existing Peppol transport — If your account already had a Peppol transport (for instance from another PA or for another use case), it is replaced by the new 0225 transport. If your SIREN was registered with another PA, B2Brouter closes the previous Annuaire entry and opens the new one automatically.
If registration fails — An invalid SIREN (Luhn checksum) or a temporary DGFiP outage rolls back the setup and returns an error. Fix the data and save again.
Verifying that the registration is published
Section titled “Verifying that the registration is published”Once the setting is saved, go to Account settings → Transports → Peppol. You’ll see three publication statuses, each taking the values not_published, processing or published:
- SML — the global Peppol SML registration.
- SMP — the metadata service (at B2Brouter, it mirrors the SML).
- Peppol Directory — the listing on the public Peppol Directory.
Once all three read published, any other platform can locate you and send you invoices.
2 · Create a French contact
Section titled “2 · Create a French contact”Before issuing an invoice, the customer must exist in your contacts. B2Brouter auto-fills the identifiers from whatever you enter.
- Contacts → New contact.
- Pick France as the country.
- Choose the identifier type and enter the value:
- SIREN — 9 digits (e.g.
123456789). - SIRET — 14 digits (e.g.
12345678900012). - VAT number —
FR{kk}{siren}withkktwo check digits (e.g.FR32123456789).
- SIREN — 9 digits (e.g.
- Validate identifier and continue.
- Fill in the legal name, address, postcode and city.
- Under Delivery method, B2Brouter automatically selects Peppol Network and the format France UBL Invoice CIUS. Confirm that the Peppol identifier is correct.
- Continue → Save.
Three different identifiers — The contact record holds three distinct codes, each with its own role:
- Company identifier (
cin_scheme):0002for SIREN (9 digits) or0009for SIRET (14 digits). - Tax identifier / VAT (
tin_scheme):9957; valueFR{kk}{siren}. - Peppol identifier (
pin_scheme):0225; value SIREN orSIREN_SIRET.
If you see 0002 in the UI, that’s the company identifier (not the Peppol one). The Peppol scheme for DGFiP is always 0225.
Auto-fill — For DGFiP accounts activated from 2026-03-31 onwards, B2Brouter derives the three identifiers from each other: enter the SIREN and it generates the VAT number and the Peppol identifier; enter the VAT number and it generates the SIREN and the Peppol identifier.
Legacy contacts — Contacts created before DGFiP was activated may not have a VAT number. When you issue an invoice to such a contact, the error “The customer VAT number is required for DGFiP reporting” appears. Edit the contact, add the VAT number, and re-issue.
Annuaire verification
Section titled “Annuaire verification”When you create a French contact, B2Brouter automatically verifies its presence in the Annuaire:
- Registered in the Annuaire → invoices are transmitted via Peppol UBL and produce a Flux 1 report.
- Not registered → invoices are created but do not produce a Flux 1 report (the submission would be invalid). The recipient must register with a PA.
- Verification pending — creation is not blocked: the invoice proceeds and a report is generated. The verification arrives asynchronously.
Non-French contacts — Any invoice with a contact from another country automatically generates a Flux 10 report (cross-border e-Reporting). Use the Peppol scheme for the contact’s country in the identifier field.
3 · Issue an invoice
Section titled “3 · Issue an invoice”Pick the recipient
Section titled “Pick the recipient”- Invoices → Create invoice.
- Pick the contact and Continue.
Check that Transport reads Peppol Network and Format reads France UBL Invoice CIUS. If so, the invoice will travel over the DGFiP network.
General information
Section titled “General information”- Invoice number — unique sequential number. Maximum 20 characters. Allowed:
A-Z 0-9 -+_/. No leading, trailing, or consecutive spaces. - Invoice date and Due date — both mandatory.
- Currency —
EURfor domestic invoices. For foreign currencies, fill in the exchange rate against EUR on the invoice date.
Invoice lines
Section titled “Invoice lines”For each line: description, quantity, unit price excluding VAT, and VAT rate.
French VAT rates:
- 20 % — standard rate.
- 10 % — catering, construction, transport.
- 5.5 % — food, books, energy.
- 2.1 % — press, reimbursable medicines.
- 0 % — Exempt — CGI exemptions (requires a
VATEX-FR-CGI…code). - 0 % — Zero-rate — franchise en base de TVA (
VATEX-FR-FRANCHISE). - 0 % — Reverse charge — autoliquidation (
VATEX-FR-AE).
VAT exemption — mandatory code — If you apply 0 % under exemption, you must enter the corresponding VATEX-FR-… code in the line comment. Without the code the invoice is created but not transmitted to the PPF: it gets stuck and you need to delete it and re-create it with the correct code.
Most common VATEX codes:
VATEX-FR-FRANCHISE— franchise en base de TVA (micro-enterprises). B2Brouter maps it to categoryZ(zero-rate) in the XML.VATEX-FR-AE— autoliquidation (reverse charge).VATEX-FR-CGI261-1— medical services.VATEX-FR-CGI261-3— education and professional training.VATEX-FR-CGI261-5— non-profit organisations.VATEX-FR-CGI261C-1— banking and financial operations.VATEX-FR-CGI261C-2— insurance and reinsurance.VATEX-FR-CNWVAT— not established in France.
For the full list (more than 20 codes), see the technical developer guide: https://developer.b2brouter.net/docs/dgfip.
Payment information — mandatory fields (B2B)
Section titled “Payment information — mandatory fields (B2B)”Three fields are mandatory for French B2B invoices. If any of them is missing the invoice is not created: an explicit error is returned per field.
- Payment information (DGFiP code PMD) — reference and legal mentions (legal form, share capital, RCS).
- Payment method text (DGFiP code PMT) — method + IBAN/BIC.
- Payment terms (DGFiP code AAB) — due date, late-payment penalties, early-payment discount.
Examples (kept in French — these are legal mentions printed on the final invoice):
Payment information (PMD):FA-2026-0048 — Exemplar SAS, SAS au capital de 50 000 EUR, RCS Paris 123 456 789Payment method text (PMT):Virement bancaire, IBAN FR00 0000 0000 0000 0000 0000 000, BIC XXXXFRPPPayment terms (AAB):Net 30 jours à compter de la date de facture.Pénalité de retard : 12% annuel (Art. L441-10 C. com.).Indemnité forfaitaire de recouvrement : 40,00 EUR (Art. D441-5 C. com.).Pas d'escompte pour paiement anticipé.These fields are not mandatory for B2C invoices (simplified receipts to individuals).
Payment method (common codes): 4 Bank transfer, 58 SEPA Credit Transfer, 2 Direct Debit, 59 SEPA Direct Debit, 19 Card, 11 Cheque, 13 Other (use the text field to describe it).
- Save and preview — review the invoice.
- Issue and send — B2Brouter generates the document (UBL, CII or Factur-X depending on the contact), deposits it to the PPF via Peppol and automatically produces the associated VAT report.
4 · Invoice lifecycle
Section titled “4 · Invoice lifecycle”The invoice page shows the current state and, when something goes wrong, the exact reason.
Sending → Sent → Registered → Accepted → Paid ↘ Refused ↘ Error- Sending — the invoice has been created and is queued for PPF transmission.
- Sent — B2Brouter has deposited the document to the PPF.
- Registered ✅ — the DGFiP has validated and accepted the invoice. This is the compliance state.
- Accepted — the buyer has approved the invoice.
- Refused — the buyer has rejected the invoice.
- Paid — the buyer has reported the invoice as paid. Feature under development.
- Error — transmission error or PPF rejection. The reason appears on the invoice page.
Two PPF response moments — PPF responses arrive in two phases:
- Technical acknowledgement (fast) — the PPF confirms that it has received and technically validated the document. At this point the invoice becomes Sent.
- Final registration (once a day) — the DGFiP processes the received documents in a batch, once a day, and this is when it decides whether the invoice becomes Registered or Refused. It can take up to 24 hours from submission.
Configure webhooks in Settings → Webhooks if you want an instant notification when the registration arrives.
«Paid» — This state cannot currently be set from the UI or the API. CDAR 212 (Encaissée) is planned for a future release.
Invoice with an error
Section titled “Invoice with an error”An invoice in Error cannot be retransmitted. You must delete it, fix the data, and create a new one.
- Open the invoice and read the error reason.
- Delete the invoice.
- Fix the data (contact, VAT, missing fields…).
- Create and send a fresh invoice.
Common errors
Section titled “Common errors”- “Remittance information is required for DGFiP reporting” — PMD field is empty. Fill in Payment information.
- “Payment information is required for DGFiP reporting” — PMT field is empty. Fill in Payment method text.
- “Payment terms are required for DGFiP reporting” — AAB field is empty. Fill in Payment terms.
- “The customer VAT number is required for DGFiP reporting” — the contact has no VAT number. Edit the contact and add the TIN.
- “Invoice number too long / invalid chars” — number has more than 20 characters or contains forbidden characters. Adjust it.
REJ_COH BT-47— the buyer’s SIREN is not in the PPF Annuaire. In production, the customer must register with a PA. In staging, this is expected (the QAS environment doesn’t hold every SIREN).- Exempt line without VATEX code (silent block) — delete the invoice and re-create it with the correct VATEX code in the line comment.
parameter_invalid(SIREN) — the SIREN fails the Luhn check. Verify it.parameter_taken(SIREN) — the SIREN is already linked to another account. Contact support.
5 · Credit notes (rectifications)
Section titled “5 · Credit notes (rectifications)”A credit note cancels or rectifies a previous invoice. B2Brouter generates a UBL CreditNote with type code 381 and a reference to the original invoice.
- Open the original invoice.
- Create credit note.
- Fill in:
- The number of the original invoice (and the date it was issued).
- The lines and amounts you want to rectify. You can enter them with either a positive or a negative sign — tax-wise they are always treated as amounts that subtract from the original declaration, regardless of the sign you use.
- The same mandatory payment fields (PMD / PMT / AAB).
- Save and send — it is transmitted to the PPF as any other invoice (Flux 1).
Always use the real number and date of the original invoice, not an internal reference.
6 · Receiving invoices
Section titled “6 · Receiving invoices”Once your account is active (in either mode), you are registered in the Annuaire and can receive invoices from your suppliers over Peppol 0225.
- Expenses → see incoming invoices.
- Click on an invoice to open its details.
Actions on a received invoice
Section titled “Actions on a received invoice”- Approve — tell the supplier and the DGFiP that you accept the invoice (CDAR 205, Approuvée).
- Refuse — tell the supplier and the DGFiP that you reject the invoice (CDAR 210, Refusée). A reason is required.
- Mark as paid — CDAR 212, Encaissée. Feature under development, not yet available.
When you update the state, B2Brouter automatically sends the matching CDAR message to the PPF and to the supplier.
Flux 10 for received invoices — A report is only generated if the received invoice comes from a non-French supplier. Invoices from a French supplier need no declaration on your side (the supplier’s PA handles it).
7 · VAT reports (Full e-Reporting mode only)
Section titled “7 · VAT reports (Full e-Reporting mode only)”In Full e-Reporting mode, B2Brouter generates and transmits VAT reports automatically, with no manual action. In Reception only mode no reports are generated.
Flux 1 — domestic B2B invoices
Section titled “Flux 1 — domestic B2B invoices”One report per invoice. B2Brouter deposits it to the PPF and updates the state as the response comes back.
Flux 10 — B2C and cross-border
Section titled “Flux 10 — B2C and cross-border”Every B2C invoice and every invoice with a non-French recipient is grouped into daily Ledgers. The Ledger is sent to the PPF once a day (cron at 02:00 server time).
A single day can produce several Ledgers depending on the role and the type:
- Transactions ledger — sales (role SE): cross-border and B2C issued invoices.
- Transactions ledger — purchases (role BY): invoices received from foreign suppliers.
- Payments ledger (role SE): paid issued invoices.
Viewing the reports
Section titled “Viewing the reports”⚙ Account settings → Taxes → e-Reporting France → list of submitted reports.
Report lifecycle
Section titled “Report lifecycle”- New — created and queued (Flux 1) or accumulating in the daily Ledger (Flux 10).
- Sent — B2Brouter has deposited it to the PPF.
- Received — the PPF confirms receipt (CDV 500, Recevable).
- Registered ✅ — the DGFiP has accepted it (CDV 300). Positive final state.
- Refused ❌ — the DGFiP has rejected it (CDV 301).
- Error ❌ — transmission or processing error.
- Annulled — invoice annulled after registration (Flux 1 only).
CDV — Compte-Rendu de Validation: the asynchronous PPF response. There are two kinds:
- CDV 500 (Recevable) — arrives shortly after submission and confirms that the PPF received and technically validated the document. This corresponds to the Received state.
- CDV 300 / 301 (Registered / Refused) — the DGFiP issues them in a daily batch: this is when it decides whether the declaration is accepted or rejected. It can take up to 24 hours after submission.
Report with an error
Section titled “Report with an error”Most errors originate from the source invoice. Fix the invoice (delete + new invoice) and a fresh report is generated automatically. If the message isn’t clear, contact support.
8 · Document formats
Section titled “8 · Document formats”B2Brouter picks the format automatically based on the contact configuration:
- UBL Peppol France CIUS — default, if the recipient is registered in the Annuaire/Peppol.
- CII France CIUS — alternative XML variant, if the recipient requires it.
- Factur-X — fallback for recipients not registered in Peppol FR. It is a PDF/A-3 with embedded CII XML; a scanned or printed PDF is not a Factur-X.
Once the invoice is Sent, an option appears on the invoice page to download the transmitted document. The format will be UBL or Factur-X depending on the case.
9 · API integrations (for developers)
Section titled “9 · API integrations (for developers)”This manual covers the UI. If you integrate with B2Brouter over the API, the official reference is the DGFiP developer guide — it covers the Tax Report Settings endpoint, the Invoices and Contacts APIs, the state-change webhooks, and the Directory lookup used to check whether a contact is registered in the Annuaire.
Authentication uses a static API key (header X-B2B-API-Key) plus the API version (X-B2B-API-Version). DGFiP-specific features require version 2026-04-20 or later.
You can import existing UBL, CII or Factur-X invoices — if the source format doesn’t carry native payment fields (PMD / PMT / AAB), pass them in the extra_info field using the #PMD#, #PMT# and #AAB# tags.