solution pour avoir une "Durée de la session" autre que 0

Nouveau WRInaute
bonjour,
je cherche un moyen d'obtenir que Google Analytics indique une "Durée de la session" autre que 00:00:00 pour les pages de mon site.
La doc dit:
"S'il n'y a aucun autre appel après le premier enregistré, Analytics ne peut pas calculer la durée de la session."
"Il calcule le temps passé sur la page en examinant le temps écoulé entre le moment où une page est chargée et le moment où une page a été fermée ou remplacée."

j'ai bien pensé à GTM mais je n'ai pas su faire... alors j'ai essayé 2 solutions:
1/ j'ai placé sur ma page TEST.html une image cliquable de fermeture :

<form><input type='image' src="IMAGES/porte.png" class="CloseWindow" onclick="window.open('EXIT.html'); self.close()"></form>

EXIT.html contient juste :
<script>self.close();</script>

quand je clique sur l'icône de la porte, Google Analytics comptabilise alors le temps passé sur TEST.html, mais on ne quitte pas la page...
La doc dit:
"vous ne pouvez pas fermer une fenêtre de navigateur via JavaScript si vous n'avez pas créé la fenêtre via un script". Donc il semble que je sois coincé de ce côté là...

2/ piéger la croix X de sortie avec genre:
<body beforeunload = "alert('GO')">
ou
<body onbeforeunload="alert('GO')">
ou
<body onBlur = "alert('GO')">

mais aucun n'exécute la commande, autrement dit je ne peux pas appeler EXIT.html...
si vous avez une idée, un conseil...
merci et bien cordialement
daniel
 
WRInaute passionné
Je n'ai pas testé mais ce que je ferais, c'est faire un hit vers une page virtuelle dans l'événement onbeforeunload :

ga('set', 'transport', 'beacon');
ga('send', 'pageview', '/page_virtuelle_de_sortie.html');
 
