竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


207月/150

如何跟踪用户在WAP页面的浏览

发布在 邵珠庆

一、背景

网站分析工具基本的工作原理 这篇文章我们有讲到过,目前主流的网站分析工具都是使用页面标记法来收集网站数据的,一般使用的是JavaScript 代码的方式,我们可以称之为客户端实现。WAP 页面,在本文中特指使用WML编写的用于在功能手机和低端类手机显示的页面。对于WAP 页面,前端实现的方法显然是不可行的,这是因为:1)功能手机和其他低端类手机的网页浏览器很多不支持JavaScript;2)页面标记法代码执行时通常要伴加载一个超过10Kb的JavaScript文件,而这类手机内存非常之小,10Kb 对于它们来说太大了!

那么,如何才能跟踪这些手机上WAP 页面的数据呢?答案就是HTML 页面标记+服务端实现

二、实现方法

 

方法一:

1)根据服务器环境选择对应文件放到服务器上;

如服务器环境是PHP,用百度统计跟踪的话,将百度统计后台提供的hm.php 放到网站根目录。

2)在所需跟踪页面(动态页面)的<head>前用脚本定义好后边发送数据所需必要信息;

如引用hm.php 定义的方法,定义百度统计收数使用的站点ID。

3)在所需跟踪的页面的</body>结束之前插入一个img标签,其src属性使用第二步中定义好的方法来指定;

如src 的值指向百度统计的收数地址,即类似这种形式http://hm.baidu.com/hm.gif?……

具体案例:

多米音乐WAP页面:http://wap.duomi.com/

本站WAP(img) 测试页面:http://jeffshow.com/test/bd/wap_img.php

baidu-wap-tracking

方法二:

第1步、第2步和方法一相同,但是第3步不指向统计工具的收数地址,而指向本站的一个地址,再通过服务器设置302跳转,使之指向统计工具的收数地址。

具体案例:

虎扑体育论坛WAP页面:http://wap.hupu.com/bbs/nba

img-src-302

方法三:

为了帮用户节省流量,不少移动端浏览器可以开启无图模式,而前两种方式都是基于img标记来实现的,开启了无图模式之后,数据不能被发送出去,因而可能导致较大的误差。为了避免这种情况造成数据较大的误差,需要引入link标签代替img标签。

第1步和第2步和第二种方法一样,只是在第3步这里使用link标签来代替,相应的img标签的相关属性也被替换,如src被替换为href等。

具体案例:

手机瑞丽网:http://wap.rayli.com/

本站WAP(link)测试页面:http://jeffshow.com/test/bd/wap_link.php

badiu-wap-link

三、GA 中的实现方法

以上介绍的三种方法是通用型的,为了方便说明是以百度统计为例来介绍的。那么在GA 中,其实现方式如何?是否有什么不同之处?

本质上说,GA 中的实现方式与上述一样,不过细节方面又稍有不同。根据GA 帮助文档,在GA 中WAP 页面跟踪的实现方式分为两种:一种是基于ga.php;另一种是基于Measurement Protocol,GA 推荐的实现方法;

我们分别来看下这两种方法(以PHP环境为例):

基于ga.php

这种方法跟前面介绍的第一种方法相似,前两步是一样的,第3步在GA 中稍有不同。GA 中的实现并不是让img直接请求收数地址,而是附加查询参数请求已经上传的ga.php文件。当服务器收到这个请求后,会解析并执行携带参数的ga.php文件,ga.php文件中定义了发送数据到GA 服务器的方法,执行后相关数据就被发送到了GA 收数服务器。

需要注意的是:

1)不能直接使用property ID,需要把UA-替换为MO-;

2)此方法在2014-4-2 即已被GA 官方弃用,不过经测试,依然可以收数;

3)仅能满足pageview类型hit的发送,因此流量来源和会话相关报表可以正常使用,但是事件统计之类的满足不了;

具体案例:

多米音乐WAP页面:http://wap.duomi.com/

本站WAP测试页面:http://jeffshow.com/test/ga/wap_img.php

ga-wap-img

基于Measurement Protocol

GA 对于Measurement Protocol 的用处描述如下:

  • Measure user activity in new environments.
  • Tie online to offline behavior.
  • Send data from both the client and server.

即Measurement Protocol 可以用来衡量新场景下的用户的行为,打通线上和线下,从客户端或服务端发送数据。相比前一种方法,使用Measurement Protocol的方法可以实现复杂的事件统计、电商统计等功能。其具体使用方法和前述类似,即构造http请求发送到GA 收数服务器即可。

四、总结与扩展

随着智能手机的普及,不支持JavaScript 的情况越来越少,相应的,WAP 页面也几乎消失殆尽。尽管如此,服务端实现的方法依然有其价值所在。比如说,我们要实现某些敏感数据的统计,但是这些数据又不能出现在页面源代码中;或者要统计一些文档(如PDF文档)被用户直接浏览或下载的次数,这些文档对应的地址显然是用不了JavaScript代码的;再比如说,我们要尽可能完整地收集使用无图模式的用户的浏览页面的数据。

以上举例,只是实际可能碰到情况的一个很小的子集。当使用客户端实现的方法难以较好地解决当前的问题,或许是时候考虑下服务端实现的方法了。

五、参考资料

1. Google Analytics for Mobile Websites

2. Measurement Protocol – Using a Proxy -Server

3. 百度统计贴吧

4. Tracking PDFs & Downloads Inside Google Analytics, Server-Side!

Read more: http://jeffshow.com/how-to-track-wap-based-site-in-ga.html#ixzz3gPkMwsaX

205月/140

Google Analytics细分功能大升级:更强大更好用

发布在 邵珠庆

Justin Cutroni早在7月份就发布了博文介绍了升级后GA细分功能: http://cutroni.com/blog/2013/07/16/google-analytics-segmentation/。可以说这次细分功能的升级将是GA有史以来非常重要的一次升级。这些更新将在未来几个月内对所有使用者逐步开放。如果大家觉得GA有哪些地方不好用或是有一些新的需要,可以直接在Justin的博客后边发布你的意见或建议,通常他都会给你回复。

下边我们将从Justin的视角去了解一下更新后的细分功能:

细分功能可能是网站分析工具中最重要的功能。不细分,毋定死。这也充分说明了细分的重要性。通过使用升级后的Google Analytics细分功能,你可以创新性地对数据进行细分分析。

下边我们将具体看一下GA细分功能的升级点及其在网站或APP分析中的应用。

Google Analytics细分新功能:

这一次GA的细分功能和之前相比主要有以下三大方面的不同:

1.真正的用户细分 高级细分功能将支持真正的用户细分。这意味着Google Analytics将可以把访问一个网站或者使用一个应用程序的人群明确细分开来。这也意味着我们将可以进行群组分析(把在某个时间段内具有同一特征或同一行为的用户细分出来进行分析,比如,在一月份第一次访问过analyticskey.com网站的用户。注:这里把cohort译为群组,以方便理解,后期GA的官方中文说法可能会有些不同)。

要注意的是,因为用户细分的数据是需要后台实时处理的,这是一项较大的工作,为了保证数据可以快速显示,这里对用户细分是有一定的限度:你最多只能把用户细分应用于90天的时间范围内。

2.顺序过滤器 这同样是一项非常大的改进。现在,我们可以实现真正的用户细分,我们可以跟踪同一用户在多个会话中的行为。例如,你可以创建这样一个细分:点击了某个广告系列并在一段时间后购买了产品的用户。

3.界面升级 更整洁更符合操作逻辑的界面。一些高级用户可能认为界面过于简单化了,原来有的一些功能变得不太好找,但实际上原有的功能仍然保留了下来。新的界面将方便大家更容易创建和管理一些常用的细分。

升级的界面如下图所示。

NewUserSegment

新的Google Analytics细分功能界面

下边我们将深入了解一下新升级的细分功能。

了解用户细分、访问细分和Hit细分有什么不同

用户细分将返回所有与该用户相关的数据。这意味着这包含了该用户在你的时间框架中产生的所有访问数据。你可以针对用户、访问或Hit设置限制条件。

例如,我可以创建一个基于收入(Revenue)的用户细分,我想看到​​所有产生了500美元的收入的用户的数据。在这个条件设置里,收入(Revenue)这个指标的限制条件将应用于单个用户。

里边的某个用户可以在经过多次访问产生的收入才超过500美元,而另一个用户在一次访问中产生的收入就超过了500美元。这个细分会把这两类用户的数据都包含在一起,因为这批用户中每一个人产生的收入都超过了$500。

1A_UserSegment

基于用户而不是基于会话的分类来评估一个用户

访问细分将基本访问返回所有符合过滤条件的数据。这与现在存在的功能相同。

现在我们从访问的角度来看看同样一个例子。如果我们创建了一个基于访问的单次收入大于$500收入的访问细分,GA将匹配找到所有满足该条件的访问,并返回所有相关的数据。

1B_VisitSegment

在Google Analytics中,细分条件过虑是于于会话而不是基于访问的

最后,还有一类Hit级别的细分。这在某种程度上,也类似于我们今天所使用的Google Analytics。你可以设置一个Hit级别的条件,比如综合浏览量或事件,系统将会返回所有与这些浏览量或事件相关的访问的数据 - 而不只是返回那些符合条件的浏览量或事件数据。

创建简单的分类

现在我们大概知道了不同类型的细分之间的差异,下边让我们创建一些简单的分类。

导航的左侧部分提供了一个维度组的列表,你可以从中找到一些最常见的维度或指标。例如,在电子商务(Ecommerce)的组里,你可以找到下边这一些常见的维度(比如产品Product和产品类别Product Category)与指标(如收入Revenue)。

2_InterfaceDescription

创建GA细分界面

这里的每个指标或维度都是有相应的条件逻辑的。这与之前我们经常使用的高级细分的设置比较相似。另外这里还有一个地方要输入细分条件的值。

对于指标来说,你可以把条件选项应用于用户或会话。通过下拉菜单可进行选择。

我们要创建的是一个用户收入超过$500的细分。首先要把这个细分应用到用户级别,然后再设置合适的条件数值,在“收入”(Revenue)字段中输入500。

3_User500Segment

为每个过滤器输入一个值。

请注意,当添加一个条件时,在界面右侧将会有相应的汇总显示。

如果要在这个细分中添加额外的条件,需要进入到另一个维度组并添加条件。

比如要在这个细分中添加一个地理位置的条件,需要点击人口统计组(Demographics),创建一个条件:仅包括来自马萨诸塞州(Massachusetts)的访问。

4_MultipleFiltersInSegment

注意添加标注的地方表明这个细分包括了多个过滤器

现在创建好了用户细分群组是,来自马萨诸塞州并在网站上花费超过$500的用户。

我可以把这个细分应用于少于90天的时间范围内。

另一个要注意的事项是:使用选项链接(Option)你可以把这个细分应用到到任何其他的你常用的配置文件中。旧版的细分功能也有此选项。当然,如果不是很必要,可以仅应用于当前的配置文件。

5_ApplyToMultipleProfiles

你可以把创建的细分应用到多个配置文件

创建高级细分

现在,我们已经掌握了基本的细分创建方法,下边我们将了解一下较为复杂的高级细分如何设置。高级细分可用于创建包括多个用户条件、多个访问条件或者是用户条件与访问条件的组合条件的细分。

6_AdvancedSegments

同时把访问条件与用户条件都应用于一个高级细分

这种细分可以用于衡量在某一段较长的时间段内一个用户的一次访问的行为情况。例如,你想了解一下阅读了你的博客的访问行为是否会影响到一个用户的长期价值。

下边我们将建立这样一个细分。

首先,创建一个基于价值(Revenue)的用户过滤器。然后再添加一个访问过滤器以匹配浏览过博客内容的访次。

7_BlogReaderRevenueSEgment

同时把访问条件与用户条件都应用于细分中

这两个过滤器将分两个阶段进行应用。

首先,GA将基于用户过滤器(包括所有这些用户的访问)把这符合条件的用户过滤出来。

然后,GA将再从符合第一个条件(用户条件)过滤得到的数据中选择满足第二个条件(访问条件)的访问数据筛选出来。

这个非常简单的设置可用于回答这样的问题:“我的博客内容有助于推动更多的销售和收入吗?” 在过去这确实是这个不好回答的较为纠结的问题,现在终于有了一个相对完善的解决方案。

这将对于内容营销有极大的促进作用。用原文作者的话说,所有内容营销的粉丝都流口水了吧?

创建顺序细分

顺序细分(Sequence Segments)是GA新的细分工具的另一个高级功能。这里所说的顺序可以是基于不同的访次或是基于同一次访问。这非常类似于再营销功能中所使用的顺序细分。

顺序过滤器可以把按一次的先后顺序浏览了两个页面(不一定要是页面条件,详情可见下边的示例)的用户细分出来。这有些类似购物车中的两个步骤。

细分示例:有些用户进入了购物流程但并没有最终购买。它采用了一个页面条件来表示添加货品到购物车。因为没有达成购买,交易是在会话期间为零。

7A_SequenceFilter

GA可以把那些进入购买流程但完成交易的用户细分出来

当你需要查看某两个动作之间的关系或相关数据,可以使用顺序细分。

在GA中创建用户群组

当然在新的细分功能发布之前我们是可以通过配置自定义变量的方法来跟踪和细分用户群组,这是基于代码的方法,实现起来有点麻烦。而现在我们可以直接在Google Analytics中创建基本的用户群组,这是一个巨大的进行。

群组(cohort),就是把在某个时间段内具有同一特征或同一行为的用户。一个群组基本上就是一个包含了某些日期条件的细分。例如,我要看所有在1月份中第一次访问网站的用户的相关数据。 他们在1月份之后有没有回访我们的网站呢,有没有继续产生销售呢?

要查看到这些信息,我们需要创建一个基于用户的第一次访问的群组。GA提供了这样一个新的维度:第一次访问的日期(Date of Fist Visit)。这意味着,我们为可以为第一次访问指定一个特定的日期范围。

8_Cohort

在GA中创建一个基本第一次访问日期维度的群组

注:该群组的日期范围不能超过31天。

当然,在创建其他的细分时你也可以使用第一次访问的日期作为细分的维度。例如,对于一个电商网站来说,通过需要把用户第一次访问的细分与用户产生的销售合并起来。

下边为第一次访问与电子商务的条件相合并的设置方法。

9a_RevenueOverTIme

把第一次访问与电子商务的条件相合并

由此产生的数据是这样的:

9b_RevenueOverTIme

这个例子展示了所有用户与及在特定时间内第一次访问了网站的用户的收入数据变化曲线

要注意的是,基于用户的细分只能应用于不超过90天的时间范围内。因此,任何创建的群组使用这种方法最多也只能应用于90天。

另一示例:如果我是一名出版商,我想看一下在特定的月份第一次访问网站用户他们在附后的时间里的行为表现。我可以为每一个月可以创建一个细分(第一次访问的用户群组)并查看每一个群组在随后的时间段中的数据变化情况。

10_PubReadersOverTime

在GA中查看月度首次访问群组的数据

如果对于某一个群组,你要查看的数据的时间段超过了90天,那你可能还得使用自定义变量或事件跟踪的方法来收集和查看数据。

还有一些要注意的事项:我们还不能根据转化创建群组;在GA中还没有第一次转化日期的维度,现在只有第一次访问日期的维度。

细分管理变得更简单

相比于之前,新的界面让你的细分管理变得更加简单。

现在界面提供了过滤功能,你可以直接输入过滤条件快速查找到你之前设置的细分。另外你还可以使用星标标注出哪些是你最常用的细分

若要编辑某个细分,把鼠标悬停在该细分上面,并点击弹出的齿轮工具即可。

11_OrganizingSegments

多种方式组织和查找细分

小结

这篇文章有点长(作者原话)。我较早前就看到了这个功能的介绍,但因为之前一段时间较忙一直拖着没有把它整理出来。这可能是Google Analytics有史以来最重要的升级之一。用户细分的功能将会改变人们对于的GA使用方式。而且,我们即将进入通用分析的世界,我们将会有更多的数据,因此,更有效地对用户进行细分将显得尤为重要。

205月/140

从Google Analytics升级Universal Analytics

发布在 邵珠庆

