Référence · Schematron EN 16931 & CTC FR

Erreurs Schematron : comprendre un rejet Factur-X

Votre facture est refusée avec un code du genre BR-CO-13 et un message en anglais qui ne dit pas quoi corriger. Cette page explique d'où viennent ces codes, puis reprend un par un ceux qu'on rencontre réellement — avec la cause et la correction.

Pourquoi un code, et pas un message clair

La validation d'une facture électronique se fait en deux temps. Le XSD vérifie la forme : les balises attendues, dans le bon ordre, avec les bons types. Le Schematron vérifie le sens : que les totaux s'additionnent, que la TVA est ventilée par taux, que les mentions obligatoires sont présentes. Ces règles métier portent des identifiants normalisés — BR- pour Business Rule — définis par la norme européenne EN 16931, complétés en France par les règles BR-FR- du Schematron CTC.

Le message associé est la reformulation littérale de la règle, pas un diagnostic. BR-CO-13 vous dit qu'une égalité n'est pas vérifiée ; il ne vous dit pas que c'est votre remise globale qui a été oubliée dans le total.

Deux familles de codes, deux sources

BR-*, BR-CO-*, BR-S-* — règles européennes EN 16931, communes à Factur-X et ZUGFeRD.
BR-FR-* — règles françaises du Schematron CTC, qui s'ajoutent aux précédentes pour la réforme 2026-2027. Un fichier qui passe le Schematron EN 16931 « nu » peut très bien échouer côté français : les deux jeux doivent être joués.

Les règles rencontrées en pratique

CodeCe que la règle exigeCause la plus fréquente
BR-CO-10 Le total des lignes du document égale la somme des montants nets de chaque ligne Arrondis flottants, ou une ligne recalculée d'un côté seulement
BR-CO-13 Le total HT du document = total des lignes − remises globales + charges globales Une remise appliquée au pied de facture sans être déclarée comme remise document
BR-CO-15 Le total TTC = total HT + total de TVA TVA calculée par ligne puis arrondie deux fois
BR-CO-16 Le net à payer = total TTC − montant déjà payé + arrondi Acompte déduit du TTC au lieu d'être porté dans le champ prévu
BR-S-02 Le numéro de TVA du vendeur est présent dès qu'une ligne est en TVA standard Le champ existe côté logiciel mais n'est pas transmis dans le XML
BR-S-08 La base taxable de chaque taux égale la somme des lignes portant ce taux Deux taux distincts agrégés dans une seule ventilation
BR-16 La facture comporte au moins une ligne Facture d'acompte construite sans ligne, uniquement avec un total
BR-FR-05 Les mentions légales françaises figurent dans les notes du document XML construit à la main, sans les notes de pénalités et de recouvrement
BR-FR-12 / BR-FR-13 Une adresse électronique de routage est présente pour le vendeur et pour l'acheteur Confusion avec l'email de contact commercial, ou champ laissé vide côté acheteur

Les pages détaillées sont ajoutées au fil des cas réellement remontés par le validateur — deux sont disponibles aujourd'hui : BR-CO-10 et BR-FR-05.

Trois réflexes qui évitent la moitié des rejets

  1. Ne jamais manipuler des montants en flottant. Utilisez des décimaux (ou des chaînes) de bout en bout. Le Schematron compare des égalités exactes : 0.1 + 0.2 vaut 0.30000000000000004, et une facture entière peut se faire refuser pour un centime fantôme.
  2. Recalculer les totaux à partir des lignes, plutôt que de transmettre ceux que votre base a stockés. Un total historisé et une ligne modifiée après coup, et l'égalité tombe.
  3. Valider avant d'envoyer, pas après le rejet. Le validateur en ligne est gratuit et sans inscription ; en intégration continue, POST /v1/validate fait la même chose sans consommer de quota.

Le cas où l'on ne voit jamais ces erreurs

Chez nous, la validation XSD + Schematron s'exécute à chaque génération, et un document qui échoue n'est pas livré : l'API répond 422 avec la liste des règles en échec. L'erreur arrive donc au moment où on peut encore la corriger — pas trois jours plus tard, dans un accusé de rejet.

Tester une facture existante

Déposez un PDF : XML embarqué, profil détecté, contrôles XSD et Schematron. Gratuit, sans inscription, rien n'est conservé.

Ouvrir le validateur Obtenir une clé API