TL;DRPour installer Google Tag Manager sur PrestaShop sans fausser vos ventes, suivez cet ordre : relever les suivis existants, poser le conteneur, construire le dataLayer, recetter en mode aperçu, puis couper l'ancien suivi au moment de publier. Un double comptage vient presque toujours de deux suivis actifs en même temps.
Article à jour au 2 octobre 2026, sources consultées ce jour. Valable pour PrestaShop 8 et PrestaShop 9.
Vous avez installé Google Tag Manager sur PrestaShop. Depuis, GA4 affiche un chiffre d'affaires deux fois supérieur à celui du back-office. Ou l'inverse : plus aucune vente ne remonte.
Les deux symptômes viennent de la même étape mal faite : la bascule. Soit les deux suivis tournent ensemble, soit l'ancien a été coupé avant que le nouveau sache envoyer un achat.

Comment ce guide a été vérifié. Websource développe et maintient des boutiques PrestaShop depuis 2010. Les deux extraits du thème enfant ont été compilés avec Smarty sur les gabarits de Classic 2.1.3 (PrestaShop 8), Classic 3.1.2 et Hummingbird 2.1.2 (PrestaShop 9). Le comportement du module officiel a été lu dans son code source, version 6.0.0.
Ce que GTM change, et ce qu'il ne change pas#
Trois outils, trois rôles.
- Le dataLayer est un tableau JavaScript rempli par la boutique. Il décrit ce qui se passe : produit vu, panier modifié, commande passée.
- GTM lit ce tableau et déclenche des balises selon des règles. Il ne mesure rien tout seul.
- GA4 reçoit les données envoyées par les balises et produit les rapports.
Installer GTM sur PrestaShop ne suffit donc pas. Si la boutique ne remplit pas le dataLayer, GTM n'a rien à transmettre (présentation officielle de Tag Manager).
Ce que GTM change : vous ajoutez une balise sans toucher au code de la boutique. Ce qu'il ne change pas : la qualité des données dépend de ce que la boutique pousse.
La logique est la même que dans notre guide Google Tag Manager pour WooCommerce.