从Urchin到Google Analytics,再到如今的Universal Analytics。Google的分析工具总是在不断的升级,完善中。搞的我们这些使用者一刻也不敢懈怠。努力的跟上这升级的节奏,不敢落后。从本篇文章开始,我们的注意力将从Google Analytics转移到对Universal Analytics的关注。

 

本篇文章将分两大部分来介绍Universal Analytics的代码。第一部分是Universal Analytics的全局代码,也就是网站中每个页面都需要添加的那部分常规追踪代码。第二部分是Universal Analytics的自定义代码。下面我们来分别看下这两部分追踪代码如何设置和实施,以及和Google Analytics追踪代码的区别。

 

第一部分 Universal Analytics全局代码

1,在返回数据时的变化

在对Universal Analytics的追踪代码和实施过程进行介绍之前,我想有必要先来介绍一个细节的变化。就是Google 分析工具在向服务器返回数据时的请求URL和方式的变化。在Google Analytics中,所有追踪到的数据会以对utm.gif图像的请求参数形式返回到Google服务器。因此,我们在检查Google Analytics时最常见的是以http://www.google-analytics.com/__utm.gif开头的URL地址。

但是现在,无论是你的网站部署的是Google Analytics,还是Universal Analytics,当你对返回数据进行检查时,都会发现一些变化。返回数据不再只有之前的一个URL地址了。而是可能会变成以下三个中的一个。

三类Google 分析工具返回数据URL地址

  1. http://www.google-analytics.com/__utm.gif
  2. http://www.google-analytics.com/collect
  3. http://stats.g.doubleclick.net/__utm.gif

这三类地址都可以正常返回访问者的行为数据,产生三类不同返回数据URL地址的原因在于网站中实施的Google分析工具。其中第一个是网站部署Google Analytics默认全局代码时返回数据的URL地址,第二个是网站部署Universal Analytics默认全局代码时返回数据的URL地址。第三个URL地址比较有意思,当我们启用受众特征和兴趣报告,并对默认的全局追踪代码进行定制时返回数据URL地址。

启用受众特征和兴趣报告需对Google分析的全局代码进行修改,并且在账户中的媒体资源部分选择启用受众特征和兴趣报告

下面我们以代码示例来说明下不同情况下可能产生的返回数据URL情况。

 

如果你的网站实施的是默认的Google Analytics全局追踪代码。

1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-12347890-2']);
  _gaq.push(['_trackPageview']);
 
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>

那么你将看到以http://www.google-analytics.com/__utm.gif开头的返回数据URL地址。

1
http://www.google-analytics.com/__utm.gif?utmwv=5.4.6&utms=1&utmn=1896906760&utmhn= bluewhale.cc &utmcs=utf-8&utmsr=1120x700&utmvp=1103x33&utmsc=24-bit&utmul=zh-cn&utmje=1&utmfl=11.9%20r900& utmdt=%E8%93%9D%E9%B2%B8%E7%9A%84%E7%BD%91%E7%AB%99%E5%88%86%E6%9E%90%E7%AC%94%E8%AE%B0%20%7C%20%E5%85%B3%E6%B3%A8Google%20Analytics%E5%BA%94%E7%94%A8%E4%B8%8E%E6%8A%80%E5%B7%A7&utmhid=1955227755&utmr=-&utmp=%2F&utmht=1387982554877&utmac=UA-24113315-1&utmcc=__utma%3D1.1231777628.1385699116.1387959194.1387982555.8%3B%2B__utmz%3D1.1387959194.7.1.utmcsr%3Dbaidu123%7Cutmccn%3D(not%2520set)%7Cutmcmd%3D(not%2520set)%3B&utmu=qFEAg~

 

如果你的网站实施的是默认的Universal Analytics全局追踪代码。

1
2
3
4
5
6
7
8
9
<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-12347890-11', 'bluewhale.cc');
  ga('send', 'pageview');
</script>

那么你将看到以http://www.google-analytics.com/collect开头的返回数据URL地址。

1
http://www.google-analytics.com/collect?v=1&_v=j15&a=2124808192&t=pageview&_s=1&dl=http%3A%2F%2Fbluewhale.cc%2Ftest%2Fua_test.html&ul=zh-cn&de=gb2312&dt=UAcode%E6%B5%8B%E8%AF%95%E9%A1%B5%E9%9D%A2&sd=24-bit&sr=1120x700&vp=1103x33&je=1&fl=11.9%20r900&_utma=127635166.34592685.1383186536.1387941519.1387981700.19&_utmz=127635166.1387352120.16.8.utmcsr%3Dgoogle%7Cutmccn%3D(organic)%7Cutmcmd%3Dorganic%7Cutmctr%3D%25E8%2593%259D%25E9%25B2%25B8%25E7%25BD%2591%25E7%25AB%2599%25E5%2588%2586%25E6%259E%2590&_utmht=1387982003772&_u=MACC~&cid=34592685.1383186536&tid=UA-12347890-11&z=994756508

 

如果你的Google分析启用了受众特征和兴趣报告,并对默认的全局追踪代码进行了定制。

1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-12347890-11']);
  _gaq.push(['_trackPageview']);
 
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>

那么无论你的网站中实施Google Analytics还是Universal Analytics,你都会看到以http://stats.g.doubleclick.net/__utm.gif开头的返回数据URL地址。

1
http://stats.g.doubleclick.net/__utm.gif?utmwv=5.4.6dc&utms=1&utmn=894009105&utmhn=bluewhale.cc&utmcs=utf-8&utmsr=1120x700&utmvp=1120x33&utmsc=24-bit&utmul=zh-cn&utmje=1&utmfl=11.9%20r900&utmdt=%E8%93%9D%E9%B2%B8%E7%9A%84%E7%BD%91%E7%AB%99%E5%88%86%E6%9E%90%E7%AC%94%E8%AE%B0%20%7C%20%E5%85%B3%E6%B3%A8Google%20Analytics%E5%BA%94%E7%94%A8%E4%B8%8E%E6%8A%80%E5%B7%A7&utmhid=853429841&utmr=-&utmp=%2F&utmht=1387981699675&utmac=UA-12347890-1&utmcc=__utma%3D127635166.34592685.1383186536.1387941519.1387981700.19%3B%2B__utmz%3D127635166.1387352120.16.8.utmcsr%3Dgoogle%7Cutmccn%3D(organic)%7Cutmcmd%3Dorganic%7Cutmctr%3D%25E8%2593%259D%25E9%25B2%25B8%25E7%25BD%2591%25E7%25AB%2599%25E5%2588%2586%25E6%259E%2590%3B&utmu=qAE~

 

2,返回数据的类型变化

在介绍Google Analytics的文章中我们曾说过,Google Analytics支持5种数据类型。

而在Universal Analytics中对数据类型的标记和分类更加清晰,同时支持的数据类型也有增加。

在Universal Analytics的返回数据中通过参数t来记录本次记录到的数据属于哪种类型。除了我们之前介绍的5种类型以外,Universal Analytics还支持时间类型和社交类型的返回数据。

如上表所示,当t=pageview时表示页面类的数据,t=event时表示事件类的数据,t=Transaction或Item时表示电商类的订单数据,t=Social时表示社交类的数据,t=timing时表示计时类的数据。t参数的值不存在为空的情况。后面部分我们会详细介绍对触发不同类型数据代码的定制和实施方法。

 

3,Universal Analytics全局代码定制变化

前面介绍了返回数据URL的变化和数据类型的变化情况,下面我们进入正题,开始介绍Universal Analytics的全局代码。Universal Analytics的追踪代码与Google Analytics相比,更加简单,易用,并且可读性也更强。即使是一个非技术背景的分析人员,也能大概读懂代码所表示的含义并对追踪代码进行简单的定制工作。

常用代码定制界面化

首先,对于Google Analytics中我们使用最频繁的几项代码定制的工作,如添加新搜索引擎来源,访问次数超时设置,Cmapaign来源有效期设置,以及搜索关键词排除设置等操作在Universal Analytics中都不再需要对全局追踪代码进行修改或定制,这些操作在Universal Analytics中都被以友好的界面方式呈现,并且有清晰的引导和说明信息。

 

上图是Universal Analytics中添加搜索引擎来源的操作界面,你可以在报告界面中的“管理”部分找到这些定制操作界面。在这类界面中即使没有技术背景的分析师也可以完成对代码的定制工作,并且也不需要重复的对页面中的代码进行修改。当然你也可以选择通过Google Tag Manager来减少修改代码对网站及页面的影响,但界面化的操作比直接面对代码要友好很多。

自定义追踪代码全局变量

Universal Analytics的全局代码中允许我们对全局变量进行自定义。在Universal Analytics全局代码第一段的最后一部分,是默认的全局变量ga,对于这个全局变量,我们可以进行修改和自定义。

 

这是默认的默认的Universal Analytics全局追踪代码。第一部分最后的全局变量名称是ga,同时第二部分中的创建账户以及返回数据代码也都使用了ga这个全局变量。

1
2
3
4
5
6
7
8
9
<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-12347890-11', 'bluewhale.cc');
  ga('send', 'pageview');
</script>

我们对Universal Analytics的全局变量名称进行修改,将ga修改为ua,同时代码第二部分中所使用的全局变量名称也都需要手动修改为ua。

 

1
2
3
4
5
6
7
8
9
<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','ua');
 
  ua('create', 'UA-12347890-11', 'bluewhale.cc');
  ua('send', 'pageview');
</script>

——————————————————重要提示————————————————————

注意:本部分以后的代码我们都将以ua作为Universal Analytics的全局变量进行定制和实施介绍。在使用代码时请注意,如你的网站使用默认Universal Analytics全局代码,请将ua更改为ga再使用。否则可能导致代码无法正常工作!

———————————————————————————————————————————

Cookie有效期设置及名称

在Universal Analytics中除了修改全局变量名称外,我们还可以修改记录访客的Cookie有效期。Universal Analytics默认的cookie有效期为两年,我们可以通过设置cookieExpires修改这个cookie的有效期。

在上面的截图中,我们将Universal Analytics的Cookie名称改为uaCookie,并将过期时间从2年改为1天。具体的代码修改如下:

在Universal Analytics全局代码第二部分增加cookieExpires值的设置,以秒为单位,示例中86400秒等于24小时,即1天。(86400秒/60=1440分钟/60=24小时)

1
2
3
4
5
6
7
8
9
<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','ua');
 
  ua('create', 'UA-12347890-11',{'cookieExpires': 86400});
  ua('send', 'pageview');
</script>

更改Cookie名称的方法和修改有效期类似,在Universal Analytics全局代码中相同的位置对 cookieName值进行设置即可。

 

1
2
3
4
5
6
7
8
9
<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','ua');
 
  ua('create', 'UA-12347890-11',{'cookieName':'uaCookie','cookieExpires': 86400});
  ua('send', 'pageview');
</script>

需要说明的是,对Cookie有效期及名称的修改请在代码初次实施前完成,并且需要保证所有页面代码保持一致,否则你可能会因为同时存在多个不同名称及生存期的Cookie而导致网站的数据不准确。

 

第二部分 Universal Analytics自定义代码

对于Universal Analytics自定义代码的定制和实施与Google Analytics中变化不大。下面我们分别来介绍虚拟页面事件追踪,社交追踪和电商代码的定制和实施。所有的Universal Analytics自定义代码我们都将以onclick事件为例。并且以定制后的ua作为Universal Analytics全局变量进行介绍。如你的网站中使用默认的Universal Analytics全局代码,请讲ua更改为ga。否则代码可能无法正常工作。

 

1,  虚拟页面

常规的虚拟页面代码如下,在pageview后添加虚拟页面的命名规则即可,添加的虚拟页面名称以URL的形式出现在Universal Analytics的所有页面报告中。

1
<a href="http://bluewhale.cc"onClick="javascript:ua('send', 'pageview', '/virtual_pageviews_test');">虚拟页面</a>

与Google Analytics不同的是,Universal Analytics中除了可以定制虚拟页面的URL,还可以定制虚拟页面的title。在title后添加虚拟页面的title名称即可。这将大大提高虚拟页面在报告中的数据可读性。

1
<a href="http://bluewhale.cc"onClick="javascript:ua('send', 'pageview', {'page':'/virtual_pageviews_test','title':'virtual_page'});">虚拟页面测试(自定义页面URL及title)</a>

2,  事件追踪

Universal Analytics中的事件追踪与Google Analytics没有太大差别,同样使用事件类别,行动和标签三个默认参数来标记事件。

1
<a href="http://bluewhale.cc"onClick="javascript:ua('send', 'event', 'category', 'action', 'label');">事件追踪</a>

3,  社交追踪

Universal Analytics中的社交追踪与事件非常相似,你可以对网站中的各类社交分享按钮进行追踪,这里允许记录社交媒体的名称,社交按钮的行为,目标URL等信息。具体社交追踪代码如下。

1
<a href="http://bluewhale.cc"onClick="javascript:ga('send', 'social', 'socialNetwork', 'socialAction', 'socialTarget');">社交媒体</a>

加强型的社交追踪代码除了前面介绍的三个参数外,还能标记社交按钮被触发的页面名称。

1
<a href="http://bluewhale.cc"onClick="javascript:ua('send', 'social', 'socialNetwork', 'socialAction', 'socialTarget', {'page': '/my-new-page'});">社交媒体</a>

4,电子商务追踪

最后介绍的Universal Analytics定制代码是电商代码,结构和功能与Google Analytics类似,唯一不同的是Universal Analytics为了保证analytics.js的文件大小,没有把电商的代码放在里面,因此在使用电商代码时,需要单独调用ecommerce.js文件。另外,在使用电商代码前,需要先在Google分析管理后台开通电商报告功能。

以下是Universal Analytics电子商务代码示例。所有全局变量以及改为ua,请注意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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','ua');
 
  ua('create', 'UA-12347890-11', 'bluewhale.cc');
  ua('send', 'pageview');
  ua('require', 'ecommerce', 'ecommerce.js');
  ua('ecommerce:addTransaction', {
  'id': '1234',                     // Transaction ID. Required.
  'affiliation': 'Acme Clothing',   // Affiliation or store name.
  'revenue': '11.99',               // Grand Total.
  'shipping': '5',                  // Shipping.
  'tax': '1.29'                     // Tax.
  });
  ua('ecommerce:addItem', {
  'id': '1234',                     // Transaction ID. Required.
  'name': 'Fluffy Pink Bunnies',    // Product name. Required.
  'sku': 'DD23444',               // SKU/code.
  'category': 'Party Toys',         // Category or variation.
  'price': '11.99',                 // Unit price.
  'quantity': '1'                   // Quantity.
  });
  ua('ecommerce:send');
</script>

 

本篇文章我们简单介绍了Universal Analytics的全局代码和自定义代码的定制和实施。更多Universal Analytics全局代码的定制内容请参看Google官方文档

—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,转自“蓝鲸网站分析博客”。】—

206月/132

Google Analytics UTM参数

发布在 邵珠庆

Google Analytics UTM参数

我们知道,页面设置好Google Analytics基本跟踪代码后,用以下UTM广告些列参数对着陆页面的url进行标注,可以区别衡量各种营销渠道所带来的访客价值。因此,我们需要想法在访客分享页面时,在被分享的url后添加UTM参数。

 

参数 说明 描述
广告系列来源(utm_source) 必填 使用 utm_source 来标识 搜索 引擎、简报名称或其他来源。
示例:utm_source=google
广告系列媒介(utm_medium) 必填 使用 utm_medium 来标识 电子邮件 或每次点击 费用等媒介。
示例:utm_medium=cpc
广告系列字词 (utm_term) 用于付费搜索。 使用 utm_term 来注明此广告的关键字。
示例: utm_term=running+shoes
广告系列内容 (utm_content) 用于 A/B 测试和 以网页内容定位的 广告。 使用 utm_content 区分指向同一网址的 广告或链接。
示例:utm_content=logolink utm_content=textlink
广告系列名称 (utm_campaign) 必填,用于关键字分析。 使用 utm_campaign 来标识特定的产品促销活动或战略性广告系列。
示例:utm_campaign=spring_sale

 

关于自定义广告系列

https://support.google.com/analytics/answer/1033863?hl=zh-Hans

网址构建工具

