【问题标题】:Track campaigns with Google Analytics without query string parameters?在没有查询字符串参数的情况下使用 Google Analytics 跟踪广告系列?
【发布时间】:2019-06-25 16:01:31
【问题描述】:

Google Analytics 中是否有一种支持的方式来跟踪广告系列,而无需使用查询字符串参数。

在 Analytics 中,您可以使用 utm_campaignutm_medium 等查询字符串参数在 tag a link to your site 中携带有关活动的信息,以便对其进行跟踪。

Google 实际上有一个online tool 来帮助创建此类链接。

例如,如果 StackOverflow 在 Experts Exchange 上做广告,他们可能会有这样的链接:

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

出于多种原因,我不希望这些看起来笨拙的参数出现在我的 URL 中:

  • 我想鼓励发推特,而长链接不鼓励这样做
  • 我不希望人们用活动 ID 为他们添加书签
  • 我希望人们看到一个干净的 URL
  • 我不希望搜索引擎将这些链接编入索引。
  • 我希望完全控制发送到谷歌分析的参数 - 而不是让我的合作伙伴搞乱他们访问我网站的 URL

我不久前试图找到一种可以设置这些参数的方法。 Google has a page 乍一看似乎是解决方案,但实际上并非如此。该页面描述了如何将查询字符串参数的名称更改为其他名称 - 例如使用 src 而不是 utm_source 您将运行:

 pageTracker._setCampSourceKey("src");     

我似乎真的无法弄清楚为什么他们不能轻松地明确设置 utm_source 键的值 - 而不仅仅是为其设置一个替代参数名称。

我记得前段时间找到了一个有某种讨厌的黑客的人,但我现在似乎找不到了。我似乎记得,无论是谁拿到了分析代码的副本,基本上都将其分支出来并对其进行了黑客攻击。这对我来说不是一个好的解决方案!

是否有官方支持的方式来执行此操作,而无需某种讨厌的重定向。

简而言之,我想做这样的事情(ASP.NET MVC 站点)。使用这样的 URL 为我的网站提供一个链接:

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

在我的 MVC 页面的控制器中,我会找出这个 GUID 与哪个活动相关,并设置模型状态。注意:这给了我一个优势,我可以更改活动参数而无需重新发布 URL。

在页面本身我会这样做:

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();

重要提示:此 _setCampaignData 方法实际上并不存在。这只是我希望能够做的“伪代码”。

有没有人成功地做到了这样的事情?

【问题讨论】:

  • 添加赏金因为我真的很想看到这个问题的任何更新 - 但没有足够的时间(或乐观)来自己研究它。虽然手指交叉!谢谢

标签: javascript google-analytics


【解决方案1】:

_设置活动参数

你理论上的“_setCampaignData”终于存在了,形式为["_set","campaignParams",...]

如果您有办法以编程方式注入您想要设置的值(例如,由 cookie 在重定向或服务器端设置并打印到页面上),您可以使用_set用于硬编码您想要设置的活动参数的 API。

格式就是:

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

所以,使用你原来的例子:

 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]);

2017 年更新

This answer 详细介绍了如何使用较新的 Google Analytics(分析)库 analytics.js/Universal Analytics 来实现这一目标。

【讨论】:

  • 这听起来对我来说太复杂了。只需计算内部ID并在JS中更新location.hash并让GA处理它
  • 这很复杂 :),但显然 location.hash 方法会导致返回按钮出现问题,并且可能会重写 cookie。
  • 我只是添加了一个更简单的方法:)
  • 注意_gaq.push(['_set', 'campaignParams', ...])应该放在_gaq.push(['_trackPageview'])之前
  • 恐怕这个解决方案对我不起作用。也许这就是它仍然没有记录的原因,但我参考了许多例子和 _gaq.push(['_set', 'campaignParams', ...]);方法根本行不通。我知道我的分析工作,因为如果我手动添加查询字符串,它工作正常。
【解决方案2】:

Török Gábor 给了我一个想法。

// ...
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;

这样,您可以在后端创建活动数据,然后将其动态传递给哈希,然后在用户甚至没有注意到的情况下恢复它。 IE。活动跟踪 100% 独立于真实 URL。

