Le suivi des visites des internautes avec un outil comme Google Analytics est l’une des solution les plus efficace pour prendre des décisions d’optimisation sur un site web et sur ses actions d’acquisition de trafic.
Une implémentation, même standard, de GA permet en effet d’identifier l’origine des visiteurs (recherche sur Google, accès direct…), leur comportement (pages visitées, temps passé sur le site, remplissages de formulaires…) ou encore le navigateur qu’ils utilisent, leur résolution d’écran, etc…
Ces données sont très riches en enseignements mais leur collecte ne fonctionne que si le navigateur du visiteur autorise le déclenchement des codes Javascript. Ce pré requis peut sembler n’être qu’un détail dans le web d’aujourd’hui, et pourtant beaucoup plus de visiteurs que l’on ne pourrait le penser naviguent sans Javascript.
Si l’on veut quand même obtenir des informations sur ces visites il est donc nécessaire de déployer Google Analytics de façon plus avancée.
Pourquoi Google Analytics ne collecte pas d’informations sur des visites sans Javascript ?
L’envoi des données de visites à GA passe par l’ajout d’un code de suivi sur le site. Ce code se présente sous cette forme :
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXX-X"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-XXXXXXXX-X');
</script>
Ce code repose exclusivement sur la technologie Javascript (<script>) pour envoyer les données de visite aux serveur Google. Ainsi si le navigateur utilisé a bloqué le javascript le code ne peut pas être déclenché.
Le problème reste le même si l’on utilise l’implémentation « simplifiée » de GA par Google Tag Manager ; celle-ci en effet utilise la même technologie qu’une intégration classique et se retrouve donc également bloquée par l’absence de Javascript.