https://support.google.com/analytics/answer/1033867?hl=zh-Hans&ref_topic=1032998

 

1212月/122

Google Analytics ga.js格式化源代码

发布在 邵珠庆

 

    (function() {

    var g = void 0,

    h = !0,

    j = null,

    l = !1,

    aa = encodeURIComponent,

    ba = Infinity,

    ca = setTimeout,

    n = Math,

    da = decodeURIComponent;

    function ea(a, b) {

    return a.name = b

    }

    var p = "push",

    fa = "test",

    ia = "slice",

    q = "replace",

    ja = "load",

    ka = "floor",

    la = "charAt",

    ma = "value",

    r = "indexOf",

    na = "match",

    oa = "port",

    pa = "createElement",

    qa = "path",

    s = "name",

    v = "host",

    w = "toString",

    x = "length",

    y = "prototype",

    ra = "clientWidth",

    z = "split",

    sa = "stopPropagation",

    ta = "scope",

    A = "location",

    ua = "search",

    B = "protocol",

    va = "clientHeight",

    wa = "href",

    C = "substring",

    xa = "apply",

    ya = "navigator",

    D = "join",

    E = "toLowerCase",

    F;

    function za(a, b) {

    switch (b) {

    case 0:

    return "" + a;

    case 1:

    return 1 * a;

    case 2:

    return !! a;

    case 3:

    return 1E3 * a

    }

    return a

    }

    function Aa(a) {

    return "function" == typeof a

    }

    function Ba(a) {

    return a != g && -1 < (a.constructor + "")[r]("String")

    }

    function G(a, b) {

    return g == a || "-" == a && !b || "" == a

    }

    function Ca(a) {

    if (!a || "" == a) return "";

    for (; a && -1 < " \n\r\t" [r](a[la](0));) a = a[C](1);

    for (; a && -1 < " \n\r\t" [r](a[la](a[x] - 1));) a = a[C](0, a[x] - 1);

    return a

    }

    function Da() {

    return n.round(2147483647 * n.random())

    }

    function Ea() {}

    function H(a, b) {

    if (aa instanceof Function) return b ? encodeURI(a) : aa(a);

    I(68);

    return escape(a)

    }

    function J(a) {

    a = a[z]("+")[D](" ");

    if (da instanceof Function) try {

    return da(a)

    } catch(b) {

    I(17)

    } else I(68);

    return unescape(a)

    }

    var Fa = function(a, b, c, d) {

    a.addEventListener ? a.addEventListener(b, c, !!d) : a.attachEvent && a.attachEvent("on" + b, c)

    },

    Ga = function(a, b, c, d) {

    a.removeEventListener ? a.removeEventListener(b, c, !!d) : a.detachEvent && a.detachEvent("on" + b, c)

    };

    function Ha(a, b) {

    if (a) {

    var c = K[pa]("script");

    c.type = "text/javascript";

    c.async = h;

    c.src = a;

    c.id = b;

    var d = K.getElementsByTagName("script")[0];

    d.parentNode.insertBefore(c, d);

    return c

    }

    }

    function L(a) {

    return a && 0 < a[x] ? a[0] : ""

    }

    function Ia(a) {

    var b = a ? a[x] : 0;

    return 0 < b ? a[b - 1] : ""

    }

    var Ja = function() {

    this.prefix = "ga.";

    this.R = {}

    };

    Ja[y].set = function(a, b) {

    this.R[this.prefix + a] = b

    };

    Ja[y].get = function(a) {

    return this.R[this.prefix + a]

    };

    Ja[y].contains = function(a) {

    return this.get(a) !== g

    };

    function Ka(a) {

    0 == a[r]("www.") && (a = a[C](4));

    return a[E]()

    }

    function La(a, b) {

    var c, d = {

    url: a,

    protocol: "http",

    host: "",

    path: "",

    d: new Ja,

    anchor: ""

    };

    if (!a) return d;

    c = a[r]("://");

    0 <= c && (d.protocol = a[C](0, c), a = a[C](c + 3));

    c = a[ua]("/|\\?|#");

    if (0 <= c) d.host = a[C](0, c)[E](),

    a = a[C](c);

    else return d.host = a[E](),

    d;

    c = a[r]("#");

    0 <= c && (d.anchor = a[C](c + 1), a = a[C](0, c));

    c = a[r]("?");

    0 <= c && (Ma(d.d, a[C](c + 1)), a = a[C](0, c));

    d.anchor && b && Ma(d.d, d.anchor);

    a && "/" == a[la](0) && (a = a[C](1));

    d.path = a;

    return d

    }

    function Oa(a, b) {

    function c(a) {

    var b = (a.hostname || "")[z](":")[0][E](),

    c = (a[B] || "")[E](),

    c = 1 * a[oa] || ("http:" == c ? 80 : "https:" == c ? 443 : "");

    a = a.pathname || "";

    0 == a[r]("/") || (a = "/" + a);

    return [b, "" + c, a]

    }

    var d = b || K[pa]("a");

    d.href = K[A][wa];

    var e = (d[B] || "")[E](),

    f = c(d),

    k = d[ua] || "",

    m = e + "//" + f[0] + (f[1] ? ":" + f[1] : "");

    0 == a[r]("//") ? a = e + a: 0 == a[r]("/") ? a = m + a: !a || 0 == a[r]("?") ? a = m + f[2] + (a || k) : 0 > a[z]("/")[0][r](":") && (a = m + f[2][C](0, f[2].lastIndexOf("/")) + "/" + a);

    d.href = a;

    e = c(d);

    return {

    protocol: (d[B] || "")[E](),

    host: e[0],

    port: e[1],

    path: e[2],

    Oa: d[ua] || "",

    url: a || ""

    }

    }

    function Ma(a, b) {

    function c(b, c) {

    a.contains(b) || a.set(b, []);

    a.get(b)[p](c)

    }

    for (var d = Ca(b)[z]("&"), e = 0; e < d[x]; e++) if (d[e]) {

    var f = d[e][r]("=");

    0 > f ? c(d[e], "1") : c(d[e][C](0, f), d[e][C](f + 1))

    }

    }

    function Pa(a, b) {

    if (G(a) || "[" == a[la](0) && "]" == a[la](a[x] - 1)) return "-";

    var c = K.domain;

    return a[r](c + (b && "/" != b ? b: "")) == (0 == a[r]("http://") ? 7 : 0 == a[r]("https://") ? 8 : 0) ? "0": a

    };

    var Qa = 0;

    function Ra(a, b, c) { ! (1 <= Qa) && !(1 <= 100 * n.random()) && (a = ["utmt=error", "utmerr=" + a, "utmwv=5.3.8", "utmn=" + Da(), "utmsp=1"], b && a[p]("api=" + b), c && a[p]("msg=" + H(c[C](0, 100))), M.w && a[p]("aip=1"), Sa(a[D]("&")), Qa++)

    };

    var Ta = 0,

    Ua = {};

    function N(a) {

    return Va("x" + Ta++, a)

    }

    function Va(a, b) {

    Ua[a] = !!b;

    return a

    }

    var Wa = N(),

    Xa = Va("anonymizeIp"),

    Ya = N(),

    $a = N(),

    ab = N(),

    bb = N(),

    O = N(),

    P = N(),

    cb = N(),

    db = N(),

    eb = N(),

    fb = N(),

    gb = N(),

    hb = N(),

    ib = N(),

    jb = N(),

    kb = N(),

    lb = N(),

    nb = N(),

    ob = N(),

    pb = N(),

    qb = N(),

    rb = N(),

    sb = N(),

    tb = N(),

    ub = N(),

    vb = N(),

    wb = N(),

    xb = N(),

    yb = N(),

    zb = N(),

    Ab = N(),

    Bb = N(),

    Cb = N(),

    Db = N(),

    Eb = N(),

    Fb = N(h),

    Gb = Va("currencyCode"),

    Hb = Va("page"),

    Ib = Va("title"),

    Jb = N(),

    Kb = N(),

    Lb = N(),

    Mb = N(),

    Nb = N(),

    Ob = N(),

    Pb = N(),

    Qb = N(),

    Rb = N(),

    Q = N(h),

    Sb = N(h),

    Tb = N(h),

    Ub = N(h),

    Vb = N(h),

    Wb = N(h),

    Zb = N(h),

    $b = N(h),

    ac = N(h),

    bc = N(h),

    cc = N(h),

    R = N(h),

    dc = N(h),

    ec = N(h),

    fc = N(h),

    gc = N(h),

    hc = N(h),

    ic = N(h),

    jc = N(h),

    S = N(h),

    kc = N(h),

    lc = N(h),

    mc = N(h),

    nc = N(h),

    oc = N(h),

    pc = N(h),

    qc = N(h),

    rc = Va("campaignParams"),

    sc = N(),

    tc = Va("hitCallback"),

    uc = N();

    N();

    var vc = N(),

    wc = N(),

    xc = N(),

    yc = N(),

    zc = N(),

    Ac = N(),

    Bc = N(),

    Cc = N(),

    Dc = N(),

    Ec = N(),

    Fc = N(),

    Gc = N(),

    Hc = N(),

    Ic = N();

    N();

    var Mc = N(),

    Nc = N(),

    Oc = N();

    function Pc(a) {

    var b = this.plugins_;

    if (b) return b.get(a)

    }

    var T = function(a, b, c, d) {

    a[b] = function() {

    try {

    return d != g && I(d),

    c[xa](this, arguments)

    } catch(a) {

    throw Ra("exc", b, a && a[s]),

    a;

    }

    }

    },

    Qc = function(a, b, c, d) {

    U[y][a] = function() {

    try {

    return I(c),

    za(this.a.get(b), d)

    } catch(e) {

    throw Ra("exc", a, e && e[s]),

    e;

    }

    }

    },

    V = function(a, b, c, d, e) {

    U[y][a] = function(f) {

    try {

    I(c),

    e == g ? this.a.set(b, za(f, d)) : this.a.set(b, e)

    } catch(k) {

    throw Ra("exc", a, k && k[s]),

    k;

    }

    }

    };

    var Rc = RegExp(/(^|\.)doubleclick\.net$/i),

    Sc = function(a, b) {

    return Rc[fa](K[A].hostname) ? h: "/" !== b ? l: (0 == a[r]("www.google.") || 0 == a[r](".google.") || 0 == a[r]("google.")) && !( - 1 < a[r]("google.org")) ? h: l

    },

    Tc = function(a) {

    var b = a.get(bb),

    c = a.c(P, "/");

    Sc(b, c) && a[sa]()

    };

    var Zc = function() {

    var a = {},

    b = {},

    c = new Uc;

    this.g = function(a, b) {

    c.add(a, b)

    };

    var d = new Uc;

    this.e = function(a, b) {

    d.add(a, b)

    };

    var e = l,

    f = l,

    k = h;

    this.T = function() {

    e = h

    };

    this.j = function(a) {

    this[ja]();

    this.set(sc, a, h);

    a = new Vc(this);

    e = l;

    d.execute(this);

    e = h;

    b = {};

    this.n();

    a.Ja()

    };

    this.load = function() {

    e && (e = l, this.Ka(), Wc(this), f || (f = h, c.execute(this), Xc(this), Wc(this)), e = h)

    };

    this.n = function() {

    if (e) if (f) e = l,

    Xc(this),

    e = h;

    else this[ja]()

    };

    this.get = function(c) {

    Ua[c] && this[ja]();

    return b[c] !== g ? b[c] : a[c]

    };

    this.set = function(c, d, e) {

    Ua[c] && this[ja]();

    e ? b[c] = d: a[c] = d;

    Ua[c] && this.n()

    };

    this.z = function(b) {

    a[b] = this.b(b, 0) + 1

    };

    this.b = function(a, b) {

    var c = this.get(a);

    return c == g || "" === c ? b: 1 * c

    };

    this.c = function(a, b) {

    var c = this.get(a);

    return c == g ? b: c + ""

    };

    this.Ka = function() {

    if (k) {

    var b = this.c(bb, ""),

    c = this.c(P, "/");

    Sc(b, c) || (a[O] = a[hb] && "" != b ? Yc(b) : 1, k = l)

    }

    }

    };

    Zc[y].stopPropagation = function() {

    throw "aborted";

    };

    var Vc = function(a) {

    var b = this;

    this.q = 0;

    var c = a.get(tc);

    this.Ua = function() {

    0 < b.q && c && (b.q--, b.q || c())

    };

    this.Ja = function() { ! b.q && c && ca(c, 10)

    };

    a.set(uc, b, h)

    };

    function $c(a, b) {

    b = b || [];

    for (var c = 0; c < b[x]; c++) {

    var d = b[c];

    if ("" + a == d || 0 == d[r](a + ".")) return d

    }

    return "-"

    }

    var bd = function(a, b, c) {

    c = c ? "": a.c(O, "1");

    b = b[z](".");

    if (6 !== b[x] || ad(b[0], c)) return l;

    c = 1 * b[1];

    var d = 1 * b[2],

    e = 1 * b[3],

    f = 1 * b[4];

    b = 1 * b[5];

    if (! (0 <= c && 0 < d && 0 < e && 0 < f && 0 <= b)) return l;

    a.set(Q, c);

    a.set(Vb, d);

    a.set(Wb, e);

    a.set(Zb, f);

    a.set($b, b);

    return h

    },

    cd = function(a) {

    var b = a.get(Q),

    c = a.get(Vb),

    d = a.get(Wb),

    e = a.get(Zb),

    f = a.b($b, 1);

    return [a.b(O, 1), b != g ? b: "-", c || "-", d || "-", e || "-", f][D](".")

    },

    dd = function(a) {

    return [a.b(O, 1), a.b(cc, 0), a.b(R, 1), a.b(dc, 0)][D](".")

    },

    ed = function(a, b, c) {

    c = c ? "": a.c(O, "1");

    var d = b[z](".");

    if (4 !== d[x] || ad(d[0], c)) d = j;

    a.set(cc, d ? 1 * d[1] : 0);

    a.set(R, d ? 1 * d[2] : 10);

    a.set(dc, d ? 1 * d[3] : a.get(ab));

    return d != j || !ad(b, c)

    },

    fd = function(a, b) {

    var c = H(a.c(Tb, "")),

    d = [],

    e = a.get(Fb);

    if (!b && e) {

    for (var f = 0; f < e[x]; f++) {

    var k = e[f];

    k && 1 == k[ta] && d[p](f + "=" + H(k[s]) + "=" + H(k[ma]) + "=1")

    }

    0 < d[x] && (c += "|" + d[D]("^"))

    }

    return c ? a.b(O, 1) + "." + c: j

    },

    gd = function(a, b, c) {

    c = c ? "": a.c(O, "1");

    b = b[z](".");

    if (2 > b[x] || ad(b[0], c)) return l;

    b = b[ia](1)[D](".")[z]("|");

    0 < b[x] && a.set(Tb, J(b[0]));

    if (1 >= b[x]) return h;

    b = b[1][z]( - 1 == b[1][r](",") ? "^": ",");

    for (c = 0; c < b[x]; c++) {

    var d = b[c][z]("=");

    if (4 == d[x]) {

    var e = {};

    ea(e, J(d[1]));

    e.value = J(d[2]);

    e.scope = 1;

    a.get(Fb)[d[0]] = e

    }

    }

    return h

    },

    hd = function(a) {

    var b;

    b = function(b, e) {

    if (!G(a.get(b))) {

    var f = a.c(b, ""),

    f = f[z](" ")[D]("%20"),

    f = f[z]("+")[D]("%20");

    c[p](e + "=" + f)

    }

    };

    var c = [];

    b(ic, "utmcid");

    b(nc, "utmcsr");

    b(S, "utmgclid");

    b(kc, "utmgclsrc");

    b(lc, "utmdclid");

    b(mc, "utmdsid");

    b(jc, "utmccn");

    b(oc, "utmcmd");

    b(pc, "utmctr");

    b(qc, "utmcct");

    return (b = c[D]("|")) ? [a.b(O, 1), a.b(ec, 0), a.b(fc, 1), a.b(gc, 1), b][D](".") : ""

    },

    id = function(a, b, c) {

    c = c ? "": a.c(O, "1");

    b = b[z](".");

    if (5 > b[x] || ad(b[0], c)) return a.set(ec, g),

    a.set(fc, g),

    a.set(gc, g),

    a.set(ic, g),

    a.set(jc, g),

    a.set(nc, g),

    a.set(oc, g),

    a.set(pc, g),

    a.set(qc, g),

    a.set(S, g),

    a.set(kc, g),

    a.set(lc, g),

    a.set(mc, g),

    l;

    a.set(ec, 1 * b[1]);

    a.set(fc, 1 * b[2]);

    a.set(gc, 1 * b[3]);

    var d = b[ia](4)[D](".");

    b = function(a) {

    return (a = d[na](a + "=(.*?)(?:\\|utm|$)")) && 2 == a[x] ? a[1] : g

    };

    c = function(b, c) {

    c ? (c = e ? J(c) : c[z]("%20")[D](" "), a.set(b, c)) : a.set(b, g)

    }; - 1 == d[r]("=") && (d = J(d));

    var e = "2" == b("utmcvr");

    c(ic, b("utmcid"));

    c(jc, b("utmccn"));

    c(nc, b("utmcsr"));

    c(oc, b("utmcmd"));

    c(pc, b("utmctr"));

    c(qc, b("utmcct"));

    c(S, b("utmgclid"));

    c(kc, b("utmgclsrc"));

    c(lc, b("utmdclid"));

    c(mc, b("utmdsid"));

    return h

    },

    ad = function(a, b) {

    return b ? a != b: !/^\d+$/ [fa](a)

    };

    var Uc = function() {

    this.filters = []

    };

    Uc[y].add = function(a, b) {

    this.filters[p]({

    name: a,

    s: b

    })

    };

    Uc[y].execute = function(a) {

    try {

    for (var b = 0; b < this.filters[x]; b++) this.filters[b].s.call(W, a)

    } catch(c) {}

    };

    function jd(a) {

    100 != a.get(vb) && a.get(Q) % 1E4 >= 100 * a.get(vb) && a[sa]()

    }

    function kd(a) {

    ld(a.get(Wa)) && a[sa]()

    }

    function md(a) {

    "file:" == K[A][B] && a[sa]()

    }

    function nd(a) {

    a.get(Ib) || a.set(Ib, K.title, h);

    a.get(Hb) || a.set(Hb, K[A].pathname + K[A][ua], h)

    };

    var od = new

    function() {

    var a = [];

    this.set = function(b) {

    a[b] = h

    };

    this.Xa = function() {

    for (var b = [], c = 0; c < a[x]; c++) a[c] && (b[n[ka](c / 6)] = b[n[ka](c / 6)] ^ 1 << c % 6);

    for (c = 0; c < b[x]; c++) b[c] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" [la](b[c] || 0);

    return b[D]("") + "~"

    }

    };

    function I(a) {

    od.set(a)

    };

    var W = window,

    K = document,

    ld = function(a) {

    var b = W._gaUserPrefs;

    return b && b.ioo && b.ioo() || !!a && W["ga-disable-" + a] === h

    },

    pd = function(a) {

    var b = [],

    c = K.cookie[z](";");

    a = RegExp("^\\s*" + a + "=\\s*(.*?)\\s*$");

    for (var d = 0; d < c[x]; d++) {

    var e = c[d][na](a);

    e && b[p](e[1])

    }

    return b

    },

    X = function(a, b, c, d, e, f) {

    e = ld(e) ? l: Sc(d, c) ? l: h;

    if (e) {

    if (b && 0 <= W[ya].userAgent[r]("Firefox")) {

    b = b[q](/\n|\r/g, " ");

    e = 0;

    for (var k = b[x]; e < k; ++e) {

    var m = b.charCodeAt(e) & 255;

    if (10 == m || 13 == m) b = b[C](0, e) + "?" + b[C](e + 1)

    }

    }

    b && 2E3 < b[x] && (b = b[C](0, 2E3), I(69));

    a = a + "=" + b + "; path=" + c + "; ";

    f && (a += "expires=" + (new Date((new Date).getTime() + f)).toGMTString() + "; ");

    d && (a += "domain=" + d + ";");

    K.cookie = a

    }

    };

    var qd, rd, sd = function() {

    if (!qd) {

    var a = {},

    b = W[ya],

    c = W.screen;

    a.Q = c ? c.width + "x" + c.height: "-";

    a.P = c ? c.colorDepth + "-bit": "-";

    a.language = (b && (b.language || b.browserLanguage) || "-")[E]();

    a.javaEnabled = b && b.javaEnabled() ? 1 : 0;

    a.characterSet = K.characterSet || K.charset || "-";

    try {

    var d = K.documentElement,

    e = K.body,

    f = e && e[ra] && e[va],

    b = [];

    d && (d[ra] && d[va]) && ("CSS1Compat" === K.compatMode || !f) ? b = [d[ra], d[va]] : f && (b = [e[ra], e[va]]);

    a.Wa = b[D]("x")

    } catch(k) {

    I(135)

    }

    qd = a

    }

    },

    td = function() {

    sd();

    for (var a = qd, b = W[ya], a = b.appName + b.version + a.language + b.platform + b.userAgent + a.javaEnabled + a.Q + a.P + (K.cookie ? K.cookie: "") + (K.referrer ? K.referrer: ""), b = a[x], c = W.history[x]; 0 < c;) a += c--^b++;

    return Yc(a)

    },

    ud = function(a) {

    sd();

    var b = qd;

    a.set(Lb, b.Q);

    a.set(Mb, b.P);

    a.set(Pb, b.language);

    a.set(Qb, b.characterSet);

    a.set(Nb, b.javaEnabled);

    a.set(Rb, b.Wa);

    if (a.get(ib) && a.get(jb)) {

    if (! (b = rd)) {

    var c, d, e;

    d = "ShockwaveFlash";

    if ((b = (b = W[ya]) ? b.plugins: g) && 0 < b[x]) for (c = 0; c < b[x] && !e; c++) d = b[c],

    -1 < d[s][r]("Shockwave Flash") && (e = d.description[z]("Shockwave Flash ")[1]);

    else {

    d = d + "." + d;

    try {

    c = new ActiveXObject(d + ".7"),

    e = c.GetVariable("$version")

    } catch(f) {}

    if (!e) try {

    c = new ActiveXObject(d + ".6"),

    e = "WIN 6,0,21,0",

    c.AllowScriptAccess = "always",

    e = c.GetVariable("$version")

    } catch(k) {}

    if (!e) try {

    c = new ActiveXObject(d),

    e = c.GetVariable("$version")

    } catch(m) {}

    e && (e = e[z](" ")[1][z](","), e = e[0] + "." + e[1] + " r" + e[2])

    }

    b = e ? e: "-"

    }

    rd = b;

    a.set(Ob, rd)

    } else a.set(Ob, "-")

    };

    var vd = function(a) {

    if (Aa(a)) this.s = a;

    else {

    var b = a[0],

    c = b.lastIndexOf(":"),

    d = b.lastIndexOf(".");

    this.h = this.i = this.l = ""; - 1 == c && -1 == d ? this.h = b: -1 == c && -1 != d ? (this.i = b[C](0, d), this.h = b[C](d + 1)) : -1 != c && -1 == d ? (this.l = b[C](0, c), this.h = b[C](c + 1)) : c > d ? (this.i = b[C](0, d), this.l = b[C](d + 1, c), this.h = b[C](c + 1)) : (this.i = b[C](0, d), this.h = b[C](d + 1));

    this.k = a[ia](1);

    this.Ma = !this.l && "_require" == this.h;

    this.J = !this.i && !this.l && "_provide" == this.h

    }

    },

    Y = function() {

    T(Y[y], "push", Y[y][p], 5);

    T(Y[y], "_getPlugin", Pc, 121);

    T(Y[y], "_createAsyncTracker", Y[y].Sa, 33);

    T(Y[y], "_getAsyncTracker", Y[y].Ta, 34);

    this.I = new Ja;

    this.p = []

    };

    F = Y[y];

    F.Na = function(a, b, c) {

    var d = this.I.get(a);

    if (!Aa(d)) return l;

    b.plugins_ = b.plugins_ || new Ja;

    b.plugins_.set(a, new d(b, c || {}));

    return h

    };

    F.push = function(a) {

    var b = Z.Va[xa](this, arguments),

    b = Z.p.concat(b);

    for (Z.p = []; 0 < b[x] && !Z.O(b[0]) && !(b.shift(), 0 < Z.p[x]););

    Z.p = Z.p.concat(b);

    return 0

    };

    F.Va = function(a) {

    for (var b = [], c = 0; c < arguments[x]; c++) try {

    var d = new vd(arguments[c]);

    d.J ? this.O(d) : b[p](d)

    } catch(e) {}

    return b

    };

    F.O = function(a) {

    try {

    if (a.s) a.s[xa](W);

    else if (a.J) this.I.set(a.k[0], a.k[1]);

    else {

    var b = "_gat" == a.i ? M: "_gaq" == a.i ? Z: M.u(a.i);

    if (a.Ma) {

    if (!this.Na(a.k[0], b, a.k[2])) {

    if (!a.Pa) {

    var c = Oa("" + a.k[1]);

    var d = c[B],

    e = K[A][B];

    var f;

    if (f = "https:" == d || d == e ? h: "http:" != d ? l: "http:" == e) {

    var k;

    a: {

    var m = Oa(K[A][wa]);

    if (! (c.Oa || 0 <= c.url[r]("?") || 0 <= c[qa][r]("://") || c[v] == m[v] && c[oa] == m[oa])) for (var t = "http:" == c[B] ? 80 : 443, u = M.S, b = 0; b < u[x]; b++) if (c[v] == u[b][0] && (c[oa] || t) == (u[b][1] || t) && 0 == c[qa][r](u[b][2])) {

    k = h;

    break a

    }

    k = l

    }

    f = k && !ld()

    }

    f && (a.Pa = Ha(c.url))

    }

    return h

    }

    } else a.l && (b = b.plugins_.get(a.l)),

    b[a.h][xa](b, a.k)

    }

    } catch(Za) {}

    };

    F.Sa = function(a, b) {

    return M.r(a, b || "")

    };

    F.Ta = function(a) {

    return M.u(a)

    };

    var yd = function() {

    function a(a, b, c, d) {

    g == f[a] && (f[a] = {});

    g == f[a][b] && (f[a][b] = []);

    f[a][b][c] = d

    }

    function b(a, b, c) {

    if (g != f[a] && g != f[a][b]) return f[a][b][c]

    }

    function c(a, b) {

    if (g != f[a] && g != f[a][b]) {

    f[a][b] = g;

    var c = h,

    d;

    for (d = 0; d < k[x]; d++) if (g != f[a][k[d]]) {

    c = l;

    break

    }

    c && (f[a] = g)

    }

    }

    function d(a) {

    var b = "",

    c = l,

    d, e;

    for (d = 0; d < k[x]; d++) if (e = a[k[d]], g != e) {

    c && (b += k[d]);

    for (var c = [], f = g, ha = g, ha = 0; ha < e[x]; ha++) if (g != e[ha]) {

    f = "";

    ha != mb && g == e[ha - 1] && (f += ha[w]() + Za);

    for (var Cd = e[ha], Jc = "", Yb = g, Kc = g, Lc = g, Yb = 0; Yb < Cd[x]; Yb++) Kc = Cd[la](Yb),

    Lc = Na[Kc],

    Jc += g != Lc ? Lc: Kc;

    f += Jc;

    c[p](f)

    }

    b += m + c[D](u) + t;

    c = l

    } else c = h;

    return b

    }

    var e = this,

    f = [],

    k = ["k", "v"],

    m = "(",

    t = ")",

    u = "*",

    Za = "!",

    Na = {

    "'": "'0"

    };

    Na[t] = "'1";

    Na[u] = "'2";

    Na[Za] = "'3";

    var mb = 1;

    e.Ra = function(a) {

    return g != f[a]

    };

    e.A = function() {

    for (var a = "", b = 0; b < f[x]; b++) g != f[b] && (a += b[w]() + d(f[b]));

    return a

    };

    e.Qa = function(a) {

    if (a == g) return e.A();

    for (var b = a.A(), c = 0; c < f[x]; c++) g != f[c] && !a.Ra(c) && (b += c[w]() + d(f[c]));

    return b

    };

    e.f = function(b, c, d) {

    if (!wd(d)) return l;

    a(b, "k", c, d);

    return h

    };

    e.o = function(b, c, d) {

    if (!xd(d)) return l;

    a(b, "v", c, d[w]());

    return h

    };

    e.getKey = function(a, c) {

    return b(a, "k", c)

    };

    e.N = function(a, c) {

    return b(a, "v", c)

    };

    e.L = function(a) {

    c(a, "k")

    };

    e.M = function(a) {

    c(a, "v")

    };

    T(e, "_setKey", e.f, 89);

    T(e, "_setValue", e.o, 90);

    T(e, "_getKey", e.getKey, 87);

    T(e, "_getValue", e.N, 88);

    T(e, "_clearKey", e.L, 85);

    T(e, "_clearValue", e.M, 86)

    };

    function wd(a) {

    return "string" == typeof a

    }

    function xd(a) {

    return "number" != typeof a && (g == Number || !(a instanceof Number)) || n.round(a) != a || NaN == a || a == ba ? l: h

    };

    var zd = function(a) {

    var b = W.gaGlobal;

    a && !b && (W.gaGlobal = b = {});

    return b

    },

    Ad = function() {

    var a = zd(h).hid;

    a == j && (a = Da(), zd(h).hid = a);

    return a

    },

    Dd = function(a) {

    a.set(Kb, Ad());

    var b = zd();

    if (b && b.dh == a.get(O)) {

    var c = b.sid;

    c && ("0" == c && I(112), a.set(Zb, c), a.get(Sb) && a.set(Wb, c));

    b = b.vid;

    a.get(Sb) && b && (b = b[z]("."), 1 * b[1] || I(112), a.set(Q, 1 * b[0]), a.set(Vb, 1 * b[1]))

    }

    };

    var Ed, Fd = function(a, b, c) {

    var d = a.c(bb, ""),

    e = a.c(P, "/"),

    f = a.b(cb, 0);

    a = a.c(Wa, "");

    X(b, c, e, d, a, f)

    },

    Xc = function(a) {

    var b = a.c(bb, "");

    a.b(O, 1);

    var c = a.c(P, "/"),

    d = a.c(Wa, "");

    X("__utma", cd(a), c, b, d, a.get(cb));

    X("__utmb", dd(a), c, b, d, a.get(db));

    X("__utmc", "" + a.b(O, 1), c, b, d);

    var e = hd(a, h);

    e ? X("__utmz", e, c, b, d, a.get(eb)) : X("__utmz", "", c, b, "", -1);

    (e = fd(a, l)) ? X("__utmv", e, c, b, d, a.get(cb)) : X("__utmv", "", c, b, "", -1)

    },

    Wc = function(a) {

    var b = a.b(O, 1);

    if (!bd(a, $c(b, pd("__utma")))) return a.set(Ub, h),

    l;

    var c = !ed(a, $c(b, pd("__utmb")));

    a.set(bc, c);

    id(a, $c(b, pd("__utmz")));

    gd(a, $c(b, pd("__utmv")));

    Ed = !c;

    return h

    },

    Gd = function(a) { ! Ed && !(0 < pd("__utmb")[x]) && (X("__utmd", "1", a.c(P, "/"), a.c(bb, ""), a.c(Wa, ""), 1E4), 0 == pd("__utmd")[x] && a[sa]())

    };

    var Jd = function(a) {

    a.get(Q) == g ? Hd(a) : a.get(Ub) && !a.get(Mc) ? Hd(a) : a.get(bc) && Id(a)

    },

    Kd = function(a) {

    a.get(hc) && !a.get(ac) && (Id(a), a.set(fc, a.get($b)))

    },

    Hd = function(a) {

    var b = a.get(ab);

    a.set(Sb, h);

    a.set(Q, Da() ^ td(a) & 2147483647);

    a.set(Tb, "");

    a.set(Vb, b);

    a.set(Wb, b);

    a.set(Zb, b);

    a.set($b, 1);

    a.set(ac, h);

    a.set(cc, 0);

    a.set(R, 10);

    a.set(dc, b);

    a.set(Fb, []);

    a.set(Ub, l);

    a.set(bc, l)

    },

    Id = function(a) {

    a.set(Wb, a.get(Zb));

    a.set(Zb, a.get(ab));

    a.z($b);

    a.set(ac, h);

    a.set(cc, 0);

    a.set(R, 10);

    a.set(dc, a.get(ab));

    a.set(bc, l)

    };

    var Ld = "daum:q eniro:search_word naver:query pchome:q images.google:q google:q yahoo:p yahoo:q msn:q bing:q aol:query aol:q lycos:q lycos:query ask:q netscape:query cnn:query about:terms mamma:q voila:rdata virgilio:qs live:q baidu:wd alice:qs yandex:text najdi:q seznam:q rakuten:qt biglobe:q goo.ne:MT wp:szukaj onet:qt yam:k kvasir:q ozu:q terra:query rambler:query conduit:q babylon:q search-results:q avg:q comcast:q incredimail:q startsiden:q go.mail.ru:q search.centrum.cz:q".split(" "),

    Sd = function(a) {

    if (a.get(kb) && !a.get(Mc)) {

    for (var b = !G(a.get(ic)) || !G(a.get(nc)) || !G(a.get(S)) || !G(a.get(lc)), c = {},

    d = 0; d < Md[x]; d++) {

    var e = Md[d];

    c[e] = a.get(e)

    } (d = a.get(rc)) ? (I(149), e = new Ja, Ma(e, d), d = e) : d = La(K[A][wa], a.get(gb)).d;

    if (! ("1" == Ia(d.get(a.get(ub))) && b)) {

    var f = d,

    k = function(b, c) {

    c = c || "-";

    var d = Ia(f.get(a.get(b)));

    return d && "-" != d ? J(d) : c

    },

    d = Ia(f.get(a.get(nb))) || "-",

    e = Ia(f.get(a.get(qb))) || "-",

    m = Ia(f.get(a.get(pb))) || "-",

    t = Ia(f.get("gclsrc")) || "-",

    u = Ia(f.get("dclid")) || "-",

    Za = k(ob, "(not set)"),

    Na = k(rb, "(not set)"),

    mb = k(sb),

    k = k(tb);

    if (G(d) && G(m) && G(u) && G(e)) d = l;

    else {

    var Xb = !G(m) && !G(t),

    Xb = G(e) && (!G(u) || Xb),

    Bd = G(mb);

    if (Xb || Bd) {

    var ga = Nd(a),

    ga = La(ga, h);

    if ((ga = Od(a, ga)) && !G(ga[1] && !ga[2])) Xb && (e = ga[0]),

    Bd && (mb = ga[1])

    }

    Pd(a, d, e, m, t, u, Za, Na, mb, k);

    d = h

    }

    d = d || Qd(a); ! d && (!b && a.get(ac)) && (Pd(a, g, "(direct)", g, g, g, "(direct)", "(none)", g, g), d = h);

    if (d && (a.set(hc, Rd(a, c)), b = "(direct)" == a.get(nc) && "(direct)" == a.get(jc) && "(none)" == a.get(oc), a.get(hc) || a.get(ac) && !b)) a.set(ec, a.get(ab)),

    a.set(fc, a.get($b)),

    a.z(gc)

    }

    }

    },

    Qd = function(a) {

    var b = Nd(a),

    c = La(b, h);

    if (! (b != g && b != j && "" != b && "0" != b && "-" != b && 0 <= b[r]("://")) || c && -1 < c[v][r]("google") && c.d.contains("q") && "cse" == c[qa]) return l;

    if ((b = Od(a, c)) && !b[2]) return Pd(a, g, b[0], g, g, g, "(organic)", "organic", b[1], g),

    h;

    if (b || !a.get(ac)) return l;

    a: {

    for (var b = a.get(Bb), d = Ka(c[v]), e = 0; e < b[x]; ++e) if ( - 1 < d[r](b[e])) {

    a = l;

    break a

    }

    Pd(a, g, d, g, g, g, "(referral)", "referral", g, "/" + c[qa]);

    a = h

    }

    return a

    },

    Od = function(a, b) {

    for (var c = a.get(zb), d = 0; d < c[x]; ++d) {

    var e = c[d][z](":");

    if ( - 1 < b[v][r](e[0][E]())) {

    var f = b.d.get(e[1]);

    if (f && (f = L(f), !f && -1 < b[v][r]("google.") && (f = "(not provided)"), !e[3] || -1 < b.url[r](e[3]))) {

    a: {

    for (var c = f, d = a.get(Ab), c = J(c)[E](), k = 0; k < d[x]; ++k) if (c == d[k]) {

    c = h;

    break a

    }

    c = l

    }

    return [e[2] || e[0], f, c]

    }

    }

    }

    return j

    },

    Pd = function(a, b, c, d, e, f, k, m, t, u) {

    a.set(ic, b);

    a.set(nc, c);

    a.set(S, d);

    a.set(kc, e);

    a.set(lc, f);

    a.set(jc, k);

    a.set(oc, m);

    a.set(pc, t);

    a.set(qc, u)

    },

    Md = [jc, ic, S, lc, nc, oc, pc, qc],

    Rd = function(a, b) {

    function c(a) {

    a = ("" + a)[z]("+")[D]("%20");

    return a = a[z](" ")[D]("%20")

    }

    function d(c) {

    var d = "" + (a.get(c) || "");

    c = "" + (b[c] || "");

    return 0 < d[x] && d == c

    }

    if (d(S) || d(lc)) return I(131),

    l;

    for (var e = 0; e < Md[x]; e++) {

    var f = Md[e],

    k = b[f] || "-",

    f = a.get(f) || "-";

    if (c(k) != c(f)) return h

    }

    return l

    },

    Td = RegExp(/^https:\/\/(www\.)?google(\.com?)?(\.[a-z]{2}t?)?\/?$/i),

    Nd = function(a) {

    a = Pa(a.get(Jb), a.get(P));

    try {

    if (Td[fa](a)) return I(136),

    a + "?q="

    } catch(b) {

    I(145)

    }

    return a

    };

    var Ud, Vd, Wd = function(a) {

    Ud = a.c(S, "");

    Vd = a.c(kc, "")

    },

    Xd = function(a) {

    var b = a.c(S, ""),

    c = a.c(kc, "");

    b != Ud && ( - 1 < c[r]("ds") ? a.set(mc, g) : !G(Ud) && -1 < Vd[r]("ds") && a.set(mc, Ud))

    };

    var Zd = function(a) {

    Yd(a, K[A][wa]) ? (a.set(Mc, h), I(12)) : a.set(Mc, l)

    },

    Yd = function(a, b) {

    if (!a.get(fb)) return l;

    var c = La(b, a.get(gb)),

    d = L(c.d.get("__utma")),

    e = L(c.d.get("__utmb")),

    f = L(c.d.get("__utmc")),

    k = L(c.d.get("__utmx")),

    m = L(c.d.get("__utmz")),

    t = L(c.d.get("__utmv")),

    c = L(c.d.get("__utmk"));

    if (Yc("" + d + e + f + k + m + t) != c) {

    d = J(d);

    e = J(e);

    f = J(f);

    k = J(k);

    f = $d(d + e + f + k, m, t, c);

    if (!f) return l;

    m = f[0];

    t = f[1]

    }

    if (!bd(a, d, h)) return l;

    ed(a, e, h);

    id(a, m, h);

    gd(a, t, h);

    ae(a, k, h);

    return h

    },

    ce = function(a, b, c) {

    var d;

    d = cd(a) || "-";

    var e = dd(a) || "-",

    f = "" + a.b(O, 1) || "-",

    k = be(a) || "-",

    m = hd(a, l) || "-";

    a = fd(a, l) || "-";

    var t = Yc("" + d + e + f + k + m + a),

    u = [];

    u[p]("__utma=" + d);

    u[p]("__utmb=" + e);

    u[p]("__utmc=" + f);

    u[p]("__utmx=" + k);

    u[p]("__utmz=" + m);

    u[p]("__utmv=" + a);

    u[p]("__utmk=" + t);

    d = u[D]("&");

    if (!d) return b;

    e = b[r]("#");

    if (c) return 0 > e ? b + "#" + d: b + "&" + d;

    c = "";

    f = b[r]("?");

    0 < e && (c = b[C](e), b = b[C](0, e));

    return 0 > f ? b + "?" + d + c: b + "&" + d + c

    },

    $d = function(a, b, c, d) {

    for (var e = 0; 3 > e; e++) {

    for (var f = 0; 3 > f; f++) {

    if (d == Yc(a + b + c)) return I(127),

    [b, c];

    var k = b[q](/ /g, "%20"),

    m = c[q](/ /g, "%20");

    if (d == Yc(a + k + m)) return I(128),

    [k, m];

    k = k[q](/\+/g, "%20");

    m = m[q](/\+/g, "%20");

    if (d == Yc(a + k + m)) return I(129),

    [k, m];

    try {

    var t = b[na]("utmctr=(.*?)(?:\\|utm|$)");

    if (t && 2 == t[x] && (k = b[q](t[1], H(J(t[1]))), d == Yc(a + k + c))) return I(139),

    [k, c]

    } catch(u) {}

    b = J(b)

    }

    c = J(c)

    }

    };

    var de = "|",

    fe = function(a, b, c, d, e, f, k, m, t) {

    var u = ee(a, b);

    u || (u = {},

    a.get(Cb)[p](u));

    u.id_ = b;

    u.affiliation_ = c;

    u.total_ = d;

    u.tax_ = e;

    u.shipping_ = f;

    u.city_ = k;

    u.state_ = m;

    u.country_ = t;

    u.items_ = u.items_ || [];

    return u

    },

    ge = function(a, b, c, d, e, f, k) {

    a = ee(a, b) || fe(a, b, "", 0, 0, 0, "", "", "");

    var m;

    a: {

    if (a && a.items_) {

    m = a.items_;

    for (var t = 0; t < m[x]; t++) if (m[t].sku_ == c) {

    m = m[t];

    break a

    }

    }

    m = j

    }

    t = m || {};

    t.transId_ = b;

    t.sku_ = c;

    t.name_ = d;

    t.category_ = e;

    t.price_ = f;

    t.quantity_ = k;

    m || a.items_[p](t);

    return t

    },

    ee = function(a, b) {

    for (var c = a.get(Cb), d = 0; d < c[x]; d++) if (c[d].id_ == b) return c[d];

    return j

    };

    var he, ie = function(a) {

    if (!he) {

    var b;

    b = K[A].hash;

    var c = W[s],

    d = /^#?gaso=([^&]*)/;

    if (c = (b = (b = b && b[na](d) || c && c[na](d)) ? b[1] : L(pd("GASO"))) && b[na](/^(?:[|!]([-0-9a-z.]{1,40})[|!])?([-.\w]{10,1200})$/i)) Fd(a, "GASO", "" + b),

    M._gasoDomain = a.get(bb),

    M._gasoCPath = a.get(P),

    a = c[1],

    Ha("https://www.google.com/analytics/web/inpage/pub/inpage.js?" + (a ? "prefix=" + a + "&": "") + Da(), "_gasojs");

    he = h

    }

    };

    var ae = function(a, b, c) {

    c && (b = J(b));

    c = a.b(O, 1);

    b = b[z]("."); ! (2 > b[x]) && /^\d+$/ [fa](b[0]) && (b[0] = "" + c, Fd(a, "__utmx", b[D](".")))

    },

    be = function(a, b) {

    var c = $c(a.get(O), pd("__utmx"));

    "-" == c && (c = "");

    return b ? H(c) : c

    };

    var ke = function(a, b) {

    var c = n.min(a.b(Dc, 0), 100);

    if (a.b(Q, 0) % 100 >= c) return l;

    a: {

    if (c = (c = W.performance || W.webkitPerformance) && c.timing) {

    var d = c.navigationStart;

    if (0 == d) I(133);

    else {

    c = [c.loadEventStart - d, c.domainLookupEnd - c.domainLookupStart, c.connectEnd - c.connectStart, c.responseStart - c.requestStart, c.responseEnd - c.responseStart, c.fetchStart - d, c.domInteractive - d, c.domContentLoadedEventStart - d];

    break a

    }

    }

    c = g

    }

    c || (W.top != W ? c = g: (d = (c = W.external) && c.onloadT, c && !c.isValidLoadTime && (d = g), 2147483648 < d && (d = g), 0 < d && c.setPageReadyTime(), c = d == g ? g: [d]));

    if (c == g) return l;

    d = c[0];

    if (d == g || d == ba || isNaN(d)) return l;

    if (0 < d) {

    a: {

    for (d = 1; d < c[x]; d++) if (isNaN(c[d]) || c[d] == ba || 0 > c[d]) {

    d = l;

    break a

    }

    d = h

    }

    d ? b(je(c)) : b(je(c[ia](0, 1)))

    } else Fa(W, "load",

    function() {

    ke(a, b)

    },

    l);

    return h

    },

    me = function(a, b, c, d) {

    var e = new yd;

    e.f(14, 90, b[C](0, 64));

    e.f(14, 91, a[C](0, 64));

    e.f(14, 92, "" + le(c));

    d != g && e.f(14, 93, d[C](0, 64));

    e.o(14, 90, c);

    return e

    },

    le = function(a) {

    return isNaN(a) || 0 > a ? 0 : 5E3 > a ? 10 * n[ka](a / 10) : 5E4 > a ? 100 * n[ka](a / 100) : 41E5 > a ? 1E3 * n[ka](a / 1E3) : 41E5

    },

    je = function(a) {

    for (var b = new yd, c = 0; c < a[x]; c++) b.f(14, c + 1, "" + le(a[c])),

    b.o(14, c + 1, a[c]);

    return b

    };

    var U = function(a, b, c) {

    function d(a) {

    return function(b) {

    if ((b = b.get(Nc)[a]) && b[x]) for (var c = {

    type: a,

    target: e,

    stopPropagation: function() {

    throw "aborted";

    }

    },

    d = 0; d < b[x]; d++) b[d].call(e, c)

    }

    }

    var e = this;

    this.a = new Zc;

    this.get = function(a) {

    return this.a.get(a)

    };

    this.set = function(a, b, c) {

    this.a.set(a, b, c)

    };

    this.set(Wa, b || "UA-XXXXX-X");

    this.set($a, a || "");

    this.set(Ya, c || "");

    this.set(ab, n.round((new Date).getTime() / 1E3));

    this.set(P, "/");

    this.set(cb, 63072E6);

    this.set(eb, 15768E6);

    this.set(db, 18E5);

    this.set(fb, l);

    this.set(yb, 50);

    this.set(gb, l);

    this.set(hb, h);

    this.set(ib, h);

    this.set(jb, h);

    this.set(kb, h);

    this.set(lb, h);

    this.set(ob, "utm_campaign");

    this.set(nb, "utm_id");

    this.set(pb, "gclid");

    this.set(qb, "utm_source");

    this.set(rb, "utm_medium");

    this.set(sb, "utm_term");

    this.set(tb, "utm_content");

    this.set(ub, "utm_nooverride");

    this.set(vb, 100);

    this.set(Dc, 1);

    this.set(Ec, l);

    this.set(wb, "/__utm.gif");

    this.set(xb, 1);

    this.set(Cb, []);

    this.set(Fb, []);

    this.set(zb, Ld[ia](0));

    this.set(Ab, []);

    this.set(Bb, []);

    this.B("auto");

    this.set(Jb, K.referrer);

    a = this.a;

    try {

    var f = La(K[A][wa], l),

    k = da(Ia(f.d.get("utm_referrer"))) || "";

    k && a.set(Jb, k);

    var m = W.gaData && W.gaData.expId;

    m || (m = da(L(f.d.get("utm_expid"))) || "");

    m && a.set(Oc, "" + m)

    } catch(t) {

    I(146)

    }

    this.set(Nc, {

    hit: [],

    load: []

    });

    this.a.g("0", Zd);

    this.a.g("1", Wd);

    this.a.g("2", Jd);

    this.a.g("3", Sd);

    this.a.g("4", Xd);

    this.a.g("5", Kd);

    this.a.g("6", d("load"));

    this.a.g("7", ie);

    this.a.e("A", kd);

    this.a.e("B", md);

    this.a.e("C", Jd);

    this.a.e("D", jd);

    this.a.e("E", Tc);

    this.a.e("F", ne);

    this.a.e("G", Gd);

    this.a.e("H", nd);

    this.a.e("I", ud);

    this.a.e("J", Dd);

    this.a.e("K", d("hit"));

    this.a.e("L", oe);

    this.a.e("M", pe);

    0 === this.get(ab) && I(111);

    this.a.T();

    this.H = g

    };

    F = U[y];

    F.m = function() {

    var a = this.get(Db);

    a || (a = new yd, this.set(Db, a));

    return a

    };

    F.La = function(a) {

    for (var b in a) {

    var c = a[b];

    a.hasOwnProperty(b) && this.set(b, c, h)

    }

    };

    F.K = function(a) {

    if (this.get(Ec)) return l;

    var b = this,

    c = ke(this.a,

    function(c) {

    b.set(Hb, a, h);

    b.t(c)

    });

    this.set(Ec, c);

    return c

    };

    F.Fa = function(a) {

    a && Ba(a) ? (I(13), this.set(Hb, a, h)) : "object" === typeof a && a !== j && this.La(a);

    this.H = a = this.get(Hb);

    this.a.j("page");

    this.K(a)

    };

    F.F = function(a, b, c, d, e) {

    if ("" == a || (!wd(a) || "" == b || !wd(b)) || c != g && !wd(c) || d != g && !xd(d)) return l;

    this.set(wc, a, h);

    this.set(xc, b, h);

    this.set(yc, c, h);

    this.set(zc, d, h);

    this.set(vc, !!e, h);

    this.a.j("event");

    return h

    };

    F.Ha = function(a, b, c, d, e) {

    var f = this.a.b(Dc, 0);

    1 * e === e && (f = e);

    if (this.a.b(Q, 0) % 100 >= f) return l;

    c = 1 * ("" + c);

    if ("" == a || (!wd(a) || "" == b || !wd(b) || !xd(c) || isNaN(c) || 0 > c || 0 > f || 100 < f) || d != g && ("" == d || !wd(d))) return l;

    this.t(me(a, b, c, d));

    return h

    };

    F.Ga = function(a, b, c, d) {

    if (!a || !b) return l;

    this.set(Ac, a, h);

    this.set(Bc, b, h);

    this.set(Cc, c || K[A][wa], h);

    d && this.set(Hb, d, h);

    this.a.j("social");

    return h

    };

    F.Ea = function() {

    this.set(Dc, 10);

    this.K(this.H)

    };

    F.Ia = function() {

    this.a.j("trans")

    };

    F.t = function(a) {

    this.set(Eb, a, h);

    this.a.j("event")

    };

    F.ia = function(a) {

    this.v();

    var b = this;

    return {

    _trackEvent: function(c, d, e) {

    I(91);

    b.F(a, c, d, e)

    }

    }

    };

    F.ma = function(a) {

    return this.get(a)

    };

    F.xa = function(a, b) {

    if (a) if (Ba(a)) this.set(a, b);

    else if ("object" == typeof a) for (var c in a) a.hasOwnProperty(c) && this.set(c, a[c])

    };

    F.addEventListener = function(a, b) {

    var c = this.get(Nc)[a];

    c && c[p](b)

    };

    F.removeEventListener = function(a, b) {

    for (var c = this.get(Nc)[a], d = 0; c && d < c[x]; d++) if (c[d] == b) {

    c.splice(d, 1);

    break

    }

    };

    F.qa = function() {

    return "5.3.8"

    };

    F.B = function(a) {

    this.get(hb);

    a = "auto" == a ? Ka(K.domain) : !a || "-" == a || "none" == a ? "": a[E]();

    this.set(bb, a)

    };

    F.va = function(a) {

    this.set(hb, !!a)

    };

    F.na = function(a, b) {

    return ce(this.a, a, b)

    };

    F.link = function(a, b) {

    if (this.a.get(fb) && a) {

    var c = ce(this.a, a, b);

    K[A].href = c

    }

    };

    F.ua = function(a, b) {

    this.a.get(fb) && (a && a.action) && (a.action = ce(this.a, a.action, b))

    };

    F.za = function() {

    this.v();

    var a = this.a,

    b = K.getElementById ? K.getElementById("utmtrans") : K.utmform && K.utmform.utmtrans ? K.utmform.utmtrans: j;

    if (b && b[ma]) {

    a.set(Cb, []);

    for (var b = b[ma][z]("UTM:"), c = 0; c < b[x]; c++) {

    b[c] = Ca(b[c]);

    for (var d = b[c][z](de), e = 0; e < d[x]; e++) d[e] = Ca(d[e]);

    "T" == d[0] ? fe(a, d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8]) : "I" == d[0] && ge(a, d[1], d[2], d[3], d[4], d[5], d[6])

    }

    }

    };

    F.$ = function(a, b, c, d, e, f, k, m) {

    return fe(this.a, a, b, c, d, e, f, k, m)

    };

    F.Y = function(a, b, c, d, e, f) {

    return ge(this.a, a, b, c, d, e, f)

    };

    F.Aa = function(a) {

    de = a || "|"

    };

    F.ea = function() {

    this.set(Cb, [])

    };

    F.wa = function(a, b, c, d) {

    var e = this.a;

    if (0 >= a || a > e.get(yb)) a = l;

    else if (!b || !c || 128 < b[x] + c[x]) a = l;

    else {

    1 != d && 2 != d && (d = 3);

    var f = {};

    ea(f, b);

    f.value = c;

    f.scope = d;

    e.get(Fb)[a] = f;

    a = h

    }

    a && this.a.n();

    return a

    };

    F.ka = function(a) {

    this.a.get(Fb)[a] = g;

    this.a.n()

    };

    F.ra = function(a) {

    return (a = this.a.get(Fb)[a]) && 1 == a[ta] ? a[ma] : g

    };

    F.Ca = function(a, b, c) {

    this.m().f(a, b, c)

    };

    F.Da = function(a, b, c) {

    this.m().o(a, b, c)

    };

    F.sa = function(a, b) {

    return this.m().getKey(a, b)

    };

    F.ta = function(a, b) {

    return this.m().N(a, b)

    };

    F.fa = function(a) {

    this.m().L(a)

    };

    F.ga = function(a) {

    this.m().M(a)

    };

    F.ja = function() {

    return new yd

    };

    F.W = function(a) {

    a && this.get(Ab)[p](a[E]())

    };

    F.ba = function() {

    this.set(Ab, [])

    };

    F.X = function(a) {

    a && this.get(Bb)[p](a[E]())

    };

    F.ca = function() {

    this.set(Bb, [])

    };

    F.Z = function(a, b, c, d, e) {

    if (a && b) {

    a = [a, b[E]()][D](":");

    if (d || e) a = [a, d, e][D](":");

    d = this.get(zb);

    d.splice(c ? 0 : d[x], 0, a)

    }

    };

    F.da = function() {

    this.set(zb, [])

    };

    F.ha = function(a) {

    this.a[ja]();

    var b = this.get(P),

    c = be(this.a);

    this.set(P, a);

    this.a.n();

    ae(this.a, c);

    this.set(P, b)

    };

    F.ya = function(a, b) {

    if (0 < a && 5 >= a && Ba(b) && "" != b) {

    var c = this.get(Fc) || [];

    c[a] = b;

    this.set(Fc, c)

    }

    };

    F.V = function(a) {

    a = "" + a;

    if (a[na](/^[A-Za-z0-9]{1,5}$/)) {

    var b = this.get(Ic) || [];

    b[p](a);

    this.set(Ic, b)

    }

    };

    F.v = function() {

    this.a[ja]()

    };

    F.Ba = function(a) {

    a && "" != a && (this.set(Tb, a), this.a.j("var"))

    };

    var ne = function(a) {

    "trans" !== a.get(sc) && 500 <= a.b(cc, 0) && a[sa]();

    if ("event" === a.get(sc)) {

    var b = (new Date).getTime(),

    c = a.b(dc, 0),

    d = a.b(Zb, 0),

    c = n[ka](1 * ((b - (c != d ? c: 1E3 * c)) / 1E3));

    0 < c && (a.set(dc, b), a.set(R, n.min(10, a.b(R, 0) + c)));

    0 >= a.b(R, 0) && a[sa]()

    }

    },

    pe = function(a) {

    "event" === a.get(sc) && a.set(R, n.max(0, a.b(R, 10) - 1))

    };

    var qe = function() {

    var a = [];

    this.add = function(b, c, d) {

    d && (c = H("" + c));

    a[p](b + "=" + c)

    };

    this.toString = function() {

    return a[D]("&")

    }

    },

    re = function(a, b) { (b || 2 != a.get(xb)) && a.z(cc)

    },

    se = function(a, b) {

    b.add("utmwv", "5.3.8");

    b.add("utms", a.get(cc));

    b.add("utmn", Da());

    var c = K[A].hostname;

    G(c) || b.add("utmhn", c, h);

    c = a.get(vb);

    100 != c && b.add("utmsp", c, h)

    },

    te = function(a, b) {

    b.add("utmac", Ca(a.get(Wa)));

    a.get(Oc) && b.add("utmxkey", a.get(Oc), h);

    a.get(vc) && b.add("utmni", 1);

    var c = a.get(Ic);

    c && 0 < c[x] && b.add("utmdid", c[D]("."));

    var c = function(a, b) {

    b && d[p](a + "=" + b + ";")

    },

    d = [];

    c("__utma", cd(a));

    c("__utmz", hd(a, l));

    c("__utmv", fd(a, h));

    c("__utmx", be(a));

    b.add("utmcc", d[D]("+"), h);

    a.get(Xa) !== l && (a.get(Xa) || M.w) && b.add("aip", 1);

    b.add("utmu", od.Xa())

    },

    ue = function(a, b) {

    for (var c = a.get(Fc) || [], d = [], e = 1; e < c[x]; e++) c[e] && d[p](e + ":" + H(c[e][q](/%/g, "%25")[q](/:/g, "%3A")[q](/,/g, "%2C")));

    d[x] && b.add("utmpg", d[D](","))

    },

    ve = function(a, b) {

    a.get(ib) && (b.add("utmcs", a.get(Qb), h), b.add("utmsr", a.get(Lb)), a.get(Rb) && b.add("utmvp", a.get(Rb)), b.add("utmsc", a.get(Mb)), b.add("utmul", a.get(Pb)), b.add("utmje", a.get(Nb)), b.add("utmfl", a.get(Ob), h))

    },

    we = function(a, b) {

    a.get(lb) && a.get(Ib) && b.add("utmdt", a.get(Ib), h);

    b.add("utmhid", a.get(Kb));

    b.add("utmr", Pa(a.get(Jb), a.get(P)), h);

    b.add("utmp", H(a.get(Hb), h), h)

    },

    xe = function(a, b) {

    for (var c = a.get(Db), d = a.get(Eb), e = a.get(Fb) || [], f = 0; f < e[x]; f++) {

    var k = e[f];

    k && (c || (c = new yd), c.f(8, f, k[s]), c.f(9, f, k[ma]), 3 != k[ta] && c.f(11, f, "" + k[ta]))

    } ! G(a.get(wc)) && !G(a.get(xc), h) && (c || (c = new yd), c.f(5, 1, a.get(wc)), c.f(5, 2, a.get(xc)), e = a.get(yc), e != g && c.f(5, 3, e), e = a.get(zc), e != g && c.o(5, 1, e));

    c ? b.add("utme", c.Qa(d), h) : d && b.add("utme", d.A(), h)

    },

    ye = function(a, b, c) {

    var d = new qe;

    re(a, c);

    se(a, d);

    d.add("utmt", "tran");

    d.add("utmtid", b.id_, h);

    d.add("utmtst", b.affiliation_, h);

    d.add("utmtto", b.total_, h);

    d.add("utmttx", b.tax_, h);

    d.add("utmtsp", b.shipping_, h);

    d.add("utmtci", b.city_, h);

    d.add("utmtrg", b.state_, h);

    d.add("utmtco", b.country_, h);

    xe(a, d);

    ve(a, d);

    we(a, d);

    (b = a.get(Gb)) && d.add("utmcu", b, h);

    c || (ue(a, d), te(a, d));

    return d[w]()

    },

    ze = function(a, b, c) {

    var d = new qe;

    re(a, c);

    se(a, d);

    d.add("utmt", "item");

    d.add("utmtid", b.transId_, h);

    d.add("utmipc", b.sku_, h);

    d.add("utmipn", b.name_, h);

    d.add("utmiva", b.category_, h);

    d.add("utmipr", b.price_, h);

    d.add("utmiqt", b.quantity_, h);

    xe(a, d);

    ve(a, d);

    we(a, d);

    (b = a.get(Gb)) && d.add("utmcu", b, h);

    c || (ue(a, d), te(a, d));

    return d[w]()

    },

    Ae = function(a, b) {

    var c = a.get(sc);

    if ("page" == c) c = new qe,

    re(a, b),

    se(a, c),

    xe(a, c),

    ve(a, c),

    we(a, c),

    b || (ue(a, c), te(a, c)),

    c = [c[w]()];

    else if ("event" == c) c = new qe,

    re(a, b),

    se(a, c),

    c.add("utmt", "event"),

    xe(a, c),

    ve(a, c),

    we(a, c),

    b || (ue(a, c), te(a, c)),

    c = [c[w]()];

    else if ("var" == c) c = new qe,

    re(a, b),

    se(a, c),

    c.add("utmt", "var"),

    !b && te(a, c),

    c = [c[w]()];

    else if ("trans" == c) for (var c = [], d = a.get(Cb), e = 0; e < d[x]; ++e) {

    c[p](ye(a, d[e], b));

    for (var f = d[e].items_, k = 0; k < f[x]; ++k) c[p](ze(a, f[k], b))

    } else "social" == c ? b ? c = [] : (c = new qe, re(a, b), se(a, c), c.add("utmt", "social"), c.add("utmsn", a.get(Ac), h), c.add("utmsa", a.get(Bc), h), c.add("utmsid", a.get(Cc), h), xe(a, c), ve(a, c), we(a, c), ue(a, c), te(a, c), c = [c[w]()]) : "feedback" == c ? b ? c = [] : (c = new qe, re(a, b), se(a, c), c.add("utmt", "feedback"), c.add("utmfbid", a.get(Gc), h), c.add("utmfbpr", a.get(Hc), h), xe(a, c), ve(a, c), we(a, c), ue(a, c), te(a, c), c = [c[w]()]) : c = [];

    return c

    },

    oe = function(a) {

    var b, c = a.get(xb),

    d = a.get(uc),

    e = d && d.Ua,

    f = 0;

    if (0 == c || 2 == c) {

    var k = a.get(wb) + "?";

    b = Ae(a, h);

    for (var m = 0, t = b[x]; m < t; m++) Sa(b[m], e, k, h),

    f++

    }

    if (1 == c || 2 == c) {

    b = Ae(a);

    m = 0;

    for (t = b[x]; m < t; m++) try {

    Sa(b[m], e),

    f++

    } catch(u) {

    u && Ra(u[s], g, u.message)

    }

    }

    d && (d.q = f)

    };

    var Be = function() {

    return "https:" == K[A][B] || M.G ? "https://ssl.google-analytics.com": "http://www.google-analytics.com"

    },

    Ce = function(a) {

    ea(this, "len");

    this.message = a + "-8192"

    },

    De = function(a) {

    ea(this, "ff2post");

    this.message = a + "-2036"

    },

    Sa = function(a, b, c, d) {

    b = b || Ea;

    if (d || 2036 >= a[x]) {

    var e = b;

    b = c || Be() + "/__utm.gif?";

    var f = new Image(1, 1);

    f.src = b + a;

    f.onload = function() {

    f.onload = j;

    f.onerror = j;

    e()

    };

    f.onerror = function() {

    f.onload = j;

    f.onerror = j;

    e()

    }

    } else if (8192 >= a[x]) {

    var k = b;

    if (0 <= W[ya].userAgent[r]("Firefox") && ![].reduce) throw new De(a[x]);

    var m;

    b = Be() + "/p/__utm.gif";

    if (c = W.XDomainRequest) m = new c,

    m.open("POST", b);

    else if (c = W.XMLHttpRequest) c = new c,

    "withCredentials" in c && (m = c, m.open("POST", b, h), m.setRequestHeader("Content-Type", "text/plain"));

    m ? (m.onreadystatechange = function() {

    4 == m.readyState && (k(), m = j)

    },

    m.send(a), b = h) : b = g;

    b || Ee(a, k)

    } else throw new Ce(a[x]);

    },

    Ee = function(a, b) {

    if (K.body) {

    a = aa(a);

    try {

    var c = K[pa]('<iframe name="' + a + '"></iframe>')

    } catch(d) {

    c = K[pa]("iframe"),

    ea(c, a)

    }

    c.height = "0";

    c.width = "0";

    c.style.display = "none";

    c.style.visibility = "hidden";

    var e = K[A],

    e = Be() + "/u/post_iframe.html#" + aa(e[B] + "//" + e[v] + "/favicon.ico"),

    f = function() {

    c.src = "";

    c.parentNode && c.parentNode.removeChild(c)

    };

    Fa(W, "beforeunload", f);

    var k = l,

    m = 0,

    t = function() {

    if (!k) {

    try {

    if (9 < m || c.contentWindow[A][v] == K[A][v]) {

    k = h;

    f();

    Ga(W, "beforeunload", f);

    b();

    return

    }

    } catch(a) {}

    m++;

    ca(t, 200)

    }

    };

    Fa(c, "load", t);

    K.body.appendChild(c);

    c.src = e

    } else ca(function() {

    Ee(a, b)

    },

    100)

    };

    var $ = function() {

    this.G = this.w = l;

    this.C = {};

    this.D = [];

    this.U = 0;

    this.S = [["www.google-analytics.com", "", "/plugins/"]];

    this._gasoCPath = this._gasoDomain = g;

    var a = function(a, c, d) {

    T($[y], a, c, d)

    };

    a("_createTracker", $[y].r, 55);

    a("_getTracker", $[y].oa, 0);

    a("_getTrackerByName", $[y].u, 51);

    a("_getTrackers", $[y].pa, 130);

    a("_anonymizeIp", $[y].aa, 16);

    a("_forceSSL", $[y].la, 125);

    a("_getPlugin", Pc, 120);

    a = function(a, c, d) {

    T(U[y], a, c, d)

    };

    Qc("_getName", $a, 58);

    Qc("_getAccount", Wa, 64);

    Qc("_visitCode", Q, 54);

    Qc("_getClientInfo", ib, 53, 1);

    Qc("_getDetectTitle", lb, 56, 1);

    Qc("_getDetectFlash", jb, 65, 1);

    Qc("_getLocalGifPath", wb, 57);

    Qc("_getServiceMode", xb, 59);

    V("_setClientInfo", ib, 66, 2);

    V("_setAccount", Wa, 3);

    V("_setNamespace", Ya, 48);

    V("_setAllowLinker", fb, 11, 2);

    V("_setDetectFlash", jb, 61, 2);

    V("_setDetectTitle", lb, 62, 2);

    V("_setLocalGifPath", wb, 46, 0);

    V("_setLocalServerMode", xb, 92, g, 0);

    V("_setRemoteServerMode", xb, 63, g, 1);

    V("_setLocalRemoteServerMode", xb, 47, g, 2);

    V("_setSampleRate", vb, 45, 1);

    V("_setCampaignTrack", kb, 36, 2);

    V("_setAllowAnchor", gb, 7, 2);

    V("_setCampNameKey", ob, 41);

    V("_setCampContentKey", tb, 38);

    V("_setCampIdKey", nb, 39);

    V("_setCampMediumKey", rb, 40);

    V("_setCampNOKey", ub, 42);

    V("_setCampSourceKey", qb, 43);

    V("_setCampTermKey", sb, 44);

    V("_setCampCIdKey", pb, 37);

    V("_setCookiePath", P, 9, 0);

    V("_setMaxCustomVariables", yb, 0, 1);

    V("_setVisitorCookieTimeout", cb, 28, 1);

    V("_setSessionCookieTimeout", db, 26, 1);

    V("_setCampaignCookieTimeout", eb, 29, 1);

    V("_setReferrerOverride", Jb, 49);

    V("_setSiteSpeedSampleRate", Dc, 132);

    a("_trackPageview", U[y].Fa, 1);

    a("_trackEvent", U[y].F, 4);

    a("_trackPageLoadTime", U[y].Ea, 100);

    a("_trackSocial", U[y].Ga, 104);

    a("_trackTrans", U[y].Ia, 18);

    a("_sendXEvent", U[y].t, 78);

    a("_createEventTracker", U[y].ia, 74);

    a("_getVersion", U[y].qa, 60);

    a("_setDomainName", U[y].B, 6);

    a("_setAllowHash", U[y].va, 8);

    a("_getLinkerUrl", U[y].na, 52);

    a("_link", U[y].link, 101);

    a("_linkByPost", U[y].ua, 102);

    a("_setTrans", U[y].za, 20);

    a("_addTrans", U[y].$, 21);

    a("_addItem", U[y].Y, 19);

    a("_clearTrans", U[y].ea, 105);

    a("_setTransactionDelim", U[y].Aa, 82);

    a("_setCustomVar", U[y].wa, 10);

    a("_deleteCustomVar", U[y].ka, 35);

    a("_getVisitorCustomVar", U[y].ra, 50);

    a("_setXKey", U[y].Ca, 83);

    a("_setXValue", U[y].Da, 84);

    a("_getXKey", U[y].sa, 76);

    a("_getXValue", U[y].ta, 77);

    a("_clearXKey", U[y].fa, 72);

    a("_clearXValue", U[y].ga, 73);

    a("_createXObj", U[y].ja, 75);

    a("_addIgnoredOrganic", U[y].W, 15);

    a("_clearIgnoredOrganic", U[y].ba, 97);

    a("_addIgnoredRef", U[y].X, 31);

    a("_clearIgnoredRef", U[y].ca, 32);

    a("_addOrganic", U[y].Z, 14);

    a("_clearOrganic", U[y].da, 70);

    a("_cookiePathCopy", U[y].ha, 30);

    a("_get", U[y].ma, 106);

    a("_set", U[y].xa, 107);

    a("_addEventListener", U[y].addEventListener, 108);

    a("_removeEventListener", U[y].removeEventListener, 109);

    a("_addDevId", U[y].V);

    a("_getPlugin", Pc, 122);

    a("_setPageGroup", U[y].ya, 126);

    a("_trackTiming", U[y].Ha, 124);

    a("_initData", U[y].v, 2);

    a("_setVar", U[y].Ba, 22);

    V("_setSessionTimeout", db, 27, 3);

    V("_setCookieTimeout", eb, 25, 3);

    V("_setCookiePersistence", cb, 24, 1);

    a("_setAutoTrackOutbound", Ea, 79);

    a("_setTrackOutboundSubdomains", Ea, 81);

    a("_setHrefExamineLimit", Ea, 80)

    };

    F = $[y];

    F.oa = function(a, b) {

    return this.r(a, g, b)

    };

    F.r = function(a, b, c) {

    b && I(23);

    c && I(67);

    b == g && (b = "~" + M.U++);

    a = new U(b, a, c);

    M.C[b] = a;

    M.D[p](a);

    return a

    };

    F.u = function(a) {

    a = a || "";

    return M.C[a] || M.r(g, a)

    };

    F.pa = function() {

    return M.D[ia](0)

    };

    F.aa = function() {

    this.w = h

    };

    F.la = function() {

    this.G = h

    };

    var Fe = function(a) {

    if ("prerender" == K.webkitVisibilityState) return l;

    a();

    return h

    };

    var M = new $;

    var Ge = W._gat;

    Ge && Aa(Ge._getTracker) ? M = Ge: W._gat = M;

    var Z = new Y;

    var He = function() {

    var a = W._gaq,

    b = l;

    if (a && Aa(a[p]) && (b = "[object Array]" == Object[y][w].call(Object(a)), !b)) {

    Z = a;

    return

    }

    W._gaq = Z;

    b && Z[p][xa](Z, a)

    };

    if (!Fe(He)) {

    I(123);

    var Ie = l,

    Je = function() { ! Ie && Fe(He) && (Ie = h, Ga(K, "webkitvisibilitychange", Je))

    };

    Fa(K, "webkitvisibilitychange", Je)

    };

    function Yc(a) {

    var b = 1,

    c = 0,

    d;

    if (a) {

    b = 0;

    for (d = a[x] - 1; 0 <= d; d--) c = a.charCodeAt(d),

    b = (b << 6 & 268435455) + c + (c << 14),

    c = b & 266338304,

    b = 0 != c ? b ^ c >> 21 : b

    }

    return b

    };

    })();

