How To Track Adjusted Bounce Rate

Posted on: January 28th, 2015 by Patrick Hathaway in Guides, How To

Most marketers are aware that Google Analytics ‘bounce rate’ is a pretty crappy engagement metric. Possibly not everyone knows there’s an easy way to get a much more useful metric from Google Analytics – ‘adjusted bounce rate.’

What’s The Problem With Bounce Rate?

If you aren’t aware of the issue with bounce rate, let me explain it. Bounce rate simply reports on users that visit a page on your site, then bounce off again without visiting another page.

Intuitively, you think of this as a user landing on the page, deciding ‘this page is not right for me’, and bouncing straight off again.

However, in many cases it is possible for users to be engaged in a page, get the exact answer they were looking for, and have no reason to browse any further. They might spend several minutes consuming the content before moving on (‘bouncing’).

Traditional bounce rate does not take this kind of ‘dwell time’ into consideration, which is where adjusted bounce rate comes in.

Adjusted Bounce Rate

Traditional bounce rate treats all pageviews as equal, whether the user visited for 2 seconds or 2 minutes. Adjusted bounce rate takes this into account, by firing an event once a user has spent a certain amount of time on the page.

Once the event is executed, the visitor is no longer counted as a ‘bounce’. You determine the amount of time it takes to trigger the event – for some websites 10 seconds might be appropriate, for others it might be minutes.

You end up with a bounce rate that is a much better reflection of true engagement of your webpages.

How To Implement Adjusted Bounce Rate

It is pretty straightforward to get set up, you just need to add the following line to the bottom of your Google (Universal) Analytics code:

setTimeout("ga('send','event','adjusted bounce rate','page visit 30 seconds or more')",30000);

As you can see, this makes the requirement 30 seconds (30,000 milliseconds) before the event is fired, but you can easily adjust this yourself.

You can see this in action by looking at the Analytics code for this website:

Google Analytics Adjusted Bounce Rate

The labels you use for this event are not important – you can use whatever you wish. It is the act of triggering an event that stops Analytics counting a visit as a bounce, even if they don’t visit more than 1 page (indeed, you could send any event). Thanks to Cully Larson for pointing this out in the comments.

The event can be tracked as any other event in Google Analytics:

Adjusted Bounce Rate

Glenn Gabe wrote a post over on Search Engine Watch describing how to implement adjusted bounce rate via Google Tag Manager (in case you are a fan of Tag Manager).

How Long Should I Set My Timeout?

It’s perfectly valid to go off gut instinct on how long to set your timeout – no one knows your users better than you do. However if you want a more data-driven approach you can check the Engagement Report in Google Analytics.

Go to Audience -> Behavior -> Engagement, then add the segment ‘Sessions with Conversions’, to get a report that looks like this:

Google Analytics Engagement ReportIn our case, above, we can see that the majority of conversions happen when visitors spend more than 30 seconds on the page, which is why I chose to set 30,000 milliseconds as the timeout.

A More Accurate Engagement Metric

If you are interested in making more money from your website, you should be looking at engagement metrics to help judge your success. Adjusted bounce rate is simply a more accurate measure of engagement than traditional bounce rate.

And if you’re not looking at engagement, you probably should be…

Anyone that has dealt with sites affected by Panda will have probably noticed poor engagement metrics on affected pages (I wrote about this previously), and it is pretty much accepted in the SEO community that Google calculate engagement metrics such as dwell time to help measure how successfully a page satisfies a given search query.

So there are plenty of good reasons to start measuring your engagement better – go off and do it! You’ll be rewarded with a much more pleasant set of engagement statistics to boot.

Adjusted Bounce Rate in action

Patrick Hathaway

By Patrick Hathaway

