44 votes

Suivre les campagnes avec Google Analytics sans paramètres de chaîne de requête ?

Existe-t-il un moyen de suivre une campagne dans Google Analytics sans avoir à utiliser des paramètres de chaîne de requête ?

Dans Analytics, vous pouvez marquer un lien vers votre site avec des paramètres de chaîne d'interrogation tels que utm_campaign y utm_medium qui transportent des informations sur la campagne afin de pouvoir en assurer le suivi.

Google a en fait un outil en ligne pour aider à la création de ces liens.

Par exemple, si StackOverflow faisait de la publicité sur Experts Exchange, il pourrait avoir un lien comme celui-ci :

http://www.stackoverflow.com/?utm_source=expertexchange&utm_medium=banner&utm_campaign=a-better-expert-exchange

Pour de nombreuses raisons, je ne veux pas que ces paramètres maladroits apparaissent dans mes URL :

  • Je veux encourager l'utilisation de Twitter, et les liens longs ne le permettent pas.
  • Je ne veux pas que les gens les marquent d'un signet avec les identifiants de la campagne dans
  • Je veux que les gens voient une URL propre
  • Je ne veux pas que les moteurs de recherche indexent ces liens.
  • Je veux avoir un contrôle total sur les paramètres envoyés à Google Analytics - et ne pas laisser à mes partenaires le soin de mélanger les URL avec lesquelles ils accèdent à mon site.

J'ai cherché il y a quelque temps un moyen de définir ces paramètres. Google a une page qui, à première vue, semble être la solution, mais qui ne l'est pas. Cette page décrit comment vous pouvez changer le nom des paramètres de la chaîne d'interrogation en quelque chose d'autre - par exemple pour utiliser src au lieu de utm_source vous courriez :

 pageTracker._setCampSourceKey("src");     

Je n'arrive vraiment pas à comprendre pourquoi il n'est pas facile de définir explicitement la valeur de l'attribut utm_source et non pas simplement lui attribuer un nom de paramètre alternatif.

Je me souviens qu'il y a quelque temps, j'ai trouvé quelqu'un qui avait fait une sorte de piratage méchant, mais je n'arrive même pas à le trouver maintenant. Je crois me souvenir que cette personne avait pris une copie du code d'analyse et l'avait essentiellement dérivé pour le pirater. Ce n'est pas une bonne solution pour moi !

existe-t-il un moyen officiel de faire cela, sans redirections désagréables ?

En bref, je veux faire quelque chose comme ceci (site ASP.NET MVC). Donner à un partenaire un lien vers mon site avec une URL comme celle-ci :

 http://www.example.com/?cid=2dae88a8-66b1-475d-8a35-2978bd1a158c

Dans le contrôleur de ma page MVC, je trouverais à quelle campagne ce GUID se rapporte, et je définirais l'état du modèle. Remarque : cela me donne l'avantage de pouvoir modifier les paramètres de la campagne sans avoir à réémettre l'URL.

Dans la page elle-même, je ferais alors ceci :

var campaignMedium = <%= ViewData.Model.CampaignMedium %>;
var campaignSource = <%= ViewData.Model.CampaignSource %>;
var campaignName = <%= ViewData.Model.CampaignName %>;

pageTracker._setCampaignData({
    utm_source: campaignSource,
    utm_medium: campaignMedium,
    utm_campaignName: campaignName
});
pageTracker._trackPageview();

IMPORTANT : Cette méthode _setCampaignData N'EXISTE PAS ACTUELLEMENT. Il s'agit juste d'un 'pseudo code' pour ce que j'aimerais idéalement être capable de faire.

Quelqu'un a-t-il réussi à faire une telle chose ?

1 votes

J'ai ajouté la prime parce que j'aimerais vraiment voir des mises à jour sur cette question - mais je n'ai pas assez de temps (ou d'optimisme) pour faire des recherches moi-même. je croise les doigts cependant ! thx

31voto

Yahel Points 21516

_set campaignParams

Votre théorique "_setCampaignData" existe enfin, sous la forme de ["_set","campaignParams",...]

