Tracking e-commerce GTM + GA4 : Implémentation complète et DataLayer
Les exemples de code respectent le schéma GA4 officiel de mai 2026. Vérifiez toujours vos implémentations via GA4 DebugView avant de publier en production.
DataLayer e-commerce complet, 13 événements GA4, balise unique regex, déduplication des transactions et vérification DebugView — guide technique de référence.
Tracking ecommerce GA4 · GTM GA4 ecommerce · Suivi ecommerce GA4 · Enhanced ecommerce GA4 · GA4 purchase event GTM · DataLayer e-commerce GA4
Le tracking e-commerce GA4 avec GTM repose sur 3 composants : un DataLayer e-commerce structuré (alimenté par votre site), une balise GA4 Event dans GTM avec l'option "Envoyer des données d'e-commerce", et un déclencheur Custom Event regex qui écoute tous les événements en une seule balise.
Règle absolue : chaque push DataLayer e-commerce doit être précédé de window.dataLayer.push({ecommerce: null}). Sans cette ligne, GTM fusionne les données du push précédent avec le suivant — ce qui produit des rapports GA4 avec des produits incorrects sur les événements de conversion.
⚡ Setup minimal GA4 e-commerce — opérationnel en 2h
Vous avez besoin de tracking e-commerce fonctionnel rapidement ? Voici le minimum viable — les 2 événements qui comptent vraiment avant tout le reste.
- 1. L'événement purchase — sans lui, vos conversions Google Ads et Meta ne remontent pas. C'est l'événement le plus critique de toute implémentation e-commerce.
- 2. L'événement add_to_cart — il alimente vos audiences de remarketing et vos rapports d'entonnoir GA4.
-
1Demandez à votre développeur ce DataLayer minimum
Sur la page de confirmation de commande :
window.dataLayer = window.dataLayer || []; window.dataLayer.push({ ecommerce: null }); window.dataLayer.push({ event: 'purchase', ecommerce: { transaction_id: 'ID_UNIQUE_COMMANDE', value: 89.99, // number, pas string currency: 'EUR', // Obligatoire items: [{ item_id: 'SKU-001', item_name: 'Nom du produit', price: 89.99, quantity: 1 }] } }); -
2Créez une seule balise GA4 dans GTM
Balise → Nouvelle → Google Analytics : Événement GA4 → Nom :
{{Event}}→ activez "Envoyer des données d'e-commerce" → Source : Couche de données → Déclencheur : Custom Eventpurchase. Publiez. -
3Vérifiez dans GA4 DebugView
Ajoutez
?debug_mode=1à l'URL → placez une commande test → l'événementpurchasedoit apparaître dans GA4 DebugView avec les paramètres corrects. Important : les données n'apparaissent dans les rapports Monétisation qu'après 24–48 heures — DebugView est la seule façon de valider immédiatement.
Vous préférez déléguer plutôt que de coder vous-même ? Nous configurons le DataLayer e-commerce complet.
Parlez-nous de votre projet →Architecture du tracking e-commerce GA4 — les 3 composants
| Composant | Qui le produit | Rôle |
|---|---|---|
| DataLayer e-commerce | Développeur front-end ou plugin CMS | Transmet les données produit structurées à GTM au bon moment |
| Configuration GTM | Analytics / marketing | Écoute les événements DataLayer et les envoie à GA4 et Google Ads |
| Propriété GA4 | Analytics | Reçoit les événements, les stocke, les rend disponibles dans les rapports |
Le maillon faible est toujours le DataLayer. GTM et GA4 ne peuvent pas corriger des données mal structurées côté site. Si le DataLayer envoie un prix en chaîne ("49.99") ou oublie currency, GA4 reçoit des données incorrectes — souvent sans erreur visible.
Les 13 événements e-commerce GA4 — liste complète
GA4 reconnaît 13 événements e-commerce recommandés. Contrairement à Universal Analytics, ces événements sont nativement supportés sans configuration supplémentaire — à condition de respecter exactement les noms et paramètres. Chaque événement supporte jusqu'à 27 paramètres custom par item dans le tableau items[] (source : Google Developers).
| Événement GA4 | Moment de déclenchement | Priorité | items[] requis |
|---|---|---|---|
view_item_list | Affichage d'une liste produits / catégorie | Moyen | ✅ Oui |
select_item | Clic sur un produit depuis une liste | Moyen | ✅ Oui |
view_item | Affichage d'une fiche produit | ⭐ Élevé | ✅ Oui |
add_to_cart | Ajout au panier | ⭐⭐ Critique | ✅ Oui |
remove_from_cart | Suppression du panier | Moyen | ✅ Oui |
view_cart | Affichage du panier | Moyen | ✅ Oui |
begin_checkout | Démarrage du checkout | ⭐⭐ Critique | ✅ Oui |
add_shipping_info | Saisie des infos d'expédition | Moyen | ✅ Oui |
add_payment_info | Saisie des infos de paiement | Moyen | ✅ Oui |
purchase | Confirmation de commande | ⭐⭐⭐ Maximum | ✅ Oui |
refund | Remboursement client réel | Élevé | ✅ Partiel |
add_to_wishlist | Ajout à la liste de souhaits | Faible | ✅ Oui |
view_promotion | Affichage d'une promotion / bannière | Faible | Optionnel |
Par où commencer : implémentez purchase, add_to_cart, begin_checkout et view_item en priorité. Ces 4 événements couvrent le tunnel d'achat complet et suffisent à alimenter Google Ads Smart Bidding, les audiences GA4 et l'analyse de l'entonnoir.
Votre DataLayer e-commerce n'est pas structuré correctement et vos rapports GA4 sont inexploitables ?
Parlez-nous de votre projet →DataLayer e-commerce GA4 — les 5 règles absolues
- Règle 1 — ecommerce: null avant chaque push. Sans ce reset, les données du push précédent contaminent le suivant et produisent des rapports avec de mauvais produits.
- Règle 2 — price et value sont des nombres, jamais des chaînes.
price: 49.99✅ —price: "49.99"❌. GA4 ignore silencieusement les valeurs numériques en chaîne dans les rapports de monétisation. - Règle 3 — currency est obligatoire. Sans le champ
currency, la valeur envoyée n'apparaît pas dans les rapports Monétisation de GA4. Toujours passer le code ISO — ex:"EUR". - Règle 4 — transaction_id est unique par commande. GA4 utilise ce champ pour dédupliquer les transactions. Un transaction_id vide produit des revenus multipliés. Sans
transaction_id, un rechargement de la page de confirmation multiplie le chiffre d'affaires 2 à 4 fois. - Règle 5 — items[] requiert item_id ou item_name. Au moins l'un des deux est obligatoire dans chaque objet item. Sans ces champs, l'item est ignoré dans les rapports produits GA4. Le tableau items[] supporte jusqu'à 27 paramètres custom par item.
Codes DataLayer complets — les 4 événements prioritaires
view_item — fiche produit
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null }); // Obligatoire
window.dataLayer.push({
event: 'view_item',
ecommerce: {
currency: 'EUR',
value: 89.99,
items: [{
item_id: 'SKU-001',
item_name: 'Veste imperméable Alpine',
item_brand: 'Alpine Pro',
item_category: 'Vêtements',
item_category2: 'Vestes',
item_variant: 'Bleu / L',
price: 89.99,
quantity: 1
}]
}
});
add_to_cart — ajout au panier
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'add_to_cart',
ecommerce: {
currency: 'EUR',
value: 89.99,
items: [{
item_id: 'SKU-001',
item_name: 'Veste imperméable Alpine',
item_brand: 'Alpine Pro',
item_category: 'Vêtements',
item_variant: 'Bleu / L',
price: 89.99,
quantity: 1
}]
}
});
begin_checkout — démarrage checkout
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'begin_checkout',
ecommerce: {
currency: 'EUR',
value: 134.98,
coupon: 'SOLDES10',
items: [
{ item_id: 'SKU-001', item_name: 'Veste imperméable Alpine', price: 89.99, quantity: 1 },
{ item_id: 'SKU-042', item_name: 'Gants ski Pro', price: 44.99, quantity: 1 }
]
}
});
purchase — confirmation commande (le plus critique)
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'CMD-20260508-00142', // ID unique — jamais vide
value: 134.98,
tax: 22.50,
shipping: 5.99,
currency: 'EUR',
coupon: 'SOLDES10',
items: [
{
item_id: 'SKU-001',
item_name: 'Veste imperméable Alpine',
item_brand: 'Alpine Pro',
item_category: 'Vêtements',
item_variant: 'Bleu / L',
price: 89.99,
quantity: 1
},
{
item_id: 'SKU-042',
item_name: 'Gants ski Pro',
item_category: 'Accessoires',
price: 44.99,
quantity: 1
}
]
}
});
Note sur le champ value : décidez dès le départ si vous transmettez HT ou TTC, et soyez cohérent sur tous vos événements. Une incohérence entre begin_checkout et purchase produit des rapports d'abandon de panier faux.
Configuration GTM — la balise unique avec déclencheur regex
Étape 1 — Créer le déclencheur regex
Déclencheurs → Nouveau → Type : Événement personnalisé
- Nom de l'événement :
view_item_list|select_item|view_item|add_to_cart|remove_from_cart|view_cart|begin_checkout|add_shipping_info|add_payment_info|purchase|refund - Cochez "Utiliser la correspondance d'expressions régulières"
- Nommez :
CE - GA4 Ecommerce Events (Regex)
Étape 2 — Créer la balise GA4 Event unique
- Balises → Nouvelle → Type : Google Analytics : Événement GA4
- Nom de l'événement : variable intégrée {{Event}}
- Dans "Plus de paramètres" → cochez "Envoyer des données d'e-commerce" → Source : Couche de données
- Associez le déclencheur regex créé à l'étape 1
Erreurs silencieuses — ce qui casse sans avertissement
| Erreur silencieuse | Symptôme dans GA4 | Cause | Correction |
|---|---|---|---|
price en string — price: "49.99" |
Revenus manquants ou à 0 dans les rapports Monétisation | GA4 ignore les valeurs numériques en chaîne | price: parseFloat("49.99") |
| currency manquante | Événement présent dans GA4 mais aucune valeur dans Monétisation | GA4 requiert currency pour afficher les revenus | Toujours ajouter currency: 'EUR' |
| ecommerce: null absent | Produits incorrects sur les événements | Fusion récursive GTM entre deux pushes consécutifs | Toujours ajouter dataLayer.push({ecommerce: null}) avant chaque push |
| transaction_id vide ou undefined | Revenus multipliés 2–4x, rapport d'achat avec des lignes vides | ID de commande non disponible au moment du push | Générer l'ID côté serveur et le passer dans le DataLayer |
| Double implémentation — GA4 natif + GTM | Tous les événements comptés en double, revenus × 2 | GA4 chargé via gtag.js ET via GTM dans le même conteneur | Désactiver Enhanced Measurement dans GA4 si vous envoyez manuellement les événements |
| Données non visibles après déploiement | Rapports Monétisation vides malgré des événements corrects dans DebugView | Délai normal de traitement GA4 — 24 à 48 heures pour les rapports Monétisation | Attendre 48h. Utiliser DebugView pour la validation immédiate |
| Événements dupliqués sur click bouton | Même événement visible 2–3 fois pour un seul achat | Utilisateur clique plusieurs fois sur "Confirmer" (connexion lente, impatience) | Implémenter un debounce JS avant le push purchase (voir section déduplication) |
Déduplication des transactions — le problème le plus coûteux
La duplication de transactions gonfle artificiellement le chiffre d'affaires dans GA4 et fausse le tROAS dans Google Ads — l'algorithme optimise alors vers des conversions fictives.
Solutions par ordre d'efficacité
- transaction_id unique côté serveur : GA4 utilise le
transaction_idpour la déduplication native. Si vous envoyez deux fois le même ID, GA4 ne comptabilise normalement que la première occurrence. - Debouncing JavaScript : si votre bouton "Confirmer" peut être cliqué plusieurs fois rapidement, implémentez un debounce avant le push purchase :
// Debounce — empêche les clicks multiples sur "Confirmer commande" let purchaseTracked = false; document.getElementById('btn-confirm').addEventListener('click', function() { if (purchaseTracked) return; // Ignore les clicks suivants purchaseTracked = true; window.dataLayer.push({ ecommerce: null }); window.dataLayer.push({ event: 'purchase', ecommerce: {...} }); }); - Flag de session :
if (!sessionStorage.getItem('purchase_tracked_' + orderId)) { sessionStorage.setItem('purchase_tracked_' + orderId, '1'); window.dataLayer.push({ ecommerce: null }); window.dataLayer.push({ event: 'purchase', ecommerce: {...} }); } - Redirection post-achat : après la confirmation, redirigez vers une URL unique (
/merci?order=CMD-001) — la page ne doit pas être rechargeable avec les mêmes données.
refund vs reverse — distinction importante dans GA4
GA4 distingue deux types de remboursement que la plupart des implémentations FR confondent :
- refund : remboursement client réel — soustrait le revenu du rapport Monétisation tout en conservant l'achat original pour l'analyse comportementale
- reverse (via Measurement Protocol) : annulation d'un achat fictif ou en double — pour les commandes frauduleuses, QA, ou les purchases dupliqués par erreur technique. À utiliser pour corriger les données historiques, pas pour les remboursements clients standards
Détecter les doublons existants dans GA4
GA4 → Explorations → Forme libre → dimension : Transaction ID, métrique : Achats. Filtrez sur Achats > 1. Tout transaction ID avec plus d'un achat est une transaction dupliquée.
Par plateforme — ce que vous pouvez déléguer à un plugin
| Plateforme | Plugin recommandé | DataLayer automatique ? | Conteneur GTM import ? |
|---|---|---|---|
| WooCommerce | GTM4WP (option WooCommerce avancée) | ✅ Oui — schéma GA4 | ✅ Disponible |
| Shopify | Custom Pixel GTM + events Shopify | ✅ Via analytics.subscribe | ⚠️ Manuel ou app tierce |
| PrestaShop | Module Google Analytics Enhanced Ecommerce | ⚠️ Vérifier schéma GA4 vs UA | ❌ Non |
| Magento 2 | Anowave GA4, MagePal GTM | ✅ Schéma GA4 | ✅ Selon module |
| Site custom | Implémentation manuelle | ❌ Développement requis | ❌ Manuel |
Avertissement plugins : même avec un plugin qui alimente le DataLayer automatiquement, vérifiez systématiquement la structure réelle des pushes via la console Chrome. De nombreux plugins sont encore sur le schéma Universal Analytics.
WooCommerce — points de vigilance spécifiques
Avec GTM4WP sur WooCommerce, vérifiez aussi que l'option "DataLayer enrichi pour WooCommerce" est activée, et que le plugin n'entre pas en conflit avec MonsterInsights — ce conflit produit des doublons d'événements. Pour les sites utilisant Elementor Pro pour personnaliser la page de confirmation WooCommerce, GTM4WP peut ne pas détecter la commande — dans ce cas, l'événement purchase ne se déclenche pas. Solution : implémentation manuelle du push DataLayer sur la page de confirmation Elementor.
Shopify — rappel
Pour le GA4 ecommerce tracking Shopify, les événements checkout et purchase passent par les Customer Events (Custom Pixel) depuis 2025. Voir le guide complet : GTM sur Shopify — Custom Pixel →
Vérification complète du tracking e-commerce
- Mode Preview GTM → chaque événement e-commerce apparaît dans la liste avec les bonnes valeurs dans l'onglet DataLayer
- ecommerce: null présent avant chaque push dans la console Chrome
- GA4 DebugView → les événements apparaissent en temps réel avec les paramètres corrects (items non vides, currency présente, value numérique)
- Pas de doublons → actualiser la page de confirmation ne déclenche pas un second push purchase
- transaction_id non vide → vérifier dans DebugView que le paramètre est présent et unique
- Enhanced Measurement GA4 → si vous envoyez manuellement purchase, désactivez "Achat" dans Enhanced Measurement pour éviter le double comptage
- Délai 48h → ne diagnostiquez pas l'absence de données dans les rapports Monétisation avant 48h post-déploiement
Votre implémentation e-commerce présente des anomalies — conversions dupliquées, revenus incorrects, événements manquants ? Un audit GTM complet identifie la cause en 2 heures.
Décrivez-nous votre situation.
CMS utilisé, outils Google en place, symptômes observés — plus vous êtes précis, plus notre retour sera concret. Réponse sous 24h.
Parlez-nous de votre projet →Réponse sous 24h · Sans engagement · Devis sur mesure
Questions fréquentes
view_item, add_to_cart, begin_checkout et purchase selon le schéma GA4 officiel. (2) Dans GTM, créer un déclencheur Custom Event regex et une seule balise GA4 Event avec "Envoyer des données d'e-commerce" activée. (3) Vérifier dans GA4 DebugView. Note : les rapports Monétisation prennent 24–48h à se peupler — DebugView est la seule validation immédiate.window.dataLayer.push({ecommerce: null}), les données de l'événement précédent persistent en mémoire et contaminent le push suivant — votre purchase contiendra les produits de la fiche produit consultée, pas les produits réellement achetés. Ce reset est obligatoire avant chaque push e-commerce, sans exception.