Comment collecter des données dans GA même lors de navigations sans Javascript ?
Pour réussir à collecter des données même lors de navigations sans Javascript il faut donc contourner la limitation du code standard de G.A. Nous allons pouvoir obtenir ce résultat en suivant une intégration en 3 étapes :
- Utiliser une balise <noscript> pour détecter les navigations sans Javascript
- Utiliser un pixel image pour envoyer les données à GA en utilisant le Measurement Protocol
- Filtrer une vue G.A. pour n’afficher que les visites sans Javascript
1. Utiliser une balise <noscript> pour détecter les navigations sans Javascript
Si vous avez déjà installé Google Tag Manager sur un site vous aurez pu constater que son code d’implémentation se décompose en deux parties. La première partie est en Javascript et Google demande de l’installer entre les balises <head> et </head> de la page. Celle ci est destinée aux utilisateurs « normaux » qui naviguent avec le Javascript activé sur leur navigateur.
La seconde partie du code d’intégration de GTM est un code <noscript> qui se présente comme ceci :
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
Ce code est intéressant dans notre cas car les balises <noscript> assurent son déclenchement par les visiteurs n’utilisant pas le Javascript (et uniquement par ceux là).
Sachant que cette seconde section garantit le déclenchement de GTM même sans JS, il pourrait être envisageable de chercher à envoyer ensuite un appel sans JS à Google Analytics depuis Tag Manager.
C’est une solution théoriquement envisageable mais assez complexe à mettre en oeuvre. Nous allons donc opter pour une solution un peu plus simple en exploitant les propriétés de la balise <noscript>. Pour commencer il faut ainsi placer ces deux balises dans le code source du site.
<noscript>
</noscript>
2. Utiliser un pixel image pour envoyer les données à GA en utilisant le Measurement Protocol
L’utilisation d’un tag appelé par l’affichage d’une image invisible est intéressante ici car elle n’est pas dépendante de l’activation du Javascript sur le navigateur du visiteur. Le déclenchement du tag sera donc bien opérationnel dans les conditions qui nous intéressent ici.
Au préalable il faut donc déterminer l’url à appeler avec cette image afin d’envoyer les informations sur la visite à Google Analytics.
La solution consiste à utiliser le Measurement Protocol de Google Analytics qui a été prévu pour envoyer des données à GA dans le plus grand nombre de configurations possibles. C’est la version Page Tracking de ce Measurement Protocol qui va nous être utile ici. Certaines variables devront être intégrées à l’url appelée pour son bon fonctionnement :
- la version du protocole – v=1
- l’id de la propriété GA qui doit recevoir les données – tid=
- un identifiant unique pour chaque visiteur – cid (nous allons utiliser un nombre aléatoire)
- le type d’événement suivi – ici t=pageview
- le nom d’hôte du site – dh=
- le chemin de la page dans le site – dp=
- et le nom de la page – dt
Nous avons besoin d’un nombre aléatoire pour le paramètre cid car sans Javascript nous ne disposons pas de l’identifiant « habituel » généré par les cookies de sessions. Le cid étant obligatoire nous avons donc besoin de ce nombre (l’utilisation d’un nombre unique pour chaque appel du tag fausserait trop les données).
Il n’est pas très compliqué de générer un tel nombre avec un language de programmation côté serveur. La majorité des sites utilisant le Php c’est également ce que nous allons utiliser mais la technique peut tout à fait être adaptée dans d’autres languages si besoin.
Nous allons également utiliser le même language pour les autres variables nécessaires :
- L’hote du site – hostpage
- Et le chemin de la page visitée – uripage
Voici le résultat :
<?php
$nbaleatoire = rand();
$hostpage=$_SERVER['HTTP_HOST'];
$uripage=$_SERVER['REQUEST_URI'];
?>
L’url finale à intégrer au tag se présente enfin comme une concaténation des différents champs à notre disposition :
https://www.google-analytics.com/collect?v=1&t=pageview&tid=UA-XXXXXXX-X&cid={{nbaleatoire}}&dh={{hostpage}}&dp={{uripage}}&dt=PageVueSansJavascript
Il est bien entendu nécessaire d’utiliser en tid le bon identifiant de la votre propriété GA. Quand aux variables entre {{ }} il s’agit des noms de variables que vous avez préalablement crées pour calculer les variables nécessaires. Enfin nous utilisons une valeur fixe comme nom de page (dt=PageVueSansJavascript) au lieux de récupérer et d’utiliser le « vrai » nom de la page car cela nous sera utile pour créer un filtre spécifiques pour les vues Google Analytics concernées.
Si besoin le code complet (en Php) se présente donc comme ceci :
<!-- Code pour les visiteurs sans js -->
<noscript><?php
$nbaleatoire = rand();
$hostpage=$_SERVER['HTTP_HOST'];
$uripage=$_SERVER['REQUEST_URI'];
$url = "http://www.google-analytics.com/collect?&v=1&t=pageview&tid=UA-59844134-2&cid=".$nbaleatoire."&dh=".$hostpage."&dp=".$uripage."&dt=PageVueSansJavascript";
echo "<img src=\"".$url."\" height=\"0\" width=\"0\" style=\"display:none;visibility:hidden\">";
?></noscript>
<!-- Fin Code pour les visiteurs sans js -->
A ce stade de l’intégration nous avons donc d’une part un tag GA standard qui est déclenché sur toutes les pages du site par les visiteurs avec Javascript (installé normalement préalablement à tout ça). Et nous avons d’autre part un appel de GA en image qui utilise le Measurement Protocol pour tous les visiteurs sans Javascript (ce que nous venons de faire).
Le travail pourrait donc sembler terminé mais les infos envoyées avec le Measurement Protocol sont beaucoup plus pauvres que celles envoyées avec le tag standard. Nous ne mesurons que des pages vues, ne collectons pas d’infos sur le visiteur (technologie utilisée) ou l’origine de sa visite (source de trafic) et ne sommes pas en mesure de consolider les pages vues par visiteurs (c’est pour cela que nous avons utilisé un nombre aléatoire en cid).
Pour ne pas polluer notre vue principale par des infos incomplètes, nous allons donc ventiler sur deux vues distinctes les visiteurs avec ou sans Javascript.
3. Filtrer une vue G.A. pour n’afficher que les visites sans Javascript
Nous allons donc maintenant ajouter une vue supplémentaires à notre propriété Google Analytics pour collecter les visites sans Javascript. Une fois cette vue crée il faut ajouter un filtre pour ne conserver que ces visites ; c’est pour cela que nous avons utilisé un nom de page unique dans le Measurement Protocol.
Il suffit ainsi de créer un filtre personnalisé (custom filter) qui ne va inclure que les visites pour lesquelles le nom de la page vue est PageVueSansJavascript.

Et il ne reste plus qu’à créer sur la vue GA principale un filtre inverse qui exclura de la même manière les visites sans Javascript.
Résultat
Une fois toutes ces manipulations terminées nous disposons donc d’une nouvelle vue dans GA qui va nous permettre de collecter des informations sur les visiteurs n’ayant pas le Javascript activé sur leur navigateur.

La remonté de ces informations est immédiate et vous pouvez la vérifier en vous rendant sur son rapport temps réel.

En résumé
Le suivi dans Google Analytics des visiteurs qui n’ont pas de Javascript activé dans leur navigateur est compliqué car le tag GA standard ne peut pas être déclenché dans ces conditions.
Pour réussir à suivre ces internautes il faut donc passer par une intégration plus avancée en plusieurs étapes :
- Utiliser les balises <noscript> pour isoler les visiteurs sans Javascript
- Récupérer et calculer les variables nécessaires à l’utilisation du Measurement Protocol de Google Analytics
- Préparer une url d’appel de GA pour mesurer les vues de pages en utilisant ce Measurement Protocol
- Appeler cette url en utilisant un pixel image qui sera ainsi déclenché uniquement par les visites sans Javascript
- Ajouter une vue à la propriété Google Analytics concernée pour n’y collecter que les visites sans Javascript au moyen d’un custom filter
- Et exclure de la vue principale de GA les visites sans Javascript au moyen du filtre inverse