📅 Facture électronique obligatoire en 2026. Préparez-vous dès maintenant →
Logo FactPulse

E-Reporting TVA France 2026 : Guide Complet des Flux 10.1 à 10.4

C'est quoi le E-Reporting ?

Le e-reporting est l'obligation de transmettre à l'administration fiscale les données de transactions qui ne passent pas par la facturation électronique (e-invoicing). Concrètement, c'est déclarer au PPF (Portail Public de Facturation) :

  • Vos ventes à l'international (clients hors France)
  • Vos ventes aux particuliers (B2C)
  • Les paiements reçus sur ces transactions

Les 4 flux e-reporting

L'e-reporting se décompose en 4 types de flux, organisés logiquement en deux catégories.

Transactions B2B internationales

Flux Quoi ? Quand ?
10.1 Factures émises/reçues avec des entreprises étrangères À chaque facture internationale
10.2 Paiements reçus sur ces factures internationales À chaque encaissement

Le flux 10.1 couvre trois scénarios selon qui est français :

Scénario Vendeur Acheteur Qui déclare ?
B2Bi Français Étranger Vendeur (roleCode=SE)
Bi2B Étranger Français Acheteur (roleCode=BY)
Bi2Bi Étranger Étranger Le français impliqué

Exemple B2Bi : Vous vendez des marchandises à un client allemand. Vous (vendeur FR) déclarez la facture.

Exemple Bi2B : Vous achetez des services à un prestataire espagnol. Vous (acheteur FR) déclarez la facture.

Exemple flux 10.2 : Le client paie sa facture. Vous déclarez le paiement.

Transactions B2C (ventes aux particuliers)

Flux Quoi ? Quand ?
10.3 Ventes aux particuliers agrégées Par période (totaux quotidiens par catégorie)
10.4 Paiements reçus sur ces ventes B2C Par période (totaux quotidiens par taux TVA)

Exemple flux 10.3 : Vous êtes commerçant. Vous avez fait 150 ventes de biens (10 000€ HT) et 80 prestations de services (5 000€ HT) le 15 janvier. Vous déclarez ces deux totaux agrégés pour cette journée.

Exemple flux 10.4 : Vous avez encaissé 12 000€ TTC le 15 janvier sur vos ventes B2C. Vous déclarez ce paiement agrégé.

Différence clé : unitaire vs agrégé

Type Flux Granularité
Unitaire 10.1, 10.2 Une ligne par facture/paiement
Agrégé 10.3, 10.4 Totaux quotidiens par catégorie

Périodicité de transmission

La fréquence de transmission dépend de votre régime de TVA (source: Spécifications externes PPF v3.1) :

Données de facture et transaction (10.1, 10.3)

Régime TVA Période Délai de transmission
Réel normal mensuel Décade (1-10, 11-20, 21-fin du mois) 10 jours après fin de période
Réel normal trimestriel Mensuelle Le 10 du mois suivant
Régime simplifié Mensuelle Entre le 25 et 30 du mois suivant
Franchise en base Bimestrielle Entre le 25 et 30 du mois suivant

Données de paiement (10.2, 10.4)

Régime TVA Période Délai de transmission
Réel normal mensuel Mensuelle Le 10 du mois suivant
Réel normal trimestriel Mensuelle Le 10 du mois suivant
Régime simplifié Mensuelle Entre le 25 et 30 du mois suivant
Franchise en base Bimestrielle 1er du deuxième mois à venir

Bimestres civils : janvier-février, mars-avril, mai-juin, juillet-août, septembre-octobre, novembre-décembre.

Les données de flux 10.3/10.4 sont agrégées par jour d'activité au sein de la période de transmission.

Comment transmettre : le fichier unique PPF

Le PPF attend un seul fichier XML contenant tous vos flux de la période. C'est ce qu'on appelle le dépôt agrégé.

┌─────────────────────────────────────────────┐
│           Dépôt e-reporting (période)       │
├─────────────────────────────────────────────┤
│  📄 Factures B2B internationales (10.1)     │
│  💳 Paiements B2B internationaux (10.2)     │
│  🛒 Transactions B2C agrégées (10.3)        │
│  💰 Paiements B2C agrégés (10.4)            │
└─────────────────────────────────────────────┘
                    ↓
            Fichier XML unique
                    ↓
                   PPF

