Table des matières :
- Pourquoi utiliser n8n pour la gestion des commandes PrestaShop (et pourquoi des webhooks) ?
- Architecture cible (vue d’ensemble)
- Côté PrestaShop : émettre un webhook sur création et mise à jour de commande
- Sécuriser le webhook : HMAC, anti‑rejeu et bonnes pratiques
- Côté n8n : workflow de réception, validation et orchestration
- Idempotence et gestion des doublons (indispensable en e‑commerce)
- Cas d’usage concrets en France/Belgique/Suisse francophone
- Monitoring, reprise sur erreur et conformité (RGPD)
- Plan de déploiement et tests (avant mise en prod)
- Conclusion
n8n : automatiser la gestion des commandes e‑commerce via webhooks
Vous cherchez à mettre en place un automatisme avec n8n et PrestaShop (webhooks sur création/maj de commande), mais il me manque deux informations nécessaires pour être précis :
1) Version PrestaShop exacte (8.0 / 8.1 / 9.x ?) et version PHP (8.1 / 8.2 / 8.3 ?)
2) Mode d’hébergement n8n : Cloud n8n, Docker self‑hosted (single) ou queue mode (Redis + workers) ?
Sans ces précisions, je peux écrire un article générique, mais votre consigne demande de contextualiser « les versions exactes ».
Dites‑moi ces 2 points et je vous livre l’article complet (1200–1500 mots, H2, code module PrestaShop + workflow n8n, sécurité HMAC, idempotence, monitoring, et liens internes/externe).
Dans la suite, je pars donc sur une approche générique et robuste, compatible avec la plupart des boutiques PrestaShop 8.x et des déploiements n8n (Cloud ou self‑hosted). L’objectif : déclencher automatiquement des actions (ERP, expédition, facture, emails internes, Slack, Google Sheets, etc.) dès qu’une commande est créée ou mise à jour, sans “scraper” ni interroger en boucle l’API.
Pourquoi utiliser n8n pour la gestion des commandes PrestaShop (et pourquoi des webhooks) ?
Dans PrestaShop, il n’existe pas de « webhooks commandes » natifs dans le cœur : on a plutôt une logique événementielle interne (hooks) et une API Webservice surtout pensée pour du pull (vous interrogez PrestaShop). En e‑commerce, le pull a deux limites fréquentes :
- Latence : vous découvrez la commande 5, 10 ou 30 minutes plus tard, selon votre cron.
- Charge & complexité : vous devez gérer des diff, des pagination, des états, et des risques de rate‑limit.
Les webhooks inversent la logique : PrestaShop pousse l’événement dès qu’il se produit. n8n est ensuite un bon chef d’orchestre parce que :
- vous chaînez des étapes (validation → enrichissement → routage → écriture en base → notifications),
- vous centralisez les logs et les erreurs,
- vous adaptez facilement les flux selon le transporteur (Colissimo, Mondial Relay…), le moyen de paiement, le pays, la TVA, etc.
Architecture cible (vue d’ensemble)
Une architecture simple et efficace ressemble à ceci :
- PrestaShop (module léger) émet un POST HTTP vers une URL n8n.
- n8n (Webhook trigger) reçoit l’événement, le valide (signature), dédoublonne (idempotence) puis déclenche vos actions.
- Optionnel : une base (MySQL/PostgreSQL) ou un stockage dédié pour garder une trace (événements traités, statuts, erreurs, retry).
Mini‑schéma logique :
order.created(création/validation de commande) → création client/commande dans ERP → création d’étiquette transporteur → message à l’équipe logistiqueorder.updated(changement d’état) → “payée”, “préparée”, “expédiée”, “remboursée” → synchronisation CRM/outil de support → mise à jour tableur
Pour éviter les mauvaises surprises, on vise dès le départ :
- Signature HMAC (authentification du webhook)
- Anti‑rejeu (timestamp / tolérance)
- Idempotence (pas de doublons si PrestaShop retente ou si n8n rejoue)
- Réponse rapide (ack immédiat), et traitement asynchrone si possible
Côté PrestaShop : émettre un webhook sur création et mise à jour de commande
Quels événements PrestaShop exploiter ?
Deux hooks courants (selon besoins) :
actionValidateOrder: quand la commande est validée (souvent un bon proxy de “commande créée”).actionObjectOrderUpdateAfter: après modification de l’objet Order (utile pour capter certains changements).
Il est important de définir ce que “mise à jour” signifie chez vous : changement d’état, modification de l’adresse, ajout d’un numéro de suivi, etc. En pratique, beaucoup d’équipes se limitent à :
order.created: à la validationorder.status_changed: quand l’état commande change
Données à envoyer (et à ne pas envoyer)
Bon compromis : envoyer des identifiants + quelques champs clés, et laisser n8n aller chercher les détails si nécessaire (via API), plutôt que pousser un payload énorme à chaque événement.
Exemple de payload utile :
event:order.created/order.updatedorder_id,referencecurrent_state(id état)total_paid_tax_incl,currencycustomer_iddate_add,date_upd- Optionnel :
shipping_numbersi disponible,carrier_id,payment
Évitez d’envoyer des données sensibles inutiles (ex. email en clair) si vous n’en avez pas besoin. En contexte RGPD, appliquez le principe de minimisation : n’envoyez que ce qui est nécessaire au traitement.
Exemple de module minimal (émission webhook + HMAC)
Ci‑dessous un exemple minimaliste (pédagogique) : un module PrestaShop qui envoie un webhook lors de la validation de commande et lors d’une mise à jour. Il utilise cURL (pas de dépendance externe) et une signature HMAC basée sur une chaîne canonique (plus stable que “signer le JSON brut”).
À adapter : nom du module, écran de configuration, choix précis des hooks, gestion des timeouts et des erreurs, et éventuellement file d’attente (si vous ne voulez jamais bloquer le front).
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
class N8nWebhooks extends Module
{
public function __construct()
{
$this->name = 'n8nwebhooks';
$this->tab = 'administration';
$this->version = '1.0.0';
$this->author = 'Votre équipe';
$this->need_instance = 0;
parent::__construct();
$this->displayName = 'n8n Webhooks (Commandes)';
$this->description = 'Émet des webhooks n8n lors de la création et mise à jour de commandes.';
}
public function install()
{
return parent::install()
&& $this->registerHook('actionValidateOrder')
&& $this->registerHook('actionObjectOrderUpdateAfter');
}
public function hookActionValidateOrder($params)
{
/** @var Order $order */
$order = $params['order'];
$this->sendWebhook('order.created', $order);
}
public function hookActionObjectOrderUpdateAfter($params)
{
if (empty($params['object']) || !($params['object'] instanceof Order)) {
return;
}
/** @var Order $order */
$order = $params['object'];
$this->sendWebhook('order.updated', $order);
}
private function sendWebhook($event, Order $order)
{
$url = Configuration::get('N8NWH_URL');
$secret = Configuration::get('N8NWH_SECRET');
if (empty($url) || empty($secret)) {
return;
}
$payload = [
'event' => $event,
'shop' => [
'base_url' => Tools::getShopDomainSsl(true),
'id_shop' => (int) $order->id_shop,
],
'order' => [
'id' => (int) $order->id,
'reference' => (string) $order->reference,
'current_state' => (int) $order->current_state,
'total_paid_tax_incl' => (float) $order->total_paid_tax_incl,
'currency_id' => (int) $order->id_currency,
'customer_id' => (int) $order->id_customer,
'date_add' => (string) $order->date_add,
'date_upd' => (string) $order->date_upd,
],
];
// Chaîne canonique pour signature (évite les soucis de "raw body" côté n8n)
$timestamp = time();
$canonical = $timestamp . '|' . $event . '|' . (int)$order->id . '|' . (string)$order->date_upd;
$signature = hash_hmac('sha256', $canonical, $secret);
// Idempotency key : même événement + même date_upd => même clé
$idempotencyKey = hash('sha256', $event . '|' . (int)$order->id . '|' . (string)$order->date_upd);
$json = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $json,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json; charset=utf-8',
'X-Webhook-Timestamp: ' . $timestamp,
'X-Webhook-Signature: ' . $signature,
'X-Idempotency-Key: ' . $idempotencyKey,
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 3, // court pour ne pas ralentir PrestaShop
CURLOPT_CONNECTTIMEOUT => 2,
]);
$response = curl_exec($ch);
$httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Option : log minimal si besoin (à affiner)
if ($httpCode >= 400) {
PrestaShopLogger::addLog(
sprintf('n8n webhook error (%s) order #%d HTTP %d', $event, (int)$order->id, $httpCode),
2
);
}
}
}
À faire “proprement” en production :
- ajouter une page de configuration (URL n8n, secret, événements activés),
- gérer une stratégie de retry côté PrestaShop ou accepter que n8n fasse le retry via des mécanismes d’exécution/relance,
- éventuellement décorréler l’envoi (file interne) pour ne jamais dépendre du réseau pendant le checkout.
Sécuriser le webhook : HMAC, anti‑rejeu et bonnes pratiques
Un webhook “nu” (URL publique) finit souvent scanné et spammé. La base :
1) HMAC (signature)
Le principe : PrestaShop et n8n partagent un secret. PrestaShop calcule une signature hash_hmac et l’envoie dans un header. n8n recalcule et compare.
Recommandations concrètes :
- secret long (32+ caractères), stocké en config, jamais en dur dans le code
- rotation possible (prévoir un champ “secret actuel” + “secret précédent” pendant une période de transition)
2) Anti‑rejeu
Envoyez un X-Webhook-Timestamp et refusez les requêtes trop anciennes (ex. plus de 5 minutes). Même si quelqu’un intercepte une requête, elle devient inutilisable plus tard.
3) Filtrage réseau (si possible)
Selon votre infra :
- autoriser uniquement certaines IP (plus simple si n8n est dans la même infra/VPN),
- mettre le endpoint derrière un reverse‑proxy (Nginx/Traefik) avec rate limiting,
- imposer HTTPS (TLS) de bout en bout.
4) Minimisation des données (RGPD)
Si vous traitez des données personnelles (client, adresse, email), vérifiez :
- que n8n est hébergé dans un environnement conforme à vos exigences (souvent UE),
- que les logs n8n ne conservent pas indéfiniment des payloads sensibles,
- que vous avez une base légale et une durée de conservation.
Côté n8n : workflow de réception, validation et orchestration
n8n va jouer 3 rôles : réception, contrôle, orchestration.
Documentation utile (nœud Webhook n8n) : https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/
Workflow type (liste de nœuds)
Un workflow courant :
1) Webhook (Trigger)
2) Code (ou Function) : validation signature + vérif timestamp + normalisation
3) Stockage “idempotence” : vérifier si X-Idempotency-Key a déjà été traité
4) Switch/IF sur event
5) Actions : HTTP Request (ERP), Slack, Email, Google Sheets, DB, transporteur, etc.
6) Respond to Webhook : répondre 200 rapidement (ou répondre tôt puis continuer en asynchrone selon votre approche)
Validation HMAC côté n8n (logique)
Sans entrer dans les détails d’implémentation propres à votre version n8n, l’idée est :
- lire les headers
X-Webhook-Timestamp,X-Webhook-Signature - reconstruire la chaîne canonique exactement comme PrestaShop :
timestamp|event|order_id|date_upd - recalculer le HMAC SHA‑256 avec le secret
- comparer de manière stricte
- refuser si timestamp trop ancien
Pseudo‑contrôle (logique) :
- si
abs(now - timestamp) > 300s→ rejeter - si
signature != hmac(canonical, secret)→ rejeter - sinon → continuer
Point important : ne renvoyez pas d’erreur “détaillée” (“signature incorrecte”) à l’extérieur. Répondez plutôt 401 Unauthorized ou 403 Forbidden avec un message générique.
Dédoublonnage : où stocker l’idempotence ?
Trois options réalistes :
- Base SQL (recommandé si vous avez déjà MySQL/PostgreSQL)
Tablewebhook_events(idempotency_key, received_at, order_id, event, status, error). - Redis (pratique, TTL facile)
Stocker la clé avec une durée (ex. 7 jours). - Stockage interne n8n (possible pour petits volumes, mais à éviter si vous scalez ou si vous avez plusieurs workers)
Si vous êtes en queue mode (Redis + workers), préférez Redis ou une DB : c’est conçu pour être partagé entre plusieurs exécuteurs.
Idempotence et gestion des doublons (indispensable en e‑commerce)
En e‑commerce, les doublons arrivent vite :
- double clic / timeouts / retry réseau
- module qui déclenche plusieurs hooks
- exécutions rejouées côté n8n
La règle d’or : une commande ne doit pas créer deux factures, deux expéditions ou deux écritures ERP.
Checklist pratique :
- une clé d’idempotence stable (ex.
event + order_id + date_upd) - un stockage “vu/pas vu”
- un comportement clair :
- si déjà traité → répondre
200(ou202) et ne rien refaire - si en cours → répondre
202et ignorer (ou mettre en file)
Astuce simple : enregistrez aussi un “résultat” (ex. erp_order_id) pour pouvoir faire des mises à jour plutôt que des créations.
Cas d’usage concrets en France/Belgique/Suisse francophone
Quelques scénarios “terrain” où webhooks + n8n font gagner du temps, sans sur‑automatiser :
- TVA et facturation : si vous vendez en B2B (intracom) ou selon pays, déclencher un contrôle automatique (présence du numéro de TVA, règles de facturation), puis router vers un outil de facturation.
- Transporteurs locaux : en fonction du transporteur choisi (Colissimo, Mondial Relay, Chronopost, etc.), appeler une API d’étiquetage différente, puis pousser le numéro de suivi dans votre outil interne ou notifier l’équipe.
- Paiements fractionnés : si vous utilisez une solution de paiement en plusieurs fois, déclencher une étape “vérifier statut paiement” avant de lancer la préparation.
- Service client : créer automatiquement un ticket (ou une tâche) uniquement si le panier contient certains SKU (produit fragile, produit sur‑mesure, précommande).
Mini‑exemple de règle métier (simple et fréquent) :
- si
total_paid_tax_incl > 300et pays ≠ France → notifier un canal “contrôle fraude / vérif adresse” - sinon → flux normal
L’intérêt de n8n ici : vous matérialisez ces règles de façon lisible, sans redéployer toute la boutique.
Monitoring, reprise sur erreur et conformité (RGPD)
Monitoring opérationnel
À mettre en place dès le début :
- un canal d’alerte (email/Slack) en cas d’échec
- une politique de retry (exponentielle si possible) sur les appels externes (ERP, transporteur)
- des logs exploitables :
- order_id
- event
- idempotency_key
- code retour HTTP des systèmes appelés
Si vous self‑hostez n8n, surveillez :
- la disponibilité de l’instance
- l’espace disque (exécutions/logs)
- la base de données n8n
- Redis si vous êtes en queue mode
RGPD : points d’attention concrets
- Limitez les données personnelles dans les payloads.
- Attention aux outils tiers dans le workflow : si vous envoyez des données client vers un SaaS, vérifiez le cadre contractuel (DPA), la localisation, et les durées de conservation.
- Purgez ou masquez les champs sensibles dans les logs (selon configuration et besoins d’audit).
Plan de déploiement et tests (avant mise en prod)
Une mise en production “safe” ressemble à ça :
1) Environnement de test (préprod si possible)
2) Webhook n8n en mode “log only” (il reçoit et log, mais n’écrit rien en ERP)
3) Déclencher des scénarios :
- commande payée carte
- commande virement (en attente)
- commande annulée / remboursée
- changement d’état manuel en BO
4) Vérifier : - signature OK / refus si signature fausse
- timestamp refusé si trop ancien
- dédoublonnage OK (rejouer la même requête → pas de double action)
5) Passer progressivement en “actif” : - d’abord notifications internes
- puis création ERP
- puis expédition / écritures sensibles
Table de vérification rapide :
| Point | Objectif | Test |
|---|---|---|
| Signature HMAC | empêcher l’injection | requête sans signature → 401 |
| Anti‑rejeu | bloquer la relecture | timestamp ancien → 401/403 |
| Idempotence | pas de double traitement | rejouer la même clé → pas d’action |
| Timeout PrestaShop | checkout fluide | n8n down → commande OK, log erreur |
| Observabilité | diagnostiquer vite | logs avec order_id + event |
Conclusion
Automatiser la gestion des commandes PrestaShop avec n8n via webhooks est surtout un travail de design de flux fiable : sécurité (HMAC), idempotence (dédoublonnage), et monitoring (alertes + logs). Une fois ces fondations posées, vous pouvez itérer rapidement sur des cas d’usage concrets (ERP, expédition, service client) sans alourdir votre boutique ni multiplier les scripts cron.
Si vous me donnez :
- votre version PrestaShop + PHP,
- votre mode d’hébergement n8n (Cloud/Docker/queue),
je peux vous adapter : les hooks exacts, le format de payload optimal, la stratégie de stockage idempotent (DB/Redis), et une version “production‑ready” du module + workflow n8n correspondant à votre contexte.
