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.
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.Prerequisites
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.
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.
403 FR_EREPORTING_NOT_ENABLED. Enable it in the dashboard first.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 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"
}'
{
"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
| Field | Type | Required | Description |
|---|---|---|---|
| transactions | array | Yes | One or more transaction objects (see below). Must not be empty. |
| period | string | No | Reporting period as YYYY-MM. Inferred from the earliest transaction date if omitted. |
| source | string | No | Caller identifier stored for audit trail (e.g. "taxsure", "shopify"). |
Transaction object fields
| Field | Type | Required | Description |
|---|---|---|---|
| date | string | Yes | Transaction date as YYYY-MM-DD. |
| netAmountEur | number | Yes | Taxable base in EUR. Must be ≥ 0. |
| vatAmountEur | number | Yes | VAT amount in EUR. Must be ≥ 0. |
| vatRate | number | Yes | VAT rate as a percentage (e.g. 20 for 20%, 5.5 for 5.5%). Must be > 0 and ≤ 100. |
| transactionType | string | Yes | DOMESTIC — French buyer; INTRA_EU — EU buyer outside France; EXPORT — non-EU buyer. |
| productCode | string | No | Your internal SKU or product code. Used to resolve the DGFiP category via your mapping table. Falls to entity default if omitted or unmapped. |
| reference | string | No | Your own order or transaction reference, stored for audit purposes. Not sent to DGFiP. |
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 https://api.clearvo.io/v1/fr/categories \
-H "x-api-key: csk_live_..."
{
"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 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 https://api.clearvo.io/v1/fr/categories \
-X DELETE \
-H "x-api-key: csk_live_..." \
-H "Content-Type: application/json" \
-d '{ "productCode": "SKU-042" }'
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
| Status | Meaning |
|---|---|
| PENDING_SUBMISSION | Transactions received. Period is open — more transactions can be added. Reclassification is available. Awaiting submission deadline or manual trigger. |
| QUEUED | Submission job has picked up this period and is building the Flux 10 payload. |
| SUBMITTED | 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 "https://api.clearvo.io/v1/fr/periods?limit=12" \
-H "x-api-key: csk_live_..."
{
"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)
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 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.
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.
| Code | Category |
|---|---|
| 01 | Retail and consumer goods |
| 02 | Food and beverages |
| 03 | Hotels and accommodation |
| 04 | Restaurants and catering |
| 05 | Transport and travel |
| 06 | Telecommunications |
| 07 | Digital services and software |
| 08 | Professional services |
| 09 | Construction and real estate |
| 10 | Healthcare and pharmaceutical |
| 11 | Education and training |
| 12 | Entertainment and culture |
| 13 | Financial and insurance services |
| 14 | Other |
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:
| Column | Required | Format |
|---|---|---|
| date | Yes | YYYY-MM-DD |
| net_amount_eur | Yes | Decimal number (e.g. 82.64) |
| vat_amount_eur | Yes | Decimal number |
| vat_rate | Yes | Percentage (e.g. 20) |
| transaction_type | Yes | DOMESTIC, INTRA_EU, or EXPORT |
| product_code | No | Your SKU or product code |
| reference | No | Your order reference |
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.