Les catégories de transactions (flux 10.3)

Pour le flux 10.3, vous devez catégoriser vos ventes B2C :

Code Type de vente Exemple
TLB1 Livraisons de biens Vente de produits en magasin
TPS1 Prestations de services Coiffeur, réparation, conseil
TNT1 Transactions exonérées Ventes hors champ TVA
TMA1 Transactions mixtes Biens + services (à éviter)

Ce que FactPulse vous apporte

Validation automatique conforme PPF

FactPulse valide vos données selon les spécifications v3.1 de l'Annexe 6 :

  • REJ_SEMAN : Format des identifiants (SIREN, codes TVA)
  • REJ_COH : Cohérence des montants (TVA = somme des ventilations)
  • REJ_PER : Dates dans la période déclarée

→ Vous détectez les erreurs avant d'envoyer au PPF.

Enrichissement intelligent

FactPulse remplit automatiquement les champs optionnels :

  • SchemeID déduit du format SIREN/SIRET
  • Devise EUR par défaut
  • Pays vendeur FR par défaut
  • Code exigibilité TVA selon la catégorie (services vs biens)

→ Vous envoyez le minimum, FactPulse complète.

Génération et transmission

FactPulse gère deux aspects distincts :

Format du flux (Spécifications PPF v3.1) :

  • Structure XML conforme au XSD e-reporting
  • Codes de catégorie normalisés (TLB1, TPS1, TNT1, TMA1)
  • Calcul automatique du SHA256 pour l'intégrité

Protocole de transmission (AFNOR XP Z12-013) :

  • API standardisée pour l'envoi aux plateformes (PA/PPF)
  • Gestion des accusés de réception
  • Suivi du cycle de vie des flux

→ Vous n'avez qu'une seule API à appeler, FactPulse gère le reste.

Utiliser l'API FactPulse

Endpoint principal : dépôt agrégé

Pour un dépôt de période complet, utilisez /generate-aggregated :

POST /api/v1/ereporting/generate-aggregated

Exemple complet : dépôt de période

import requests

BASE_URL = "https://factpulse.fr/api/v1"
headers = {"Authorization": "Bearer VOTRE_TOKEN", "Content-Type": "application/json"}

depot_periode = {
    "reportId": "EREPORT-2025-01",
    "reportName": "E-Reporting Janvier 2025",
    "transmissionType": "IN",  # Initial (RE pour rectificatif)
    "sender": {
        "siren": "123456789",
        "name": "Ma Société SARL"
    },
    "issuer": {  # Optionnel : déclarant avec son rôle
        "siren": "123456789",
        "roleCode": "SE"  # SE=vendeur (B2Bi), BY=acheteur (Bi2B)
    },
    "period": {
        "startDate": "2025-01-01",
        "endDate": "2025-01-31"
    },

    # Flux 10.1 - Facture B2Bi (vendeur FR → acheteur DE)
    "invoices": [
        {
            "invoiceId": "FAC-2025-INT-001",
            "issueDate": "2025-01-10",
            "typeCode": "380",
            "sellerId": "123456789",       # SIREN vendeur FR
            "sellerCountry": "FR",
            "buyerCountry": "DE",
            "buyerVatId": "DE123456789",
            "taxExclusiveAmount": "50000.00",
            "taxAmount": "0.00",
            "taxBreakdown": [
                {"rate": "0.00", "taxableAmount": "50000.00", "taxAmount": "0.00"}
            ]
        }
    ],

    # Flux 10.2 - Paiement reçu sur cette facture
    "invoicePayments": [
        {
            "invoiceId": "FAC-2025-INT-001",
            "paymentDate": "2025-01-25",
            "amount": "50000.00"
        }
    ],

    # Flux 10.3 - Ventes B2C du mois (agrégées par catégorie)
    "transactions": [
        {
            "date": "2025-01-31",
            "categoryCode": "TLB1",  # Ventes de biens
            "taxExclusiveAmount": "10000.00",
            "taxAmount": "2000.00",
            "taxBreakdown": [
                {"rate": "20.00", "taxableAmount": "10000.00", "taxAmount": "2000.00"}
            ],
            "transactionCount": 150
        },
        {
            "date": "2025-01-31",
            "categoryCode": "TPS1",  # Prestations de services
            "taxExclusiveAmount": "5000.00",
            "taxAmount": "1000.00",
            "taxBreakdown": [
                {"rate": "20.00", "taxableAmount": "5000.00", "taxAmount": "1000.00"}
            ],
            "transactionCount": 80
        }
    ],

    # Flux 10.4 - Encaissements B2C du mois
    "transactionPayments": [
        {
            "paymentDate": "2025-01-31",
            "amountsByRate": [
                {"rate": "20.00", "amount": "15000.00"}
            ]
        }
    ]
}

