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
| Code | Ce que la règle exige | Cause 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
- 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.2vaut0.30000000000000004, et une facture entière peut se faire refuser pour un centime fantôme. - 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.
- Valider avant d'envoyer, pas après le rejet. Le
validateur en ligne est gratuit et sans
inscription ; en intégration continue,
POST /v1/validatefait 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