PS PrestaShop Intermédiaire

AI Competitor — Veille tarifaire concurrents

Installer et configurer la veille tarifaire concurrents sur PrestaShop 8 et 9 : profils concurrents, crawl du catalogue, extraction IA, alertes et analytics.

Mis à jour Version du module 1.1.1

Présentation

AI Competitor surveille les prix de vos concurrents directement depuis votre back-office PrestaShop. Vous déclarez un concurrent une fois, avec son nom et ses sélecteurs ; le module peut ensuite récupérer la liste complète de ses produits par son sitemap, la rapprocher de votre catalogue, relever les prix à intervalles réguliers, détecter les variations significatives, vous alerter par email et vous proposer un prix ajusté selon votre stratégie.

Compatible PrestaShop 8.0 à 9.x, PHP 7.4 à 8.3, multiboutique natif. Aucune dépendance Composer, aucune bibliothèque JavaScript externe.

Installation

  1. Dans votre back-office, ouvrez Modules → Gestionnaire de modules → Installer un module.
  2. Uploadez le fichier dfaicompetitor.zip.
  3. Le module crée ses tables et le menu Catalogue → AI Competitor, qui regroupe six pages : tableau de bord, concurrents, URLs surveillées, catalogue concurrent, rapports et analytics, import/export.

Après installation, un token cron unique est généré. Vous le retrouverez sur le tableau de bord du module.

Mise à jour depuis une version 1.0.x

Uploadez simplement le nouveau ZIP par-dessus l’installation existante. Le script de mise à jour crée les nouvelles tables, ajoute les colonnes manquantes, et surtout génère un profil concurrent pour chaque nom de concurrent déjà utilisé avant d’y rattacher les URLs correspondantes. Vos données existantes sont conservées et il n’y a rien à ressaisir.

Réinstaller un paquet portant le même numéro de version que celui déjà en place ne rejoue pas le script de mise à jour, et l’opcache PHP peut continuer à servir les anciens fichiers. Vérifiez toujours le numéro de version affiché sur le tableau de bord après un upload.

Configuration initiale

Ouvrez Catalogue → AI Competitor. Le tableau de bord regroupe les statistiques et cinq blocs de configuration.

Provider IA

Le fallback IA est facultatif mais recommandé : c’est lui qui prend le relais quand un site concurrent n’expose ni données structurées ni sélecteur exploitable. Trois providers sont supportés :

  • Mistral AI (défaut), le plus économique, modèle conseillé : mistral-small-latest
  • Anthropic Claude, la meilleure précision sur les pages complexes, modèle conseillé : claude-haiku-4-5-20251001
  • OpenAI, bon compromis, modèle conseillé : gpt-4o-mini

Renseignez la clé API du provider choisi. Elle est masquée à l’affichage ; laissez le champ vide lors d’un enregistrement ultérieur pour conserver la clé en place. Vous payez le provider directement, sans surcoût DataFirefly.

Alertes

  • Email de notification : destinataire des digests d’alertes et du rapport hebdomadaire.
  • Seuil de variation en pourcentage, 3 % par défaut. En dessous, aucune alerte n’est créée.
  • Jour du rapport hebdomadaire, lundi par défaut.

Scraping

  • URLs par lot cron : nombre d’URLs relevées à chaque exécution, 20 par défaut.
  • Intervalle par défaut en heures, appliqué aux nouvelles URLs, 24 h par défaut.
  • Timeout HTTP et User-Agent. Le User-Agent livré identifie le robot par son nom (DataFireflyBot) ; certains sites acceptent un robot nommé qu’ils bloqueraient autrement.
  • Rétention de l’historique en jours, 180 par défaut.

Crawl du catalogue

  • Pages par tranche : nombre de fiches concurrentes ouvertes en une passe, 15 par défaut.
  • Secondes par tranche : budget de temps de chaque passe, 20 par défaut. Gardez-le sous votre max_execution_time PHP.
  • Seuil de rapprochement : similarité de titre minimale pour accepter une correspondance automatique, 82 par défaut.
  • Surveiller automatiquement les correspondances : crée une URL surveillée dès qu’une page crawlée est rapprochée d’un de vos produits. Désactivé par défaut.
  • Faire avancer les crawls depuis le cron : activé par défaut.

Stratégie d’ajustement

Trois stratégies déterminent le prix suggéré, toujours calculé à partir du concurrent le moins cher :

  • Aligner : même prix que le plus bas concurrent.
  • Undercut de X % : X % en dessous, 1 % par défaut.
  • Premium à X % : X % au-dessus, pour un positionnement haut de gamme assumé.

Déclarer un concurrent

