En 2026, la facture est à la fois un actif de marque et un objet de conformité
L'exercice 2026 a redéfini ce qu'une facture est censée faire. Ce n'est plus une simple demande de paiement statique—c'est un objet de données structurées consommé par les autorités fiscales, un point de contact identitaire que votre client voit au moment où l'argent est en jeu, et un enregistrement traitable par machine qui doit survivre aux audits, aux réseaux d'e-facturation et aux moteurs de rapprochement pilotés par IA. Odoo 19, avec la révélation d'Odoo 20 prévue lors des événements OXP en septembre 2026, est la version où les décisions de personnalisation cessent d'être cosmétiques et commencent à porter un vrai poids financier.
Le climat tarifaire rend le constat incontournable. Depuis avril 2026, les abonnements Enterprise encore sur des versions antérieures à v17 sont soumis à une surtaxe de 25 % pour version obsolète, qui s'ajoute à une hausse de 30 % sur le marché nord-américain et à une indexation annuelle de 7 %. Bien personnaliser ses factures aujourd'hui, c'est d'abord migrer vers une version supportée à jour, puis bâtir par-dessus les mises en page natives, les extensions Studio et l'héritage QWeb d'une manière qui survit aux deux prochaines mises à niveau.
Ce guide parcourt chaque couche de la personnalisation des factures en 2026 : le moteur de mise en page, les sections dynamiques, les champs personnalisés, l'éditeur de rapports Studio, l'ingénierie QWeb & XPath, l'e-facturation Peppol, les codes QR EPC, l'automatisation assistée par IA, et le manuel de dépannage pour les pannes qui cassent réellement les PDF en production.
Le paysage de migration 2026 : pourquoi votre stratégie facture commence par une décision de version
La feuille de route 2026 d'Odoo suit une stratégie de migration en trois vagues qui place la finance et la conformité en premier. La raison est simple : l'e-facturation obligatoire en Europe, dans certaines régions d'Amérique latine, dans le Golfe et chez une liste croissante d'acheteurs publics en Amérique du Nord exige que les documents financiers soient à la fois lisibles par l'humain et traitables par machine. Si vous personnalisez une facture sur une version obsolète, vous personnalisez un document qui ne correspond plus à l'intégrité structurelle des données qu'attend votre administration fiscale.
| Version | Statut (avril 2026) | Surtaxe | Surface principale de personnalisation |
|---|---|---|---|
| Odoo 14–16 | Obsolète | +25 % | XML-RPC classique, QWeb brut |
| Odoo 17 | Couverte | 0 % | QWeb, Studio, UI moderne |
| Odoo 18 | Couverte | 0 % | Fonctionnalités IA-first, Studio, QWeb |
| Odoo 19 | Dernière stable | 0 % | Agents IA, vibe coding, sidebar repliable |
| Odoo 20 | Révélation sept. 2026 | n/a | Roadmap OXP globale, IA avancée |
Côté développeur, le virage architectural se poursuit. Les endpoints d'intégration XML-RPC classiques sont désormais programmés pour suppression en v22, ce qui laisse aux équipes une fenêtre de transition pour migrer leurs systèmes externes qui consomment des données de factures vers le protocole JSON-2, plus efficace. Considérez cette fenêtre comme partie intégrante de votre stratégie facture, pas comme un projet séparé : c'est la façon dont les factures sont récupérées, signées et rendues en aval qui fait ou défait une migration.
Si vous êtes encore en v15 ou v16, le chemin le moins cher vers une facture personnalisée n'est pas de retoucher votre vieux modèle—c'est de migrer d'abord en v19, puis d'empiler la personnalisation par-dessus. La surtaxe de 25 % éclipse souvent à elle seule le coût d'une migration finance Wave 1 propre.
Mise en page native : la fondation no-code dont hérite chaque facture
Avant de toucher au XML ou au Python, chaque facture Odoo doit être configurée au niveau de la Mise en page du document. C'est le moteur no-code qui définit l'identité visuelle partagée entre devis, commandes, factures et avoirs. Faites-le correctement et l'essentiel de votre travail de personnalisation disparaît.
Où la trouver
Allez dans Paramètres › Paramètres généraux › Sociétés › Mise en page du document puis cliquez sur Configurer la mise en page du document. La fenêtre modale expose quatre cadres de mise en page, chacun calé sur un rythme sectoriel différent :
| Mise en page | Signature visuelle | Cible idéale |
|---|---|---|
| Boxed | Cellules définies, bordures dures | Fabrication, construction, environnements à fort enjeu d'audit |
| Bold | Typographie marquée, en-têtes très contrastés | Services modernes, agences, cabinets créatifs |
| Striped | Arrière-plans de lignes alternés | Gros, distribution, factures à longues lignes |
| Light | Minimaliste, content-first | Retail, luxe, B2C de marque |

