Google Analytics Referrer Override
Posted by ophir on November 4th, 2008
A couple of weeks ago I posted about a known issue using A/B experiments in Google Website Optimizer.
http://www.prusak.com/google-website-optimizer-and-referer-data/
Basically, when conducting an A/B experiment in Website Optimizer, the original referrer data is lost because of the JavaScript redirect to the test versions. This means that the traffic source will be wrong (it will say direct instead of the true traffic source).
This issue isn’t just a problem with website optimizer. Any landing page that uses JavaScript to redirect will loose the original referrer data. For example if your site provides easy to remember URLs like www.mysite.com/freeshipping and then uses JavaScript to redirect users to a different URL.
I wrote in my previous blog post that I wished Google Analytics provided an easy way to over ride the referrer value (and not use the document.referrer value).
It seems I spoke to soon.
Google Analytics DOES have a way to overwrite the referrer data.
It just doesn’t seem to be documented anywhere
I planned on writing my own hack to override the referrer value in Google Analytics. I was doing some reverse engineering of the ga.js code and found this interesting tidbit:
I’m still running some tests, but based on my initial results, the _setReferrerOverride function provides a simple way to manually set the referrer value.
So now, we can actually capture the original referrer even when the visitor is redirected. Here’s how:
1 - Store the original referrer data in a cookie named realreferrer right before we redirect
2 - On the test pages, look for the realreferrer cookie. If it exists use it to over ride the referrer value in Google Analytics and then delete the cookie (so it won’t mess up page views that weren’t a result of a redirect from the original version).
Here’s the code I’m currently using in my tests.
Add this on the original page before the redirect (the GWO control script):
document.cookie = "realreferrer="+encodeURIComponent(document.referrer)+"; path=/";
</script>
On the test page, add this code before any GA or GWO calls:
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(";");
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==" ") c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return "";
}
var realreferrer = decodeURIComponent(readCookie("realreferrer"));
document.cookie = "realreferrer=; path=/";
</script>
Then change your GA code from this:
var pageTracker = _gat._getTracker("UA-XXXXXX-Y");
pageTracker._trackPageview();
</script>
to this:
var pageTracker = _gat._getTracker("UA-XXXXXX-Y");
if (realreferrer.length > 0) {
pageTracker._setReferrerOverride(realreferrer);
}
pageTracker._trackPageview();
</script>
Please let me know if this works for you !
Update:
I just found another (and possibly better) solution. See:
http://www.prusak.com/google-ananlytics-initial-referrer-update/
Update #2 [Oct 2010]:
It’s been over two years since my initial posting and this issue still exists. A few people have asked about an async version so here it is.
All of my custom JS stays the same.
Here is the change for the async code:
Before
After
_gaq.push([‘_setReferrerOverride’,realreferrer]);
}
_gaq.push([‘_trackPageview’]);
Please note my blog messes up the single quotes for code snippets when copying / pasting.
- Ophir
November 4th, 2008 at 12:27 pm
[...] Google Analytics Referrer Override [...]
June 14th, 2009 at 8:13 am
[...] no official documentation available for _setReferrerOverride, but I believe credit for discovering this method goes to Ophir. He also gives an excellent use for the function in his [...]
June 21st, 2010 at 12:31 am
I don’t know, this solution seems safer than the second to me. And easier to fix if goog decides to mess with their API in the future.
September 1st, 2010 at 10:55 pm
[...] Overriding the Referrer Datum – use the _setReferrerOverride function to set the referrer value based on a Cookie. [...]
October 13th, 2010 at 9:04 am
Ehi everybody, but this is the old code, but what are talking about new asynchronous code?
It is the same thing? Or what??
Thanks a lot.
October 21st, 2010 at 9:16 am
What are talking about new asynchronous code?
iniData have been deprecated !
October 22nd, 2010 at 2:41 am
Thx for the update !
October 28th, 2010 at 11:20 am
[...] second solution is to store the referrer in a cookie before the Control Script and on the landing page, use the _setReferrerOverride method to manually [...]
January 2nd, 2011 at 3:08 am
Hi,
Great post.
Do you know if this hack will also work for using Goals with funnels that span more than one sub domain ? (the problem is that once a certain page in the goal is in a different sub domain, Analytics loses the original traffic source)
Thanks
January 6th, 2012 at 8:59 am
Hi…
Is this trick still working with the latest changes in the GA? I’m asking as I’m a newbie when it comes to these things and might ask someone to do it for me. But, if this can be done or is still working to date, I might try it myself.
Thanks
January 8th, 2012 at 10:51 pm
One of those essential GWO posts, Ophir. I’m implementing this right now in fact.
Anyway, just noticed the wrong types of quote marks are being used here:
_gaq.push([‘_setReferrerOverride’,realreferrer]);
WordPress auto formats them to look nice. Unfortunately nice quote marks don’t work in code.
November 30th, 2012 at 3:39 am
Will this solution work for Internet Explorer?