DataLayer GTM : Configuration avancée, datalayer.push et débogage
Les exemples de code de cet article sont fournis à titre indicatif. Testez toujours vos pushes DataLayer dans le mode Preview GTM avant de publier en production.
Guide complet du DataLayer GTM — définition, datalayer.push, exemples e-commerce GA4, erreurs fréquentes et débogage par framework (React, Vue, Shopify, TypeScript).
DataLayer GTM · datalayer.push · DataLayer e-commerce GA4 · datalayer undefined · DataLayer c'est quoi · window.dataLayer · couche de données GTM
Le DataLayer (ou couche de données, data layer) est un tableau JavaScript (window.dataLayer) qui sert de pont structuré entre votre site et Google Tag Manager. Votre site y pousse des données ; GTM les lit pour déclencher les bonnes balises au bon moment.
Sans DataLayer : GTM scrape le DOM — fragile, cassé à chaque refonte. Avec DataLayer : GTM lit des clés stables définies par vous — robuste, indépendant du design.
Indispensable pour : tracking e-commerce GA4, Enhanced Conversions Google Ads, segmentation avancée, Consent Mode v2, tout événement qui dépend de données serveur (identifiant utilisateur, valeur de transaction, statut de paiement).
datalayer.push() est la façon standard d'y envoyer des données à tout moment. Les erreurs les plus fréquentes — variable undefined, timing incorrect, reset accidentel — ont toutes des solutions simples une fois qu'on comprend le fonctionnement de la file d'attente JavaScript.
C'est quoi le DataLayer GTM — définition et fonctionnement interne
Pour ceux qui se demandent DataLayer c'est quoi : techniquement, window.dataLayer est un tableau JavaScript (un array) que GTM surveille en permanence. Chaque fois qu'un objet y est ajouté via dataLayer.push(), GTM l'intercepte, extrait les clés/valeurs, met à jour son état interne et évalue si des déclencheurs correspondent à cet événement.
La définition DataLayer simplifiée : c'est une file d'attente de messages entre votre site (qui produit les données) et GTM (qui les consomme). GTM ne lit pas directement le DOM de votre page — il lit uniquement ce que vous avez mis dans le DataLayer. C'est ce qui rend le tracking découplé du design.
Ce que le DataLayer n'est pas
- Ce n'est pas une base de données permanente — le DataLayer se réinitialise à chaque chargement de page complète. Données pushées sur la page A : absentes sur la page B.
- Ce n'est pas automatiquement alimenté — si vous ne pushes rien, GTM ne voit rien au-delà des variables intégrées.
- Ce n'est pas GTM lui-même — GTM est le gestionnaire de balises qui lit le DataLayer. Ce sont deux composants distincts.
DataLayer vs gtag.js — quelle différence ?
gtag.js utilise aussi window.dataLayer en interne — mais via une API simplifiée (gtag('event', ...)) qui limite les possibilités. Le DataLayer GTM vous donne accès direct à la file d'attente et permet une granularité que gtag.js ne permet pas. Sur les sites avec GTM, le DataLayer est toujours préféré à gtag.js direct.
Renommer le DataLayer — quand et comment
Dans des cas avancés — conflits avec d'autres scripts, multi-conteneurs, applications complexes — il est possible de renommer l'objet DataLayer. La documentation officielle Google explique comment modifier le paramètre l dans le snippet GTM et la fonction gtag pour utiliser un nom personnalisé (ex : window.myDataLayer). Attention : toutes les occurrences de dataLayer dans votre code doivent être mises à jour, et les variables GTM doivent pointer vers le nouveau nom. Réservé aux cas où un conflit avéré existe avec un script tiers.
datalayer.push vs déclaration directe — quand utiliser quoi
La déclaration directe — avant GTM uniquement
// Déclaration directe — AVANT le snippet GTM
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'pageType': 'product',
'userLoggedIn': true,
'userId': 'U-12345'
});
Attention : si vous faites window.dataLayer = [...] au lieu de window.dataLayer = window.dataLayer || [], vous écrasez un DataLayer déjà existant — ce qui peut casser des déclencheurs GTM en cours.
datalayer.push — pour tout événement d'interaction
// datalayer.push — au moment de l'événement
document.getElementById('btn-add-cart').addEventListener('click', function() {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'add_to_cart',
'ecommerce': {
'currency': 'EUR',
'value': 49.99,
'items': [{
'item_id': 'SKU-001',
'item_name': 'T-shirt coton bio',
'item_category': 'Vêtements',
'quantity': 1,
'price': 49.99
}]
}
});
});
La clé 'event' dans le push est le signal que GTM écoute pour déclencher un Custom Event trigger. Sans cette clé, le push met à jour les variables disponibles mais ne déclenche aucune balise directement.
| Déclaration directe | datalayer.push() | |
|---|---|---|
| Moment d'exécution | Avant le snippet GTM | À tout moment après GTM |
| Usage principal | Données de page statiques | Événements d'interaction |
| Déclenche un trigger GTM ? | Oui si la clé "event" est présente | Oui si la clé "event" est présente |
| Risque de reset | ⚠️ Si mal écrit : écrase tout | ✅ Non — ajoute sans écraser |
| Recommandation | Données de page disponibles au chargement | Tout le reste — méthode standard |
Structure, bonnes pratiques et versioning du DataLayer
Conventions de nommage
Le DataLayer est sensible à la casse. transactionId et transactionid sont deux clés différentes. Adoptez une convention et ne la changez jamais :
- camelCase (recommandé pour les événements custom) :
transactionId,itemName,userLoggedIn - snake_case (recommandé pour les événements GA4) :
transaction_id,item_name,user_id - Règle absolue : ne mélangez pas les deux dans le même conteneur
- Taxonomie court et orientée action : préférez
lead_submitàform_submission_contact_page— les noms courts sont plus robustes dans les rapports GA4
Versioning du DataLayer — éviter de casser les implémentations existantes
Un aspect souvent ignoré en production : si vous modifiez la structure d'un événement DataLayer déjà consommé par des balises GTM actives, vous pouvez casser silencieusement le tracking existant. La pratique recommandée est de créer un nouvel événement versionné plutôt que de modifier l'existant :
// ❌ Modifier un événement existant — casse les balises actuelles en production
dataLayer.push({ event: 'add_to_cart', ...nouveaux_champs });
// ✅ Créer un événement versionné — les deux versions coexistent
dataLayer.push({ event: 'add_to_cart_v2', ...nouveaux_champs });
// Migrez ensuite les balises GTM progressivement vers v2
Cette approche est particulièrement importante pour les agences qui gèrent des conteneurs clients — une modification non versionnée peut casser des conversions Google Ads en production sans alerte immédiate.
Limitation GA4 — troncature des strings longs
Un bug documenté mais peu connu : GA4 tronque les valeurs de paramètres à environ 35–40 caractères. Si vous pushes un paramètre comme userRoles: "authenticated user, lead admin, administrator, all staff", GA4 et BigQuery ne recevront que les 35–40 premiers caractères — le reste est silencieusement ignoré. Solutions : diviser en plusieurs paramètres courts, utiliser un code numérique (role_id: 3 au lieu d'une chaîne longue), ou implémenter via BigQuery Export pour les analyses complexes sur des chaînes longues.
Ne jamais réinitialiser le DataLayer en cours de session
L'erreur la plus destructrice : faire window.dataLayer = [] ou dataLayer = [{}] après le chargement de GTM. Cela efface l'historique des événements et peut empêcher certains déclencheurs de s'activer. La règle : toujours utiliser push(), jamais réassigner le tableau.
| Type | Caractéristiques | Exemple | Quand pusher |
|---|---|---|---|
| Données de page statiques | Disponibles dès le chargement | Type de page, catégorie, langue | Avant GTM, dans le <head> |
| Données utilisateur | Spécifiques à la session, côté serveur | userId, plan, statut connexion | Avant GTM si disponibles côté serveur |
| Données d'interaction | Déclenchées par une action utilisateur | add_to_cart, form_submit, video_play | Via datalayer.push() au moment de l'action |
| Données e-commerce | Structurées selon le schéma GA4 | purchase, view_item, begin_checkout | Via datalayer.push() à chaque étape |
Variable DataLayer dans GTM — configuration pas à pas
-
1Créer la variable dans GTM
Variables → Nouvelle variable → Type : Variable de couche de données. Dans le champ "Nom de la variable de couche de données", entrez le chemin exact vers votre donnée.
-
2Notation des chemins pour les objets imbriqués
Pour accéder à des données imbriquées, utilisez la notation pointée :
// Pour ce push : dataLayer.push({ 'ecommerce': { 'transaction_id': 'T-001' }}); // Variable GTM : ecommerce.transaction_id // Premier item : ecommerce.items.0.item_name -
3Version du DataLayer — toujours version 2
Laissez "Version de la couche de données" sur 2. La version 1 est obsolète depuis 2012 et ne gère pas les objets imbriqués. Si vos variables retournent
undefinedsur des données imbriquées, vérifiez que la version est bien sur 2. -
4Vérifier via le mode Preview
Activez le mode Preview → déclenchez l'événement → onglet Variables. Votre variable datalayer doit afficher la valeur correcte. Si elle affiche
undefined: vérifiez la casse, la notation du chemin, et que le push s'est exécuté avant le déclencheur GTM.
Votre DataLayer est mal structuré et vos données e-commerce sont incorrectes dans GA4 ?
Parlez-nous de votre projet →DataLayer e-commerce GA4 — exemples complets
Le DataLayer GA4 suit le schéma officiel Google. Les clés sont imposées — toute déviation produit des données inexploitables dans les rapports e-commerce GA4.
Événement purchase — le plus critique
// datalayer.push purchase GA4 — sur la page de confirmation
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null }); // Réinitialiser le précédent push ecommerce
window.dataLayer.push({
'event': 'purchase',
'ecommerce': {
'transaction_id': 'T-20260508-001', // Unique — évite les doublons
'value': 89.99,
'tax': 14.99,
'shipping': 5.00,
'currency': 'EUR',
'coupon': 'SOLDES10',
'items': [{
'item_id': 'SKU-123',
'item_name': 'Veste imperméable',
'item_brand': 'Alpine Pro',
'item_category': 'Vêtements',
'item_category2': 'Vestes', // Sous-catégorie pour rapports enrichis
'item_variant': 'Bleu / L',
'price': 89.99,
'quantity': 1
}]
}
});
Point critique : le window.dataLayer.push({ ecommerce: null }) avant le push principal est recommandé par Google pour éviter que les données d'un événement précédent ne contaminent le rapport de purchase.
| Événement | Étape | Données clés |
|---|---|---|
view_item_list | Liste produits / catégorie | items[] avec item_list_name |
view_item | Fiche produit | items[] avec price, item_id |
add_to_cart | Ajout panier | items[] avec quantity, currency, value |
begin_checkout | Début checkout | items[], value, currency |
purchase | Confirmation commande | transaction_id, value, items[] |
refund | Remboursement | transaction_id — partiel ou total |
DataLayer WooCommerce, Shopify, Magento, PrestaShop
Sur WordPress / WooCommerce : le plugin GTM4WP propose une option "DataLayer enrichi pour WooCommerce" qui alimente automatiquement les événements e-commerce GA4. Sur Shopify : depuis 2024, l'API Customer Events remplace le DataLayer traditionnel — combinée avec un Custom Pixel GTM. Sur Magento 2 et PrestaShop : des extensions dédiées (Anowave, MagePal) alimentent le DataLayer e-commerce. Vérifiez toujours la compatibilité avec le schéma GA4 — beaucoup de modules sont encore sur le schéma Universal Analytics obsolète.
Timing et ordre d'exécution — les erreurs qui coûtent le plus cher
// ❌ PROBLÈME — push asynchrone peut arriver trop tard
fetch('/api/order-confirmation')
.then(data => {
window.dataLayer.push({ 'event': 'purchase', 'ecommerce': { ... } });
});
// ✅ SOLUTION — GTM attend le Custom Event 'purchase'
// Configurez votre déclencheur GTM sur Custom Event 'purchase'
// GTM attendra que ce push arrive, peu importe quand
<!-- ✅ ORDRE CORRECT — DataLayer statique avant GTM -->
<head>
<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'pageType': 'product',
'userId': 'id; ?>'
});
</script>
<!-- Google Tag Manager -->
<script>...snippet GTM...</script>
</head>
DataLayer par framework — spécificités
DataLayer React / Next.js
Dans une SPA React ou Next.js, le DataLayer ne se réinitialise pas entre les routes car il n'y a pas de rechargement de page. Utilisez useEffect avec la dépendance correcte et ajoutez toujours { ecommerce: null } avant chaque push e-commerce :
import { useEffect } from 'react';
function ProductPage({ product }) {
useEffect(() => {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
'event': 'view_item',
'ecommerce': {
'currency': 'EUR',
'value': product.price,
'items': [{ 'item_id': product.sku, 'item_name': product.name, 'price': product.price }]
}
});
}, [product.sku]);
}
DataLayer Vue.js / Nuxt
// Vue 3 — Composition API
import { onMounted } from 'vue';
export default {
setup() {
onMounted(() => {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ 'event': 'page_viewed', 'pageCategory': 'blog' });
});
}
}
DataLayer TypeScript — typage et erreurs
Le message "datalayer does not exist on type window" est fréquent en TypeScript. Solution :
// TypeScript — fichier global.d.ts
declare global {
interface Window {
dataLayer: Array<{
event?: string;
ecommerce?: Record<string, unknown>;
[key: string]: unknown;
}>;
}
}
// Utilisation sécurisée
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'purchase',
ecommerce: { transaction_id: 'T-001', value: 99.99, currency: 'EUR' }
});
Quand utiliser un DataLayer — et quand c'est inutile
| Votre situation | Besoin DataLayer ? | Par quoi commencer |
|---|---|---|
| Site vitrine simple, pas d'e-commerce | 🟢 Non — inutile | GTM + triggers natifs (scroll, clic, page view) suffisent. Zéro développement. |
| Blog ou site de contenu | 🟡 Partiel | DataLayer utile uniquement pour les conversions newsletter ou événements non capturables par GTM natif. |
| E-commerce (WooCommerce, Shopify…) | 🔴 Oui — obligatoire | Sans DataLayer e-commerce structuré, le tracking purchase est soit absent, soit basé sur des sélecteurs CSS fragiles. Commencez par le DataLayer purchase. |
| Lead generation avec formulaires multiples | 🟠 Recommandé | Si vous avez >3 types de formulaires distincts, le DataLayer clarifie l'attribution et évite les faux positifs sur les triggers formulaire GTM. |
| SPA (React, Vue, Next.js) | 🔴 Oui — critique | Sans DataLayer + History Change trigger, GTM ne voit qu'une seule page vue sur toute la session. Tous vos rapports GA4 sont faux. |
| Application avec données serveur | 🟠 Recommandé | Le DataLayer est le seul moyen de transmettre des données générées côté serveur à GTM — ID utilisateur, plan, date d'abonnement. |
🛒 Vous avez un e-commerce
Votre priorité : DataLayer purchase + add_to_cart. Sans ça, votre tracking GA4 et vos conversions Google Ads sont incomplets. Parlez-nous de votre projet →
📋 Vous avez des formulaires
Commencez par les triggers natifs GTM. Si ça ne suffit pas (formulaires AJAX, multi-étapes), ajoutez un DataLayer pour l'événement de succès côté serveur.
⚛️ Vous avez une SPA React/Vue
DataLayer obligatoire dès le départ. Votre développeur front doit l'intégrer au routeur. Parlez-nous de votre projet →
Déboguer le DataLayer — outils gratuits
Voir le DataLayer dans la console Chrome
- Ouvrez DevTools (F12) → onglet Console
- Tapez
dataLayeret appuyez sur Entrée - Tableau complet avec tous les pushes dans l'ordre chronologique
// Afficher le dernier événement pushé
dataLayer[dataLayer.length - 1]
// Filtrer les événements d'achat
dataLayer.filter(e => e.event === 'purchase')
| Extension | Avantages | Accès |
|---|---|---|
| DataLayer Checker | Affiche les pushes en temps réel avec mise en forme lisible. La plus simple. | Gratuit — Chrome Web Store |
| DataLayer Inspector+ (Adswerve) | Vue structurée de chaque push, historique paginé — le meilleur outil gratuit | Gratuit — Chrome Web Store |
| Mode Preview GTM | Onglet DataLayer — affiche chaque push avec ses clés/valeurs dans GTM officiel | Gratuit — dans GTM |
Déboguer un push qui ne déclenche pas
-
1Vérifiez que le push existe dans window.dataLayer
Console Chrome →
dataLayer→ cherchez votre événement. S'il n'est pas là, le problème vient du code côté site, pas de GTM. -
2Vérifiez la clé "event" dans le push
Un push sans clé
eventne déclenche aucun Custom Event trigger GTM. Vérifiez que'event': 'nom_exact'est présent et correspond exactement au nom dans votre déclencheur GTM. -
3Vérifiez le timing dans le mode Preview GTM
Mode Preview → liste des événements → votre push doit apparaître dans la timeline. S'il n'apparaît pas, vérifiez que
window.dataLayerest bien initialisé avant le snippet GTM. -
4Vérifiez la casse des clés
Mode Preview → événement → onglet Variables → variable affiche
undefined? Comparez caractère par caractère le nom de la clé dans le push avec le nom dans la variable GTM.
Erreurs fréquentes et solutions
| Erreur | Cause | Solution |
|---|---|---|
| datalayer undefined / Variable retourne undefined | Casse incorrecte, chemin mal formé, push exécuté après le déclencheur GTM | Vérifier casse exacte dans le mode Preview → onglet Variables. Notation pointée pour les objets imbriqués. |
| datalayer.push not working | La clé "event" est absente, GTM n'est pas chargé, ou window.dataLayer n'est pas initialisé | Vérifier la clé "event". Contrôler window.dataLayer dans la console. S'assurer que GTM est chargé avant le push. |
| datalayer is not defined | Code accède à dataLayer sans window. hors du scope global, ou GTM pas encore chargé |
Toujours utiliser window.dataLayer = window.dataLayer || []. En TypeScript, déclarer le type global. |
| Événements e-commerce en double dans GA4 | Push ecommerce précédent non réinitialisé | Ajouter window.dataLayer.push({ ecommerce: null }); avant chaque push d'événement ecommerce. |
| DataLayer vide sur les pages SPA | Pas de rechargement de page → GTM ne déclenche pas les triggers de page_view | Configurer un déclencheur History Change dans GTM et pusher un événement virtualPageview à chaque changement de route. |
| DataLayer reset accidentel | Code qui exécute window.dataLayer = [] — réinitialise tout le tableau |
Chercher dans le code toutes les occurrences de dataLayer = [ (sans push). Les remplacer par window.dataLayer = window.dataLayer || []. |
| Paramètre tronqué dans GA4 / BigQuery | GA4 tronque les valeurs string à ~35–40 caractères silencieusement | Raccourcir les valeurs de paramètres, utiliser des codes numériques, ou implémenter via BigQuery Export pour les analyses complexes. |
| Données manquantes dans le DataLayer WordPress | Plugin GTM4WP sans option WooCommerce activée, ou conflit avec un autre plugin | Activer l'option DataLayer enrichi dans GTM4WP. Vérifier les conflits avec d'autres plugins de tracking. |
Si votre DataLayer est déjà en place mais que vos données semblent incorrectes dans GA4 ou Google Ads, la cause est peut-être ailleurs dans votre configuration GTM. Un audit GTM complet identifie la source exacte du problème.
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
window.dataLayer) qui sert de pont entre votre site et GTM. Votre site y pousse des données via dataLayer.push() ; GTM les lit pour déclencher les balises correspondantes. Sans DataLayer, GTM dépend du DOM — fragile à chaque refonte. Avec DataLayer, le tracking est découplé du design et fiable.datalayer.push() est utilisé à tout moment après GTM pour les événements d'interaction. La recommandation : utilisez toujours push(). Évitez de réassigner window.dataLayer = [...] qui écrase les données existantes et peut désactiver les listeners GTM.transactionId ≠ transactionid), mauvais chemin pour les objets imbriqués, push qui s'exécute après le déclencheur GTM, ou variable GTM non activée. Vérifiez dans le mode Preview → onglet Variables après avoir déclenché l'événement.dataLayer. Méthode 2 : extensions Chrome gratuites — DataLayer Inspector+ (Adswerve), DataLayer Checker — affichent les pushes en temps réel avec une interface lisible. Méthode 3 : mode Preview GTM → onglet DataLayer de chaque événement.window.dataLayer est réinitialisé à chaque chargement de page complète. Non, pour les SPA (React, Vue, Angular) : sans rechargement de page, le DataLayer persiste pendant toute la session — d'où la nécessité d'un push { ecommerce: null } avant chaque événement e-commerce, et d'un déclencheur History Change dans GTM pour simuler les page_views.