1212月/120

Google Analytics Tracking Code 跟踪代码分析

发布在 邵珠庆

 

The Google Analytics tracking API consists of two global objects; _gat for standard tracking and _gaq for asynchronous tracking. Both of these global objects contain methods for creating tracker objects. Tracker objects are used to track your pages and they have many methods to configure how that tracking will work.

This page is a complete reference of all the methods available in _gat, _gaq, and tracker objects.

_gat Object Methods

_gaq Object Methods

Tracker Object Methods

1610月/120

Google Analytics 关于社交分析(The Social Relationship)

发布在 邵珠庆

这些天我这边对GA关于社交功能的学习和测试,得到了以下结论:
 
业界主要的社交有两个指标分享量回流量,GA提供了以社交网络来源和社交分享网页两个维度来进行查看详细的分享数据(我们主要使用的两个功能),数据准确度来说GA社交同GA其他功能一样,数据是基本准确的,但对整体流量趋势还是可以作为参考的,GA社交相关统计只要正确部署GA统计代码即可,不需要其他特殊部署方式
个人认为社交功能是对引荐流量的一种细化,将外部的引荐流量中的社交网络单独出来了,目前GA社交功能主要的功能包括:
1、来源(来自哪些社交网络)
社交网络来源->共享网址->完整引荐来源网址
这个功能还是可以帮助我们分析自己网站社交网络的分布和推广情况

