Guide6 mai 2026 · 12 min de lecture · Par Rachid El Kedmiri, Architecte Odoo Senior

Comment personnaliser vos factures Odoo :
Modèles, champs & design — Guide 2026

INTRODUCTION

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.

01

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.

VersionStatut (avril 2026)SurtaxeSurface principale de personnalisation
Odoo 14–16Obsolète+25 %XML-RPC classique, QWeb brut
Odoo 17Couverte0 %QWeb, Studio, UI moderne
Odoo 18Couverte0 %Fonctionnalités IA-first, Studio, QWeb
Odoo 19Dernière stable0 %Agents IA, vibe coding, sidebar repliable
Odoo 20Révélation sept. 2026n/aRoadmap 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.

Lecture stratégique

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.

02

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 pageSignature visuelleCible idéale
BoxedCellules définies, bordures duresFabrication, construction, environnements à fort enjeu d'audit
BoldTypographie marquée, en-têtes très contrastésServices modernes, agences, cabinets créatifs
StripedArrière-plans de lignes alternésGros, distribution, factures à longues lignes
LightMinimaliste, content-firstRetail, luxe, B2C de marque
Fenêtre modale Configurer la mise en page d'Odoo 19 montrant les quatre cadres de mise en page (Boxed, Bold, Striped, Light) avec sélecteur de logo, couleurs de marque, police et aperçu en direct
La fenêtre Mise en page du document dans Odoo 19 — quatre cadres, upload du logo, couleurs de marque, choix de police et aperçu de facture en direct, le tout sans écrire une ligne de code.

Pas-à-pas : configurer la mise en page native

  1. Ouvrez le tableau de bord — connectez-vous à l'environnement v19 et ouvrez le module Comptabilité ou Facturation.
  2. Paramètres › Configuration — déroulez jusqu'au bloc Sociétés.
  3. Configurer la mise en page du document — choisissez le cadre qui correspond à votre positionnement de marque.
  4. Branding — uploadez un logo PNG ou SVG, fixez les couleurs primaire et secondaire via le sélecteur hex, choisissez l'alignement (gauche / centre / droite).
  5. 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é).
  6. 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.
  7. Continuer — sauvegarde les paramètres globaux et les applique à chaque document externe, dont les factures.
Pourquoi le slogan compte

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.

03

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 factureOrigine recommandéePourquoi c'est important
Date de factureAuto-remplie à la confirmationDétermine la date d'émission officielle et la période fiscale
Banque destinataireJournal  /  onglet Autres infosDétermine l'IBAN encodé dans le QR code EPC
Position fiscaleFiche contactMappe les substitutions de taxes et le remappage de comptes à grande échelle
Conditions de paiementContact  /  commandeDéfinit les échéanciers et le texte d'escompte de paiement anticipé
04

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

  1. Ouvrez une facture et cliquez sur l'icône clé à molette (Activer Studio) en haut à droite.
  2. Choisissez la vue Formulaire ; Studio affiche une barre latérale avec les types de champs.
  3. Glissez-déposez le type de champ dont vous avez besoin (Monétaire, Sélection, Many2One, Lié, etc.) sur le formulaire.
  4. 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.users pour un commercial secondaire)
  5. Fermez Studio — vous revenez à l'interface standard avec le champ en place.
Barre latérale Odoo Studio sur un formulaire de facture montrant la palette de types de champs et un champ x_studio personnalisé configuré avec libellé, nom technique et propriétés de visibilité
La barre latérale d'Odoo Studio sur un formulaire de facture — glissez un type de champ sur la mise en page, puis configurez libellé, nom technique, visibilité et cibles relationnelles sans quitter le navigateur.

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éFonctionnementCas d'usage
Rapport Externe / Interne / ViergeModèles de départ depuis l'assistant nouveau-rapportUtilisez Externe pour les factures—conserve l'en-tête/pied de page société
Commandes slashTapez / pour insérer tableaux, champs, blocs conditionnelsAjouter une colonne « Référence fabricant / Marque »
Blocs conditionnelsRectangles en pointillés bornés par une expression logiqueAfficher l'adresse de livraison uniquement si elle diffère de la facturation
Groupes de visibilitéRestreint des sections du rapport à un groupe d'utilisateursRéserver le détail des marges au groupe Comptabilité / Manager
Studio connaît ses limites

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.

05

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.

XML — reports/invoice_report.xml
<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

