Pretium eget enim ut bibendum ac rutrum hendrerit risus vitae non morbi phasellus sollicitudin luch venenatis tortor massa porttitor diam auctor arcu cursus sit mauris scelerisque orci aliquam amet nascetur lectus tempus nunc tortor sed enim fermentum tincidunt quis erat nibh interdum cum tristique tincidunt cursus malesuada amet ac feugiat aliquam tellus non.
Mus mauris donec consectetur nisl ultricies. Malesuada integer augue sed ullamcorper condimentum malesuada mauris vulputate integer. Sit fermentum sit orci sit velit pulvinar sed. Nunc leo sed diam ornare felis magna id vitae urna. Scelerisque gravida eget at pellentesque morbi amet vitae elit volutpat. Pretium in gravida vel nascetur platea dictum parturient laoreet.
Sit fermentum sit orci sit velit pulvinar sed. Nunc leo sed diam ornare felis magna id vitae urna. Scelerisque gravida eget at pellentesque morbi amet vitae elit volutpat. Pretium in gravida vel nascetur platea dictum parturient laoreet.
Id integer amet elit dui felis eget nisl mollis in id nunc vulputate vivamus est egestas amet pellentesque eget nisi lacus proin aliquam tempus aliquam ipsum pellentesque aenean nibh netus fringilla blandit dictum suspendisse nisi gravida mattis elementum senectus leo at proin odio rhoncus adipiscing est porttitor venenatis pharetra urna egestas commodo facilisis ut nibh tincidunt mi vivamus sollicitudin nec congue gravida faucibus purus.
“Dignissim ultrices malesuada nullam est volutpat orci enim sed scelerisque et tristique velit semper.”
Id integer amet elit dui felis eget nisl mollis in id nunc vulputate vivamus est egestas amet pellentesque eget nisi lacus proin aliquam tempus aliquam ipsum pellentesque aenean nibh netus fringilla blandit dictum suspendisse nisi gravida mattis elementum senectus leo at proin odio rhoncus adipiscing est porttitor venenatis pharetra urna egestas commodo facilisis ut nibh tincidunt mi vivamus sollicitudin nec congue gravida faucibus purus.
Un site développé en Single Page Application (Vue.js, Angular, Node.js, React...) représente un véritable défi pour la mesure d’audience avec Google Analytics. Contrairement aux sites classiques HTML où chaque changement de page déclenche naturellement une nouvelle page vue, les SPA ne rechargent pas le navigateur lors de la navigation. Résultat : Google Tag Manager interprète l’ensemble comme une seule et unique page.
Sans ajustements, vous passez à côté de l’essentiel des interactions utilisateurs. Aucune remontée de pages vues, donc aucune donnée fiable sur la navigation, le funnel ou les conversions multivues.
Ce qui change concrètement, c’est que vous devez déclencher manuellement l’envoi des pages vues, en écoutant les changements d’état dans la navigation JavaScript. Et cela repose sur une configuration bien particulière dans GTM, notamment l’utilisation d’un déclencheur de type “Changement d’historique” (History Change Trigger).
Dans cet article, on vous guide pas à pas dans la mise en place d’un tracking robuste et fiable pour votre SPA, avec Google Tag Manager et Google Analytics 4 (GA4).
Une SPA est une application web qui charge une seule fois son fichier HTML principal. Ensuite, toute la navigation est gérée en JavaScript via le DOM, sans rechargement de la page. Quand l’utilisateur clique sur un lien ou interagit avec une fonctionnalité, l’interface change, mais l’URL – et parfois même la structure HTML – évoluent sans rechargement.
Exemple concret :
Google Tag Manager repose par défaut sur les événements natifs du navigateur : un chargement classique déclenche un “Page View”. Mais sur une SPA, ce type d’événement se produit… une seule fois. Toutes les interactions suivantes ne génèrent aucun événement “Page View” supplémentaire. Résultat : GA4 ne reçoit plus rien après le premier chargement de page.
Prenons un exemple :
C’est ici qu’intervient la notion de “History Change” dans GTM.
Le JavaScript moderne permet de modifier l’URL affichée sans recharger la page, grâce à l’API history.pushState()
(ou history.replaceState()
). C’est ce mécanisme que GTM peut écouter avec un déclencheur spécifique appelé “Changement d’historique” (History Event Trigger en anglais).
Ce déclencheur s’active chaque fois que :
popstate
/ pushState
est déclenché.À noter : dans certains cas, les développeurs personnalisent la navigation ou utilisent des librairies qui ne modifient même pas l’URL visible. Il faudra alors configurer des événements personnalisés manuellement. On y reviendra.
Voici comment le mettre en place :
Ce déclencheur va désormais se déclencher à chaque mise à jour de l’historique – ce qui correspond, dans une SPA bien construite, à une “page vue”.
Une fois le déclencheur en place, il faut configurer le tag Google Analytics 4.
page_view
page_view
(il est important de garder cette forme pour que GA4 l’interprète correctement).{{Page URL}}
{{Page Path}}
{{Page Title}}
(attention, la balise <title>
ne se met pas toujours à jour automatiquement en SPA – vérifiez ou utilisez un dataLayer).💡 Bonus : vous pouvez paramétrer une variable personnalisée GTM pour extraire dynamiquement les parties de l’URL, si vous souhaitez plus de granularité dans vos rapports.
Toutes les bibliothèques front ne déclenchent pas systématiquement des événements pushState()
utilisables par GTM. Certaines (comme Vue Router ou custom React router) nécessitent d’expliciter le changement d’état via le dataLayer.
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'virtualPageview',
page_path: '/produits/chaussures-running',
page_title: 'Chaussures de running – Boutique XYZ',
});
Ensuite, côté GTM :
virtualPageview
page_path
et page_title
depuis le dataLayer.Avantage : vous contrôlez totalement les données envoyées à Google Analytics, sans dépendre du comportement du navigateur.
Activez le mode “Prévisualisation” de GTM pour :
page_title
se met bien à jour dynamiquement.�N'utilisez les balises en production qu’après validation complète sur différents parcours utilisateur.
Dans le cadre des réglementations ePrivacy et RGPD, tout déclenchement de tags marketing (dont Google Analytics) doit être conditionné à un consentement explicite de l’utilisateur.
Ce que vous devez faire :
historyChange
si le consentement n’a pas encore été donné.send_page_view
à “false” sur la configuration GA4Dans GTM, la balise de configuration GA4 envoie automatiquement un page_view à chaque chargement (même sur SPA). Résultat : vous risquez un doublon à la visite initiale.
Solution :
send_page_view
à “false” dans la balise de configuration GA4page_view
basé sur History Change.Traquer les pages vues est une première étape. Mais pour tirer pleinement parti de GA4 sur une application SPA, d’autres événements peuvent être intégrés dans la même logique.
Idées d’événements à envoyer :
À chaque fois :
historyChange
OU sur des événements personnalisés dans le dataLayer,Le déploiement de Google Analytics sur une SPA nécessite de sortir des déclencheurs classiques. Sans écoute des “history changes” ou injection d’événements personnalisés, une large part de la navigation reste invisible dans GA4. Ce manque affecte la lecture des parcours utilisateurs, l’attribution, et les campagnes marketing.
En investissant quelques heures dans une configuration bien pensée — déclencheur History Change, stops au send_page_view
, envoi contrôlé via le dataLayer — vous vous assurez un tracking de qualité, conforme, et exploitable.