New France e-invoicing mandate goes live September 2026 — our implementation is ready. See all mandates →
France E-Reporting

France B2C E-Reporting

From September 2026, French businesses with B2C sales must report transaction data to the DGFiP via Flux 10. This applies to domestic B2C sales, intra-EU distance sales (OSS-registered), and non-EU exports. The obligation is separate from the B2B e-invoicing mandate.

Clearvo handles the full Flux 10 pipeline: ingest your transaction data via API or dashboard CSV upload, resolve DGFiP product categories, aggregate by period, and submit to the PPF concentrateur on your behalf. All amounts must be provided in EUR — currency conversion is the caller's responsibility.

France B2C E-Reporting uses the same base URL as the core API (https://api.clearvo.io/v1) and the same csk_live_* / csk_test_* API key system. The sandbox behaves identically to production except no data is submitted to the PPF.
France E-Reporting

Prerequisites

1
Enable France E-Reporting on your entity

In the dashboard, open your entity's settings and navigate to the Obligations tab. Enable France B2C E-Reporting and provide your SIREN number, VAT regime, and default product category. This can only be enabled on entities with a French VAT number.

2
Use an entity-scoped API key

All write endpoints (POST /v1/fr/transactions, POST /v1/fr/categories, POST /v1/fr/periods/:period/reclassify) require an entity-scoped key (csk_live_* or csk_test_*). Account-scoped keys are accepted on read endpoints only.

If France E-Reporting is not enabled on the entity associated with your API key, write endpoints return 403 FR_EREPORTING_NOT_ENABLED. Enable it in the dashboard first.
France E-Reporting

Submit transactions

Send a batch of B2C transaction records. Transactions are stored and aggregated by period — you can submit incrementally throughout a period or in one batch at period end. Both patterns are supported.

curl
curl https://api.clearvo.io/v1/fr/transactions \
  -H "x-api-key: csk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "transactions": [
      {
        "date": "2026-05-14",
        "netAmountEur": 82.64,
        "vatAmountEur": 16.53,
        "vatRate": 20,
        "transactionType": "DOMESTIC",
        "productCode": "SKU-001",
        "reference": "ORDER-78921"
      },
      {
        "date": "2026-05-14",
        "netAmountEur": 45.45,
        "vatAmountEur": 5.00,
        "vatRate": 11,
        "transactionType": "INTRA_EU",
        "productCode": "SKU-042"
      }
    ],
    "source": "taxsure"
  }'
JSON Response
{
  "ok": true,
  "batchId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "accepted": 2,
  "period": "2026-05",
  "unmappedProductCodes": ["SKU-042"],
  "defaultCount": 1
}

When defaultCount is greater than zero, those transactions were categorised under the entity's default DGFiP category because no specific mapping was found for their product code. You can add mappings via POST /v1/fr/categories and then call reclassify on the period before it is submitted.

Request body fields

FieldTypeRequiredDescription
transactionsarrayYesOne or more transaction objects (see below). Must not be empty.
periodstringNoReporting period as YYYY-MM. Inferred from the earliest transaction date if omitted.
sourcestringNoCaller identifier stored for audit trail (e.g. "taxsure", "shopify").

Transaction object fields

FieldTypeRequiredDescription
datestringYesTransaction date as YYYY-MM-DD.
netAmountEurnumberYesTaxable base in EUR. Must be ≥ 0.
vatAmountEurnumberYesVAT amount in EUR. Must be ≥ 0.
vatRatenumberYesVAT rate as a percentage (e.g. 20 for 20%, 5.5 for 5.5%). Must be > 0 and ≤ 100.
transactionTypestringYesDOMESTIC — French buyer; INTRA_EU — EU buyer outside France; EXPORT — non-EU buyer.
productCodestringNoYour internal SKU or product code. Used to resolve the DGFiP category via your mapping table. Falls to entity default if omitted or unmapped.
referencestringNoYour own order or transaction reference, stored for audit purposes. Not sent to DGFiP.
All amounts must be in EUR. Currency conversion is not performed by the API — callers are responsible for converting to EUR before submission. DGFiP Flux 10 is denominated in EUR.
France E-Reporting

Category mappings

DGFiP Flux 10 requires classifying transactions by category. Clearvo resolves the category for each transaction using your mapping table: if the transaction's productCode matches a mapping, that category is used; otherwise the entity's default category applies.

Manage mappings at any time — they take effect immediately for new transactions and can be applied retroactively to a pending period via reclassify.

List mappings

curl
curl https://api.clearvo.io/v1/fr/categories \
  -H "x-api-key: csk_live_..."
