Plateforme PIM multi-tenant — enrichissement IA & sync multicanal

Pour une marque e-commerce aux milliers de produits actifs, j'ai construit une plateforme de Product Information Management qui centralise les données produit, les enrichit avec l'IA et les maintient synchronisées entre Shopify, les marketplaces et l'ERP — avec un humain qui contrôle chaque modification avant sa mise en ligne.

PIM multi-tenant
Enrichissement IA
Recherche vectorielle / RAG
Sync multicanal

Rôle & périmètre

Entièrement conçue et construite, puis développée en continu depuis : une plateforme PIM multi-tenant avec isolation des locataires (super admin, admin de locataire, utilisateur), un flux brouillon/publication pour que chaque modification soit relue avant sa mise en ligne, et une journalisation d'audit complète avec instantanés avant/après.

  • Synchronisation Shopify-first, complétée par une intégration ERP NetSuite et l'export vers Amazon et d'autres marketplaces via ChannelEngine.
  • Enrichissement IA des titres, descriptions, textes SEO et traductions — avec une étape de relecture avant publication du contenu généré.
  • Un assistant RAG intégré qui permet à l'équipe produit de chercher et de travailler dans le catalogue par chat : recherche vectorielle sur les données produit, avec des appels d'outils pour les actions que l'utilisateur doit d'abord approuver.
  • Une extension Chrome distincte qui permet à l'équipe d'envoyer des produits depuis les pages marketplace directement dans la file d'enrichissement.
  • Un module de conformité GPSR européen, un module SEO avec validation du volume de mots-clés, et des tâches d'arrière-plan (sync vectorielle, enrichissement, planificateur) via une file avec relances.

Impact

  • Plus de 3 400 produits actifs sur le marché principal, avec des flux d'export vers des centaines de listings supplémentaires sur des marketplaces comme Amazon.
  • Un pipeline de traduction IA qui écrasait silencieusement les URL de catégories a été annulé et remplacé par une version qui crée des redirections et consigne tout dans une piste d'audit.
  • Un bug de synchronisation où chaque liaison NetSuite écrasait le contenu IA et les modifications Shopify a été corrigé structurellement, au lieu d'être réparé à la main à chaque fois.
  • Plus de 350 commits sur huit mois de développement continu — pas une livraison ponctuelle mais un système qui grandit avec l'assortiment.

Architecture

Un monorepo Turborepo avec un backend NestJS et un frontend Next.js 14 (App Router), un package base de données Prisma partagé et des types communs. PostgreSQL avec l'extension pgvector stocke à la fois les données produit et les embeddings, si bien que la recherche vectorielle et les requêtes classiques tournent sur la même base. Le travail d'arrière-plan (sync vectorielle, enrichissement IA, sync marketplace) passe par des files adossées à Redis avec relances automatiques et backoff exponentiel, découplées de l'interface pour qu'une synchronisation marketplace lente ne bloque pas le reste de la plateforme.

Choix du modèle

L'assistant RAG intégré est délibérément multi-fournisseurs : différentes tâches passent par différents modèles (d'un modèle économique pour le chat de routine à des variantes Claude et GPT plus lourdes pour les travaux d'enrichissement complexes), avec un suivi du prix des tokens par modèle pour que le coût par conversation soit visible plutôt qu'une boîte noire. Le contenu généré (titres, descriptions, traductions) passe toujours d'abord par une étape de relecture — le modèle propose, un humain valide, pour la même raison qui fait que la logique tarifaire, dans d'autres projets, ne passe jamais directement par un modèle de langage.

Coûts & latence

  • Le coût en tokens par conversation est suivi par modèle, si bien que les modèles plus chers sont employés de façon délibérée et visible, et non par défaut.
  • Les tâches d'arrière-plan (sync vectorielle, enrichissement) tournent en asynchrone avec 3 relances maximum et un backoff exponentiel, pour qu'une panne temporaire d'une marketplace n'entraîne pas immédiatement une perte de données.
  • La recherche vectorielle et les requêtes produit classiques tournent sur la même instance PostgreSQL (pgvector), ce qui rend inutiles une base vectorielle séparée et sa couche de synchronisation.

Enseignements

Le pipeline de traduction IA écrasait les URL de catégories sans avertissement dès qu'une traduction était régénérée — bon pour le SEO en apparence, mais cela cassait les liens externes existants. Résolu en restaurant les URL historiques, en ajoutant des redirections et en construisant une piste d'audit qui rend désormais ces modifications visibles avant leur mise en ligne. Deuxième bug : chaque synchronisation NetSuite écrasait le contenu généré par IA et les modifications Shopify dès qu'un produit était rattaché à NetSuite — pas un incident mais un schéma structurel, corrigé en revoyant le sens de la synchronisation plutôt qu'en réparant à la main à chaque fois. Et un troisième, plus petit mais parlant : le pipeline traduisait mal les abréviations de matériaux comme « RVS » (acier inoxydable), corrigé par une règle de glossaire explicite plutôt qu'en comptant sur le modèle pour deviner une connaissance métier.