Si vous disposez d'un moyen d'injecter de manière programmatique les valeurs que vous souhaitez définir (par exemple, définies par un cookie lors d'une redirection, ou du côté du serveur et imprimées sur la page), vous pouvez utiliser l'attribut _set pour coder en dur les paramètres de la campagne que vous souhaitez définir.

Le format pour cela est juste :

_gaq.push(['_set', 'campaignParams', 
'utm_campaign=CAMPAIGN&utm_source=SOURCE&utm_medium=MEDIUM']);

Donc, en utilisant votre exemple original :

 var campaignMedium = <%= ViewData.Model.CampaignMedium %>;
 var campaignSource = <%= ViewData.Model.CampaignSource %>;
 var campaignName = <%= ViewData.Model.CampaignName %>;
 _gaq.push(['_set', 'campaignParams', 
'utm_campaign=' + campaignName +  '&utm_source=' + campaignSource +'&utm_medium=' + campaignMedium]);

Mise à jour 2017

Cette réponse explique comment réaliser cette opération avec la nouvelle bibliothèque Google Analytics, analytics.js/Universal Analytics.

0 votes

Cela me semble trop compliqué. Il suffit de calculer l'ID interne, de mettre à jour location.hash en JS et de demander à GA de le traiter.

0 votes

C'est assez compliqué :), mais apparemment la location.hash Cette approche crée des problèmes avec le bouton retour et, potentiellement, avec la réécriture des cookies.

0 votes

J'ai juste ajouté une approche beaucoup plus simple :)

11voto

Maciej Łebkowski Points 2869

Török Gábor m'a donné une idée.

// ...
var campaignMedium = <%= ViewData.Model.CampaignMedium %>;
var campaignSource = <%= ViewData.Model.CampaignSource %>;
var campaignName = <%= ViewData.Model.CampaignName %>;

// save the old hash
var oldHash = document.location.hash;

// add campaign data to the hash
document.location.hash = 'utm_source=' + escape(campaignSource) + ...;
pageTracker._setAllowAnchor(true);
pageTracker._trackPageview();
// restore the old hash:
document.location.hash = oldHash;

De cette façon, vous pouvez créer les données de la campagne dans le backend, puis les transmettre au hash de façon dynamique, et ensuite les restaurer sans que l'utilisateur s'en aperçoive. En d'autres termes, le suivi de la campagne est 100% indépendant de l'URL réelle.

0 votes

Cela semble perturber l'historique du navigateur, du moins dans FF 3.5. En appuyant sur "retour", on accède à la version hachée, puis à la version non hachée, et une troisième fois à la page précédente. Existe-t-il des astuces pour éviter que le hachage n'apparaisse dans l'historique ?

0 votes

Je m'inquiéterais aussi du scintillement de la page pendant que cela déclenche un post-back.

0 votes

Je ne pense pas que vous ayez besoin de stocker et de restaurer la valeur de hachage. Mais je pense que c'est la solution : traiter l'ID privé, exprimer les paramètres de la campagne dans le hash via JS, et suivre les pages vues une fois que c'est fait.

9voto

LazerBass Points 1015

El [solution utilisant push(['_set', 'campaignParams',...](https://stackoverflow.com/a/4082585/5118762) ne semble fonctionner que pour le bibliothèque patrimoniale ga.js .

Avec analytics.js, vous devez spécifier le paramètre de la campagne séparément. Par exemple

ga('set', 'campaignName', 'TheCampaignName...');
ga('set', 'campaignSource', 'someCampaignSource');
ga('set', 'campaignMedium', 'email');

https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#campaignName

0 votes

Wow, ça fait dix ans que je n'ai pas posé cette question !

7voto

Török Gábor Points 13913

Il existe une fonction _setAllowAnchor dans l'API Trackin qui vous permet de spécifier les balises dans le texte d'ancrage plutôt que comme paramètres de requête.

pageTracker._setAllowAnchor(true);

Vous pouvez donc utiliser http://www.stackoverflow.com/#utm_source=expertexchange et GA le comprendra. De cette façon, vous pouvez éviter le problème de référencement.

Pour le problème de Twitter, je vous suggère la méthode décrite dans le post Suivi des URLs Twitter et Shorten dans Google Analytics .

7voto

Israel Kloss Points 71

Vous trouverez ci-dessous une façon actualisée de procéder en utilisant la méthode universelle de suivi des événements de Google Analytics plutôt que le suivi des événements standard de GA.

La chaîne UTM complète peut être extraite de la queryString (lorsqu'elle existe) ou tirée du cookie Google (__utmz), puis transmise à Google Analytics à l'aide du code ci-dessous.

ga('send', 'event', 'queryString', 'getQueryString', googleString ); 

Ensuite, à l'exécution du déclencheur que vous souhaitez créer (j'utilise une fonction appelée "widgetTracker"), vous pouvez exécuter le suivi des événements GA.

Voici le code complet :

/* JavaScript Document */
(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','//www.google-analytics.com/analytics.js','ga');
  ga('create', 'UA-xxxxxxx-xx', 'xx.xxx');
  ga('send', 'pageview');

 var googleString;  
 var stringArray = [];  
 var queryStringObject = makeQueryStringObject();   
 var QUOT = "'";    
 var EQ = '=';  
 var AMP = '&';         

 for  ( var v in queryStringObject ) {  
    var str =  v + EQ + queryStringObject[v] ;  
    stringArray.push(str);   
    googleString = stringArray.join(AMP);
} 

         function makeQueryStringObject()   {       
            var obj = [];       
            var pageURL = window.location.href;         
            var URLArray = pageURL.split('?');      
            if( URLArray[1] )       {           
                var argsArray = URLArray[1].split('&');             
                var l = argsArray.length;           
                for( i=0; i<l; i++ )            {               
                    var individualArg = argsArray[i].split('=');                
                    if(individualArg[1] && individualArg[1].indexOf('#') > -1)              {               
                        var dropHashArray = individualArg[1].split('#');                    
                        individualArg[1] = dropHashArray[0];                
                    }               
                    obj[ individualArg[0] ] = individualArg[1];     
                    console.log("value of queryStringObject: " + individualArg[0] + " :: " + obj[   individualArg[0] ]);

                }       
            } else { /* from http://stackoverflow.com/a/14984832/1013405 */         
                ga1 = parseGACookie();  
                if(ga1['utmcsr']) {             
                    var utm_source = ga1['utmcsr'];                     
                }           
                    if(ga1['utmccn']) {             
                        var utm_campaign = ga1['utmccn'];                   
                    }           if(ga1['utmcmd']) {             
                        var utm_medium = ga1['utmcmd'];                 
                        }           
                        if(ga1['utmctr']) {             
                            var utm_term = ga1['utmctr'];                           
                        }           
                        if(ga1['utmcct']) {             
                            var utm_content = ga1['utmcct'];                
                        }       
                    }   
                        var googleString2 = "utm_campaign=" + utm_campaign + '&' + "utm_medium=" + utm_medium + '&' + "utm_term=" + utm_term + '&' + "utm_content=" + utm_content;  
                    return obj;     
                } 

                function parseGACookie()  {     
                var values = {};     
                var cookie = readCookie("__utmz");     
                if (cookie) {         
                    var z = cookie.split('.');         
                    if (z.length >= 4) {             
                        var y = z[4].split('|');            
                         for (i=0; i<y.length; i++) {                 
                            var pair = y[i].split("=");                 
                            values[pair[0]] = pair[1];             
                         }         
                        }     
                    }     
                    return values; 
                }  

                function readCookie(name) {     
                    var nameEQ = name + "=";     
                    var ca = document.cookie.split(';');     
                    for(var i=0;i < ca.length;i++) {        
                     var c = ca[i];        
                      while (c.charAt(0)==' ') c = c.substring(1,c.length);         
                      if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);     
                    }     
                    return null; 
                }  
                function widgetTracker() {  
                /* event tracking order of elements: send (required), event (required), Category, Action, Label, Value */ 
                    if (googleString) { 
                    ga('send', 'event', 'queryString', 'getQueryString', googleString ); 
                    } else { 
                     ga('send', 'event', 'queryString2', 'getQueryString2', googleString2 ); 
                     }
                }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X