GA中涉及很多的一对多或者说多对一的问题,比如在GA的账户结构中,一个账户可以有多个媒体资源,一个媒体资源可以有多个视图,一个用户可以被授权访问视图中的某一个或多个。而本文主要讨论下GA代码部署中常涉及到的一对多或多对一问题,包括一个站点添加多套GA统计代码、多个站点添加同一套统计代码和多个站点共用同一套页面源文件的问题。

一、一个站点添加多套GA代码

这是非常常见的一种情况。比如某个站点的数据既要单独收集放在一个媒体资源下,又有作为另一个汇总型媒体资源数据的一部分,典型的例子是跨国企业在各个地区的网站都放置了一套同样的GA代码,而各地区的网站自己需要做一些精细化的数据收集工作,就需要在该地区网站上另外加一套GA代码了。

这种问题在GA中被称为多个跟踪器对象(Multiple Tracking Objects)问题。GA代码中的跟踪器对象,是ga对象调用create方法的时候创建的,即这行代码:

ga('create', 'UA-58722781-1', 'auto');

像这样创建的跟踪器对象其name为t0,如果之后需要创建新的跟踪器对象,那就需要在创建时使用name字段,并且之后凡是需要使用该跟踪器对象有关的方法,都需要带上对应的name值,比如:

ga('create', 'UA-58722781-2', 'auto', {'name': 'b'});
ga('b.send', 'pageview');

举例,假设已经在网站上加好了一套ID为UA-58722781-1的GA代码,现在还需要加一套ID为UA-58722781-2的代码,那么代码部署的方式可以为:

<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','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-58722781-1', 'auto');
ga('create', 'UA-58722781-2', 'auto', {'name': 'b'});
ga('send', 'pageview');
ga('b.send', 'pageview');

</script>

如上,因为ID为UA-58722781-1没有使用name,所以其name就为默认值即t0,与默认跟踪器对象有关的方法调用,其t0.可省略,即上面代码中的这个:

ga('send', 'pageview');

实际上等价于

ga('t0.send', 'pageview');

 

二、多个站点添加同一套统计代码

1. 多个站点根域名相同

Google Analytics最新版本Universal Analytics默认就支持跨子域名的数据统计,不过需要注意的有两点:

1)基础代码中的create跟踪器对象时,可选参数需要为auto;

2)引荐排除列表需要有排除根域名的设置;

前者使得ga自动将cookie写到根域名,保证了跨子域名时用户数(Users)这一指标不会虚高;后者避免了自我引荐问题,保证会话数(sessions)的计算足够准确。

2. 多个站点根域名不相同

GA中跨根域名的数据统计,本质上是在用户从其中一个域名跳转到另一个域名时,使其cookie信息也传递过去。UA中提供了autoLink的插件专门用来支持跨根域名。其基本使用方法为,在创建跟踪器对象时,将allowLinker设置为true;在GA代码加载时,加载这个插件;定义跨域的域名,代码所在域名无需写入跨域的域名列表。

同样举个例子,如果有两个站点分别为site1.com和site2.com,这两个站点都将使用ID为UA-58722781-3的代码,site1上有链向site2的链接,site2上也有链向site1的链接,那么site1上的代码应该为:

<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','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-58722781-3', 'auto', {'allowLinker': true});
ga('require', 'linker');
ga('linker:autoLink', ['site2.com']);
ga('send', 'pageview');

</script>

对应地,site2上的代码应该为:

<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','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-58722781-3', 'auto', {'allowLinker': true});
ga('require', 'linker');
ga('linker:autoLink', ['site1.com']);
ga('send', 'pageview');

</script>

最后,引荐排除列表中需要有site1.com和site2.com

三、多个站点共用同一套页面源文件

有时候我们可能有多个不同的站点,并让这多个站点(域名)都指向同一个IP,使用该服务器上的同一份页面源文件。这种情况下可能有两种需求,一种是各个站点的数据需要分开统计,l另一种是各个站点数据要放在一块(使用同一个媒体资源ID)。

如果需要分别看各个站点较为准确的数据,建议还是使用多个不同的ID来统计,即在GA后台新建多个不同的媒体资源,每个媒体资源对应一个站点。在实际代码部署中,根据host来判断需要创建哪个媒体资源ID。

举个例子,如果有三个不同的站点www.mysite1.com, www.mysite2.com, www.mysite3.com,在GA后台其分别对应的ID为UA-12345-1, UA-12345-2, UA-12345-3,那么在共用的页面源文件中,其代码部署可以为:

<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','//www.google-analytics.com/analytics.js','ga');
if (document.location.hostname === 'www.mysite1.com') {
ga('create', 'UA-12345-1', 'auto');
ga('send', 'pageview');
} else if (document.location.hostname === 'www.mysite2.com') {
ga('create', 'UA-12345-2', 'auto');
ga('send', 'pageview');
} else {
ga('create', 'UA-12345-3', 'auto');
ga('send', 'pageview');
}

</script>

以上代码虽然可用,但还比较粗糙,使用时请根据实际情况改写判断的规则,如将hostname等于的判断改为hostname子串匹配。

以上可满足多个不同域名分开统计数据的需求,但如果还需要看汇总数据,则需要再加一套GA代码,其添加方法参照上述第一种情况。如果多个站点间还存在相互链接的情况,那么还需要设置跨域,其设置方法参照第二种情况中的多个站点根域名不相同。

对于本文中提到的问题及其解决办法,有任何疑问或意见,欢迎留言讨论。