I seem to be the one that writes all the blog posts, so I am going to unofficially name myself 'Editor'. In fact, I think I prefer Editor-in-chief. You can follow me on Twitter or 'encircle me' on .


  • Jeff Norris

    Be extremely wary of the code recommended in this article. I tried it and lost all GA tracking completely. It did not return until the code was removed.

    • HathawayP

      That sounds odd, Jeff. I can only assume you are not using Universal Analytics, in which case then yes, this specific code will not work. You can see the original Google announcement of the feature which explains how to do it on the old ga.js framework: http://analytics.blogspot.co.uk/2012/07/tracking-adjusted-bounce-rate-in-google.html

      • Jeff Norris

        It was used with Universal Analytics. I want to be fair here because the author deserves it. Another set of eyes found that the code had a special character in it – a very small comma-like character. This was probably my fault when I copied the code. It does perform as expected. I stand corrected.

        • HathawayP

          Ah, ok – good! Thanks for coming back to me and confirming. Good to know I’m not leading people astray!

        • SOMS COZA

          Hi Jeff, which “comma-like character” did you remove. I’m having the same issue…

  • Søren Jensen

    Hi there.
    Did a test and I have 2 specific questions:

    1. Does it matter if the code is placed before displayfeatures code?
    2. Firebug reports there’s use of illegal characters – The ” is not accepted.

    I’ve attached screenshots of both instances.
    Please let me hear your thoughts and suggestions.

    Best regards.

    SørenJ :o)

    • HathawayP

      Hi Søren,
      1. I don’t see why it should matter. All it does is send an event to GA. displayfeatures must be required before sending the pageview, but you are doing that already so I think this should work fine.

      2. Ah I see, WordPress has replaced the straight quotes for curly ones. Stupid error – I have fixed this in the post now. So if you copy from the post again this should not happen now.

      Thanks for the comments!


  • Angie Rose

    I’ve tried adjusting my bounce rate and set it to 15 seconds. For some reason it affected my real time page views.

    • HathawayP

      Hi Angie.
      Are you seeing the events firing in Real-time Analytics when you go to ‘Events’ on the left hand side. You should see something like this.


      • Angie Rose

        What we noticed was a decrease in traffic numbers. It went as low as ‘3’ when normally we would see 50+

        • HathawayP

          Doing so should not impact the number of sessions recorded. That said, there are inherent limits in GA for hits (and an event is a hit). You can read more here -> https://support.google.com/analytics/answer/1070983?hl=en

          GA premium does not have the limits mentioned above.

          How much traffic does the site typical get per day and month?

          • Angie Rose

            This past month we had 289,094 visits to our site. And I got my numbers mixed up, we set it at 30 seconds and thats when our numbers were dramatically changed.

  • Hello;

    Can i add “scroll” to the code?

  • Cully Larson

    Instead of putting the setTimeout callback in quotes, you could just pass it as a function:

    setTimeout(function() { ga(‘send’,’event’,’adjusted bounce rate’,’page visit 30 seconds or more’); }, 30000);

    Then you don’t have to worry about escaping quotes.

    You could also call it conditionally, only if the ga function exists:

    if(ga) {
    setTimeout(function() { ga(‘send’,’event’,’adjusted bounce rate’,’page visit 30 seconds or more’); }, 30000);

    That way, if ga doesn’t exist, the timeout won’t be set.

  • Cully Larson

    I have a question about the “adjusted bounce rate” and “page visit 30 seconds or more” strings. Are these just event labels you made up, that you’re generating a custom report off of (i.e. could I call them “My Special Bounce Rate” and “They stayed for 30000+ milliseconds”)? Or are those values that GA specifically understands?

    • HathawayP

      These were just labels I made up, you could call them whatever you want. The bit that is doing the work is the setTimeout, which delays triggering a pageview until the allotted time on page is reached (which obviously affects the Bounce Rate metric in GA).

      • Cully Larson

        It doesn’t look like it delays the pageview event, since the “pageview” event is sent right way. Instead it sends a custom event, named “adjusted bounce rate”, after 30 seconds. I’m unclear how this will directly affect the bounce rate registered in GA. How does GA know to associate your custom event “adjusted bounce rate” with the actual bounce rate?

      • Cully Larson

        One other note is that “Event Tracking” must be enabled on the page in order for this to work. I’m not sure if it’s enabled by default.

      • Cully Larson

        I think one of my replies got lost. Anyway, I found an answer to my question about why this affects bounce rate. Apparently if you send any event to GA, it will assume the user hasn’t bounced. So, it’s not that you’re delaying the “pageview” event, or that you’re spending a specific kind of event (e.g. some kind of delayed bounce rate event). The same result would come from sending ANY event. There’s more info. about this under the “Bounce Rate Impact” section of this Google support article https://support.google.com/analytics/answer/1033068

        Your article would benefit from making this more clear. Especially that the name of the event makes no difference (i.e. it doesn’t have to be “adjusted bounce rate”), it’s merely the fact that an event was sent.

        Which makes me think, what if you just sent an event every 30 seconds, instead of once after 30 seconds? Wouldn’t that prevent GA from counting a visit as a bounce if the visitor stayed on the page for 30, 60, 90, 120, etc. seconds?

        • HathawayP

          Ah yes, you’re right, the triggering of the event nullifies any subsequent ‘bounce’. I’m not sure what additional data you would get from sending an event every 30 seconds – what would the benefit of this be?

          I’ll update the article as you suggest, thanks for digging into this.

          • Cully Larson

            Oh, you’re right. I was just thinking about bounce rate incorrectly. Once GA gets that second event (“adjusted bounce rate” or whatever), then it won’t count that visit as a bounce. So, no need to send subsequent events.

  • Sam Obrart

    Hey Patrick, great read! I had so many clients of mine complaining about high bounce rate, when all I needed to do was install an adjusted bounce rate. Turns out most people were actually finding the information they were looking for! I also opted for 30 seconds for our own website too after reading your post, so thanks for that!

    I recently just published a post on installing adjusted bounce rate in Google Tag Manager (latest version) that I think could make great addition to your post. It would be great to have you check it out:

    Cheers Patrick

  • hey patrick I think your code is wrong. Don’t put qoutes here “ga(….)” please review javascript syntax for this one

  • Pompeo Pipoli

    Hi, can i set two different setTimeout in same analytics code, for example one for all the pages of website and another one only per a specific category page such as /aaa ? Thank you

    • HathawayP

      Sort of. You don’t want to have more than one setTimeout on the same page, but you could set your templates so that category pages are set to 15000 and all other pages are set to 30000, for instance.

  • Excellent tutorial. Bounce rate is very high in my site, adjusted code according to your guidance. Let me check how it works.

    Thank you very much for this writing.

Ready to take your content auditing seriously?