prestashop module

Module PrestaShop de relance panier abandonné — awfollowup

Contexte

Le module natif PrestaShop "Follow-up" a été archivé le 3 février 2021. Des milliers de marchands l'utilisaient pour relancer automatiquement les paniers abandonnés ; depuis, plus aucune mise à jour de sécurité, plus de compatibilité avec les versions récentes de PrestaShop.

Un client e-commerce m'a sollicité pour une solution de remplacement. L'objectif : reprendre le concept d'origine, le moderniser sur la base de l'architecture Symfony intégrée à PrestaShop 1.7+, et livrer un module maintenable sur le long terme.

Réalisations

Architecture Symfony

Contrairement au module d'origine (construit sur du PHP procédural), awfollowup s'appuie entièrement sur les composants Symfony disponibles dans PrestaShop 1.7+ :

  • Autoload Composer (PSR-4) pour la gestion des dépendances et le chargement automatique des classes
  • Symfony Forms (GeneralFormType, GeneralFormDataProvider) pour le formulaire de configuration back-office
  • Symfony Routes (config/routes.yml) pour le contrôleur d'administration
  • Symfony Console : deux commandes CLI dédiées

Commandes CLI

Commande CLI awfollowup:send-reminders

Exécution de la commande de relance en console

Deux commandes disponibles depuis la racine PrestaShop :

php bin/console awfollowup:send-reminders
php bin/console awfollowup:cleanup-vouchers

send-reminders orchestre la détection des paniers éligibles et l'envoi des e-mails (une ligne de statut ✓/✗ par panier). cleanup-vouchers supprime proprement les coupons expirés et inutilisés via l'API PrestaShop. Les deux sont conçues pour être planifiées via crontab.

Logique de détection des paniers abandonnés

Un panier est éligible si :

  • il appartient à un client identifié (compte ou invité ayant saisi son e-mail)
  • il n'a pas été converti en commande
  • il n'a pas déjà reçu une relance (contrainte UNIQUE KEY sur id_cart dans ps_awfollowup)
  • sa dernière mise à jour se situe dans la fenêtre configurable [délai, âge maximum]

Interface de configuration

Configuration awfollowup

Page de configuration du module en back-office PrestaShop

Formulaire back-office complet accessible via Modules > Follow Up - Abandoned Cart : délai avant envoi (en heures), âge maximum des paniers (en jours), activation des coupons, pourcentage de réduction et durée de validité. Deux boutons d'action directe : Lancer maintenant (sans passer par le cron) et Envoyer un e-mail de test à l'administrateur connecté.

Génération de coupons de réduction

En option, le module génère un CartRule unique par panier avec code personnalisé, pourcentage et durée de validité configurables. Un template d'e-mail dédié (followup_cart_voucher) intègre le code et les conditions du coupon.

E-mail de relance awfollowup

Exemple d'e-mail de relance avec coupon de réduction

Les modèles d'e-mail (HTML + TXT) sont fournis en français et en anglais.

Difficultés techniques

Unicité des relances en environnement concurrent : si le cron se déclenche deux fois simultanément (latence réseau, overlap), un même panier pourrait recevoir deux e-mails. Résolu par une contrainte UNIQUE KEY sur id_cart en base : la BDD garantit l'unicité indépendamment du nombre de processus.

Nettoyage des CartRule orphelines : les coupons générés mais non utilisés s'accumulent rapidement en production et polluent le back-office. La commande cleanup-vouchers les purge via CartRule::delete() en respectant le cycle de vie PrestaShop.

Compatibilité multi-versions PS 1.7 : la couche Symfony évolue entre les sous-versions de PrestaShop 1.7.x. La configuration des services et des routes a nécessité des ajustements pour couvrir un spectre de versions large sans dépendances trop contraignantes.

Résultats

  • Module en production sur une boutique active
  • Zéro doublon de relance grâce à la contrainte UNIQUE KEY
  • Architecture Symfony testable et facilement extensible
  • Interface de configuration complète, sans accès serveur requis
  • Déclenchement via crontab standard (compatible tout hébergeur)
  • Licence AFL-3.0

Ce module vous intéresse ou vous avez un besoin similaire ? Contactez-moi, on en discute.