【讨论】:

  • 这似乎弄乱了浏览器历史记录,至少在 FF 3.5 中是这样。按下返回到散列版本,再次返回,未散列版本,第三次返回到上一页。有什么技巧可以让哈希远离历史记录?
  • 我也会担心页面闪烁而触发回发。
  • 我认为您不需要存储和恢复哈希值。但我相信这是要走的路:处理私有 ID,通过 JS 将活动参数表达为哈希,并在完成后跟踪浏览量
【解决方案3】:

solution using push(['_set', 'campaignParams',... 似乎只适用于legacy library ga.js

使用 analytics.js,您需要单独指定活动参数。例如

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

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

【讨论】:

  • 哇,我问这个问题已经十年了!
【解决方案4】:

Trackin API 中有一个函数_setAllowAnchor,允许您在锚文本中指定标签,而不是作为查询参数。

pageTracker._setAllowAnchor(true);

所以你可以使用http://www.stackoverflow.com/#utm_source=expertexchange,GA 会理解它。这样可以避免 SEO 问题。

对于推特问题,建议你使用Tracking Twitter and Shorten URLs in Google Analytics帖子中描述的方法。

【讨论】:

    【解决方案5】:

    我将此发布到 Google 帮助论坛。

    谷歌请阅读!!!很大的提升机会!!!这导致很多用户无法使用广告参数。允许从 trackPageview(url) 上使用的 URL 读取广告参数。

    无论如何,如果没有这种能力,我不得不使用一种变通方法。而不是将参数附加到 URL。我暂时将它们作为书签附加到 URL。然后我在 trackPageview 调用后删除了它们。通过将它们添加为书签,页面不会重新加载。请参阅以下示例。

    var pageTracker = _gat._getTracker(param);
    var orighash = document.location.hash;
    if (orighash == "") {
        orighash = "none";  // this is done to prevent page scrolling
    }
    document.location.hash = 'utm_source='+source+'&utm_campaign='+campaign+'&utm_medium='+medium+'&utm_content='+content;
    pageTracker._setAllowAnchor(true);
    pageTracker._trackPageview();
    document.location.hash = orighash
    

    【讨论】:

    • 这是我见过的常见解决方法。 (您可能想编辑您的帖子并修复代码)
    【解决方案6】:

    以下是使用 Google Analytics(分析)通用事件跟踪方法而不是 GA 标准事件跟踪的更新方法。

    整个 UTM 字符串可以从 queryString 中提取(如果有)或从 Google cookie (__utmz) 中提取,然后使用以下代码传递给 Google Analytics。

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

    然后,在执行您想要创建的任何触发器(我使用名为“widgetTracker”的函数)时,您可以执行 GA 事件跟踪器。

    这是完整的代码:

    /* 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 ); 
                         }
                    }  
    

    【讨论】:

      【解决方案7】:

      好吧,我没有测试它,但尝试将这些参数添加到.trackPageview() 方法中,即:

      pageTracker._trackPageview("?utm_source=...")
      

      无论如何,您必须以某种方式传递这些参数。这意味着,您总是会有很长的 URL,其中包含某种广告系列的废话。它不会阻止为错误的 URL 添加书签、搜索引擎将它们编入索引等。

      如果您想保持对这些参数的控制,请为合作伙伴设置单独的 URL-s,以重定向到标记的目标 URL:

      http://example.com/campaigns/1 -> http://example.com/?utm_source=...
      

      【讨论】:

      • 当心,从参数中删除正斜杠,因为它修改了实际查询的真实路径。
      • 我还没有测试它,但显然这不起作用。在我看来,这是一个真正的耻辱。见google.com/support/forum/p/Google%20Analytics/…
      • 它不起作用,trackPageview 值不会被读取以查找活动参数,它只是作为当前页面记录的内容
      【解决方案8】:

      您可以在示例中使用 Google Analytics API 自定义对 _trackPageview 的调用。

      pageTracker._trackPageview("/inbound/" + campaignSource + "/" + campaignMedium );
      

      然后,所有入站链接都将显示在 Google Analytics 中的 /inbound/“伪目录”下,其中包含用于广告系列来源和广告系列媒介的单独“目录”。

      【讨论】:

        【解决方案9】:

        新的(er)通用分析允许您指定这些参数 - 请参阅此处的文档 https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference

        查找“广告系列来源”部分以获取设置 utm_source 参数的示例。

        【讨论】:

          猜你喜欢
          • 2013-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多