# Générer le XML
response = requests.post(f"{BASE_URL}/ereporting/generate-aggregated", headers=headers, json=depot_janvier)

if response.status_code == 200:
    result = response.json()
    print(f"XML généré ({len(result['xml'])} bytes)")
    print(f"Type: {result['flowType']}")  # MultiFlowReport
    print(f"Contenu: {result['contentSummary']}")

    # Sauvegarder
    with open("ereporting_janvier.xml", "w") as f:
        f.write(result["xml"])

Exemple flux 10.3 seul : commerce de détail

Si vous n'avez que des ventes B2C :

depot_b2c = {
    "reportId": "EREPORT-2025-01-B2C",
    "transmissionType": "IN",
    "sender": {"siren": "123456789", "name": "Boutique SARL"},
    "period": {"startDate": "2025-01-01", "endDate": "2025-01-31"},
    "transactions": [
        {
            "date": "2025-01-31",
            "categoryCode": "TLB1",
            "taxExclusiveAmount": "25000.00",
            "taxAmount": "5000.00",
            "taxBreakdown": [
                {"rate": "20.00", "taxableAmount": "25000.00", "taxAmount": "5000.00"}
            ],
            "transactionCount": 500
        }
    ]
}

response = requests.post(f"{BASE_URL}/ereporting/generate-aggregated", headers=headers, json=depot_b2c)
# flowType sera "AggregatedCustomerTransactionReport"

Exemple flux 10.1 : export international (B2Bi)

Cas où vous vendez à un client étranger (vendeur FR → acheteur étranger) :

depot_export = {
    "reportId": "EREPORT-2025-01-EXPORT",
    "transmissionType": "IN",
    "sender": {"siren": "123456789", "name": "Exportateur SA"},
    "issuer": {"siren": "123456789", "roleCode": "SE"},  # SE = Seller
    "period": {"startDate": "2025-01-01", "endDate": "2025-01-31"},
    "invoices": [
        {
            "invoiceId": "FAC-2025-001",
            "issueDate": "2025-01-10",
            "typeCode": "380",
            "sellerId": "123456789",     # SIREN vendeur FR
            "sellerCountry": "FR",
            "buyerCountry": "US",
            "taxExclusiveAmount": "100000.00",
            "taxAmount": "0.00",
            "taxBreakdown": [
                {"rate": "0.00", "taxableAmount": "100000.00", "taxAmount": "0.00"}
            ]
        }
    ]
}

response = requests.post(f"{BASE_URL}/ereporting/generate-aggregated", headers=headers, json=depot_export)
# flowType sera "UnitaryCustomerTransactionReport"

Exemple flux 10.1 : import international (Bi2B)

Cas où vous achetez à un fournisseur étranger (vendeur étranger → acheteur FR) :