Nouveau WRInaute
oui, c'est ce que j'avais lu... mais ça me titille et j'ai voulu quand même creuser
@rick38, merci de ta suggestion mais dis-moi:
si déjà
<body onbeforeunload="alert('GO')">
"GO" ne s'affiche pas ça veut dire que onbeforeunload fait rien, non?
mais je vais essayer! /page_virtuelle_de_sortie.html c'est mon EXIT.htlm?
(dans EXIT.htlm j'ai mis aussi le "Global site tag")

daniel
 
WRInaute passionné
<body onbeforeunload="alert('GO')">
"GO" ne s'affiche pas ça veut dire que onbeforeunload fait rien, non?

Non, ça veut dire que les navigateurs ne veulent plus qu'on empêche le visiteur de quitter la page, donc ils ignorent la fonction alert() à cet endroit.

Et l'autre problématique de onbeforeunload par rapport aux autres événements, c'est qu'en exécutant du code asynchrone, comme ajax(), il n'aura pas le temps d'être exécuté avant que le navigateur le passe à la trappe, donc il faut un code synchrone, comme la fonction sendBeacon(), si on veut appeler une page à cette endroit, mais comme le code de GA a une propriété transport: beacon j'en déduis qu'il doit pour utiliser cette façon de faire.

mais je vais essayer! /page_virtuelle_de_sortie.html c'est mon EXIT.htlm?

Non c'est une page qui ne sera pas réellement appelée, c'est virtuel, juste histoire de déclencher un événement, peu importe son nom. Une alternative est de déclencher un 'event' pour ne pas faire apparaître cette fausse page dans les stats.
 
Nouveau WRInaute
j'ai essayé... le résultat est inattendu :
j'ai d'abord eu :
1 (6,67 %) 00:00:00 (0,00 %) 00:00:00 (0,00 %) 0,00 %
puis après 5mn :
1 (6,67 %) 00:04:58 (100,00 %) 00:04:58 (100,00 %) 0,00 %
je vais continuer ces tests sur plusieurs pages, vues en direct et vi
 
Nouveau WRInaute
zut, le mail est parti tout seul, désolé
je disais donc que j'allais continuer ces tests et que je ferai un bilan demain
En attendant je te remercie beaucoup!!

daniel
 
Nouveau WRInaute
bonjour @rick38
j'ai appliqué ce matin ta solution sur les 70 pages de mon site et envoyé le sitemap. Je dois attendre que Google les indexe et laisser passer quelques jours avant de pouvoir dire son impact sur la durée de session calculée. Je ne peux encore le dire.
A bientôt donc et encore merci
daniel
 
WRInaute passionné
Oui je ne vois pas ce que le sitemap fait dans tout ça.

Puis ce serait mieux que tu aies un fichier javascript séparé, chargé dans chaque page, plutôt que de recopier le code dans toutes les pages. En jquery ça donne $('body').on('beforeunload', function() { ... }); pour lier l'événement.

Je reprécise que je n'ai pas essayé ma solution, je ne certifie pas que ça marche.

Une autre solution est évoquée avec GTM mais c'est trop long je n'ai pas lu : https://www.simoahava.com/analytics/leverage-usebeacon-beforeunload-google-analytics/
 
Nouveau WRInaute
bonjour
j'ai renvoyé le sitemap pour que Google réindexe les pages... Je dis une bêtise?

j'ai remplacé le <body> de toutes les pages ainsi:
<body onbeforeunload = "ga('set', 'transport', 'beacon');ga('send', 'pageview', '/page_virtuelle_de_sortie.html');">
peut-être que j'aurais pu le faire dans mon "site.css"...

en effet ça paraissait possible avec GTM, mais je n'ai pas compris comment faire

merci de vos messages!
daniel
 
Nouveau WRInaute
bonjour,
comme promis, je vous fais un point sur la problématique que je vous ai soumise.
1/ Avec ta solution @rick38 :
-> d'abord GA indique le temps exact passé sur la page mais après 10-20 minutes c'est le délire : au lieu de qques secondes il indique des dizaines de minutes...
=> cela indique mais ne respecte pas la durée de la session
2/ sur ton conseil je me suis replongé dans GTM, et suivi le cours de Bruno Guyot :
https://www.bruno-guyot.com/guide-gtm-concepts.php
Il est très bien fait! Malheureusement, et il me l'a confirmé, il n'y a pas de déclencheur prévu quand le visiteur ferme la page avec X
3/ nouvelles recherches sur le Net :
trouvé sur :
https://developers.google.com/analytics/devguides/collection/analyticsjs
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-XXXXX-Y', 'auto');
ga('send', 'pageview');
</script>
-> placé ce code en <head> AVANT le "Global site tag"
=> mais idem: indique mais ne respecte pas la durée de la session
Ex: 2mn10s -> 00:19:14 / 00:10:14 !

Par contre:
inséré ce même code en <body onbeforeunload =...> comme suggéré par @rick38 :
<body onbeforeunload = " (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');ga('create', 'UA-XXXXX-Y', 'auto');ga('send', 'pageview')">

et là, ça marche !
Ex: une connexion de 2mn20s :
il y a 2 traces de session :
905 --> 00:00:00 / 00:02:22
907 --> 0s
la 1ère indique correctement la durée et la 2ème, de 0s, se produit n minutes après la 1ère. Elle confirme en quelque sorte la durée de la session...

Fonctionne aussi :
placé le code suivant AVANT le "Global site tag" :
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-XXXXX-Y', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>

connexion de 2mn5s :
780 --> 00:02:11 OK
783 --> 0s
=> idem donc que le cas précédent

En conclusion :
2 solutions, apparemment équivalentes
La session "fantôme" supplémentaire ne gêne pas trop
Il reste à les observer dans le temps, notamment sur les anciens mobiles qui ne reconnaissent par la commande "async"... (pas tout compris)

Encore un grand merci à @rick38
daniel
 
Discussions similaires
Haut