Depuis la version 1.1.0, un concurrent est une fiche à part entière et non plus un simple libellé retapé sur chaque URL. Ouvrez Catalogue → AI Competitor → Concurrents → Ajouter. La fiche se découpe en trois onglets.

Identité

Le nom affiché partout, le domaine sans schéma (exemple.com), la devise, l’intervalle de relevé, l’option d’extraction IA forcée et un champ de notes libres. Le domaine est ce qui permet au module de rattacher automatiquement une nouvelle URL au bon concurrent.

Sélecteurs

Les sélecteurs CSS du prix, du nom du produit, du SKU, de l’image, de la disponibilité. Laissez-les vides si le site publie du JSON-LD, ce qui est le cas de la majorité des boutiques modernes. Syntaxe supportée : balise, .classe, #identifiant, [attribut=valeur], descendant et enfant direct. Exemple : div.product-price > span.amount

C’est le principal gain de la fiche concurrent : le jour où un site refond son thème et casse un sélecteur, vous le corrigez ici une seule fois et la correction se propage à toutes les URLs de ce concurrent qui n’ont pas de sélecteur propre.

Crawl du catalogue

L’URL du sitemap (laissez vide pour lire les directives Sitemap: du robots.txt du domaine), l’URL d’une page catégorie de départ, le sélecteur des liens produit et celui du lien vers la page suivante, les motifs d’URL à retenir ou à écarter, le délai entre deux requêtes, le plafond de produits et le respect du robots.txt.

Les motifs acceptent une simple sous-chaîne ou une expression régulière délimitée par des slashs. Sur une boutique française, /produit/ en motif à retenir suffit souvent à isoler les fiches produit dans un sitemap qui contient aussi le blog et les pages CMS.

Crawler le catalogue d’un concurrent

Ouvrez Catalogue → AI Competitor → Catalogue concurrent, choisissez le concurrent, la source de découverte et le plafond de produits, puis lancez le crawl.

Deux sources sont disponibles :

  • Sitemap, recommandé. Le module lit le sitemap configuré ou celui annoncé par le robots.txt, suit les index de sitemaps de façon récursive et retient les adresses correspondant à vos motifs.
  • Pages catégories, quand aucun sitemap n’est exploitable. Le module part de l’URL de listing, collecte les liens produit via le sélecteur du concurrent et suit le lien de page suivante.

La découverte est suivie d’une phase d’enrichissement qui ouvre chaque page et en extrait titre, SKU, EAN, marque, prix, disponibilité et image, puis tente le rapprochement avec votre catalogue.

Le crawl avance par tranches bornées en temps, pilotées par la page ouverte avec une barre de progression, et reprend à chaque passage du cron. Un sitemap de plusieurs dizaines de milliers d’URLs se traite sans jamais atteindre le max_execution_time de PHP. Vous pouvez fermer la page : le travail se poursuit côté cron.

Le rapprochement avec votre catalogue

Le module essaie trois pistes, dans l’ordre de fiabilité décroissante :

  1. EAN13, cherché sur vos produits et sur leurs déclinaisons. Correspondance certaine, score 100.
  2. Référence, référence fournisseur ou MPN. Score 95.
  3. Similarité de titre, avec une pondération qui donne plus de poids aux numéros de modèle et aux marques qu’aux mots courants, et une pénalité quand les deux titres sont de longueurs très différentes. Le score doit dépasser le seuil configuré, 82 par défaut.

Chaque ligne du catalogue affiche la méthode et le score de sa correspondance. Une correspondance douteuse se corrige à la main : le champ de rapprochement propose une autocomplétion sur votre catalogue, par nom ou par référence. Les boutons Re-rapprocher relancent l’opération sur les lignes non rapprochées, ou sur toutes, ce qui est utile après avoir corrigé des références chez vous.

Une ligne rapprochée devient une URL surveillée via son bouton Surveiller, ou en masse par l’action groupée sur une sélection. L’URL créée hérite du nom, des sélecteurs, de la devise et de l’intervalle du concurrent.

Ajouter une URL à la main

Le crawl ne remplace pas la saisie ponctuelle. Ouvrez Catalogue → AI Competitor → URLs surveillées → Ajouter :

  • Concurrent : la fiche dont l’URL héritera. Laissez vide pour tout saisir à la main.
  • Produit : sélectionné dans votre catalogue.
  • URL : l’adresse complète de la fiche produit concurrente.
  • Nom du concurrent, sélecteur CSS, devise, intervalle : renseignés depuis le concurrent quand vous les laissez vides.

Si vous ne choisissez pas de concurrent, le module cherche celui dont le domaine correspond à l’adresse saisie et l’y rattache automatiquement. Le bouton Scrape de chaque ligne déclenche un relevé immédiat, pratique pour valider une URL dès sa création.

Comment fonctionne l’extraction

