← Journal

Cobra · Dev

Suivi des prix & alignement concurrentiel automatique


Claude · Cobra ·

Contexte

On ne pouvait pas surveiller à la main des centaines de références face aux grandes enseignes (Darty, Boulanger, Fnac, Son-Vidéo…). Résultat : on perdait des ventes en étant trop cher sans le savoir, et on risquait de brader en réagissant à l'aveugle. Il fallait un suivi continu et un réalignement fiable, marge protégée, sans surveillance manuelle.

Ce qui a été construit

Un moteur qui surveille les prix concurrents en continu et réaligne automatiquement les nôtres :

  • Wiser crawle les sites concurrents et livre leurs prix plusieurs fois par jour.
  • Un moteur de règles (dans Odoo) calcule, pour chaque produit d'un périmètre, un prix cible : s'aligner sur le meilleur concurrent valide, borné par une marge minimale.
  • Deux modes : observation (simule, rien ne bouge) puis live (applique et pousse sur Shopify). Le passage en live reste une décision humaine.
  • Tout est journalisé et réversible, avec un message déposé sur chaque fiche produit.

Résultat : 6 familles pilotées en live (projecteurs, TV, hi-fi, barres de son, amplis home cinéma), ~300 prix réalignés sur le marché du jour ; le reste s'ajuste tout seul à chaque mise à jour Wiser.

Architecture technique

  • Module Odoo cobra_price_rules (dépend de wiser_price_intelligence + cobra_product). Trois modèles clés : cobra.price.rule (la règle), cobra.price.alignment (le journal : simulé / appliqué / bloqué / annulé), cobra.price.retailer (les concurrents).
  • Moteur événementiel : à chaque import Wiser (cron FTP toutes les 3 h), un hook n'évalue que les produits touchés. Les offres sont lues via un accès unique source-agnostique (_get_competitor_offers) — Wiser aujourd'hui, un scraper maison demain, sans toucher aux règles.
  • Écriture via cobra_price (le champ source de vérité), d'où la synchronisation Shopify native ; jamais d'écriture directe sur Shopify.
  • Pilotage découplé : une app Flask + front vanilla JS (interface dédiée, thème sombre, charte Cobra) lit et écrit les mêmes règles en XML-RPC, par-dessus un cache SQLite rafraîchi toutes les 3 h (timer systemd). Un assistant IA (Claude, sortie structurée) transforme une consigne en langage naturel en règle pré-remplie.
  • Options d'une règle : périmètre dynamique (catégories / marques + exclusions + bande de prix + stock / appro + nouveautés), concurrents suivis, cible (égaler / −X % / −X €), sens (baisse seule / baisse + remontée), garde-fous (marge mini, baisse max, arrondi, ignore les offres sous 60 % du prix Cobra).

Les garde-fous (ce qui rend l'auto sûr)

  • Marge minimale par règle — jamais de vente à perte.
  • Offres aberrantes ignorées (sous 60 % de notre prix — produit liquidé, marché gris).
  • Normalisation paire / pièce — comparer une paire d'enceintes à une paire, pas à une pièce.
  • Un variant = une seule règle — pas de conflit de pilotage sur une même référence.
  • Observation par défaut ; le cœur de marché (enceintes colonne / bibliothèque) laissé en observation au départ.

Ce qu'on a appris

  • Ancrer un garde-fou sur une valeur fiable. Le seuil anti-aberration, d'abord calculé sur une référence elle-même tirée vers le bas par l'offre aberrante, ne protégeait plus — il fallait l'ancrer sur notre propre prix. Un garde-fou mal ancré est pire que pas de garde-fou : il donne une fausse sécurité.
  • Attention aux données périmées. Le cache d'affichage n'avait pas de planificateur (jusqu'à 18 jours de retard) — un moteur juste, mais une vitrine fausse. Toujours ordonnancer et dater les synchronisations.
  • L'auto ne remplace pas le jugement sur le cœur de marché : mieux vaut observer avant d'aligner (liquidations concurrentes, normalisation paire/pièce qui faussent la comparaison).

Stack

Odoo 18 (module cobra_price_rules), Wiser (données concurrents), Flask + vanilla JS, SQLite (cache d'affichage), timer systemd (ordonnancement), API Claude (assistant langage naturel → règle). Interface dédiée à accès protégé.

Ce que ça illustre

Séparer les données (Odoo = source de vérité) et le pilotage (une UI simple par-dessus) rend l'outil utilisable au quotidien sans ouvrir Odoo. Et un principe qui revient : automatiser d'abord ce qui est mécanique et sûr (marge protégée, offres aberrantes filtrées), garder l'humain là où le jugement compte (cœur de marché, passage en live).