问题:且此工具目前统计的流量来源中没有包含腾讯微博、QQ空间、朋友网、花瓣网等这些社交网络平台?

Google已经有很多的社交网络加入,目前我没有找到可以自己定义的社交网络,搜索了大量网上资料,是需要符合社交网络的网站自己向谷歌提交申请通过后才可以显示在社交功能里面    参考网址:https://developers.google.com/analytics/devguides/socialdata/ 

 
2、网页(哪些网页被社交网络分享,并获得回流)
共享网址->社交网络->完整引荐来源网址
可以获取用户比较喜欢分享并获得回流的页面是哪些,通过这些页面分享到的社交网络有哪些,被分享到的社交网络网址是什么
典型的例子:被分享到人人有一篇叫《机场内部人员都是这么定的机票的》 文章带来了较高的社交网络分享回流量
 
3、转化(根据我们设定的转换目标,来查看哪些社交网络带来的转换高)
在社交流量没有达到一定基数时此功能可以暂时先不设定转化
 
4、社交插件(主要是统计一些社交按钮Google[+1]按钮、Facebook[Like]按钮、Twitter[Follow] )
此插件对国内大多数站点基本没太大作用,大多相关社交插件国内都不能访问
 
5、社交访问流(根据社交网络带来的流量查看访问流)

 

 

 

