Soon after launching this blog, I took a look at Google Analytics and was surprised to see a bounce rate of ~80%. Surely my posts weren’t that bad? So I decided to learn more about what consitutes a “bounce” – and I was surprised at what I found.

It turns out that Google Analytics will wait for a visitor to trigger a second event, such as visiting another page on the same site. If that second event is never triggered, the visit is counted as a bounce (regardless of the duration of the visit). On a typical non-blog website this is beneficial as visitors are encouraged to visit multiple pages in order to maximise conversions. If the visitor never moves beyond the first page, their visit is a bounce.

For a blog, however, it’s common that a visitor will land on one specific article, but not visit any other pages. This will be reported as a bounce even though the visitor may have spent several minutes reading the artice and may intend to read more of your posts in the future.

Adjusted bounce rates

My research brought me to this article from the Google Analytics blog, which discusses Adjusted Bounce Rates. The basic idea is that you manually trigger a tracking event after a period of time (however long you feel constitutes a real visit and not a bounce) by adding a line to your Google Analytics snippet:

<script type= "text/javascript" > var _gaq = _gaq || []; _gaq . push ([ '_setAccount' , 'UA-XXXXXXX-1' ]); _gaq . push ([ '_trackPageview' ]); setTimeout ( "_gaq.push(['_trackEvent', '15_seconds', 'read'])" , 15000 ); ( 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>

The new tracking event is added in this line:

setTimeout ( "_gaq.push(['_trackEvent', '15_seconds', 'read'])" , 15000 );

Now, visitors to your blog will only be generate a bounce if they leave within 15 seconds (or whatever length of time) – hopefully substantially reducing the bounce rate percentage in your reports.

Update 26th May, 2013

This post got featured on Hacker News, which was lucky because it’s given me an excellent opportunity to test the newly adjusted bounce rate. Taking data from the 25th and 26th, the bounce rate is now 9.78%, down from 80.80% for the prior unadjusted period.

Some interesting alternative techniques have also been made in the comments. One that caught my eye was a more robust method of using the scroll event instead of the 15s setTimeout . One downside to using the timer method is that it doesn’t guarantee that the visitor is even looking at your blog – they may have opened the page in a new tab intending to read it later. The timer will still run even in the background, so their visit won’t be recorded as a bounce even if they never actually read your article. Using scroll , you’re ensuring that the user has interacted in some way with the page. This doesn’t depend on an arbitrary period of time, and ensures that the reader has your blog open in an active tab. Win win? Food for thought at least.

Update 7th June, 2013

I’ve switched to the scroll technique, with a 5-second delay for good measure. Here’s the code I used:

<script type= "text/javascript" > var _gaq = _gaq || []; _gaq . push ([ '_setAccount' , 'UA-XXXXXXX-1' ]); _gaq . push ([ '_trackPageview' ]); setTimeout ( function () { window . onscroll = function () { window . onscroll = null ; // Only track the event once _gaq . push ([ '_trackEvent' , 'scroll' , 'read' ]); } }, 5000 ); ( 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>

Participate in the discussion over on Hacker News.