Faire l'état des lieux avant de toucher à quoi que ce soit#
Lister les suivis déjà en place#
Quatre endroits sont à contrôler :
- Le module officiel Google Analytics (
ps_googleanalytics). Il relie GA4 à PrestaShop en envoyant lui-même les événements, sans passer par GTM. - Les modules tiers : pixel Meta, Google Ads, PrestaShop Marketing with Google. Leur comportement serait à vérifier sur votre installation.
- Le code collé dans le thème : un extrait
gtagajouté à la main dans un gabarit. - Les surcharges : un module modifié dans le thème, ou un fichier du dossier
override/.
Où chercher concrètement#
- Modules : Modules > Gestionnaire de modules, en version 8 comme en 9. Cherchez google, analytics, tag, pixel, tracking.
- Thème : ouvrez
themes/votre-theme/templates/_partials/head.tpletthemes/votre-theme/templates/layouts/layout-both-columns.tpl. Cherchezgtag(,GTM-,G-etfbq(. - Surcharges : regardez
themes/votre-theme/modules/et le dossieroverride/à la racine. - Paramètres : Paramètres de la boutique > Trafic et SEO. Certains thèmes proposent aussi un champ d'en-têtes personnalisés, qui serait à chercher dans leur configuration.
Contrôle le plus fiable : affichez le code source d'une page (Ctrl+U) et cherchez googletagmanager.com.
Relever le tout pour pouvoir revenir en arrière#
Notez dans un tableur chaque module, sa version, son état et ses identifiants (G-XXXX, AW-XXXX, GTM-XXXX). Capturez chaque écran de configuration.
Copiez les fichiers du thème modifiés à la main. Désactivez les modules sans les désinstaller : une désinstallation peut effacer leur configuration.
Installer le conteneur GTM : les deux méthodes#
Créez le conteneur sur tagmanager.google.com, type Web. Google fournit deux extraits : un script pour le <head>, un <noscript> à placer juste après <body> (procédure officielle).
Méthode 1 : un module Google Tag Manager PrestaShop#
Un module dédié insère les deux extraits et génère le dataLayer. Plusieurs modules payants existent sur la marketplace Addons. Leur compatibilité, leur prix et leur gestion du consentement seraient à vérifier sur chaque fiche.
Installez-le dans Modules > Gestionnaire de modules > Installer un module, puis saisissez l'identifiant GTM-XXXXXXX.
Méthode 2 : l'insertion manuelle dans le thème enfant#
Ne modifiez pas le thème parent : une mise à jour écraserait vos changements. Créez un thème enfant selon la documentation PrestaShop, puis ajoutez deux fichiers.
Premier fichier, themes/votre-theme-enfant/templates/_partials/head.tpl :
{* Reprend le head.tpl du thème parent sans le recopier *}
{extends file='parent:_partials/head.tpl'}
{* head_charset est le premier bloc du head : GTM se charge au plus tôt *}
{block name='head_charset'}
{$smarty.block.parent}
{* literal empêche Smarty d'interpréter les accolades du JavaScript *}
{literal}
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXXX');</script>
{/literal}
{/block}
Second fichier, themes/votre-theme-enfant/templates/layouts/layout-both-columns.tpl :
{extends file='parent:layouts/layout-both-columns.tpl'}
{* Classic : ce bloc suit immédiatement la balise body *}
{* Hummingbird : remplacez son nom par top_content, premier bloc du body *}
{block name='hook_after_body_opening_tag'}
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
{$smarty.block.parent}
{/block}
Videz ensuite le cache : Paramètres avancés > Performances > Vider le cache.
Différence entre les versions. Sur PrestaShop 8, le thème par défaut est Classic. Hummingbird le remplace à partir de la 9.1.
Le bloc du head porte le même nom dans les deux thèmes. Pour le body, Hummingbird place deux éléments d'accessibilité avant le hook : utilisez-y le bloc top_content. Sur un thème acheté, ces noms seraient à vérifier dans ses fichiers.
Un passage à la version 9 est prévu ? Faites-le d'abord, avec notre checklist de migration vers PrestaShop 9.
Module ou insertion manuelle : le comparatif#
| Critère | Module dédié | Insertion manuelle |
|---|---|---|
| Mise en place | Quelques minutes, sans code | Deux fichiers à créer, puis le dataLayer à développer |
| Maintenance | Dépend de l'éditeur du module | À votre charge ou à celle de votre prestataire |
| Risque à la mise à jour | Module à revalider à chaque version majeure | Faible avec un thème enfant, élevé si le thème parent a été modifié |
| Contrôle du dataLayer | Limité aux réglages du module | Total : vous décidez de chaque champ |
Le dataLayer PrestaShop, le vrai sujet#
Sans dataLayer, GTM ne connaît que les pages vues et les clics. Il ignore le panier, les produits et le numéro de commande. Le suivi e-commerce PrestaShop repose sur ce que la boutique pousse.
Le suivi GA4 PrestaShop attend des noms d'événements précis, listés dans la documentation des événements recommandés.
| Événement GA4 | Moment de déclenchement | Page PrestaShop concernée |
|---|---|---|
view_item | Affichage de la fiche, puis à chaque changement de déclinaison | Fiche produit |
add_to_cart | Après la réponse du serveur à l'ajout | Fiche produit, listes, aperçu rapide |
remove_from_cart | Suppression d'une ligne ou baisse de quantité | Panier et panier latéral |
begin_checkout | Arrivée dans le tunnel | Page commande, première étape |
add_shipping_info | Validation du transporteur | Page commande, étape livraison |
add_payment_info | Validation du mode de paiement | Page commande, étape paiement |
purchase | Affichage de la confirmation | Page de confirmation de commande |
Côté thème, PrestaShop émet des événements JavaScript, dont updateCart pour le panier et updatedProduct pour les déclinaisons (référence des événements).
Côté serveur, un module peut se greffer sur le hook displayOrderConfirmation, qui reçoit la commande (liste des hooks).
La version 9.2 annonce une commande en une page : les étapes de livraison et de paiement y seraient à revérifier.
La structure de l'événement d'achat#
Voici le format attendu pour l'événement purchase GA4, d'après le guide e-commerce pour Tag Manager et la référence des paramètres :
window.dataLayer = window.dataLayer || [];
// Vide l'objet ecommerce précédent pour ne pas mélanger deux événements
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: "purchase", // nom exact attendu par GA4
ecommerce: {
transaction_id: "XKBKNABJK", // obligatoire – identifiant unique de la commande
value: 59.90, // obligatoire – montant, avec un point décimal
currency: "EUR", // obligatoire – code ISO 4217
tax: 9.98, // facultatif – montant des taxes
shipping: 4.90, // facultatif – frais de port
coupon: "RENTREE10", // facultatif – code de réduction utilisé
items: [ // obligatoire – au moins un article
{
item_id: "REF-1042", // item_id ou item_name : l'un des deux est obligatoire
item_name: "Sac bandoulière en cuir",
item_variant: "Noir", // déclinaison commandée
price: 45.00, // prix unitaire
quantity: 1
}
]
}
});
Les montants sont des nombres : 59.90, sans virgule ni symbole euro. Choisissez une convention pour value, hors taxes ou toutes taxes, et gardez-la.
Dans GTM : Balises > Nouvelle > Google Analytics : événement GA4. Cochez Envoyer des données d'e-commerce, source Couche de données. Le déclencheur est un Événement personnalisé nommé purchase.
Éviter le double comptage des transactions#
Désactiver l'ancien suivi avant d'activer le nouveau#
Le double comptage des transactions naît à la bascule. Tant que le conteneur n'est pas publié, il ne s'exécute que dans votre navigateur, en mode aperçu. Vous pouvez tout préparer sans risque.
Le jour venu : désactivez l'ancien suivi, videz le cache, puis publiez le conteneur, dans la même opération. L'inverse crée une période où chaque commande part deux fois.
Le module officiel laissé actif en parallèle#
Le module ps_googleanalytics envoie son propre événement d'achat à GA4 depuis la page de confirmation. Si votre balise GTM vise la même propriété, GA4 reçoit deux achats par commande.
Décidez qui envoie les achats : le module ou GTM, jamais les deux. Pour le couper : Modules > Gestionnaire de modules, puis Désactiver dans le menu du module. Sa version 6 exige PrestaShop 8.2.0 ; une boutique plus ancienne utilise une version antérieure.
Le rechargement de la page de confirmation#
Un client recharge la page de confirmation, ou la rouvre depuis son historique. Si le dataLayer pousse l'achat à chaque affichage, la commande est recomptée.
Le module officiel traite ce cas côté serveur : il note en base qu'une commande a déjà été envoyée. Un dataLayer sur mesure doit faire de même. À défaut, une protection dans le navigateur limite les dégâts :
var cle = "achat_envoye_XKBKNABJK"; // une clé par commande
if (!localStorage.getItem(cle)) { // première visite de la confirmation ?
// ... dataLayer.push de l'événement purchase ...
localStorage.setItem(cle, "1"); // mémorise l'envoi dans ce navigateur
}
Elle ne couvre pas un retour depuis un autre appareil : le marquage côté serveur reste plus fiable.
Le rôle de l'identifiant de transaction#
GA4 déduplique les achats web qui portent le même transaction_id (documentation Google). C'est un filet de sécurité : Google Ads et Meta appliquent leurs propres règles.
L'identifiant doit être unique par commande. S'il est identique d'une commande à l'autre, GA4 fusionne des ventes distinctes et le chiffre d'affaires s'effondre. Utilisez la référence visible dans Commandes > Commandes.
Les paiements externes#
Avec PayPal ou une page de paiement bancaire, le client quitte la boutique. Deux effets possibles :
- Il ne revient pas sur la confirmation : la commande existe dans PrestaShop, pas dans GA4.
- Il revient plus tard : la vente est attribuée au site de paiement. Ajoutez ces domaines dans GA4 : Administration > Flux de données > votre flux web > Configurer les paramètres de la balise > Tout afficher > Sites référents à ignorer.
Un cas vécu. Sur la boutique Futurheli, migrée par nos soins vers PrestaShop 1.7 puis 8.1.3, des commandes payées par PayPal n'étaient parfois pas enregistrées alors que le paiement était débité.
La validation dépendait d'un affichage qui échouait sans message. Nous l'avons corrigée (étude de cas Futurheli). La leçon vaut pour le suivi : la page de retour n'est pas un événement fiable. Testez chaque moyen de paiement.
Recette et validation#
Procédez dans cet ordre.
- Mode aperçu de GTM. Cliquez sur Prévisualiser, en haut à droite de l'espace de travail, puis saisissez l'adresse de la boutique. Passez une commande de test. Dans la colonne de gauche, cliquez sur
purchaseet contrôlez l'identifiant, le montant et les articles poussés dans la couche de données (documentation de l'aperçu). - Extension d'inspection. L'extension Chrome Tag Assistant Companion garde l'aperçu dans le même navigateur pendant le tunnel. Vérifiez qu'une seule balise d'achat se déclenche.
- Rapport temps réel GA4. Rapports > Temps réel : l'événement
purchasedoit apparaître dans la minute (rapport Temps réel). Une seule fois. - Rapprochement sur 48 heures. Exportez les commandes depuis Commandes > Commandes et comparez-les, par identifiant, aux transactions de GA4. Le traitement des données peut prendre 24 à 48 heures selon Google.
Quel écart accepter#
Il n'existe pas de seuil officiel. Notre repère : GA4 ne doit jamais afficher plus de commandes que le back-office. Un seul dépassement signale un doublon ou une commande de test.
Dans l'autre sens, un écart est normal : refus de consentement, bloqueurs de publicité, onglets fermés avant la confirmation, retours de paiement manqués.
L'écart devrait rester proche du taux de refus de votre bandeau cookies. Au-delà, cherchez du côté des paiements externes.
Consentement : articuler GTM, bandeau cookies et consent mode PrestaShop#
La règle de la CNIL : pas de dépôt de traceur avant accord, et un refus aussi simple que l'acceptation (Cookies et traceurs : que dit la loi ?).
Certains outils de mesure d'audience peuvent en être dispensés sous conditions. Notre comparatif des plateformes d'analytics françaises les présente.
Le bandeau recueille le choix, GTM l'applique. Le mode consentement de Google repose sur quatre signaux : ad_storage, analytics_storage, ad_user_data et ad_personalization.
En pratique :
- Tous les signaux sont réglés sur refusé par défaut. La plupart des CMP le font via leur modèle de balise, sur le déclencheur Initialisation du consentement – Toutes les pages.
- Dans GTM, activez Admin > Paramètres du conteneur > Activer la vue d'ensemble du consentement. Chaque balise affiche alors ses exigences sous Paramètres avancés > Paramètres d'autorisation (aide Tag Manager).
- Un pixel tiers sans prise en charge native reçoit une exigence supplémentaire : il ne se déclenche qu'après accord.
Quand le visiteur refuse, deux comportements existent. En mode de base, les balises Google restent bloquées et rien n'est envoyé. En mode avancé, elles envoient des mesures sans cookie. Ce choix relève de votre analyse de conformité.
Ce que nous faisons sur websource.fr. Le pixel Meta et la balise Google Ads ne se chargent qu'après accord pour la catégorie marketing, et le choix est conservé 13 mois. Nous avons retiré la variante noscript du pixel : elle suivait le visiteur avant tout choix.
Même vigilance avec l'extrait noscript de GTM : n'y rattachez aucune balise soumise à consentement.
Pour choisir l'outil, voyez notre comparatif des CMP françaises.
Performance : un conteneur rangé pèse moins#
GTM se charge de façon asynchrone. Ce sont les balises qu'il déclenche qui ralentissent la boutique.
- Supprimez les balises en pause et les outils abandonnés.
- Notre repère, faute de nombre officiel : au-delà d'une vingtaine de balises actives, vérifiez l'utilité de chacune.
- Déclenchez le chat ou les cartes de chaleur sur Fenêtre chargée plutôt que sur Toutes les pages.
- Hummingbird, sur PrestaShop 9, n'utilise plus jQuery dans son code : une ancienne balise HTML qui en dépend serait à tester.
Mesurez avant et après avec notre article Mon site est lent : le diagnostic en 5 étapes.
Pour les boutiques à fort volume, la mesure côté serveur déplace une partie des balises vers un serveur que vous contrôlez. C'est un projet à part, avec un coût d'hébergement.
Conclusion : la checklist de mise en production#
- Tous les suivis existants sont relevés, avec identifiants et captures.
- Le conteneur GTM est installé par une seule méthode, et présent sur toutes les pages, tunnel compris.
- Les sept événements e-commerce apparaissent dans le mode aperçu.
- L'événement
purchasecontienttransaction_id,value,currencyetitems. - Un rechargement de la page de confirmation ne renvoie pas l'achat.
- Chaque moyen de paiement a été testé avec une commande réelle.
- L'ancien suivi est désactivé, le cache vidé, puis le conteneur publié.
- Le rapprochement entre back-office et GA4 est fait à 48 heures, commande par commande.
Questions fréquentes#
Faut-il un module payant pour installer GTM sur PrestaShop ?#
Non. Le conteneur s'installe à la main dans un thème enfant, avec deux fichiers. Un module payant fait surtout gagner du temps sur le dataLayer, la partie longue à développer.
Pourquoi GA4 affiche-t-il plus de commandes que le back-office ?#
Le plus souvent, deux suivis envoient l'achat, par exemple le module officiel et GTM. Autres causes : la page de confirmation rechargée sans protection, ou des commandes de test.
GTM ralentit-il la boutique ?#
Le conteneur se charge de façon asynchrone. Ce sont les balises ajoutées qui pèsent : limitez-les et différez les secondaires.
Peut-on garder le module officiel Google Analytics avec GTM ?#
Oui, si les deux n'envoient pas les mêmes événements à la même propriété. Le plus simple : relier GA4 à PrestaShop par une seule voie.
La procédure est-elle la même sur PrestaShop 8 et PrestaShop 9 ?#
Les menus et les emplacements d'insertion sont identiques. Les différences portent sur le thème par défaut, Hummingbird à partir de la 9.1, et sur le tunnel de la 9.2. Refaites la recette après chaque montée de version.
Websource installe et recette le suivi e-commerce des boutiques PrestaShop. Si vous préférez confier cette migration, parlez-nous de votre boutique.