Pas-à-pas : configurer la mise en page native
- Ouvrez le tableau de bord — connectez-vous à l'environnement v19 et ouvrez le module Comptabilité ou Facturation.
- Paramètres › Configuration — déroulez jusqu'au bloc Sociétés.
- Configurer la mise en page du document — choisissez le cadre qui correspond à votre positionnement de marque.
- Branding — uploadez un logo PNG ou SVG, fixez les couleurs primaire et secondaire via le sélecteur hex, choisissez l'alignement (gauche / centre / droite).
- Typographie & arrière-plan — choisissez une police corporate (v19 a élargi le registre des polices riches ; pas besoin de CSS personnalisé dans la majorité des cas) et sélectionnez un style d'arrière-plan (Vide, Logo de démo, Upload personnalisé).
- Slogan & pied de page — ajoutez la baseline de l'entreprise, les certifications (numéros ISO, statut B-Corp, etc.) et la mention légale du pied de page.
- Continuer — sauvegarde les paramètres globaux et les applique à chaque document externe, dont les factures.
Le champ slogan est le meilleur endroit pour les références ISO/SOC 2, les accréditations sectorielles ou les certifications QHSE. Il apparaît sur chaque document client sans polluer le corps principal et élimine le ticket récurrent « peux-tu ajouter le numéro de certification ? » reçu par la finance.
Sections dynamiques, contrôles de visibilité et où devraient vraiment vivre les données de facture
Odoo 19 a fait passer la gestion des sections de facture d'une corvée réservée aux développeurs à une capacité utilisateur fonctionnelle. Vous pouvez désormais réorganiser, dupliquer ou masquer des sections entières d'une facture client depuis la vue formulaire elle-même—sans mise à jour de module, sans édition XML, sans cycle de QA.
Gestion des sections et sous-sections
Dans le formulaire de facture, des poignées de glisser-déposer permettent de découper les lignes en sections nommées (« Phase 1 Cadrage », « Phase 2 Implémentation ») et en sous-sections (« Jours sur site », « Heures à distance »). Ce schéma est précieux pour la facturation projet où le client veut voir comment le total a été construit.
Visibilité granulaire sur le PDF imprimé
Au sein de chaque section, trois bascules indépendantes contrôlent ce que le client voit réellement sur le PDF rendu :
- Masquer les prix — utile pour les lignes de bonus offert ou les factures « synthèse » où seuls les totaux sont divulgués.
- Masquer les taxes — pour les factures à l'export, les scénarios d'autoliquidation intra-UE ou un nettoyage cosmétique.
- Masquer toute la section — permet de garder des notes internes, des ventilations par centre de coûts ou des lignes analytiques sur l'enregistrement de facture sans jamais les exposer au destinataire.
Déplacer les champs répétitifs de la facture vers le contact
L'onglet Autres infos reste le dépôt central pour la Référence client, la Référence de paiement et les Incoterms. La bonne pratique 2026, en revanche, est de renvoyer ces données vers la fiche contact. Définir les positions fiscales, les conditions de paiement, la banque préférée et les comptes clients sur la fiche contact (Comptabilité › Clients › Clients) signifie que chaque nouvelle facture se pré-remplit correctement, ce qui élimine la reprise par facture.
| Donnée de facture | Origine recommandée | Pourquoi c'est important |
|---|---|---|
| Date de facture | Auto-remplie à la confirmation | Détermine la date d'émission officielle et la période fiscale |
| Banque destinataire | Journal / onglet Autres infos | Détermine l'IBAN encodé dans le QR code EPC |
| Position fiscale | Fiche contact | Mappe les substitutions de taxes et le remappage de comptes à grande échelle |
| Conditions de paiement | Contact / commande | Définit les échéanciers et le texte d'escompte de paiement anticipé |
Odoo Studio : ajouter des champs personnalisés et éditer les rapports sans écrire de module
Studio occupe le terrain intermédiaire entre les paramètres natifs et le code complet. C'est l'outil adapté quand vous avez besoin d'un champ qui n'existe pas en standard, d'une colonne sur le PDF imprimé, ou d'un bloc conditionnel—sans le coût d'un module personnalisé livré en production.
Pas-à-pas : ajouter un champ personnalisé via Studio
- Ouvrez une facture et cliquez sur l'icône clé à molette (Activer Studio) en haut à droite.
- Choisissez la vue Formulaire ; Studio affiche une barre latérale avec les types de champs.
- Glissez-déposez le type de champ dont vous avez besoin (Monétaire, Sélection, Many2One, Lié, etc.) sur le formulaire.
- Configurez les propriétés :
- Libellé — ex. « Éco-contribution »
- Nom technique — Studio préfixe avec
x_studio_ - Visibilité — obligatoire, invisible ou pilotée par domaine
- Pour les champs relationnels, fixez le modèle cible (par ex.
res.userspour un commercial secondaire)
- Fermez Studio — vous revenez à l'interface standard avec le champ en place.