PositionEffetQuand l'utiliser
replaceSupprime entièrement l'élément cibleRefondre le bloc adresse pour la conformité légale
after / beforeInsertion en frèreAjouter un Chef de projet à côté du Vendeur
insideInsertion en enfantAjouter une mention dans le bloc CGV
attributesModifie class / style / data-*Ajouter des utilitaires Bootstrap 5, couleurs de marque
Utilisez des ancres nommées

É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 :

QWeb — rendre l'image produit sur chaque ligne
<span t-esc="line.product_id.image_128"
      t-options="{
        'widget': 'image',
        'max_width': '64',
        'class': 'rounded'
      }"/>
06

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

  1. Ouvrez Comptabilité › Configuration › Paramètres › Facturation électronique et cliquez sur Activer Peppol.
  2. Fournissez l'identifiant d'endpoint Peppol (numéro de TVA ou GLN).
  3. Pour chaque client, fixez le format e-facture sur l'onglet Comptabilité de la fiche contact (Factur-X, UBL, CII, etc.).
  4. Lorsque la facture est envoyée, v19 attache automatiquement le XML structuré à côté du PDF.
Panneau Peppol Registration d'Odoo 19 montrant un enregistrement actif avec l'identifiant d'endpoint et un bouton Send pour les e-factures sortantes
Un enregistrement Peppol actif dans Odoo 19. Une fois l'endpoint vérifié, chaque facture client confirmée embarque le XML structuré à côté du PDF.

Codes QR EPC / SEPA

Panneau de paramètres Customer Payments d'Odoo listant les formats de paiement QR disponibles dont SEPA QR, Pix, FPS et VietQR
Les méthodes de paiement QR exposées sous Customer Payments. L'activation du bon format par région détermine le QR rendu en bas de la facture imprimée.
  1. Dans Comptabilité › Configuration › Paramètres, activez Codes QR sous Paiements clients.
  2. Vérifiez que le journal bancaire porte à la fois IBAN et BIC.
  3. Renseignez le champ Banque destinataire sur l'onglet Autres infos de la facture.
  4. 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.
Bascule SEPA QR Code activée dans les paramètres Odoo avec le texte d'aide Add a payment QR code to your invoices
La bascule SEPA QR Code est l'unique interrupteur qui fait apparaître les données de paiement EPC sur chaque facture imprimée.
Code QR EPC rendu en bas d'une facture client Odoo imprimée avec l'invitation Scan me with your bank app to pay
Le résultat sur le PDF : un seul scan avec une appli bancaire de la zone SEPA pré-remplit IBAN, bénéficiaire, montant et référence.

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.

07

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 AICtrl + K ou 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.

08

Trois pièges de production qui cassent la personnalisation des factures

1

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.

Correctif

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.

2

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.

Correctif

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.

3

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.

Correctif

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.

ROI MÉTIER

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é :

5–8 joursDSO réduit

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.

60 %Tickets AR en moins

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.

100 %Couverture conformité

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.

PARCOURS

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.

ModuleSujetDurée
1Introduction à la facturation2 min
2Création et configuration de la base13 min
3Ventes : du devis à la facture15 min
4Achats & Peppol9 min
5Facturation récurrente & contrats15 min
6Paiements & rapprochement12 min
7Workflows de l'app mobile6 min
8Reporting & analyse8 min
9Transmission par le comptable2 min

Ouvrir le cours Odoo Academy : (e-)facturation →

D'Odoo 19 à Odoo 20 : personnalisez une fois, capitalisez pour toujours

Le chemin vers Odoo 20 fin 2026 est fondamentalement une trajectoire finance et conformité. La personnalisation des factures en est l'expression la plus visible—chaque champ, chaque section, chaque xpath QWeb capitalise de la valeur à la prochaine mise à niveau, ou devient une dette technique que la surtaxe legacy de 25 % finira par chiffrer.

Personnalisez à la bonne couche. Utilisez la mise en page du document pour le branding, les sections et la fiche contact pour l'hygiène des données, Studio pour les champs tactiques, et un module personnalisé avec héritage QWeb pour tout ce qui doit survivre aux deux prochaines mises à niveau. Câblez Peppol, les codes QR EPC et le total en lettres dès le départ, pas en projet de suivi. Alignez les champs alimentant l'IA avec un nommage sémantique pour que l'OCR et Ask AI puissent raisonner dessus. Fait dans cet ordre, vos factures cessent d'être un centre de coûts récurrent pour redevenir l'actif opérationnel qu'elles ont toujours dû être.

Réservez un audit facture gratuit