14 Thoughts on “GA代码部署中的一对多问题及其解决办法

  1. 你好,我是多站点,相同根域名,不用同一套源文件,例如:两站点,www.xxx.com和m.xxx.com,我用的是两个网站分别布置了GA跟踪代码UA-12345-1,UA-12345-2,各自收集数据,但是数据会有出错,和GA会经常提示 跟踪代码不匹配
    网页m.xxx.com上的跟踪代码与媒体资源的跟踪ID不匹配。但却包含了www.xxx.com的UA-12345-1跟踪代码,总是不知道要修改哪里,这种情况该怎么解决呢?

    • 提示给出了具体的页面吗?如果给出了,检查该页面上的GA 代码确认是否存在问题呗;如果没有给出,可以基于所有页面报告新加主机名(hostname)的次级维度,然后筛选出不应该出现的hostname,就可以定位到是哪些页面存在问题了。

  2. Jeff,你好,感谢分享GA的知识。我自己也在这一块有一些困惑

    配置情况:我目前使用1个UA的账号来检测www.example.com和 sub.example.com的数据(example.com目前设置了302跳转),媒体资源设置中默认的网址填写的是www.example.com。

    问题:在学习设置目标的过程中,假设我的注册成功返回网址是sub.example.com/thankyou.html,我应该如何填写呢?GA提示说直接使用 /thankyou.html,而不是 http://www.example.com/thankyou.html,但是我的目标网址是子域名的,而不是www的。

    感谢。

    • 抱歉这么晚回复。

      你说的这个问题,设置一个过滤器使该视图保留完整的url即可,设置方法官方有参考文档

      P.S. 不要直接在主视图上使用该方法!在测试的视图上使用该方法确认OK之后,再考虑在主视图上应用该过滤器。

  3. 我是一名菜鸟,刚接触谷歌,虽然您写的我不是全部都能理解,但是对我的帮助却非常大,真的很感谢您。

  4. 很感谢你的文章 看了你这篇文章才有帮助的 谢谢

  5. 你好,首先感谢你对我留言的及时回复。针对我之前的问题,详细说明一下:

    现有手机web版网站有三个域名(m.test1.com、wap.test1.com和m.test2.com)

    共用同一套网页源文件。我创建一个GA媒体资源ID为UA-******-1用来收集两个域

    名的汇总数据,同时分别给两个顶级域名test1.com和test2.com创建媒体资源ID

    为UA-******-2和UA-******-3用来收集各自的访问数据。后在所有页面上安装如下

    的统计代码,但是只有汇总数据的ID为UA-******-1媒体资源中数据收集正常,其

    他两个ID为UA-******-2和UA-******-3的媒体资源数据都为0。请问如下统计代码

    有何问题?针对上述情况,统计代码如何配置合理?希望拨冗解答,谢谢!

    (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-******-1’, ‘auto’);
    ga(‘require’, ‘linkid’);
    ga(‘send’, ‘pageview’);

    (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’);
    if (document.location.hostname === ‘m.test1.com.cn’) {
    ga(‘create’, ‘ UA-******-2’, ‘auto’);
    ga(‘require’, ‘linkid’);
    ga(‘send’, ‘pageview’);
    } else if (document.location.hostname === ‘wap.test1.com.cn’) {
    ga(‘create’, ‘ UA-******-2’, ‘auto’);
    ga(‘require’, ‘linkid’);
    ga(‘send’, ‘pageview’);
    } else {
    ga(‘create’, ‘ UA-******-3’, ‘auto’);
    ga(‘require’, ‘linkid’);
    ga(‘send’, ‘pageview’);
    }

    • 一个页面添加多套代码,如果第二个跟踪器不使用新的跟踪器名称,实际数据会发送到第一个ID里去,也就是你目前ID1里的数据其实是double的,具体请参考本文第一种方法。

  6. 你好,首先感谢你对我留言的及时回复。针对我之前的问题,详细说明一下:
    现有手机web版网站有三个域名(m.test1.com、wap.test1.com和m.test2.com)共用同一套网页源文件。我创建一个GA媒体资源ID为UA-******-1用来收集两个域名的汇总数据,同时分别给两个顶级域名test1.com和test2.com创建媒体资源ID为
    UA-******-2和UA-******-3用来收集各自的访问数据。后在所有页面上安装如下的统计代码,但是只有汇总数据的ID为UA-******-1媒体资源中数据收集正常,其他两个ID为UA-******-2和UA-******-3的媒体资源数据都为0。请问如下统计代码有何问题?针对上述情况,统计代码如何配置合理?

    (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-******-1’, ‘auto’);
    ga(‘require’, ‘linkid’);
    ga(‘send’, ‘pageview’);

    (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’);
    if (document.location.hostname === ‘m.test1.com.cn’) {
    ga(‘create’, ‘ UA-******-2’, ‘auto’);
    ga(‘require’, ‘linkid’);
    ga(‘send’, ‘pageview’);
    } else if (document.location.hostname === ‘wap.test1.com.cn’) {
    ga(‘create’, ‘ UA-******-2’, ‘auto’);
    ga(‘require’, ‘linkid’);
    ga(‘send’, ‘pageview’);
    } else {
    ga(‘create’, ‘ UA-******-3’, ‘auto’);
    ga(‘require’, ‘linkid’);
    ga(‘send’, ‘pageview’);
    }

  7. 你好,为什么我采用第三种方法添加统计代码,收集不到数据?

  8. 感谢Jefferson,帮了很多人

发表评论

电子邮件地址不会被公开。

Post Navigation