Pour chaque URL, le module essaie quatre méthodes en cascade et s’arrête à la première qui aboutit :

  1. JSON-LD : les données structurées Product/Offer, présentes sur la grande majorité des sites e-commerce. Le prix, la devise, la disponibilité, et pour le crawl le titre, le SKU, le GTIN et la marque, sont lus directement sans configuration.
  2. OpenGraph : les balises meta product price amount.
  3. Sélecteur CSS : celui du concurrent, ou celui propre à l’URL s’il en a un.
  4. IA : un extrait HTML nettoyé est envoyé à votre provider, qui renvoie le prix, la devise et l’état de stock. Les formats de prix internationaux sont gérés (1 299,90 comme 1.234,56 ou $49.99).

Commencez toujours sans sélecteur CSS : le JSON-LD suffit dans la plupart des cas. N’ajoutez un sélecteur ou l’IA forcée que si la colonne Status affiche no_price.

Import et export

La page Import / Export sert à emporter une configuration d’une boutique à l’autre.

Concurrents en JSON

L’export produit un fichier contenant les noms, domaines, sélecteurs et réglages de crawl. Cochez les concurrents à inclure, ou ne cochez rien pour tout exporter. À l’import, le rapprochement se fait d’abord par nom puis par domaine ; une case décide si un concurrent déjà présent est mis à jour ou ignoré, et un mode prévisualisation annonce le résultat sans rien écrire.

URLs surveillées en CSV

Colonnes attendues : product_id, product_reference, competitor_name, competitor_domain, url, price_selector, currency_iso, use_ai_extraction, scrape_interval_hours, active.

Seuls competitor_name et url sont obligatoires, plus product_id ou product_reference pour savoir à quel produit rattacher l’URL. Un nom de concurrent inconnu crée sa fiche automatiquement, si bien qu’un seul fichier suffit à amorcer une installation entière. Le séparateur est détecté automatiquement, et l’import démarre en mode prévisualisation qui rapporte ligne par ligne ce qui serait créé, mis à jour ou ignoré.

Catalogue concurrent en CSV

Export de tout ce que le crawl a découvert, avec le produit rapproché, la méthode et le score. Une case restreint l’export aux seules lignes rapprochées. Pratique pour un audit hors ligne ou un partage avec votre équipe achats.

Configurer le cron

Le fonctionnement périodique repose sur un endpoint sécurisé par token, affiché sur le tableau de bord. Programmez son appel toutes les 30 minutes :

*/30 * * * * curl -s "https://votre-boutique.com/index.php?fc=module&module=dfaicompetitor&controller=cron&token=VOTRE_TOKEN" > /dev/null

À chaque exécution, le cron relève le lot d’URLs dont l’intervalle est écoulé, envoie les emails d’alertes en attente, expédie le rapport hebdomadaire si c’est le bon jour, fait avancer d’une tranche un crawl de catalogue en cours, et purge l’historique au-delà de la rétention configurée. La réponse est un JSON récapitulatif.

Le token peut être régénéré à tout moment depuis le tableau de bord, auquel cas les crons existants doivent être mis à jour. Un déclenchement manuel est aussi disponible via le bouton Run cron now.

Alertes

Cinq types d’alertes sont générés, chacun avec une sévérité :

  • price_drop / price_rise : variation au-delà du seuil. Une variation supérieure ou égale à 10 % passe en critical.
  • undercut : un concurrent passe sous votre prix de vente TTC. Toujours critical.
  • out_of_stock / back_in_stock : transitions de disponibilité détectées via les données structurées ou l’IA.
  • scrape_error : uniquement après 3 échecs consécutifs, pour éliminer le bruit des indisponibilités passagères.

Les alertes sont regroupées en un seul email digest par exécution du cron.

Rapports et analytics

L’écran Rapports et analytics tient en quatre onglets, derrière un bandeau d’indicateurs affiché en permanence : produits comparés, part de produits où vous êtes le moins cher, écart moyen face au prix plancher du marché, alertes ouvertes, santé du scraping. Un sélecteur de période couvre 7, 30 ou 90 jours.

Vue d’ensemble

Votre position sur le marché sous forme de barre (le moins cher, au milieu, le plus cher), les produits où vous perdez sur le prix classés par écart décroissant, ceux où vous avez de la marge pour remonter, un tableau par concurrent indiquant qui vous passe dessous le plus souvent, et la synthèse exécutive rédigée par l’IA. Les opportunités s’exportent en CSV.

Alertes

La liste filtrable par type, sévérité, état et texte libre, avec un graphique du volume quotidien par sévérité. Chaque ligne s’acquitte ou se rouvre sans recharger la page, et le compteur d’alertes ouvertes se met à jour dans le bandeau.

Analyse produit