depot_import = {
    "reportId": "EREPORT-2025-01-IMPORT",
    "transmissionType": "IN",
    "sender": {"siren": "987654321", "name": "Importateur SARL"},
    "issuer": {"siren": "987654321", "roleCode": "BY"},  # BY = Buyer (acheteur)
    "period": {"startDate": "2025-01-01", "endDate": "2025-01-31"},
    "invoices": [
        {
            "invoiceId": "INV-ES-2025-001",
            "issueDate": "2025-01-15",
            "typeCode": "380",
            "sellerCountry": "ES",            # Vendeur espagnol
            "sellerVatId": "ESB12345678",     # TVA intracommunautaire du vendeur
            "buyerId": "987654321",           # SIREN acheteur FR
            "buyerCountry": "FR",
            "taxExclusiveAmount": "75000.00",
            "taxAmount": "0.00",              # TVA autoliquidée
            "taxBreakdown": [
                {"rate": "0.00", "taxableAmount": "75000.00", "taxAmount": "0.00"}
            ]
        }
    ]
}

response = requests.post(f"{BASE_URL}/ereporting/generate-aggregated", headers=headers, json=depot_import)
# flowType sera "UnitaryCustomerTransactionReport"

Workflow recommandé

1. Valider vos données

Avant de générer, vérifiez que tout est correct :

response = requests.post(
    f"{BASE_URL}/ereporting/validate-aggregated",
    headers=headers,
    json=depot_janvier
)

result = response.json()
if result["valid"]:
    print("Données conformes PPF")
else:
    for error in result["errors"]:
        print(f"Erreur {error['code']}: {error['message']}")

2. Générer et vérifier le XML

response = requests.post(
    f"{BASE_URL}/ereporting/generate-aggregated",
    headers=headers,
    json=depot_janvier
)

result = response.json()
with open("preview.xml", "w") as f:
    f.write(result["xml"])

# Vérifier manuellement si besoin

3. Soumettre à la PA

response = requests.post(
    f"{BASE_URL}/ereporting/submit-aggregated",
    headers=headers,
    json={**depot_janvier, "trackingId": "TRACK-2025-01"}
)

if response.status_code == 200:
    result = response.json()
    print(f"Soumis! Flow ID: {result['flowId']}")

4. Suivre le statut

flow_id = result["flowId"]
response = requests.post(
    f"{BASE_URL}/afnor/flows/search",
    headers=headers,
    json={"flowId": flow_id}
)

for flow in response.json().get("results", []):
    print(f"Statut: {flow['acknowledgmentStatus']}")

Endpoints disponibles

Génération et validation

Endpoint Description
POST /ereporting/generate-aggregated Générer un XML multi-flux
POST /ereporting/validate-aggregated Valider sans générer
POST /ereporting/submit-aggregated Soumettre à la PA
GET /ereporting/category-codes Lister les codes de catégorie

Mono-flux (cas simples)

Endpoint Description
POST /ereporting/generate Générer un XML mono-flux
POST /ereporting/validate Valider un flux unique
POST /ereporting/generate/download Télécharger directement le XML

XML pré-généré

Endpoint Description
POST /ereporting/validate-xml Valider un XML contre les XSD
POST /ereporting/submit-xml Soumettre un XML existant

Référence : structure des données

Sender (émetteur)

{
    "siren": "123456789", // SIREN 9 chiffres ou SIRET 14 chiffres
    "name": "Ma Société SARL", // Raison sociale
    "vatId": "FR12345678901" // Optionnel
}

Issuer (déclarant) - Optionnel

{
    "siren": "123456789", // SIREN du déclarant français
    "name": "Ma Société SARL", // Optionnel
    "roleCode": "SE" // SE=vendeur (B2Bi), BY=acheteur (Bi2B)
}

Period (période)

{
    "startDate": "2025-01-01", // Début de période
    "endDate": "2025-01-31" // Fin de période
}

Transaction (flux 10.3)

{
    "date": "2025-01-31",
    "categoryCode": "TLB1", // TLB1, TPS1, TNT1, TMA1
    "taxExclusiveAmount": "10000.00",
    "taxAmount": "2000.00",
    "taxBreakdown": [
        { "rate": "20.00", "taxableAmount": "10000.00", "taxAmount": "2000.00" }
    ],
    "transactionCount": 150, // Optionnel
    "taxDueDateTypeCode": "29" // Optionnel: 5=débits, 29=encaissements
}

Invoice (flux 10.1)

B2Bi (vendeur FR → acheteur étranger) :