作为一种营销渠道,社交网络的重要性与日俱增。不过,您应当如何衡量社交举措的影响力和效果呢?四个要素决定了您的社交影响力:

 

转化
来源
网页
社交插件
您的
社交影响力

 

  • 来源:随着您的内容在网上传播,吸引人们来到您的网站,您有必要了解不同社交来源的访问者如何与您的网站进行互动。
  • 转化:共享内容网址成为了您的网站的进入点,从各种社交来源为您吸引流量。通过衡量这种流量的转化和货币价值,有助于您了解社交网络对您的业务的影响力。
  • 网页:人们正越来越多地通过社交网络与内容互动、分享它们、讨论它们。您有必要了解哪些网页和内容正在被人们共享、在何处共享以及如何共享。
  • 社交插件:为您的网站添加社交插件按钮(例如 Google“+1”按钮),让您的用户可以直接从您的网站将内容共享到社交网络中。您的社交插件数据可显示哪些内容正在被人们共享,以及此共享活动发生在哪些网络中。

社交报告允许您集中分析所有这些信息,从宏观上了解社交网络如何影响您的业务。

社交报告

概览

通过概览报告,您可以对社交渠道产生的转化价值一目了然。社交价值图表的目的是对比所有达到的目标数量和货币价值,与通过社交引荐达到的目标数量和货币价值。

