Un client appelle au sujet d'un lot défectueux de composants électroniques reçu la semaine dernière. Votre responsable d'entrepôt ouvre l'ERP, cherche le bon de livraison… et ne trouve rien : aucun numéro de lot, aucun numéro de série, aucun lien vers l'expédition fournisseur d'origine. Ce scénario se répète chaque jour dans les entreprises qui négligent la configuration des lots et numéros de série lors de leur déploiement Odoo. La traçabilité ne s'improvise pas : elle se conçoit. Ce guide couvre chaque couche du suivi des lots et numéros de série dans Odoo 19, de la réception au client.
Ce que vous allez apprendre
- La différence entre suivi par lot et suivi par numéro de série, et quand utiliser chacun.
- Comment configurer un produit pour la traçabilité dans Odoo 19.
- Comment affecter les numéros à la réception et à la livraison.
- Comment exploiter les rapports de traçabilité amont et aval.
- Comment gérer les dates de péremption, la stratégie FEFO et les rappels produit.
- Les erreurs qui cassent la traçabilité en production, et comment les éviter.
Votre inventaire ne vaut que par votre capacité à le tracer
En bref : Odoo embarque des fonctions de traçabilité puissantes, mais elles exigent une configuration délibérée — la traçabilité n'arrive pas par défaut, elle se conçoit.
Quand un client signale un défaut, la seule façon d'enquêter sans traçabilité est de recouper manuellement bons de commande, dates de livraison et factures fournisseurs : un travail de plusieurs heures au lieu de quelques secondes. Ce délai n'est pas qu'un inconfort opérationnel ; en cas de rappel réglementaire, il devient un risque juridique et commercial majeur. Pour un dirigeant, la traçabilité est moins un projet d'entrepôt qu'un investissement de gestion du risque.
Le module Inventaire d'Odoo gère deux mécanismes de suivi distincts : par lot et par numéro de série. Bien configurés, ils permettent de remonter toute la chaîne, du fournisseur qui vous a livré jusqu'au client qui a reçu la marchandise. Mal configurés — ou pas du tout — ils laissent des trous béants dans votre piste d'audit. Ce guide détaille chaque étape, avec les modèles Python et vues XML réels d'Odoo 19, afin que vous compreniez ce qui se passe sous le capot.
Si vous débutez sur le module stock, commencez par notre présentation du module Inventaire d'Odoo, puis revenez ici pour la couche traçabilité. Les deux se complètent : l'un pose les bases du stock, l'autre garantit que chaque mouvement est traçable de bout en bout.
Suivi par lot ou par numéro de série : lequel choisir ?
En bref : le suivi par lot regroupe plusieurs unités sous un même numéro (idéal pour les rappels par batch) ; le numéro de série identifie chaque unité individuellement (idéal pour le SAV et la garantie).
Choisir le mauvais mécanisme crée des difficultés opérationnelles pénibles à corriger une fois le stock en service. Comprendre la différence en amont vous épargne des heures de nettoyage de données. Le tableau ci-dessous synthétise les critères de décision.
| Critère | Suivi par lot | Suivi par numéro de série |
|---|---|---|
| Unicité | Un numéro de lot couvre plusieurs unités (ex. 500 unités dans le lot A2024-03) | Chaque unité reçoit un numéro de série unique |
| Quantité par numéro | Quantité libre | Exactement 1,00 |
| Idéal pour | Agroalimentaire, chimie, pharma, matières premières, vrac | Électronique, machines, véhicules, actifs de valeur, garantie |
| Dates de péremption | Par lot — toutes les unités partagent la même date | Par série — rarement utilisé |
| Portée du rappel | Rappel d'un lot entier (rappel par batch) | Rappel d'unités individuelles par numéro de série |
| Charge opérationnelle | Faible — un scan par batch | Élevée — un scan par unité |
| Champ Odoo | tracking = 'lot' | tracking = 'serial' |
Cadre de décision. Posez-vous la question : « Si ce produit est défectueux, dois-je rappeler chaque unité individuellement, ou puis-je rappeler tout le lot de production ? » Si vous avez besoin du rappel unitaire (garantie, suivi d'actifs), utilisez les numéros de série. Si le rappel par batch suffit (sécurité alimentaire, conformité chimique), utilisez les lots. Et si vous n'avez aucun besoin de rappel, n'activez pas le suivi : il ajoute une charge de scan à chaque opération d'entrepôt.
Comment configurer un produit pour la traçabilité dans Odoo 19 ?
En bref : la configuration se fait sur la fiche produit ; changer le type de suivi sur un produit déjà en stock impose une migration délicate — faites-le bien dès le départ.
Une fois le type de suivi défini et des mouvements de stock traités, modifier ce type sur un produit ayant des quants existants devient une opération à risque. La règle est simple : bien régler la traçabilité lors du paramétrage initial.
Étape 1 — Activer le suivi sur la fiche produit
Allez dans Inventaire → Produits → Produits, ouvrez un produit, puis l'onglet Inventaire. Dans la section Traçabilité, renseignez le champ Suivi :
# Dans stock/models/product_template.py
class ProductTemplate(models.Model):
_inherit = "product.template"
tracking = fields.Selection(
selection=[
("none", "Pas de suivi"),
("lot", "Par lots"),
("serial", "Par numero de serie unique"),
],
string="Suivi",
default="none",
required=True,
help="Assure la tracabilite d'un produit stockable "
"dans votre entrepot.",
)
Étape 2 — Activer Lots & Numéros de série dans les paramètres
Avant que le champ de suivi n'apparaisse sur la fiche produit, activez la fonctionnalité globalement. Allez dans Inventaire → Configuration → Paramètres et activez Lots & Numéros de série dans la section Traçabilité. Cela active le modèle stock.lot et ajoute le champ de suivi à la fiche produit :
<record id="stock.action_stock_config_settings"
model="ir.actions.act_window">
<field name="res_model">res.config.settings</field>
</record>
<!-- Le parametre controle group_stock_lot -->
<field name="group_stock_lot"
string="Lots & Numeros de serie"
implied_group="stock.group_stock_lot"
help="Suivre les produits par lots ou numeros de serie"/>
Étape 3 — Configurer la génération automatique (optionnel)
Odoo 19 peut générer automatiquement les numéros de lot ou de série à la réception. Cela évite la saisie manuelle et impose une nomenclature cohérente. Configurez-le via Inventaire → Configuration → Paramètres → Traçabilité :
class StockPickingType(models.Model):
_inherit = "stock.picking.type"
use_create_lots = fields.Boolean(
string="Creer de nouveaux lots/numeros de serie",
default=True,
help="Si coche, de nouveaux lots/numeros de serie "
"peuvent etre crees pendant ce type d'operation.",
)
use_existing_lots = fields.Boolean(
string="Utiliser des lots/numeros existants",
default=True,
help="Si coche, des lots/numeros existants peuvent "
"etre selectionnes pendant cette operation.",
)
# Configurer le motif de generation via la sequence :
# Inventaire > Configuration > Gestion des entrepots
# > Types d'operations > Receptions
# Definir un prefixe de sequence "Lot/Numero de serie", ex. :
# LOT/{{product.default_code}}/%(year)s-
# Genere : LOT/ELEC-001/2026-00001
Astuce nomenclature. Établissez une convention de nommage des lots/séries avant votre première réception. Un bon motif inclut la catégorie produit, l'année et un numéro séquentiel : FOOD-2026-00001 pour l'alimentaire, ELEC-SN-2026-00001 pour l'électronique. Une fois que les équipes commencent à scanner des noms de lot arbitraires, vous ne retrouverez jamais la cohérence sans migration de données.
Comment affecter les lots et numéros de série à la réception et à la livraison ?
En bref : Odoo impose l'affectation au niveau du mouvement de stock — impossible de valider une opération pour un produit suivi sans renseigner le lot ou le numéro de série.
La configuration ne sert à rien si votre équipe d'entrepôt n'affecte pas les numéros pendant les opérations. Odoo bloque la validation tant que le numéro manque, ce qui garantit l'intégrité de la chaîne. Voici le flux complet.
Affectation d'un lot à la réception
Quand un bon de commande génère une réception, les produits suivis exigent une affectation avant validation :
- Ouvrez la réception (Inventaire → Opérations → Réceptions).
- Cliquez sur Opérations détaillées (ou l'icône numéro de série) sur la ligne de mouvement.
- Pour un produit suivi par lot : saisissez le nom du lot (ou scannez le code-barres fournisseur) et la quantité reçue dans ce lot.
- Pour un produit suivi par série : saisissez chaque numéro individuellement, ou utilisez Générer les numéros de série pour créer une plage automatiquement.
- Cliquez sur Valider — Odoo crée les enregistrements
stock.lotet les lie aux mouvements de stock.
class StockLot(models.Model):
_name = "stock.lot"
_description = "Lot/Numero de serie"
name = fields.Char(
string="Numero de lot/serie",
required=True, index=True,
)
product_id = fields.Many2one(
"product.product", string="Produit",
required=True, index=True,
)
company_id = fields.Many2one(
"res.company", string="Societe",
required=True, index=True,
)
# Lien de tracabilite
quant_ids = fields.One2many(
"stock.quant", "lot_id",
string="Quants",
)
_sql_constraints = [
("unique_lot",
"unique(name, product_id, company_id)",
"Le numero de lot/serie doit etre unique "
"par produit et par societe !"),
]
Affectation d'un numéro de série à la livraison
Quand une commande client génère une livraison, Odoo demande à l'opérateur de préciser quel lot ou numéro de série est expédié. C'est le maillon critique qui rend possible la traçabilité de bout en bout — du fournisseur qui vous a livré au client qui reçoit :
# stock/models/stock_move.py (simplifie)
class StockMove(models.Model):
_inherit = "stock.move"
def _action_done(self):
for move in self:
if move.has_tracking != "none":
for ml in move.move_line_ids:
if not ml.lot_id and not ml.lot_name:
raise UserError(_(
"Vous devez fournir un numero de "
"lot/serie pour le produit : %s",
move.product_id.display_name,
))
if (move.has_tracking == "serial"
and ml.quantity > 1):
raise UserError(_(
"Un numero de serie ne peut etre lie "
"qu'a une seule unite de %s. "
"Quantite : %s",
move.product_id.display_name,
ml.quantity,
))
return super()._action_done()
Intégration du lecteur code-barres. Pour les entrepôts à fort volume, la saisie manuelle est rédhibitoire. Utilisez l'application Code-barres d'Odoo pour scanner les numéros de lot directement à la réception et à la livraison. Le scan renseigne automatiquement le champ lot sur la ligne de mouvement, élimine les fautes de frappe et réduit le temps de traitement par ligne d'environ 15 secondes à 2 secondes.
Comment tracer un produit du fournisseur au client ?
En bref : le rapport de traçabilité affiche, en une seule vue, chaque mouvement de stock lié à un lot ou numéro de série donné — l'outil de vos équipes qualité, SAV et conformité.
Allez dans Inventaire → Rapports → Traçabilité. Vous pouvez aussi y accéder depuis une fiche lot via le bouton intelligent Traçabilité. Le rapport montre la chaîne complète :
| Colonne | Ce qu'elle montre | Pourquoi c'est important |
|---|---|---|
| Référence | Référence de l'opération (WH/IN/00042, WH/OUT/00108) | Renvoie au document de réception ou livraison réel |
| Produit | Nom et référence interne | Confirme le bon produit tracé |
| Lot/Série | Le numéro de lot ou de série | Clé de recherche principale |
| Date | Horodatage du mouvement | Établit la chronologie de la chaîne de garde |
| De | Emplacement source (Fournisseur, WH/Stock…) | Indique d'où vient le produit |
| Vers | Emplacement destination (WH/Stock, Client…) | Indique où le produit est allé |
| Quantité | Unités déplacées dans l'opération | Suit combien d'unités du lot sont concernées |
Traçabilité amont et aval
- Traçabilité amont (remontante) : à partir d'un lot/série expédié à un client, remonter au fournisseur. Essentiel pour : « Le client signale un défaut — de quel batch fournisseur provient-il ? »
- Traçabilité aval (descendante) : à partir d'un lot fournisseur, retrouver tous les clients ayant reçu des unités. Essentiel pour : « Le fournisseur rappelle le batch X — quels clients sont concernés ? »
# Trouver tous les clients ayant recu un lot precis
lot = self.env["stock.lot"].search([
("name", "=", "LOT-2026-00042"),
("product_id.default_code", "=", "ELEC-001"),
], limit=1)
# Recuperer tous les mouvements sortants pour ce lot
outgoing_moves = self.env["stock.move.line"].search([
("lot_id", "=", lot.id),
("picking_id.picking_type_code", "=", "outgoing"),
("state", "=", "done"),
])
# Extraire les clients concernes
affected_customers = outgoing_moves.mapped(
"picking_id.partner_id"
)
for partner in affected_customers:
print(f"Client : {partner.name}, "
f"Livraison : {partner.picking_ids.mapped('name')}")
Intégrité de la piste d'audit. Le rapport ne vaut que par la qualité des données saisies. Si les équipes contournent l'affectation par une validation forcée, ou saisissent des lots fictifs (« TBD », « 123 »), la chaîne est rompue. Désactivez l'option de validation sans contrôle sur les types d'opérations des produits suivis, et formez vos équipes à traiter l'affectation lot/série comme une étape obligatoire. Pour aller plus loin sur les flux stock, consultez les méthodes de réservation de stock dans Odoo 19.
Comment gérer les dates de péremption et les rappels produit ?
En bref : pour les denrées périssables, le suivi par lot sans date de péremption est incomplet ; Odoo 19 étend le modèle stock.lot avec des dates qui alimentent la stratégie FEFO et les alertes.
Activez Dates de péremption dans Inventaire → Configuration → Paramètres → Traçabilité. Cela ajoute quatre champs de date à chaque lot :
class StockLot(models.Model):
_inherit = "stock.lot"
use_date = fields.Datetime(
string="A consommer de preference avant",
help="Date apres laquelle le produit peut commencer "
"a se deteriorer, sans etre necessairement dangereux.",
)
expiration_date = fields.Datetime(
string="Date d'expiration",
help="Date apres laquelle le produit devient dangereux "
"et ne doit plus etre consomme ni vendu.",
)
removal_date = fields.Datetime(
string="Date de retrait",
help="Date apres laquelle le produit doit etre retire "
"du stock (avant expiration).",
)
alert_date = fields.Datetime(
string="Date d'alerte",
help="Date a laquelle une alerte doit etre levee "
"sur le lot approchant de la peremption.",
)
Stratégie FEFO (premier périmé, premier sorti)
Avec les dates de péremption sur les lots, vous pouvez configurer des emplacements ou catégories de produits pour utiliser le FEFO (First Expiry, First Out) comme stratégie de retrait. L'entrepôt prélève d'abord le lot le plus proche de la péremption, réduisant le gaspillage :
<record id="stock_location_fefo_example"
model="stock.location">
<field name="name">Stockage froid</field>
<field name="usage">internal</field>
<field name="removal_strategy_id"
ref="product_expiry.removal_fefo"/>
</record>
<!-- Strategies de retrait disponibles :
- FIFO (premier entre, premier sorti) - par defaut
- LIFO (dernier entre, premier sorti)
- FEFO (premier perime, premier sorti)
- Emplacement le plus proche -->
Gérer un rappel produit
Lorsqu'un rappel s'impose, le flux combine rapport de traçabilité et suivi de péremption :
- Identifier le(s) lot(s) concerné(s) via l'avis de rappel fournisseur ou vos contrôles qualité.
- Lancer une traçabilité aval pour retrouver chaque client ayant reçu des unités du lot.
- Vérifier le stock actuel — rechercher dans
stock.quantles unités du lot encore en entrepôt. - Créer un ordre de rebut ou un transfert interne pour mettre en quarantaine le stock rappelé.
- Notifier les clients concernés à partir de la liste obtenue à l'étape 2.
# Trouver tous les quants du lot rappele
recalled_lot = self.env["stock.lot"].search([
("name", "=", "FOOD-2026-00089"),
], limit=1)
quants = self.env["stock.quant"].search([
("lot_id", "=", recalled_lot.id),
("location_id.usage", "=", "internal"),
("quantity", ">", 0),
])
# Creer un ordre de rebut pour chaque quant
for quant in quants:
self.env["stock.scrap"].create({
"product_id": quant.product_id.id,
"lot_id": quant.lot_id.id,
"scrap_qty": quant.quantity,
"location_id": quant.location_id.id,
"origin": "RAPPEL : FOOD-2026-00089",
})
Alertes de péremption automatisées. Configurez une action planifiée (ir.cron) qui vérifie le champ alert_date quotidiennement et notifie l'équipe qualité par e-mail. Le module product_expiry inclut un cron de base, mais la plupart des entreprises personnalisent la logique : alertes Slack, filtrage par catégorie, escalade vers la direction pour les lots de valeur. Pour la dimension réglementaire, voyez notre guide sur la traçabilité en agroalimentaire avec Odoo.
Quelles erreurs cassent la traçabilité en production ?
En bref : trois erreurs récurrentes rompent la chaîne — changer le type de suivi sur du stock existant, autoriser des noms de lot ambigus, et ne pas tracer les lots à travers la fabrication.
1. Changer le type de suivi sur un produit déjà en stock
Vous basculez un produit du suivi par lot au suivi par série (ou de « pas de suivi » à « lot ») alors que vous avez déjà du stock. Odoo autorise le changement, mais les quants existants ne reçoivent pas rétroactivement de numéro. Votre stock disponible apparaît comme non tracé, le rapport présente des trous, et les opérations déclenchent des erreurs de validation. Notre correctif : ne changez jamais le type de suivi sur un produit ayant du stock en environnement de production. À la place : (1) un ajustement d'inventaire pour solder le stock non tracé, (2) le changement de type de suivi, (3) un nouvel ajustement pour réintégrer le stock avec les bons numéros.
2. Autoriser des noms de lot identiques entre produits différents
La contrainte d'unicité de stock.lot est par produit et par société. Deux produits différents peuvent donc porter le même nom de lot « 2026-B42 ». Lors d'une recherche dans le rapport, votre équipe qualité obtient alors des résultats mélangés entre deux produits, source de confusion lors d'une enquête de rappel. Notre correctif : préfixez les numéros de lot avec la référence interne du produit (RES-001-2026-B42, CAP-005-2026-B42). Configurez la séquence de lot sur le type d'opération de réception pour inclure %(product.default_code)s en préfixe.
3. Ne pas tracer les lots à travers la fabrication
Vous tracez les matières premières entrantes et les produits finis sortants, mais vos ordres de fabrication ne consomment pas de lots précis. Quand un client signale un défaut sur un produit fini, vous remontez à l'OF… mais vous ne pouvez pas savoir quels lots de matières premières ont été utilisés. La chaîne a un trou en plein milieu. Notre correctif : activez le suivi des composants sur votre type d'opération de fabrication et faites scanner les numéros de lot des matières à la consommation. On obtient alors la chaîne complète : lot fournisseur → lot matière consommé dans l'OF → lot produit fini → livraison client. Pour structurer le volet qualité, voyez la mise en place des contrôles qualité dans Odoo 19 Manufacturing.
Que rapporte concrètement une traçabilité complète ?
En bref : la traçabilité n'est pas un projet d'entrepôt mais un investissement de gestion du risque — réponse aux rappels accélérée, gaspillage réduit, conformité d'audit garantie.
Les ordres de grandeur ci-dessous sont illustratifs et à ajuster selon votre activité, mais ils donnent la mesure de l'enjeu :
- Réponse aux rappels jusqu'à 90 % plus rapide : avec la traçabilité aval, identifier les clients concernés prend des minutes au lieu de jours. Un rappel ciblé coûte une fraction d'un rappel généralisé.
- Gaspillage de stock périmé réduit de ~40 % : le FEFO et les alertes de péremption garantissent que le stock le plus ancien part en premier. Beaucoup d'entreprises constatent 30 à 40 % de pertes en moins dès la première année.
- Conformité d'audit à 100 % : les auditeurs (FDA, ISO, BPF) exigent une traçabilité de bout en bout. Sans elle, vous échouez ; avec les rapports d'Odoo, vous passez l'audit en une seule recherche.
À titre d'exemple illustratif : pour un distributeur alimentaire gérant 2 000 références avec 3 % de pertes annuelles sur 5 M€ de stock, réduire le gaspillage de 40 % grâce au FEFO et aux alertes représente environ 60 000 € économisés par an. Ajoutez le coût évité d'un seul rappel généralisé (souvent 250 à 500 K€ pour un distributeur de taille moyenne) et le retour sur investissement d'une traçabilité bien paramétrée se mesure en multiples, pas en pourcentages. La fiabilité de ce calcul dépend toutefois d'une chose : la propreté des données, qui est au cœur de la qualité des intégrations que nous livrons chez AldenSync.
Questions fréquentes
Faut-il toujours activer le suivi des lots ou séries ?
Non. Le suivi ajoute une charge de scan à chaque opération d'entrepôt. Activez-le uniquement si vous avez un besoin réel de rappel ou de garantie. Pour des produits sans enjeu de traçabilité, l'activer inutilement ralentit vos équipes sans contrepartie. La règle : tracez ce qui doit l'être, pas tout par défaut.
Peut-on convertir un suivi par lot en suivi par série ?
Pas directement sur un produit ayant du stock : les quants existants ne reçoivent pas rétroactivement de numéro. La méthode sûre consiste à solder le stock par ajustement d'inventaire, changer le type de suivi, puis réintégrer le stock avec les bons numéros. Cela préserve la piste d'audit et évite les erreurs de validation ultérieures.
Qu'est-ce que la stratégie FEFO dans Odoo ?
FEFO signifie « premier périmé, premier sorti ». Avec des dates de péremption sur les lots, Odoo prélève en priorité le lot le plus proche de l'expiration. C'est la stratégie de référence pour les denrées périssables : elle réduit fortement le gaspillage en garantissant l'écoulement du stock le plus ancien avant les autres.
Le rapport de traçabilité couvre-t-il la fabrication ?
Oui, à condition d'activer le suivi des composants sur vos ordres de fabrication. Sans cela, vous tracez réception et livraison mais pas les matières consommées en production, laissant un trou au milieu de la chaîne. Avec le suivi des composants, vous reliez lot fournisseur, lot matière, lot produit fini et livraison client.
Comment éviter les numéros de lot en doublon ?
La contrainte Odoo n'impose l'unicité que par produit et par société, donc deux produits peuvent partager un nom de lot. Pour éviter toute confusion lors des rappels, préfixez vos numéros avec la référence interne du produit via la séquence du type d'opération de réception. Chaque nom devient ainsi unique en pratique.
Combien de temps faut-il pour déployer la traçabilité ?
Le paramétrage prend généralement de quelques jours à une semaine selon la taille de votre catalogue et la complexité de vos flux (réception, livraison, fabrication). L'effort est concentré sur la configuration et la formation des équipes au scan. Le premier audit réussi suffit généralement à justifier l'investissement.
En résumé : les points clés
- La traçabilité ne s'active pas par défaut : elle se conçoit lors du paramétrage.
- Le suivi par lot couvre des batchs ; le numéro de série identifie chaque unité.
- Odoo bloque la validation tant que le lot ou la série n'est pas affecté.
- Le rapport de traçabilité permet le traçage amont (fournisseur) et aval (clients).
- Les dates de péremption alimentent la stratégie FEFO et les alertes anti-gaspillage.
- Trois pièges cassent la chaîne : changer le suivi sur du stock existant, les lots ambigus, l'absence de suivi en fabrication.
La traçabilité n'est pas optionnelle : c'est le socle de la confiance dans votre stock
Chaque produit qui entre dans votre entrepôt sans numéro de lot est un produit que vous ne pourrez pas tracer en cas de problème. Chaque numéro de série omis à la livraison est une réclamation de garantie que vous ne pourrez pas vérifier. Chaque date de péremption non suivie est du stock perdu que vous découvrirez trop tard. Le coût de la mise en place se mesure en heures de configuration ; le coût de son absence se mesure en audits ratés, rappels généralisés et confiance client perdue. Si votre Odoo ne trace pas encore vos lots et numéros de série, c'est le moment d'agir. Parlez de votre projet de traçabilité avec AldenSync : nous déployons des systèmes complets, de la configuration produit au scan code-barres, jusqu'à la gestion des péremptions et des rappels.