Smart Offers — Documentation complète
Tout ce qu'il faut savoir pour configurer et exploiter le module Smart Offers : les quatre types d'offres groupées, le moteur d'ajout automatique au panier, et l'affichage client v1.1.0.
Smart Offers est un module PrestaShop 8 qui permet de créer des offres groupées 1+1, packs en gros, packs multi-produits et offres au choix, avec ajout automatique des produits offerts au panier et présentation soignée sur la fiche produit.
Aperçu
Smart Offers couvre les quatre formats d’offres groupées les plus utilisés en e-commerce dans un seul module, sans configuration complexe. Le moteur évalue le panier à chaque modification, ajoute automatiquement les produits offerts dès que les conditions sont remplies, et crée une règle de panier qui rend ces unités gratuites — l’expérience client est immédiate et lisible.
Installation
- Téléchargez le fichier
dfoffers-vX.Y.Z.zipdepuis votre espace client DataFirefly - Dans le back office PrestaShop, allez dans Modules → Gestionnaire de modules
- Cliquez sur le bouton Uploader un module en haut de la page
- Glissez-déposez le fichier ZIP ou cliquez pour le sélectionner
- L’installation est automatique : les tables sont créées, les hooks enregistrés, et un nouvel onglet Catalogue → Offres groupées apparaît dans le menu
Les quatre types d’offres
1+1 sur le même produit
Le format viral du buy-one-get-one : le client achète une unité d’un produit et reçoit gratuitement une autre unité du même produit. Vous configurez :
- Un seul produit (qui sert à la fois de déclencheur et de récompense)
- La quantité à acheter pour déclencher l’offre (généralement 1)
- La quantité offerte (généralement 1)
Exemple typique : « Pour 1 paire de chaussettes achetée, la deuxième est offerte. » Quand le client ajoute la paire à son panier, le moteur en ajoute automatiquement une seconde et applique une remise égale au prix unitaire.
Achetez X, recevez Y offerts (produits différents)
Format de bundle : plusieurs produits déclencheurs distincts doivent être présents dans le panier pour que l’offre s’active, et un ou plusieurs produits différents sont alors offerts. Vous configurez :
- La liste des produits déclencheurs avec leur quantité respective
- La liste des produits offerts avec leur quantité respective
Exemple typique : « Pour l’achat conjoint d’une crème de jour et d’un sérum, recevez un échantillon de masque offert. » Le moteur vérifie que tous les déclencheurs sont présents avant d’activer l’offre.
Choix parmi des déclinaisons
Format de composition libre : vous définissez un ensemble de produits ou de déclinaisons candidates parmi lesquelles le client compose son lot. Le moteur identifie automatiquement les unités les moins chères du panier comme étant les unités offertes, ce qui correspond à l’interprétation commerciale standard du buy-N-get-M.
- La liste des produits ou déclinaisons candidats
- Le nombre d’unités à acheter dans cet ensemble
- Le nombre d’unités offertes (les moins chères)
Exemple typique : « 3 t-shirts achetés parmi notre sélection, le moins cher est offert. » Le client compose son lot, le moteur ne touche pas à son panier mais applique la remise sur les unités les moins chères.
Pack en gros
Format B2B et écoulement de stock : pour chaque lot de X unités achetées d’un produit, le client reçoit Y unités gratuites d’un autre produit. Vous configurez :
- Le produit déclencheur avec la quantité de palier (par exemple 10)
- Le produit offert avec la quantité offerte (par exemple 20)
Exemple typique : « Pour 10 bouteilles de vin achetées, 2 verres offerts. » Pratique pour les fournisseurs qui veulent pousser un produit complémentaire ou écouler un stock dormant en l’attachant à un produit qui se vend bien.
Créer votre première offre
Depuis le back office, allez dans Catalogue → Offres groupées puis cliquez sur Nouvelle offre.
Étape 1 : choisir le type
Quatre cartes visuelles vous présentent les types disponibles avec une courte description. Cliquez sur celle qui correspond à votre opération commerciale. Le formulaire s’adapte automatiquement et ne montre que les champs pertinents pour ce type.
Étape 2 : nommer et badger l’offre
Renseignez :
- Nom de l’offre (obligatoire) : c’est ce que verra le client dans la bannière. Disponible en cinq langues.
- Texte du badge (optionnel, 64 caractères max) : court message qui s’affiche dans la pill en haut de la bannière (par exemple 1+1 OFFERT, OFFRE SPÉCIALE, BLACK FRIDAY).
- Couleur du badge : six presets DataFirefly disponibles plus un sélecteur de couleur libre. La couleur sert pour la bannière fiche produit ET pour la pastille cadeau côté panier.
Étape 3 : ajouter les produits déclencheurs
Cliquez sur Ajouter un produit déclencheur. Une modale de recherche s’ouvre avec un champ qui interroge votre catalogue en direct (recherche débrayée à 250 ms après la dernière frappe). Tapez un nom, une référence ou un EAN ; les résultats apparaissent immédiatement.
Cliquez sur le produit pour l’ajouter. Si le produit a des déclinaisons, les variantes apparaissent comme boutons sous le résultat — cliquez sur celle qui vous intéresse pour l’ajouter directement. Précisez la quantité requise dans le champ qui apparaît à droite de la ligne.
Étape 4 : ajouter les produits offerts
Même procédure pour les produits offerts. Cette section est masquée pour le type Choix parmi des déclinaisons, puisque les déclinaisons servent à la fois de candidats et de récompenses.
Étape 5 : règles spécifiques
- Cumulable : si activé, l’offre s’applique plusieurs fois pour chaque lot déclencheur. Sans cumul, l’offre s’applique une seule fois quel que soit le nombre d’unités. Désactivé par défaut pour protéger vos marges.
- Pour le type Choix parmi des déclinaisons, deux champs supplémentaires apparaissent : combien d’unités le client doit acheter, et combien sont offertes.
Étape 6 : activation
- Dates de validité : laissez vides pour une offre permanente. Renseignez la date de début ou de fin pour automatiser l’activation.
- Priorité : si plusieurs offres peuvent s’appliquer simultanément, celle avec la priorité la plus basse est évaluée en premier.
- Statut : interrupteur on/off, par défaut activé. Pratique pour désactiver temporairement une offre sans la supprimer.
Étape 7 : boutiques (si multi-boutique)
Cochez les boutiques sur lesquelles l’offre doit être disponible. Ne rien cocher revient à activer l’offre sur toutes les boutiques.
Comment fonctionne le moteur d’ajout automatique
Le moteur s’accroche au hook PrestaShop actionCartSave et s’exécute à chaque modification du panier (ajout, retrait, changement de quantité, fusion lors de la connexion).
- Il récupère toutes les offres actives pour la boutique courante
- Pour chaque offre, il calcule la quantité payée de chaque produit déclencheur (quantité totale du panier moins ce que le moteur a déjà auto-ajouté lors d’une évaluation précédente)
- Il évalue si les conditions de l’offre sont remplies
- Si oui, il ajoute les produits offerts manquants au panier via
Cart::updateQty - Il crée ou met à jour une règle de panier (
CartRule) avec une remise fixe TTC égale à la valeur des unités offertes - Il enregistre dans la table
ps_dfoffers_cart_autoles unités qu’il a ajoutées, pour pouvoir les distinguer des unités que le client a ajoutées lui-même
Cart::updateQty rejoue le hook actionCartSave, mais une garde statique dans le module empêche la récursion.Révocation propre
Si le client retire un produit déclencheur ou réduit sa quantité en dessous du seuil, le moteur réévalue l’offre lors du actionCartSave suivant. Si la condition n’est plus remplie, il retire les unités qu’il avait auto-ajoutées (sans toucher aux unités que le client avait ajoutées lui-même grâce au tracking) et supprime la règle de panier associée.
Affichage sur la fiche produit
Sur chaque fiche produit déclencheuse, une bannière en dégradé s’affiche via le hook displayProductAdditionalInfo. Elle contient :
- Un badge pill en blanc avec icône cadeau, contenant le texte du badge
- Le titre de l’offre
- Un message dynamique qui dépend du type d’offre (« Ajoutez 1 produit, recevez-en 1 gratuit », « Pour 10 unités achetées, 20 unités offertes », etc.)
- Une grille avec les vignettes cliquables des produits concernés, séparés en deux groupes Achetez / Recevez offert avec un séparateur SVG circulaire entre les deux
La couleur de la bannière reprend celle du badge configurée dans l’offre. Le rendu est responsive : sur mobile, les deux groupes s’empilent verticalement et le séparateur pivote pour pointer vers le bas.
Affichage dans le panier
Depuis la version 1.1.0, deux indicateurs distincts aident le client à identifier les produits offerts dans son panier.
Pastille cadeau sur chaque ligne
Sur chaque ligne du panier qui contient des unités auto-ajoutées par une offre, une petite pastille colorée 🎁 ×N offert apparaît à côté des actions de ligne. La couleur reprend celle du badge de l’offre, et la pastille indique combien d’unités de cette ligne sont gratuites (utile quand une partie de la quantité est payée et l’autre offerte, par exemple sur un 1+1 même produit).
displayCartExtraProductActions, présent dans tous les thèmes PrestaShop 8 standards qui suivent la structure native de cart-detailed-product-line.tpl.Footer panier détaillé
En bas de la grille des produits, un bloc vert récapitule les offres activées dans le panier. Pour chaque offre, le bloc affiche :
- Le nom de l’offre et son texte de badge (en pill colorée)
- La liste des produits offerts par cette offre, sous forme de chips visuels avec vignette ronde, nom et quantité
- Chaque chip est cliquable et renvoie vers la fiche produit du cadeau
Le client peut ainsi vérifier d’un coup d’œil ce qu’il a obtenu gratuitement et grâce à quelle opération commerciale.
Cas particuliers et comportements
Pourquoi le 1+1 sur le même produit est traité spécifiquement
Quand le produit déclencheur est aussi le produit récompense, beaucoup de modules d’offres groupées du marché commettent l’erreur d’identifier l’unité payée du client comme étant déjà l’unité offerte, et appliquent la remise sur cette unité — au final, le client paie zéro pour une unité au lieu de payer pour une et en recevoir une seconde gratuite.
Smart Offers gère ce cas avec une logique précise : la quantité cible dans le panier vaut quantité payée par le client + quantité récompense. Quand le client ajoute une unité, le moteur en ajoute une seconde pour que le panier contienne deux unités, et la remise s’applique sur la seconde unité uniquement. Le client paie donc le prix d’une unité pour en avoir deux dans son panier.
Cumul des lots (option stackable)
Sans cumul, l’offre s’applique une seule fois quel que soit le nombre de lots déclencheurs présents dans le panier. Si le client achète 5 unités d’un produit avec une offre 1+1 et stackable désactivé, il recevra 1 unité offerte (pas 5).
Avec cumul activé, le moteur multiplie le nombre de lots de récompenses par le nombre entier de lots déclencheurs présents. Pour la même offre 1+1 avec stackable activé et 5 unités au panier, le client recevra 5 unités offertes (cart final : 10 unités, 5 payées).
Stock et indisponibilité
L’ajout des produits offerts au panier passe par Cart::updateQty, qui respecte les règles de stock natives de PrestaShop. Si un produit offert est en rupture et que la boutique n’autorise pas la commande en rupture, l’ajout échoue silencieusement et la remise n’est pas appliquée — la condition reste prête à se déclencher dès le réapprovisionnement.
Plusieurs offres simultanées sur un même panier
Chaque offre génère sa propre règle de panier avec partial_use activé. Cela permet d’empiler plusieurs offres concurrentes sur un même panier sans conflit, et reste compatible avec les codes promo classiques que vos clients peuvent saisir.
Architecture technique
Hooks utilisés
displayProductAdditionalInfo: bannière sur la fiche produitdisplayShoppingCartFooter: footer détaillé sur la page panierdisplayCartExtraProductActions: pastille cadeau sur chaque ligne du panieractionCartSave: moteur d’évaluation et d’ajout automatiqueactionFrontControllerSetMediaetactionAdminControllerSetMedia: injection des CSS et JSactionObjectProductDeleteAfter: nettoyage automatique des offres référençant un produit supprimé
Tables ajoutées
ps_dfoffers_offer: configuration de chaque offre (type, dates, priorité, cumul)ps_dfoffers_offer_lang: nom, badge et description traduits par langueps_dfoffers_trigger: produits déclencheurs de chaque offreps_dfoffers_reward: produits récompenses de chaque offreps_dfoffers_shop: association offre / boutique en multi-boutiqueps_dfoffers_cart_auto: tracking des unités auto-ajoutées par panier et par offre, avec l’identifiant de la règle de panier générée
Toutes les tables sont préfixées par le préfixe configuré dans votre installation PrestaShop (ps_ par défaut).
Surcharger les templates dans votre thème
Le CSS du module est isolé sous le préfixe .dfoffers- pour éviter tout conflit avec votre feuille de style. Si vous souhaitez modifier le rendu, copiez les templates depuis /modules/dfoffers/views/templates/hook/ vers /themes/votre-theme/modules/dfoffers/views/templates/hook/ et personnalisez-les. Trois templates sont disponibles :
product-banner.tpl: bannière sur la fiche produitcart-offer.tpl: bloc récapitulatif dans le footer paniercart-line-gift.tpl: pastille cadeau inline sur les lignes du panier
Mise à jour du module
Pour mettre à jour vers une nouvelle version, uploadez simplement le nouveau ZIP depuis le Gestionnaire de modules. PrestaShop détecte le changement de version dans config.xml et exécute automatiquement les scripts d’upgrade présents dans /upgrade/upgrade-X.Y.Z.php, qui s’occupent par exemple d’enregistrer de nouveaux hooks ajoutés entre deux versions.
Dépannage
Les produits offerts ne s’ajoutent pas au panier
- Videz le cache PrestaShop dans Paramètres avancés → Performance
- Vérifiez que le hook
actionCartSavecontient bien le module dans Conception → Positions - Vérifiez que le produit offert est disponible (pas en rupture si la commande en rupture est interdite, pas désactivé, assigné à la boutique courante)
- Consultez Paramètres avancés → Logs en cherchant
dfoffers: le moteur trace son exécution à chaque ajout au panier
La remise ne s’applique pas malgré l’ajout du produit
Vérifiez dans les logs la ligne checkValidity qui suit la création de la règle de panier. PrestaShop y indique précisément pourquoi une règle est rejetée (rupture de stock, restriction client, devise différente, etc.).
La pastille cadeau n’apparaît pas sur les lignes du panier
Vérifiez que votre thème implémente bien le hook displayCartExtraProductActions dans cart-detailed-product-line.tpl. Les thèmes Classic et la plupart des thèmes commerciaux le contiennent. Si vous utilisez un thème custom qui ne l’implémente pas, ajoutez la ligne suivante dans votre fichier cart-detailed-product-line.tpl au niveau souhaité :
{hook h='displayCartExtraProductActions' product=$product}
Foire aux questions
Le module est-il compatible avec PrestaShop 9 ?
Non, la version 1.x cible PrestaShop 8.0 à 8.99 uniquement. Une version 2.x compatible PrestaShop 9 est planifiée séparément en raison des changements importants apportés à l’API contrôleur en PS 9.
Quel est l’impact sur les performances ?
Le moteur exécute une requête SQL par offre active sur la boutique, puis évalue les conditions en mémoire. Sur un catalogue avec une dizaine d’offres actives, l’évaluation complète prend en moyenne moins de cinquante millisecondes.
Puis-je utiliser le module avec un thème headless ?
Le moteur d’ajout automatique est indépendant du thème et fonctionne pour tout front qui passe par Cart::updateQty ou l’API REST PrestaShop. La bannière fiche produit et la pastille cadeau panier sont des hooks Smarty natifs qui nécessitent un thème classique pour s’afficher. Pour un front headless, vous pouvez exposer les données via une API custom qui interroge directement ps_dfoffers_offer et ps_dfoffers_cart_auto.
Le module gère-t-il les devises multiples ?
Oui. La règle de panier générée pour chaque offre utilise la devise du panier en cours. Si le client change de devise, la règle est régénérée à la valeur correcte au prochain actionCartSave.