使用Google Analytics跟踪不含查询string参数的广告系列

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

在Google Analytics(分析)中,您可以使用查询string参数(例如utm_campaignutm_medium来标记指向您网站的链接,这些参数包含有关该活动的信息,以便可以对其进行跟踪。

Google实际上有一个在线工具来帮助创build这样的链接。

例如,如果StackOverflow在“专家交易所”上刊登广告,他们可能会有这样的链接:

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

由于许多原因,我不希望这些笨拙的外观参数出现在我的URL中:

  • 我想鼓励twittering,长链接劝阻这个
  • 我不希望人们将广告系列ID添加到书签中
  • 我希望人们看到一个干净的url
  • 我不希望search引擎索引这些链接。
  • 我想完全控制哪些参数发送到谷歌分析 – 而不是让我的合作伙伴弄乱他们访问我的网站的url

我不久前看了一下,试图find一种方法来设置这些参数。 Google有一个乍看起来像解决scheme的页面,但实际上并不是这样。 该页面描述了如何将查询string参数的名称更改为其他内容 – 例如使用src而不是utm_source您将运行:

  pageTracker._setCampSourceKey("src"); 

我真的不明白为什么他们不明确地设置utm_source键的值 – 而不是简单地为它设置一个替代的参数名称。

我记得有一段时间,我find一个有一种讨厌的黑客的人,但是现在我甚至都不知道。 我似乎还记得,无论是谁拿了一份分析代码的副本,基本上就把它分解出来,然后劈头盖脸。 这对我来说不是一个好的解决scheme!

有没有官方支持的方式来做这件事,没有一些讨厌的redirect。

简而言之,我想要做这样的事情(ASP.NET MVC网站)。 给一个partnet链接到我的网站,像这样的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方法实际上不存在。 这只是我所希望能够做到的“伪代码”。

有没有人成功地做到这一点?

设置campaignParams

您的理论“集合数据”最终以["_set","campaignParams",...]

如果你有办法以编程的方式注入你想要设置的值(例如,通过redirect的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]); 

HTML5历史API

一个聪明,不那么复杂的解决scheme可能是利用HTML5的历史API只是一旦谷歌分析正确初始化从URL删除查询string。 只适用于支持HTML5 History API的浏览器,但会减less很多问题。

你会把这个代码放在_trackPageview调用的下面

 if (window.history && history.replaceState && (location.search+location.hash).match(/utm_/)) { _gaq.push(function(){ history.replaceState({}, "", location.pathname); //assuming you want no query string }); } 

TörökGá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; 

这样,您可以在后端创build活动数据,然后将其传递到哈希dynamic,然后恢复它甚至没有用户甚至没有注意到它。 即广告系列跟踪100%独立于真实url。

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

 pageTracker._setAllowAnchor(true); 

所以你可以使用http://www.stackoverflow.com/#utm_source=expertexchange会理解它。 这样你可以避免search引擎优化问题。

对于Twitter问题,我build议您在Google Analytics中跟踪Twitter和缩短url后描述的方法。

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

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 

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

整个UTMstring可以从queryString中提取(当存在时)或从Google cookie(__utmz)中提取,然后使用以下代码传递给Google Analytics。

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

然后,执行任何你想创build的触发器(我使用一个名为“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 ); } } 

使用push(['_ set','campaignParams',…)的解决scheme似乎只适用于传统库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

那么,我没有testing它,但尝试将这些参数添加到.trackPageview()方法,即:

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

无论如何,你必须通过这些参数如何。 这意味着,你将永远有很长的url,其中有一些运动废话。 它不会阻止为错误的URL添加书签,search引擎将其编入索引等。

如果要保持对这些参数的控制,请为redirect到标记的目标URL的伙伴设置单独的URL:

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

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

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

所有入站链接都将显示在Google Analytics(分析)下的/ inbound /“伪目录”下,其中包含Campaign Source和Campaign Medium的单独“目录”。

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

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