JSON Response
{
  "defaultCategoryCode": "01",
  "mappings": [
    { "productCode": "SKU-001", "dgfipCategoryCode": "01", "label": "Retail clothing" },
    { "productCode": "SKU-099", "dgfipCategoryCode": "07", "label": "Software licence" }
  ]
}

Add or update a mapping

curl
curl https://api.clearvo.io/v1/fr/categories \
  -X POST \
  -H "x-api-key: csk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "productCode": "SKU-042", "dgfipCategoryCode": "07", "label": "Software licence" }'

This is an upsert — if a mapping for productCode already exists, it is updated. The dgfipCategoryCode must be a valid code from the DGFiP category table.

Delete a mapping

curl
curl https://api.clearvo.io/v1/fr/categories \
  -X DELETE \
  -H "x-api-key: csk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "productCode": "SKU-042" }'
France E-Reporting

Periods & submission status

A period represents one reporting cycle (one calendar month). Clearvo creates a period record automatically when the first transaction for that month is ingested. Each period progresses through a lifecycle as transactions are collected and submitted to the PPF.

Period lifecycle

StatusMeaning
PENDING_SUBMISSION Transactions received. Period is open — more transactions can be added. Reclassification is available. Awaiting submission deadline or manual trigger.
Submission job has picked up this period and is building the Flux 10 payload.
Flux 10 payload delivered to the PPF concentrateur. Awaiting acknowledgement.
ACCEPTED PPF has acknowledged the submission. The PPF reference is stored. This is the terminal success state.
REJECTED PPF returned a rejection. Contact support — a corrected resubmission may be required.

List periods

curl
curl "https://api.clearvo.io/v1/fr/periods?limit=12" \
  -H "x-api-key: csk_live_..."
JSON Response
{
  "periods": [
    {
      "period": "2026-05",
      "status": "PENDING_SUBMISSION",
      "transactionCount": 847,
      "defaultCount": 23,
      "deadline": "2026-06-24",
      "totals": [
        {
          "transactionType": "DOMESTIC",
          "vatRate": 20,
          "dgfipCategoryCode": "01",
          "netAmountEur": 68241.50,
          "vatAmountEur": 13648.30,
          "count": 612
        }
      ]
    }
  ],
  "total": 1
}

Deadlines

The deadline field is computed from your entity's VAT regime:

  • Régime réel normal — the 24th of the month following the period (e.g. May 2026 → 24 June 2026)
  • Régime simplifié — the last day of the month following the quarter end (e.g. May 2026 is Q2, quarter ends June, deadline is 31 July 2026)
France E-Reporting

Reclassify a period

If you add or update category mappings after transactions have already been ingested, you can re-run category resolution for all transactions in a period. This updates the DGFiP category on each transaction and recounts defaultCount.

Reclassification is only available while a period is in PENDING_SUBMISSION status. Once a period has been queued or submitted, its data is locked.

curl
curl https://api.clearvo.io/v1/fr/periods/2026-05/reclassify \
  -X POST \
  -H "x-api-key: csk_live_..."

Returns the updated FrPeriodSummary with the new defaultCount. Returns 409 PERIOD_LOCKED if the period has already been submitted.

France E-Reporting

DGFiP category codes

Use these codes in dgfipCategoryCode when creating category mappings. Set your entity's default category in the dashboard under Obligations → France E-Reporting.

CodeCategory
01Retail and consumer goods
02Food and beverages
03Hotels and accommodation
04Restaurants and catering
05Transport and travel
06Telecommunications
07Digital services and software
08Professional services
09Construction and real estate
10Healthcare and pharmaceutical
11Education and training
12Entertainment and culture
13Financial and insurance services
14Other
If your business sells a single type of product or service, set the entity default category and you will never need to configure individual SKU mappings — all transactions will be classified automatically.
France E-Reporting

CSV upload

For users who prefer not to use the API directly, the dashboard at app.clearvo.io → FR E-Reporting supports CSV file upload. The upload parses the file client-side and calls the same POST /v1/fr/transactions endpoint.

Expected CSV columns:

ColumnRequiredFormat
dateYesYYYY-MM-DD
net_amount_eurYesDecimal number (e.g. 82.64)
vat_amount_eurYesDecimal number
vat_rateYesPercentage (e.g. 20)
transaction_typeYesDOMESTIC, INTRA_EU, or EXPORT
product_codeNoYour SKU or product code
referenceNoYour order reference
Integration partners (Taxsure, Crosstax, ERPs) should use the POST /v1/fr/transactions API directly with the source field set to identify the originating system. The CSV upload is designed for manual and low-volume use cases.