L'éditeur de rapports Studio
L'éditeur de rapport PDF en v19 dévie de l'éditeur de formulaire. Au lieu de glisser des champs, vous composez les modèles avec des commandes slash et des blocs conditionnels :
| Fonctionnalité | Fonctionnement | Cas d'usage |
|---|---|---|
| Rapport Externe / Interne / Vierge | Modèles de départ depuis l'assistant nouveau-rapport | Utilisez Externe pour les factures—conserve l'en-tête/pied de page société |
| Commandes slash | Tapez / pour insérer tableaux, champs, blocs conditionnels | Ajouter une colonne « Référence fabricant / Marque » |
| Blocs conditionnels | Rectangles en pointillés bornés par une expression logique | Afficher l'adresse de livraison uniquement si elle diffère de la facturation |
| Groupes de visibilité | Restreint des sections du rapport à un groupe d'utilisateurs | Réserver le détail des marges au groupe Comptabilité / Manager |
Studio est le bon choix jusqu'au point où vos modifications doivent interagir avec des champs calculés, plusieurs rapports hérités ou un CSS partagé entre documents. Dès que vous devez coordonner les xpaths de deux modules ou surcharger une méthode de account.move, basculez sur un module personnalisé—le XML généré par Studio est correct, mais il n'est pas ce que vous voulez comme source de vérité pour des personnalisations qui survivent aux mises à niveau.
QWeb & XPath : ingénierie de personnalisations qui survivent aux mises à niveau
Pour tout ce qui dépasse le plafond de Studio, la bonne réponse est l'héritage QWeb depuis un module personnalisé. La règle cardinale est la même qu'elle l'a toujours été : hériter, ne pas surcharger. Les éditions directes sur account.report_invoice_document sont effacées à chaque mise à niveau. Les modèles hérités survivent parce que l'ORM les applique en couche par-dessus la base.
Anatomie d'un rapport de facture personnalisé
Chaque rapport a deux pièces : un enregistrement ir.actions.report (les métadonnées) et un modèle QWeb (la structure). Le rapport de facture personnalisé minimum :
Pour un approfondissement orienté développeur sur les modèles de factures QWeb—numéros de PO, codes projet, instructions de virement, mises en page multi-sociétés, contenu conditionnel—voir notre guide compagnon Level Up Your Billing : A Step-by-Step Guide to Customizing Odoo Invoices.
<odoo>
<record id="action_report_custom_invoice"
model="ir.actions.report">
<field name="name">Premium Invoice Template</field>
<field name="model">account.move</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">
my_module.custom_invoice_template
</field>
<field name="binding_model_id"
ref="account.model_account_move"/>
</record>
<template id="custom_invoice_template"
inherit_id="account.report_invoice_document">
<xpath expr="//div[@name='reference']"
position="after">
<div t-if="o.x_customer_po"
class="col-auto col-3 mw-100 mb-2">
<strong>Customer PO:</strong>
<p class="m-0" t-field="o.x_customer_po"/>
</div>
</xpath>
</template>
</odoo>Antisèche des positions XPath
| Position | Effet | Quand l'utiliser |
|---|---|---|
replace | Supprime entièrement l'élément cible | Refondre le bloc adresse pour la conformité légale |
after / before | Insertion en frère | Ajouter un Chef de projet à côté du Vendeur |
inside | Insertion en enfant | Ajouter une mention dans le bloc CGV |
attributes | Modifie class / style / data-* | Ajouter des utilitaires Bootstrap 5, couleurs de marque |
Évitez les sélecteurs positionnels comme //table/tbody/tr[last()]. Dès qu'un autre module (sale_stock, l10n_*, pack OCA) hérite du même modèle et ajoute des lignes, votre « dernière ligne » devient la leur. Ciblez plutôt les ancres nommées : //div[@name='payment_term'], //div[@name='reference'], //div[@name='total']. Elles sont stables d'une mise à niveau à l'autre et dans tout l'écosystème OCA.
Rendre des images binaires sur le PDF
L'obstacle technique numéro un en v19 sur les factures : les photos produits s'affichent dans l'aperçu web mais disparaissent du PDF. Le moteur wkhtmltopdf ne peut pas récupérer les champs binaires d'image comme le fait le navigateur. La parade est de les embarquer en base64 via le widget image :
<span t-esc="line.product_id.image_128"
t-options="{
'widget': 'image',
'max_width': '64',
'class': 'rounded'
}"/>Peppol, codes QR EPC et total en lettres : personnaliser pour la conformité
Le focus Wave 1 finance de 2026 est porté par l'e-facturation obligatoire. Personnaliser une facture sans intégrer Peppol, les codes QR EPC et les structures spécifiques aux locales, c'est livrer un travail incomplet—il échouera dès que vous expédierez à l'international ou onboarderez un client du secteur public.
Activer Peppol dans Odoo 19
- Ouvrez
Comptabilité › Configuration › Paramètres › Facturation électroniqueet cliquez sur Activer Peppol. - Fournissez l'identifiant d'endpoint Peppol (numéro de TVA ou GLN).
- Pour chaque client, fixez le format e-facture sur l'onglet Comptabilité de la fiche contact (Factur-X, UBL, CII, etc.).
- Lorsque la facture est envoyée, v19 attache automatiquement le XML structuré à côté du PDF.