Choisissez un produit surveillé : le module trace votre prix contre celui de chaque concurrent sur la période, affiche la suggestion d’ajustement avec le prix actuel et le prix proposé côte à côte, et liste les sources avec un bouton de relevé immédiat sur chacune.

Depuis la version 1.1.0, chaque relevé enregistre aussi votre propre prix du moment. C’est ce qui rend l’historique des écarts reconstituable. Sur une boutique mise à jour depuis une 1.0.x, la courbe de votre prix ne devient exacte qu’à partir des relevés postérieurs à la mise à jour ; avant cette date, le module utilise votre prix actuel comme repli.

Santé

Les URLs qui échouent, avec leur statut, le nombre d’échecs consécutifs, la dernière erreur et un bouton de relance, plus un taux de réussite par concurrent. C’est le premier endroit à regarder quand un chiffre paraît faux : un concurrent dont le scraping est tombé fausse les moyennes.

Suggestion de prix

Dans l’onglet analyse produit, le module affiche votre prix actuel, le minimum, la moyenne et le maximum concurrents, les sources, et le prix suggéré selon votre stratégie. Le bouton Appliquer écrit le prix sur le produit PrestaShop.

L’application n’est jamais automatique. C’est un choix délibéré pour éviter les boucles de baisse en miroir entre concurrents équipés du même type d’outil. La conversion TTC vers HT est gérée automatiquement selon le taux de taxe du produit.

Dépannage

Le crawl ne découvre aucune page

Vérifiez d’abord que le domaine du concurrent est renseigné sans schéma ni www.. Ouvrez ensuite https://domaine/robots.txt dans un navigateur : s’il ne contient aucune directive Sitemap:, indiquez l’URL du sitemap à la main sur la fiche du concurrent. Si le sitemap existe mais que rien n’est retenu, votre motif de filtrage est probablement trop strict : videz-le pour voir ce qui remonte, puis resserrez.

Le crawl découvre des pages qui ne sont pas des produits

Renseignez le motif à retenir avec le segment commun aux fiches produit du site, par exemple /produit/ ou /p/, et le motif à écarter avec ce qui pollue, par exemple /blog/. Videz ensuite le catalogue du concurrent et relancez.

Beaucoup de pages restent non rapprochées

Regardez d’abord si les fiches concurrentes exposent un SKU ou un EAN : sans identifiant commun, seule la similarité de titre peut jouer. Renseignez le sélecteur de SKU sur la fiche du concurrent, relancez le crawl, puis utilisez Re-rapprocher. Si vos titres diffèrent beaucoup de ceux du concurrent, baissez le seuil de rapprochement à 75 et vérifiez les correspondances obtenues avant de le laisser en place.

Statut « no_price »

Aucune des méthodes n’a trouvé de prix. Vérifiez l’URL dans un navigateur, ajoutez un sélecteur CSS de prix sur la fiche du concurrent, ou activez l’extraction IA forcée.

Statut « error » ou « blocked »

error signifie que la page n’a pas répondu (HTTP 400 et plus, ou timeout). blocked signifie que le robots.txt du site interdit cette adresse à notre robot. Dans le premier cas, personnalisez le User-Agent, augmentez le timeout ou espacez l’intervalle. Dans le second, c’est une décision du site visé qu’il vous appartient d’apprécier.

L’extraction IA ne fonctionne pas

Vérifiez que la clé API est valide et que le modèle existe chez votre provider. Les erreurs d’appel IA sont journalisées dans Paramètres avancés → Logs avec le préfixe [dfaicompetitor].

Les emails n’arrivent pas

Testez la configuration email de PrestaShop dans Paramètres avancés → E-mail. Le module utilise le système de mails natif avec ses propres templates FR et EN.

Bonnes pratiques et conformité

  • Laissez le respect du robots.txt activé. Il s’applique à la découverte comme à la lecture des fiches, honore un Crawl-delay publié, et applique la règle de précédence du standard : entre un Allow et un Disallow qui correspondent tous les deux, la règle la plus longue l’emporte.
  • Gardez un délai entre requêtes d’au moins une seconde et un plafond de produits raisonnable sur le premier crawl d’un site que vous ne connaissez pas.
  • Espacez les intervalles de relevé : 6 à 24 h par URL suffisent largement pour de la veille tarifaire.
  • Conservez un User-Agent identifiable. C’est la pratique loyale attendue en veille concurrentielle, et certains sites tolèrent un robot nommé qu’ils bloqueraient autrement.
  • La lecture de prix publics est généralement licite en Europe, mais vous restez responsable de l’usage des données collectées et de l’appréciation des conditions d’utilisation des sites visés.
Cette page vous a-t-elle été utile ?

Toujours bloqué ? Contactez le support