来自社交引荐的访问可能立即带来转化,也可能间接促成日后的转化。在该图表中,立即带来转化的引荐标为最终互动社交转化。如果来自社交来源的引荐没有立即带来转化,但相应访问者日后返回并发生转化,则该次引荐将被列为辅助社交转化。最好并列参考辅助转化和最终互动转化,这对了解社交网络在业务成效中发挥的作用至关重要。

来源

转到来源部分可查看各种参与度指标(网页浏览量、平均网站停留时间、每次访问页数等),这些指标反映的是来自各个社交网络的流量。通过这种方式,您可以了解哪些社交网络带来了最优质的流量。例如,对于带来的访问虽然不多,但流量的质量却较高的社交网络,您可以考虑增加投资。

来源报告还融入了针对社交数据中心合作伙伴网络的站外数据。点击具体合作伙伴网络,即可查看在该网站上共享的网址、其共享方式(例如通过“+1”或“转发”操作)以及围绕您的内容发生的对话(活动流)。请阅读活动流数据简介,了解此类数据的收集方式。

网页

转到网页部分可查看各种参与度指标(网页浏览量、平均网站停留时间、每次访问页数),这些指标针对的是各个网址。在表中按社交活动排序,可找出您的传播最快的内容。 

点击表中的具体网址可查看该网址的来源社交网络。对于社交数据中心合作伙伴网络,您还可以查看相应网址的站外共享:该网址的共享方式(例如通过“+1”或“转发”操作)、发生共享操作的网络以及发生的对话(活动流)。请阅读活动流数据简介,了解此类数据的收集方式。

转化

通过转化报告,您可以量化社交网络的价值。该报告可显示各个网络的引荐带来的总转化次数及其货币价值。点击辅助转化与最终互动转化对比分析(位于报告顶部的“探索”标签下方),了解各个网络通过“辅助点击”和“最终点击”为转化和收入做出了怎样的贡献。

  • 辅助转化次数辅助转化价值
    此指标是指社交网络辅助促成的销售和转化的数量(和货币价值)。“辅助点击”是指:某用户访问了您的网站,没有发生转化便离开,后来又返回您的网站并在后续访问期间发生了转化。这些数字的值越大,社交网络的辅助作用就越重要。
  • 最终互动转化次数最终互动转化价值
    此指标是指最终点击销售和转化的数量(和货币价值)。当某用户访问您的网站并发生转化时,此次访问就会被视为“最终点击”。这些数字的值越大,社交网络在促进销售和转化方面的作用就越重要。
  • 辅助转化次数/最终互动转化次数
    此比值是对社交网络整体作用的整体反映。接近 0 的值表示社交网络的主要作用是产生最终点击。接近 1 的值表示社交网络在产生辅助点击和最终点击方面作用相当。该值比 1 大得越多,就表示社交网络在产生辅助点击方面发挥的作用越大。

请注意,您必须定义目标和目标价值,然后才能在此报告中看到数据。

社交插件

如果您的网站上有 Google“+1”和 Facebook“赞”(Like) 按钮,那么了解哪些按钮获得了点击以及访问者因为哪些内容而进行点击,就具有重要意义。举例来说,如果您在自己的网站上发表文章,您会希望了解哪些文章最常得到访问者的“赞”或分享,以及访问者通过哪些社交网络(例如,Google+ 或 Facebook)分享这些文章。掌握了这些信息,您就可以创作更多访问者喜欢的内容。此外,如果您发现有些按钮很少使用,可以删除这些按钮,保持简洁。

社交插件报告可显示在您的网站上,哪些文章的共享次数最多,还有用户共享这些文章时使用了哪些社交按钮(例如 Google“+1”或 Facebook“赞”)。

社交访问流