Codes QR EPC / SEPA

Customer Payments. L'activation du bon format par région détermine le QR rendu en bas de la facture imprimée.- Dans
Comptabilité › Configuration › Paramètres, activez Codes QR sous Paiements clients. - Vérifiez que le journal bancaire porte à la fois IBAN et BIC.
- Renseignez le champ Banque destinataire sur l'onglet Autres infos de la facture.
- Odoo génère automatiquement le code QR EPC en bas du document imprimé ; les clients de la zone SEPA peuvent payer en scannant via leur appli bancaire.


Les équivalents régionaux sont supportés via les modules de localisation : Pix (Brésil), FPS (Hong Kong), VietQR (Vietnam) et les diverses localisations du CCG.
Total en lettres
Dans plusieurs juridictions, le total écrit en toutes lettres est une obligation légale destinée à empêcher la falsification après impression. Activez-le sous Comptabilité › Configuration › Paramètres › Factures clients › Afficher le total en lettres. Pour un contrôle par journal (forçage en majuscules, surcharges de langue pour les factures bilingues), plusieurs modules de qualité OCA exposent une configuration au niveau journal sans forker le cœur.
L'IA dans la facturation : OCR, Ask AI et vibe coding
Dans Odoo 19, l'IA est la couche d'interaction de l'ERP, pas un sidecar. Pour le travail facture, cela se traduit par trois capacités concrètes autour desquelles concevoir vos personnalisations :
- OCR + préférences d'apprentissage — le moteur qui digitalise les factures fournisseurs alimente aussi des modèles taillés par fournisseur. Les corrections manuelles entraînent un profil par fournisseur qui s'améliore avec l'usage.
- Agent Ask AI —
Ctrl + Kou le bouton de la barre supérieure ; requêtes conversationnelles sur les données de facturation, synthèse de l'historique de litige, traduction automatique des messages du chatter, recherche sémantique (« trouve la facture de l'audit ESG de septembre dernier »). - Vibe coding & génération d'images (v19.2) — décrivez un portail ou une mise en page de document en langage naturel, générez des visuels produits directement dans l'ERP. Les mêmes images produits coulent automatiquement dans vos modèles de factures personnalisés.
Quand vous concevez des champs de facture personnalisés, préférez des champs bien nommés et bien typés à des dépôts de Char en texte libre. L'agent Ask AI et le moteur de modèles OCR raisonnent sur vos données via les libellés et les types de champs—nommer un champ x_customer_po_number avec un texte d'aide donne une automatisation nettement meilleure que x_studio_field_4d2a1.
Trois pièges de production qui cassent la personnalisation des factures
Paramètre système report.url manquant
Vous avez mis à niveau une stack v19 conteneurisée et les PDF sortent vides, sans en-tête ou dépouillés de leurs feuilles de style. Le moteur de rendu n'arrive pas à résoudre les URL des assets internes parce que le paramètre système report.url n'est pas défini.
Définissez report.url dans Paramètres › Technique › Paramètres système à l'adresse interne sur laquelle Odoo peut s'atteindre lui-même (ex. http://localhost:8069 en déploiement single-container, ou l'URL de service Docker interne quand le worker n'est pas dans le même conteneur que Nginx). Les PDF se rendent immédiatement après.
Flexbox / CSS Grid dans la feuille de style QWeb
Votre facture est parfaite dans l'aperçu d'impression de Chrome, puis arrive chez le client avec tout empilé, qui se chevauche ou disparaît. wkhtmltopdf est un fork WebKit de 2020—il parle CSS 2.1 et un CSS3 partiel, mais pas flexbox, pas grid, pas les propriétés personnalisées.
Utilisez le row/col-* de Bootstrap, des layouts en table et display: inline-block. Validez contre le binaire wkhtmltopdf 0.12.6/0.12.7 réel, pas contre l'aperçu navigateur. PostCSS en v19 fait déjà du tree-shaking sur les styles inutilisés—tirez-en parti.
Devises, symboles et libellés de taxe en dur
Un modèle localisé US passe très bien chez les clients domestiques, puis un client québécois ou saoudien reçoit des factures avec le mauvais symbole, le mauvais séparateur décimal ou la mauvaise mention de taxe. Les formatages en dur s'effondrent dès que les factures traversent une frontière.
Utilisez toujours t-field avec t-options='{"widget": "monetary"}' pour les montants, {"widget": "date"} pour les dates, et lisez les libellés de taxe depuis tax_id.description/tax_id.name. Ne codez jamais en dur les symboles de devise ou les noms de taxes ; le couple société / position fiscale encode déjà le rendu correct.
Ce que rapporte une facture correctement personnalisée
La personnalisation des factures n'est pas une ligne de branding—c'est un levier sur le BFR et une couverture de conformité :
Coordonnées bancaires claires, codes QR EPC embarqués et conditions de paiement visibles compriment le cycle AP côté client de plusieurs jours en moyenne.
Numéros de PO, codes projet et instructions de virement remontés sur le document éliminent les allers-retours qu'absorbe aujourd'hui votre équipe finance.
XML Peppol, total en lettres, codes QR régionaux et localisation propre rendent chaque facture défendable en audit dans toutes les juridictions où vous expédiez.
Pour une organisation qui émet 500 factures par mois à une valeur moyenne de 10 000 $, une amélioration de 5 jours du DSO libère environ 833 000 $ de fonds de roulement—un résultat de niveau CFO obtenu via un projet de modèle ponctuel et une activation Peppol.
Le parcours (e-)facturation de l'Odoo Academy
Le parcours 2026 de l'Academy sur l'e-facturation est structuré comme une progression de 2 heures 2 minutes qui amène les équipes des fondations base de données jusqu'à Peppol, en passant par les localisations régionales (Vietnam Form 01/GTGT, CCG/Arabie saoudite, etc.) et la transmission par le comptable. Il se marie bien avec ce guide comme compagnon pratique — cours complet sur Odoo Academy : (e-)facturation.
| Module | Sujet | Durée |
|---|---|---|
| 1 | Introduction à la facturation | 2 min |
| 2 | Création et configuration de la base | 13 min |
| 3 | Ventes : du devis à la facture | 15 min |
| 4 | Achats & Peppol | 9 min |
| 5 | Facturation récurrente & contrats | 15 min |
| 6 | Paiements & rapprochement | 12 min |
| 7 | Workflows de l'app mobile | 6 min |
| 8 | Reporting & analyse | 8 min |
| 9 | Transmission par le comptable | 2 min |