Last Updated: 20 Oct 2023

   |   

Author: 135.181.114.235

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
marketing-tech:google-analytics:setvar-and-the-zero-bounce-rate-bug [Jan 28, 2009 08:38 AM]
dordal
marketing-tech:google-analytics:setvar-and-the-zero-bounce-rate-bug [Oct 20, 2023 12:29 PM]
111.225.149.109 removed
Line 1: Line 1:
 += _setVar() and the zero bounce rate bug in Google Analytics =
 +
 +** UPDATE - Jan 27, 2009: Google has reportedly fixed the bug in GA that was causing the problem described on this page. Thus the fix is no longer necessary, but I will leave it here for historical reference. **
 +
 +Google Analytics has a ''_setVar()'' function that lets you assign a single user-defined variable to be passed to your reports, which you can then see (and filter on). 
 +
 +Unfortunately, using ''_setVar()'' on each page seems to break the bounce rate calculation in GA. This is because ''_setVar()'' apparently records a second pageview when it is called, meaning a visitor who left after their first pageview didn't actually 'leave' in the eyes of GA because they had a second page view secretly recorded via ''_setVar()''. Thus the bounce rate in Google Analytics drops to zero (or near zero) because //every single visitor// is getting hit with two pageviews. 
 +
 +Conveniently, the value that you assign to ''_setVar()'' is stored by GA in the ''_utmv'' cookie, and the tracking code actually reads this cookie and passes back the value to Google Analytics, which records it for //every single pageview//, regardless of whether you set it with ''_setVar()'' on that particular pageview. Therefore **you don't need to call ''_setVar()'' unless you actually want to //change// the user defined value**. In fact, you //shouldn't// call it any more often than you have to, because you don't want to be creating these extra pageviews. 
 +
 +This lends itself to a nice solution to the problem: we'll simply check if the value we want to call ''_setVar()'' with is already in the ''_utmv'' cookie. If it is, we'll skip calling ''_setVar()''.
 +
 +<code javascript>
 +/*
 + * getCookie(): given a cookie name, get its value. Returns null if the cookie can't be found.
 + * From http://www.webreference.com/js/column8/functions.html
 + *
 + */
 +function getCookie(name) {
 +  var dc = document.cookie;
 +  var prefix = name + "=";
 +  var begin = dc.indexOf("; " + prefix);
 +  if (begin == -1) {
 +    begin = dc.indexOf(prefix);
 +    if (begin != 0) return null;
 +  } else
 +    begin += 2;
 +  var end = document.cookie.indexOf(";", begin);
 +  if (end == -1)
 +    end = dc.length;
 +  return unescape(dc.substring(begin + prefix.length, end));
 +}
 +
 +/*
 + * utmvCookieCheck(): given a value, read the __utmv cookie and see if
 + * that value is already set. Return true if so, false otherwise.
 + *
 + */
 +function utmvCookieCheck(value) {
 + var utmvCookie = getCookie("__utmv"); 
 +
 + if (utmvCookie == null)
 + return false;
 +
 + // get rid of the Google's domain prefix ID, which appear on all
 + // GA cookies
 + utmvCookie = utmvCookie.replace(/^\d*\./, '');
 +
 + return (utmvCookie == value) ? true : false;
 +}
 +
 +</code>
 +
 +Now, just wrap your call to ''_setVar()'' with a call to check if the cookie exists first:
 +
 +<code javascript>
 +<script type="text/javascript">
 +var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
 +document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
 +</script>
 +<script type="text/javascript">
 +var pageTracker = _gat._getTracker("UA-XXXXXX-X");
 +var userDefinedValue = 'CHANGE_ME_TO_YOUR_DESIRED_VALUE_FOR_SETVAR';
 +if(!utmvCookieCheck(userDefinedValue)) {
 + pageTracker._setVar(userDefinedValue);
 +}
 +pageTracker._trackPageview();
 +</script>
 +</code>
 +
 +That's it. Now ''_setVar()'' will only be called if the value isn't already set.
 +