{
    "invoiceId": "FAC-2025-001",
    "issueDate": "2025-01-10",
    "typeCode": "380", // 380=facture, 381=avoir
    "sellerId": "123456789", // SIREN vendeur FR
    "sellerCountry": "FR",
    "buyerCountry": "DE", // Code pays ISO
    "buyerVatId": "DE123456789", // Optionnel
    "taxExclusiveAmount": "50000.00",
    "taxAmount": "0.00",
    "taxBreakdown": [
        { "rate": "0.00", "taxableAmount": "50000.00", "taxAmount": "0.00" }
    ]
}

Bi2B (vendeur étranger → acheteur FR) :

{
    "invoiceId": "INV-ES-2025-001",
    "issueDate": "2025-01-15",
    "typeCode": "380",
    "sellerCountry": "ES", // Vendeur étranger
    "sellerVatId": "ESB12345678", // TVA du vendeur (obligatoire)
    "buyerId": "987654321", // SIREN acheteur FR
    "buyerCountry": "FR",
    "taxExclusiveAmount": "75000.00",
    "taxAmount": "0.00",
    "taxBreakdown": [
        { "rate": "0.00", "taxableAmount": "75000.00", "taxAmount": "0.00" }
    ]
}

InvoicePayment (flux 10.2)

{
    "invoiceId": "FAC-2025-001",
    "paymentDate": "2025-01-25",
    "amount": "50000.00"
}

TransactionPayment (flux 10.4)

{
    "paymentDate": "2025-01-31",
    "amountsByRate": [
        { "rate": "20.00", "amount": "12000.00" },
        { "rate": "5.50", "amount": "550.00" }
    ]
}

Codes d'erreur

Code Signification
INVALID_SIREN SIREN/SIRET mal formaté
TAX_MISMATCH Montant TVA ≠ somme des ventilations
DATE_OUT_OF_PERIOD Date hors de la période déclarée
MISSING_TRANSACTIONS Flux 10.3 sans transactions
MISSING_INVOICES Flux 10.1 sans factures
MISSING_PAYMENTS Flux 10.2/10.4 sans paiements

Questions fréquentes sur l'e-reporting

Quelle est la différence entre e-invoicing et e-reporting ?

L'e-invoicing (facturation électronique) concerne les factures B2B entre entreprises françaises, transmises via une plateforme (PDP ou PPF). L'e-reporting concerne toutes les autres transactions : ventes B2C aux particuliers, ventes et achats B2B internationaux. Ces données sont déclarées au PPF sans passer par le circuit de facturation électronique.

Quand l'e-reporting devient-il obligatoire ?

L'obligation d'e-reporting entre en vigueur le 1er septembre 2026 pour les grandes entreprises et ETI, puis le 1er septembre 2027 pour les PME et micro-entreprises. Ces dates sont alignées avec l'obligation de facturation électronique.

Qui doit faire de l'e-reporting ?

Toute entreprise assujettie à la TVA en France doit déclarer :

  • Ses ventes aux particuliers (B2C)
  • Ses factures émises vers des clients étrangers (B2Bi)
  • Ses factures reçues de fournisseurs étrangers (Bi2B)
  • Les paiements associés à ces transactions

Quelle est la périodicité de l'e-reporting ?

La fréquence dépend de votre régime de TVA. En régime réel normal mensuel, les transactions (flux 10.1/10.3) sont déclarées par décade (tous les 10 jours) et les paiements (flux 10.2/10.4) sont déclarés mensuellement. En régime simplifié, tout est déclaré mensuellement.

Quel format pour l'e-reporting ?

L'e-reporting utilise un format XML conforme au XSD défini par le PPF (spécifications v3.1). Ce fichier unique peut contenir les 4 types de flux (10.1 à 10.4) pour une même période.

Comment transmettre l'e-reporting au PPF ?

Vous pouvez passer par une Plateforme agréée (PA) qui se charge de la transmission, ou envoyer directement au Portail Public de Facturation (PPF) via son API. FactPulse gère les deux cas.

Besoin d'aide ?


Dernière mise à jour : Janvier 2026 - Conforme spécifications PPF v3.1