社交访问流可显示各社交网络的访问者进入您的网站的初始路径。例如,如果您投放了宣传特定产品的广告系列,则可以查看来自各社交网络的访问者是否通过这些产品页面进入您的网站、他们是否继续访问了网站的其他版块或他们是否退出了网站。将鼠标悬停在图表上的某个来源(例如 Google+)上,选择仅查看此细分,即可重点关注来自该来源的流量。

设置社交分析报告

要想在报告中看到具体价值,您需要为目标确定价值并/或设置电子商务跟踪。要人工设置非电子商务目标的价值,一个理想的方法是评估达到目标的访问者成为客户的比例。例如,如果您的销售团队能够对提出联系请求的访问者中的 10% 完成销售目标,而您的平均交易额为人民币 500 元,您就可以为“请与我联系”目标指定 50 元(即 500 元的 10%)的价值。相比之下,如果只有 1% 的邮件列表注册用户达成交易,您就可以只为“电子邮件注册”目标指定人民币 5 元的价值。

后续操作

请阅读以下内容,详细了解“社交分析”报告应用实例和使用技巧。

  • 评估社交来源一文介绍了三个比率,您可以利用它们来评估为您带来流量的社交网络的效果。

 

 

 

1510月/120

Google Analytics 添加自定义社交媒体

发布在 邵珠庆

从网上找了很多资料来实现 自定义社交媒体名称,没有找到合适的方法,具体的参考文档请见以下URL

https://developers.google.com/analytics/devguides/socialdata/

Resources

The following resources will help you syndicate your Activity Stream to the Google Analytics social data hub.

  • Overview—Information about the social data hub and the basics of Activity Streams and the PubSubHubbub protocol.
  • Getting Started—The Getting Started section describes the required Activity Stream format you’ll need to follow and how to deliver new activities via the PubSubHubbub protocol.
  • Sign Up— The form is used to collect your company and contact details and to verify that you’ve met all of the requirements.

社会数据中心 - 注册

在您注册作为一种社会数据提供:

  • 检查的资格要求,并确认你合法拥有的和/或可共享的社会数据,你打算发送到谷歌。
  • 审查和遵守活动流的要求,
  • 审查和了解如何提供您的活动通过PSHB流。

我们收到您的申请后,我们会检讨,并联系您的详细信息,如果必要的。您应该会听到我们在一个星期内提交申请。经批准后,您就可以提供一个密钥和一个虚拟的发布终点。

Activity Stream Requirements

The social data hub expects an Atom/RSS Activity Stream feed of global activities from your social network/platform.

The following information must be present within every Activity Stream update:

  • Actor
    • username or screen name
    • display name: full name of user, if available
    • author profile URL, if available
    • author profile photo URL, if available
  • Object
    • update text: text or (x)html with the actual content of the update
    • permalink: url that uniquely identifies the update
  • Verb: type of event (post, favorite, comment, etc)
  • Publication date: date when update was created
  • Provider: name of your network
  • Other meta-data such as geo location, or follower counts

Example Activity Stream feed:
http://profile.typepad.com/markpasc/activity/atom.xml

1210月/120

Google Analytics 社交报表,让你算出「社交价值」

发布在 邵珠庆

Google Analytics 推出「社交報表」功能,讓行銷人員可以更容易衡量在社群媒體上行銷活動的投資報酬率。

新的「社交報表」功能可以在 Google Analytics 的「Social」分頁找到,新的報表目錄如下:

  • 總覽(Overview)
  • 來源(Sources)
  • 頁面(Pages)
  • 轉換率(Conversions)
  • 社交插件(Social Plugins)
  • 社交訪客流(Social Visitor Flow)

現在就來看看上面列的各項功能吧!

總覽報告

如同 Google Analytics 的其他總覽報告,社交總覽報告透過小儀表板將各項社交報告的重要數據提取到此頁,方便快速瀏覽。

這裡有一個「社交價值」的視圖,類似傳播業常用的「廣告價值」,這個圖表可以告訴你社交網絡對你的網站轉換率的貢獻,並換算成為估計金額。下面的「來源報告」及「轉換率報告」會有更詳細的說明。

Google Analytics Social Reports

來源報告

此報告顯示從社交網站等來源連結進來的活動。

Google 整合了同一個社交網站的不同連結帶進來的流量,例如  Twitter 進來的流量可能透過 twitter.com 或 t.co ,但是在這個報告都會整合到同一個網站來源,方便精準估算出每個社交網站的影響力。

有加入 Google Social Data Hub 的夥伴網站,會出現一個一個特別的標記,讓使用者知道點進去有更多額外資訊。

Social Media Sources

以其中一個夥伴網站 Google+ 來說,會顯示流量的詳細資訊,告訴使用者是從 「+1」按鈕、發文、轉推或評論中進來的。實際的轉換率可以從 Google Analytics 中看得到,每個 Social Data Hub 夥伴網站所提供的詳細資訊各自不同。

Pages Report 頁面報告

此報告會顯示每個頁面上的社交活動,包括個別頁面的流量來源統計,及從哪個網站內容離開網站。

轉換率報告

轉換率報告提供各社交網絡來源對網站的轉換率產生的影響,並同時顯示一般目標及電子商務的目標,讓使用者可以快速掌握社交來源產生的價值。

此報告同時顯示基於「最後點擊轉換」(last-click conversion )的關鍵指標,還有「conversion assists」(意指非最後點擊轉換,但對於達成轉換有幫助的點擊或廣告等動作)。

Social Plugins Report社交插件報告

此報告是分析網站中與社交插件相關的頁面資訊及社交活動,例如「讚」(like)、「tweet」或「+1」。

Social Visitors Flow Report社交訪客動線報告

從社交網站來的「訪客動線分析」,讓行銷人員了解從社交網站來的訪客在網站上的動線。

 

整合Social Data Hub機制

Google 此次推出的社交報表整合了去年 Google 推出的 Social Data Hub 機制,讓社交網站自願向 Google Analytics 傳送網站的社交行為。目前有加入的,當然包括 Google 自家的 Google+、Google Groups、Blogger 等,還有 Delicious、Digg、Reddit及常用的部落格插件 Disqus等。

大型的社交網站如 Facebook、Twitter、LinkedIn 都還沒加入 Social Data Hub,因此只能顯示網路訪客進入網站後的數據,而沒辦法追蹤進入網站前的行為。對於希望自己的努力被看得見的行銷人員,當然未來會希望把更多行銷活動及預算放在可以被度量的社交網路,因此這或許是個推力,讓大型社交網站未來有動機加入 Social Data Hub。

219月/121

Google Analytics功能篇—自定义变量

发布在 邵珠庆

自定义变量可能是google analytics中最复杂且最有用的一个功能。说他复杂是因为在使用自定义变量之前,需要你对所要追踪的数据和所达到的目的有清楚的规划,自定义变量靠在网站的不同页面进行单独插码来完成数据收集。说他最有用是因为通过自定义变量获得的数据可以清楚的了解访客的行为。

自定义变量与自定义访客群体

自定义变量的前身是自定义访客群体,也就是访问者报告下的用户定义的部分。自定义访客群体通过在页面或GATC中调用_setVar() 的方法来对访问者的身份进行标记。具体的工作过程是,当访问者在网站中完成了某个特定的行为时,在访问者的浏览器中创建一个_utmv的cookie,并在cookie值中定义此访问者的属性。这个属性值也会同时被记录到访问者报告下的用户定义报告中。

cookie_utmv

自定义访客群体最常见的用法是对访问者进行分类,也可以用来过滤动态IP地址。

比如:注册用户/游客;

VIP用户/购物用户/非购物用户

内部访问/(none)

由于自定义访客群体功能非常受欢迎,所以google analytics对这个功能进行了升级和扩展。将原来只能区分一个类别的版本扩展为可以分别记录5类,3个级别的高级版本:自定义变量。自定义变量可以完成所有自定义访客群体的功能。所以,google analytics建议更多的使用自定义变量来区分访问者。(自定义访客群体功能现在也依然可用,但会有一些问题,这个后面会提到。)

自定义变量功能概述

自定义变量可以让你了解到不同类别的访问者在浏览网站时进行的所有你最关注的行为。这句话有些绕口,但基本概括了自定义变量的功能。

例如:一个电子商务的网站可能会想知道:

1  20-30岁VS 30-40岁的访客哪个群体更有购买力?利润更高?

2  男性访客和女性访客在购物车的放弃率上有何差异?

3  喜欢CD的访问者也会对图书感兴趣吗?

这些都是自定义变量可以解决的问题。通过对自定义变量进行设置,我们可以在报告中清楚的看到这些数字。

自定义变量的工作原理

一个访问者可以在不同的时间多次访问网站,而在一次访问中可以浏览网站中的多个页面。 自定义变量就是按照访问者与网站的基本互动模式,将访问者和访问者与网站的互动分为三个级别。它们分别是:

Custom Variables

访客级别—访客级别是对网站的访问者进行标记,具体的条件可以按照网站的实际需求来设置。例如:年龄,性别,学历,收入,购买记录等等。

Session级别—Session级别是在一次访问过程中,对访问者的行为或与网站的互动行为进行记录。例如:登录网站,加入收藏,加入购物车,移除产品,发表评论等等。

页面级别—页面级别也是在一次访问过程中,对访问者浏览过的页面进行记录。例如:新产品页,促销活动页,帮助页等等。

这里的页面范围可以通过页面级自定义变量进行设置。与Google analytics热门报告中的热门页面不同。例如:你可以将所有介绍新产品的页面都定义为新产品页面。

自定义变量属于“自定义类型数据”。当自定义的内容或事件被触发时,google analytics就会收到一条数据。并将数据记录在访问者报告中的自定义变量子报告中。

访客级返回数据

CV_utmv

http://www.google-analytics.com/__utm.gif?utmwv=4.7.2&utmn=2133506401&utmhn=bluewhale.cc&utme=8(user)9(bluewhale)11(1)&utmcs=utf-8&utmsr=1280×1024&utmsc=32-bit&utmul=en-us… …

Session级返回数据

http://www.google-analytics.com/__utm.gif?utmwv=4.7.2&utmn=1548771060&utmhn=bluewhale.cc&utme=8(login)9(yes)11(2)&utmcs=utf-8&utmsr=1280×1024&utmsc=32-bit&utmul=en-us&… …

页面级返回数据

http://www.google-analytics.com/__utm.gif?utmwv=4.7.2&utmn=459118439&utmhn=bluewhale.cc&utme=8(Navigation)9(homepage)&utmcs=utf-8&utmsr=1280×1024&utmsc=32-bit&utmul=en-us&… …

其中访客级的数据会同时记录在浏览器的cookie中,当访问者下次访问网站时GATC自动读取cookie值来区分访问者属性,并针对这个属性记录访问者本次访问的浏览行为。也就是说访客级的值可以跨越不同的访次,而Session级和页面级的值只在特定的访次中有效,其中页面级的数据相当于对访次中pageviews的记录。

需要注意的几个问题

1访客级自定义变量与自定义访客群体的值都存储在_utmv cookie中,并且新值将会覆盖老值,所以两者不能同时使用。Google官方的建议是统一使用自定义变量来区分访客。

2 当访客更改访客级的自定义变量值时,页面级数据将同步更新,但Session级数据将在下个访次中才会更新。(这个是调用_setvar()方法时会产生的问题,但在新的自定义变量中并未说明具体的记录方式。)

例如:访问者在第一次访问时选择身份为CD爱好者,并被标记(_utmv cookie),当这个访问者第二次访问时在浏览了3个页面后又选择了身份为图书爱好者,并被标记(_utmv cookie)。此后该访问者继续浏览了5个页面,然后离开。那么,该访客的第二次访问时的身份将被记录为CD爱好者,在他变更身份前浏览的三个页面会被记录到CD爱好者身份下,而变更身份后浏览的5个页面将被记录到图书爱好者的身份下。所以,在选择区分访客类型时要尽量选择不易变更的属性,例如性别,职业等等。

3自定义变量分为三个基本,并通过代码中的数字进行标识。没有标识数字被默认为为页面级自定义变量。

4对于单一页面,最多只能设置5个自定义变量。可以是访客级,Session级或页面级的。但访客级的会覆盖cookie中原有的值。

5对自定义变量中设置的类别名称和值的长度不能超过64个字节。

自定义变量的实施

_setCustomVar(index, name, value, opt_scope)

_setCustomVar(类别, 自定变量名称, 自定义变量值, 自定义变量范围)

Index—自定义变量的类别,可以设置的范围是1-5

Name—自定义变量的名称,名称与值相对应。这里设置的内容将出现在自定义变量报告的最高一级。

Value—自定义变量的值,这个值与名称应该成对出现。通常一个名称可以对应很多个值。例如:当名称为性别时,对应的值就应该是男,女,两个值。

opt_scope—自定义变量的范围,可以设置的范围是1-3。其中1表示访客级别,2表示会话级别,3表示页面级别。为空时默认表示页面级别。

实施前的准备工作

自定义变量是否能追踪到数据,能追踪到哪些数据完全取决于之前的设置。简单的说就是,你关心哪些内容和行为,就对他们进行插码追踪。如果事先没有插码,就不会有任何数据。所以,在实施前就需要对网站结构和关心的内容进行整理。例如:访客类别划分,网站内容划分,所要关注的行为等等。有些时候为了获得准确的数据,还需要对网站的内容进行调整。在经过详细的规划后才有可能获得理想的数据。

三种插码实施的方法

根据网站的情况和追踪访问者行为的差异,可以使用三种不同的方法在网站的不同页面中添加自定义变量的追踪代码。

1在GATC代码中直接添加自定义变量的代码。这种方法实施起来比较简单,只需要在异步代码中增加一行自定义变量代码就可以了,但当遇到一些不需要追踪的页面时就会比较麻烦(当他们使用同一页底模板时)。如果你需要对整站应用自定义变量时,或者追踪页面有自己单独的页底模板时,可以考虑使用这种方法。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!--GA tracking code begin-->
 
<script type="text/javascript">
 
var _gaq = _gaq || [];
 
_gaq.push(['_setAccount', 'UA-12347890-1']);
 
_gaq.push(['_setCustomVar', 1,'user','bluewhale',1]);
 
_gaq.push(['_trackPageview']);
 
(function() {
 
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
 
ga.src = 'http://www.google-analytics.com/ga.js';
 
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
 
})();
 
</script>
 
<!--GA tracking code end-->

2 如果第一种方法不适合的话,可以使用这种方法。在要追踪页面的GATC后单独添加自定义变量的代码。

 

 

1
2
3
4
<script type=”text/javascript”>
_gaq.push(['_setCustomVar', 1,'user','bluewhale',1]);
_gaq.push(['_trackPageview']);
</script>

3第三种方法比较灵活,可以追踪到一些页面元素或访问者的具体行为。例如:页面加载,点击,鼠标悬停,等等。实施方法和虚拟页面类似,在访问者产生点击行为时调用自定义变量。

1
<a href="http://bluewhale.cc" onClick="javascript:_gaq.push(['_setCustomVar', 1,'user','bluewhale',1]);_gaq.push(['_trackPageview']);">

查看自定义变量数据

自定义变量的数据被记录在访问者报告下的自定义变量子报告中,报告的第一级显示的是所有自定义的自定义变量名称。选择变量名称可以查看不同值的数据。例如:在第一级报告中选择登录,下一级报告中将分别显示登录与未登录访次的数据。

Custom Variables report

自定义报告配合使用

除了在自定义变量里查看数据外,还可以使用自定义报告创建报告。在自定义报告中,可以对不同类别的自定义变量名称或值创建报告,并且可以使用时间和来源子纬度对自定义变量的值进行细分。

Custom Variables  custom report

高级群体配合使用

除了自定义报告,自定义变量同样可以和高级群体配合使用。使用高级群体可以对一类访问者或者有同一行为的访次进行过滤。并与其他访次进行对比。下面截图中创建了登录访次的高级群体。

Custom Variables advanced segment

然后在报告中应用这个高级群体,并与所有访次的数据进行对比。按照这个方式同样还可以创建更多的高级群体,不过这都取决的于之前对自定义变量的设置。

CV advanced segment

Google Analytics自定义变量的功能太强大了,一篇文章只能说个大概。也许你已经对这个功能有了很好的使用心得了。那么请给我留言吧。让我们一起分享下。

   下一页