{"id":139257,"date":"2025-03-17T09:09:58","date_gmt":"2025-03-17T09:09:58","guid":{"rendered":"https:\/\/peraltafinancing.com\/analytics\/measure-serp-bounce-time-with-gtm\/"},"modified":"2025-03-17T09:09:58","modified_gmt":"2025-03-17T09:09:58","slug":"measure-serp-bounce-time-with-gtm","status":"publish","type":"post","link":"https:\/\/fivemor.com\/?p=139257","title":{"rendered":"Measure SERP Bounce Time With GTM"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div>\n<p>Here\u2019s an interesting and hacky use case for you. It\u2019s all about uncovering <strong>bounce<\/strong> metrics for visits which originate from organic Google search results. In particular, the metric we\u2019re interested in is how long user <em>dwelled<\/em> on the landing page after arriving from organic Google search <strong>AND<\/strong> returned to the search engine results page (SERP) using the browser\u2019s back button.<\/p>\n<div style=\"aspect-ratio: 1614 \/ 726;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2015\/09\/dwell-time-landing-page.jpg\" title=\"Dwell time landing page\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"726\" width=\"1614\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2015\/09\/dwell-time-landing-page.jpg#ZgotmplZ\" alt=\"Dwell time landing page\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>The inspiration for this post came from an audience question at the Best Internet Conference in Lithuania, which I recently attended as a speaker. They were concerned that Google is using Bounce Rate as a search ranking signal, and I was fairly strongly opinionated that it\u2019s simply not possible, as all the \u201cnative\u201d GA metrics are really easy to manipulate. However, Dr. Pete from Moz wrote about <a href=\"https:\/\/moz.com\/blog\/the-2-user-metrics-that-matter-for-seo\"><em>dwell time<\/em><\/a> in 2012, and it makes a lot of sense. Google should be <strong>very<\/strong> interested how long the visitor stays out of the SERP when following a link. If users tend to immediately return to the SERP, it\u2019s very likely the result was not relevant for them.<\/p>\n<p>So, inspired by this question, I wanted to see if I can get some metrics from how long people dwell on these landing pages before returning to the SERP. I got my results, but it\u2019s definitely not an easy problem to solve. As usual, we\u2019re using a combination of <a href=\"https:\/\/tagmanager.google.com\">Google Tag Manager<\/a> and <a href=\"https:\/\/analytics.google.com\">Google Analytics<\/a> to perform the operation.<\/p>\n<p>(<strong>UPDATE 17 April 2016<\/strong> I updated this article, as I had to make some modifications to the code. It\u2019s slightly more robust now, and it lends itself better to e.g. Custom Metrics, if you prefer to use those instead of User Timings.)<\/p>\n<p>The result is a list of User Timings, where each landing page can be scrutinized against the time users spent on there before clicking the browser\u2019s back button.<\/p>\n<p>                <span class=\"simmer\"><br \/>\n  <span class=\"close\">X<\/span><\/p>\n<p>\n    <span class=\"fa fa-md fa-bell\"\/><br \/>\n    <strong>The Simmer Newsletter<\/strong>\n  <\/p>\n<p>\n    Subscribe to the <a href=\"https:\/\/www.simoahava.com\/newsletter\/\">Simmer newsletter<\/a> to get the latest news and content from Simo Ahava into your email inbox!\n  <\/p>\n<p>  <\/span><\/p>\n<h2 id=\"the-mystery-of-the-history\">The mystery of the history<\/h2>\n<p>The difficulty is that when the user clicks the browser\u2019s back button, we have no knowledge of where the user is taken to. That\u2019s browser security for you. It would be highly questionable if the website had access to the history of the web browser. Makes sense, right?<\/p>\n<p>Another difficulty is the actual browser back button. It\u2019s not part of the browser object model, so we can\u2019t actually measure clicks on it. Instead, we can <em>infer<\/em> a back button click from how people navigate with URL hashes! When a <em>hash change<\/em> is recorded, we can infer that it was due to browser back <strong>if<\/strong> we implement a little hack, where the hash is unique to organic Google search.<\/p>\n<p>You see, by creating a new browser history entry for people landing from organic Google search, the back button click doesn\u2019t take them to the SERP, but rather to the original landing page that existed <strong>before<\/strong> we redirected the user to the new history state. Using that as an indicator, we can extrapolate that the hash change occurred due to a browser back button click (or the backspace).<\/p>\n<h2 id=\"the-process\">The process<\/h2>\n<p>The process is as follows:<\/p>\n<ol>\n<li>\n<p>If the user lands on the site through organic Google search, create a new <strong>browser history entry<\/strong> with the hash <strong>#gref<\/strong><\/p>\n<\/li>\n<li>\n<p>Later, if a <strong>hash change<\/strong> is registered, and the user is still on the landing page, and the hash change is from <strong>#gref<\/strong> to a blank string, fire a Google Analytics <a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/analyticsjs\/user-timings?hl=en\">timing<\/a> event, after which programmatically invoke the \u201cBack\u201d event in the browser history<\/p>\n<\/li>\n<\/ol>\n<p>Looks simple (actually, doesn\u2019t look simple at all), but it\u2019s very hacky indeed. You see, we\u2019re <strong>manipulating browser history<\/strong> by creating a new, fictional entry called <strong>#gref<\/strong>. Then, when the user clicks browser back, instead of taking them back to Google search, it actually takes them to the previous state, which is the URL <strong>without<\/strong> the #gref.<\/p>\n<p>THAT\u2019S how we know both that the user clicked browser back AND that they were trying to return to the SERP. All we have to do is send the Google Analytics timing hit, and then move the user manually to the previous entry in the history (i.e. the SERP).<\/p>\n<p>Why is it hacky? Well, you\u2019re manipulating browser history, for one. You\u2019re creating a custom state, and you\u2019re forcing the user to adopt that state if they land from organic search. Next, you\u2019re intercepting a legitimate browser back event, and instead of letting the user directly leave the site, you\u2019re forcing them to send the GA timing hit first, before manually whisking them back to the SERP.<\/p>\n<p>Whew! Lots of things that can go wrong. Luckily the JavaScript is solid and beautiful, but don\u2019t forget to test thoroughly!<\/p>\n<p>Wait, let me repeat that: <strong>test thoroughly<\/strong>. Also, if you\u2019re running a single-page website, I can almost promise you that this won\u2019t work out-of-the-box.<\/p>\n<h2 id=\"the-custom-html-tag\">The Custom HTML Tag<\/h2>\n<p>At the heart of this solution is a single Custom HTML Tag. It\u2019s fired by two different events, to which we\u2019ll return shortly.<\/p>\n<p>First of all, here\u2019s the code:<\/p>\n<div class=\"highlight\">\n<pre style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-javascript\" data-lang=\"javascript\"><script><![CDATA[\n  (<span style=\"color:#00a\">function() {\n    <span style=\"color:#00a\">var s = <span style=\"color:#0aa\">document.location.search;\n    <span style=\"color:#00a\">var h = <span style=\"color:#0aa\">document.location.hash;\n    <span style=\"color:#00a\">var e = {{Event}};\n    <span style=\"color:#00a\">var n = {{New History Fragment}};\n    <span style=\"color:#00a\">var o = {{Old History Fragment}};\n    \n    <span style=\"color:#aaa;font-style:italic\">\/\/ Only run if the History API is supported\n<span style=\"color:#aaa;font-style:italic\">    <span style=\"color:#00a\">if (<span style=\"color:#0aa\">window.history) {\n\n      <span style=\"color:#aaa;font-style:italic\">\/\/ Create a new history state if the user lands from Google&#39;s SERP\n<span style=\"color:#aaa;font-style:italic\">      <span style=\"color:#00a\">if (e === <span style=\"color:#a50\">&#39;gtm.js&#39; && \n          <span style=\"color:#0aa\">document.referrer.indexOf(<span style=\"color:#a50\">&#39;www.google.&#39;) > -<span style=\"color:#099\">1 && \n          s.indexOf(<span style=\"color:#a50\">&#39;gclid&#39;) === -<span style=\"color:#099\">1 &&\n          s.indexOf(<span style=\"color:#a50\">&#39;utm_&#39;) === -<span style=\"color:#099\">1 &&\n          h !== <span style=\"color:#a50\">&#39;#gref&#39;) {\n        <span style=\"color:#0aa\">window.oldFragment = <span style=\"color:#00a\">false;\n        <span style=\"color:#0aa\">window.history.pushState(<span style=\"color:#00a\">null,<span style=\"color:#00a\">null,<span style=\"color:#a50\">&#39;#gref&#39;);\n      } <span style=\"color:#00a\">else <span style=\"color:#00a\">if (e === <span style=\"color:#a50\">&#39;gtm.js&#39;) {\n        <span style=\"color:#0aa\">window.oldFragment = <span style=\"color:#00a\">true;\n      }\n\n      <span style=\"color:#aaa;font-style:italic\">\/\/ When the user tries to return to the SERP using browser back, fire the\n<span style=\"color:#aaa;font-style:italic\">      <span style=\"color:#aaa;font-style:italic\">\/\/ Google Analytics timing event, and after it&#39;s dispatched, manually\n<span style=\"color:#aaa;font-style:italic\">      <span style=\"color:#aaa;font-style:italic\">\/\/ navigate to the previous history entry, i.e. the SERP\n<span style=\"color:#aaa;font-style:italic\">      <span style=\"color:#00a\">if (e === <span style=\"color:#a50\">&#39;gtm.historyChange&#39; && \n          n === <span style=\"color:#a50\">&#39;&#39; && \n          o === <span style=\"color:#a50\">&#39;gref&#39;) {\n        <span style=\"color:#00a\">var time = <span style=\"color:#00a\">new <span style=\"color:#0aa\">Date().getTime() - {{DLV - gtm.start}};\n        <span style=\"color:#00a\">if (!<span style=\"color:#0aa\">window.oldFragment) {\n          dataLayer.push({\n            <span style=\"color:#a50\">&#39;event&#39; : <span style=\"color:#a50\">&#39;returnToSerp&#39;,\n            <span style=\"color:#a50\">&#39;timeToSerp&#39; : time,\n            <span style=\"color:#a50\">&#39;eventCallback&#39; : <span style=\"color:#00a\">function() {\n              <span style=\"color:#0aa\">window.history.go(-<span style=\"color:#099\">1);\n            }\n          });\n        } <span style=\"color:#00a\">else {\n          <span style=\"color:#0aa\">window.history.go(-<span style=\"color:#099\">1);\n        }\n      }\n    }\n  })();\n<<span style=\"color:#f00;background-color:#faa\">\/script>\n]]><\/script><\/code><\/pre>\n<\/div>\n<p>Let\u2019s quickly walk through this code. First of all, the whole block is encased in an immediately invoked function expression (IIFE) <code>(function() {...})();<\/code>, which protects the global namespace. Also, the whole solution only works if the user\u2019s browser supports the History API: <code>if (window.history) {...}<\/code>.<\/p>\n<p>The first important code block is this:<\/p>\n<div class=\"highlight\">\n<pre style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-javascript\" data-lang=\"javascript\"><span style=\"color:#00a\">if<\/span> (e === <span style=\"color:#a50\">'gtm.js'<\/span> &amp;&amp; \n    <span style=\"color:#0aa\">document<\/span>.referrer.indexOf(<span style=\"color:#a50\">'www.google.'<\/span>) &gt; -<span style=\"color:#099\">1<\/span> &amp;&amp; \n    s.indexOf(<span style=\"color:#a50\">'gclid'<\/span>) === -<span style=\"color:#099\">1<\/span> &amp;&amp;\n    s.indexOf(<span style=\"color:#a50\">'utm_'<\/span>) === -<span style=\"color:#099\">1<\/span> &amp;&amp;\n    h !== <span style=\"color:#a50\">'#gref'<\/span>) {\n  <span style=\"color:#0aa\">window<\/span>.oldFragment = <span style=\"color:#00a\">false<\/span>;\n  <span style=\"color:#0aa\">window<\/span>.history.pushState(<span style=\"color:#00a\">null<\/span>,<span style=\"color:#00a\">null<\/span>,<span style=\"color:#a50\">'#gref'<\/span>);\n}\n<\/code><\/pre>\n<\/div>\n<p>This code checks the following:<\/p>\n<ol>\n<li>\n<p>Was the Tag fired due to the Page View Trigger (i.e. a page load)?<\/p>\n<\/li>\n<li>\n<p>Did the user land from a Google site (<code>referrer<\/code> contains <strong>www.google.<\/strong>)?<\/p>\n<\/li>\n<li>\n<p>If they did, make sure it\u2019s not from an AdWords ad (check that the URL does not have <strong>?gclid<\/strong>) or custom campaign.<\/p>\n<\/li>\n<li>\n<p>Make sure also that the URL does not already contain #gref, which would imply the user followed a link with that hash or that the user already had a history entry with #gref, meaning they\u2019ve navigated somewhere else within or outside the site after landing on it in the first place from the SERP.<\/p>\n<\/li>\n<\/ol>\n<p>If these checks pass, then a new global variable <code>oldFragment<\/code> is initialized with the value <code>false<\/code>. This means simply that this is a brand new landing on the site through organic Google search, and we check against this when we push the payload to <code>dataLayer<\/code>. We only want to send the Timing hit for landing page bounces.<\/p>\n<p>Finally, a new browser history state is created, where the URL is appended with <strong>#gref<\/strong> to show that the user landed from organic Google search.<\/p>\n<p>The next code block is:<\/p>\n<div class=\"highlight\">\n<pre style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-javascript\" data-lang=\"javascript\"><span style=\"color:#00a\">else<\/span> <span style=\"color:#00a\">if<\/span> (e === <span style=\"color:#a50\">'gtm.js'<\/span>) {\n  <span style=\"color:#0aa\">window<\/span>.oldFragment = <span style=\"color:#00a\">true<\/span>;\n}\n<\/code><\/pre>\n<\/div>\n<p>Here, we check if the event is a page load again, but the URL already has <strong>#gref<\/strong>. In this case, we set the global variable to <code>true<\/code>, since obviously this entry is not a direct landing from the SERP but something else. This way, we\u2019ll block the Timing hit from happening, as we only want to measure true landing page bounces.<\/p>\n<p>The final code block is:<\/p>\n<div class=\"highlight\">\n<pre style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-javascript\" data-lang=\"javascript\"><span style=\"color:#00a\">if<\/span> (e === <span style=\"color:#a50\">'gtm.historyChange'<\/span> &amp;&amp; \n    n === <span style=\"color:#a50\">''<\/span> &amp;&amp; \n    o === <span style=\"color:#a50\">'gref'<\/span>) {\n  <span style=\"color:#00a\">var<\/span> time = <span style=\"color:#00a\">new<\/span> <span style=\"color:#0aa\">Date<\/span>().getTime() - {{DLV - gtm.start}};\n  <span style=\"color:#00a\">if<\/span> (!<span style=\"color:#0aa\">window<\/span>.oldFragment) {\n    dataLayer.push({\n      <span style=\"color:#a50\">'event'<\/span> : <span style=\"color:#a50\">'returnToSerp'<\/span>,\n      <span style=\"color:#a50\">'timeToSerp'<\/span> : time,\n      <span style=\"color:#a50\">'eventCallback'<\/span> : <span style=\"color:#00a\">function<\/span>() {\n        <span style=\"color:#0aa\">window<\/span>.history.go(-<span style=\"color:#099\">1<\/span>);\n      }\n    });\n  } <span style=\"color:#00a\">else<\/span> {\n    <span style=\"color:#0aa\">window<\/span>.history.go(-<span style=\"color:#099\">1<\/span>);\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>Again, there\u2019s a checklist of things:<\/p>\n<ol>\n<li>\n<p>Is the event a browser history event?<\/p>\n<\/li>\n<li>\n<p>Is the old hash <strong>#gref<\/strong> and the new hash a blank string?<\/p>\n<\/li>\n<\/ol>\n<p>If all these checks pass, it means that the user tried to go back in browser history to the SERP. Due to our manually imposed history state, they\u2019re actually taken to the <strong>#gref<\/strong>-less landing page.<\/p>\n<p>Next, we check the dwell time on the page, using the difference between the current time and the time when the GTM container snippet was first loaded. This is a reasonable description of dwell time, but you can use something else for start time if you wish.<\/p>\n<p>Finally, we check if <code>oldFragment<\/code> is false, meaning we\u2019re still on the landing page. If it is, the payload is pushed into <code>dataLayer<\/code>. The \u2018eventCallback\u2019 key has the actual return to SERP command, and it will only be executed after any Tags that use the <strong>returnToSerp<\/strong> event have fired.<\/p>\n<p>Hacky-dy-hack-hack! I love it!<\/p>\n<h2 id=\"all-the-other-stuff-youll-need\">All the other stuff you\u2019ll need<\/h2>\n<p>Here\u2019s a list of the assets you need to create for this to work. Feel free to improvise, if you wish!<\/p>\n<h3 id=\"1-built-in-variables\">1. Built-in Variables<\/h3>\n<p>First, make sure the following Built-in Variables are checked in your container\u2019s Variables settings.<\/p>\n<div style=\"aspect-ratio: 1976 \/ 1200;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2015\/09\/built-ins.jpg\" title=\"Required built-ins\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1200\" width=\"1976\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2015\/09\/built-ins.jpg#ZgotmplZ\" alt=\"Required built-ins\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>So that\u2019s <strong>Page URL<\/strong>, <strong>Event<\/strong>, <strong>History Source<\/strong>, <strong>New \/ Old History Fragment<\/strong>.<\/p>\n<h3 id=\"2-the-triggers-for-the-custom-html-tag\">2. The Triggers for the Custom HTML Tag<\/h3>\n<p>The Custom HTML Tag runs on two Triggers.<\/p>\n<p>The first one is the default <strong>All Pages<\/strong> Trigger.<\/p>\n<p>The second one is a <strong>History Change<\/strong> Trigger which looks like this:<\/p>\n<div style=\"aspect-ratio: 1882 \/ 634;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2015\/09\/history-change-trigger.jpg\" title=\"History Change Trigger with popstate\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"634\" width=\"1882\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2015\/09\/history-change-trigger.jpg#ZgotmplZ\" alt=\"History Change Trigger with popstate\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>This Trigger only launches when a browser history event is detected which is also a <code>popstate<\/code>, and the new history fragment is empty.<\/p>\n<h3 id=\"3-the-variables\">3. The Variables<\/h3>\n<p>Create the following Data Layer Variables:<\/p>\n<div style=\"aspect-ratio: 560 \/ 570;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2015\/09\/dlv-gtm.start_.jpg\" title=\"dlv-gtm.start\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"570\" width=\"560\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2015\/09\/dlv-gtm.start_.jpg#ZgotmplZ\" alt=\"dlv-gtm.start\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>This one stores the time when the GTM container snippet was executed.<\/p>\n<div style=\"aspect-ratio: 596 \/ 572;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2015\/09\/dlv-timetoserp.jpg\" title=\"DLV - timetoserp\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"572\" width=\"596\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2015\/09\/dlv-timetoserp.jpg#ZgotmplZ\" alt=\"DLV - timetoserp\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>This is where the time spent on the landing page is stored.<\/p>\n<h3 id=\"4-the-trigger-for-the-timing-tag\">4. The Trigger for the Timing Tag<\/h3>\n<p>The Trigger you\u2019ll attach to the Timing Tag (created next) looks like this:<\/p>\n<div style=\"aspect-ratio: 1880 \/ 722;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2015\/09\/trigger-returntoserp.jpg\" title=\"returntoserp Trigger\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"722\" width=\"1880\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2015\/09\/trigger-returntoserp.jpg#ZgotmplZ\" alt=\"returntoserp Trigger\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>This Trigger fires when the <strong>returnToSerp<\/strong> <code>dataLayer<\/code> event is pushed via the Custom HTML Tag. It also checks that the dwell time pushed into <code>dataLayer<\/code> is less than 30 minutes. This way a new session won\u2019t be started with the event, if the visitor stays on the page for an exceptionally long time.<\/p>\n<h3 id=\"5-the-timing-tag\">5. The Timing Tag<\/h3>\n<p>And here\u2019s the Universal Analytics Timing Tag you\u2019ll need:<\/p>\n<div style=\"aspect-ratio: 650 \/ 1358;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2015\/09\/timing-tag.jpg\" title=\"Universal Analytics Timing Tag\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1358\" width=\"650\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2015\/09\/timing-tag.jpg#ZgotmplZ\" alt=\"Universal Analytics Timing Tag\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>We\u2019re sending <strong>SERP Bounce<\/strong> as the Timing Category, the full <strong>Page URL<\/strong> as the Timing Variable, and the <strong>time spent<\/strong> on the landing page as the value. As mentioned above, this Tag is fired by the Trigger you created in step (4) above.<\/p>\n<h2 id=\"viewing-the-results\">Viewing the results<\/h2>\n<p>Once you implement this, you\u2019ll find the results under <strong>Site Content &gt; Site Speed &gt; User Timings<\/strong> under the Timing Category labelled <strong>SERP Bounce<\/strong>.<\/p>\n<div style=\"aspect-ratio: 2208 \/ 604;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2015\/09\/user-timings-ga.jpg\" title=\"User Timings in GA\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"604\" width=\"2208\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2015\/09\/user-timings-ga.jpg#ZgotmplZ\" alt=\"User Timings in GA\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>To drill into the data, it\u2019s useful to view the Timing Variable as the primary dimension, as that\u2019s the one where the landing pages are. Try to find landing pages with an abnormally small average dwell time:<\/p>\n<div style=\"aspect-ratio: 1914 \/ 602;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2015\/09\/average-timings.jpg\" title=\"Average timings\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"602\" width=\"1914\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2015\/09\/average-timings.jpg#ZgotmplZ\" alt=\"Average timings\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>These pages have a very short dwell time compared to site average. Just make sure that the <strong>timing sample<\/strong> is large enough for you to draw conclusions from. Pages with an abnormally short dwell time from the SERP <strong>MIGHT<\/strong> indicate a poor experience or lack or relevant content.<\/p>\n<p>Also, the <strong>Distribution<\/strong> view is useful if you want to drill down to individual page performance:<\/p>\n<div style=\"aspect-ratio: 1660 \/ 728;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2015\/09\/distribution.jpg\" title=\"Timing distribution\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"728\" width=\"1660\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2015\/09\/distribution.jpg#ZgotmplZ\" alt=\"Timing distribution\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>This report lets you view the timing buckets. As you can see, there are some anomalies here, though the sample is quite small.<\/p>\n<h2 id=\"summary\">Summary<\/h2>\n<p>I hope I\u2019ve convinced you by now that this is a very hacky solution. Remember to test thoroughly. I can also promise that you will have problems if you try to implement this on a single-page application (e.g. AJAX site), which rely on the browser history API for navigation.<\/p>\n<p>Nevertheless, it\u2019s an interesting way of uncovering potential issues with your landing pages. It would be interesting to align this data with keyword data, but that\u2019s up to you to solve, since that data is difficult to come by these days, and User Timings don\u2019t align well with acquisition dimensions like Keyword.<\/p>\n<\/p><\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>Here\u2019s an interesting and hacky use case for you. It\u2019s all about uncovering bounce metrics for visits which originate from organic Google search results. In particular, the metric we\u2019re interested in is how long user dwelled on the landing page after arriving from organic Google search AND returned to the search engine results page (SERP) [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":139258,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12033],"tags":[8521,32680,16556,59373,1231],"dealstore":[],"offerexpiration":[],"class_list":["post-139257","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","tag-bounce","tag-gtm","tag-measure","tag-serp","tag-time"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Measure SERP Bounce Time With GTM - Som2ny Network<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fivemor.com\/?p=139257\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Measure SERP Bounce Time With GTM - Som2ny Network\" \/>\n<meta property=\"og:description\" content=\"Here\u2019s an interesting and hacky use case for you. It\u2019s all about uncovering bounce metrics for visits which originate from organic Google search results. In particular, the metric we\u2019re interested in is how long user dwelled on the landing page after arriving from organic Google search AND returned to the search engine results page (SERP) [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fivemor.com\/?p=139257\" \/>\n<meta property=\"og:site_name\" content=\"Som2ny Network\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-17T09:09:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/dwell-time-landing-page.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1614\" \/>\n\t<meta property=\"og:image:height\" content=\"726\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fivemor.com\/?p=139257#article\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/?p=139257\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\"},\"headline\":\"Measure SERP Bounce Time With GTM\",\"datePublished\":\"2025-03-17T09:09:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=139257\"},\"wordCount\":1884,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=139257#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/dwell-time-landing-page.jpg\",\"keywords\":[\"Bounce\",\"GTM\",\"Measure\",\"SERP\",\"Time\"],\"articleSection\":[\"Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fivemor.com\/?p=139257#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fivemor.com\/?p=139257\",\"url\":\"https:\/\/fivemor.com\/?p=139257\",\"name\":\"Measure SERP Bounce Time With GTM - Som2ny Network\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=139257#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=139257#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/dwell-time-landing-page.jpg\",\"datePublished\":\"2025-03-17T09:09:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fivemor.com\/?p=139257#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fivemor.com\/?p=139257\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/?p=139257#primaryimage\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/dwell-time-landing-page.jpg\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/dwell-time-landing-page.jpg\",\"width\":1614,\"height\":726},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fivemor.com\/?p=139257#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fivemor.com\/?bp_activities=1\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Measure SERP Bounce Time With GTM\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fivemor.com\/#website\",\"url\":\"https:\/\/fivemor.com\/\",\"name\":\"Som2ny Network\",\"description\":\"Daily Deals\",\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fivemor.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/fivemor.com\/#organization\",\"name\":\"Som2ny Network\",\"url\":\"https:\/\/fivemor.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"width\":300,\"height\":86,\"caption\":\"Som2ny Network\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"caption\":\"admin\"},\"sameAs\":[\"https:\/\/fivemor.com\"],\"url\":\"https:\/\/fivemor.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Measure SERP Bounce Time With GTM - Som2ny Network","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fivemor.com\/?p=139257","og_locale":"en_US","og_type":"article","og_title":"Measure SERP Bounce Time With GTM - Som2ny Network","og_description":"Here\u2019s an interesting and hacky use case for you. It\u2019s all about uncovering bounce metrics for visits which originate from organic Google search results. In particular, the metric we\u2019re interested in is how long user dwelled on the landing page after arriving from organic Google search AND returned to the search engine results page (SERP) [&hellip;]","og_url":"https:\/\/fivemor.com\/?p=139257","og_site_name":"Som2ny Network","article_published_time":"2025-03-17T09:09:58+00:00","og_image":[{"width":1614,"height":726,"url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/dwell-time-landing-page.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fivemor.com\/?p=139257#article","isPartOf":{"@id":"https:\/\/fivemor.com\/?p=139257"},"author":{"name":"admin","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371"},"headline":"Measure SERP Bounce Time With GTM","datePublished":"2025-03-17T09:09:58+00:00","mainEntityOfPage":{"@id":"https:\/\/fivemor.com\/?p=139257"},"wordCount":1884,"commentCount":0,"publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"image":{"@id":"https:\/\/fivemor.com\/?p=139257#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/dwell-time-landing-page.jpg","keywords":["Bounce","GTM","Measure","SERP","Time"],"articleSection":["Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fivemor.com\/?p=139257#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fivemor.com\/?p=139257","url":"https:\/\/fivemor.com\/?p=139257","name":"Measure SERP Bounce Time With GTM - Som2ny Network","isPartOf":{"@id":"https:\/\/fivemor.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fivemor.com\/?p=139257#primaryimage"},"image":{"@id":"https:\/\/fivemor.com\/?p=139257#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/dwell-time-landing-page.jpg","datePublished":"2025-03-17T09:09:58+00:00","breadcrumb":{"@id":"https:\/\/fivemor.com\/?p=139257#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fivemor.com\/?p=139257"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/?p=139257#primaryimage","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/dwell-time-landing-page.jpg","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/dwell-time-landing-page.jpg","width":1614,"height":726},{"@type":"BreadcrumbList","@id":"https:\/\/fivemor.com\/?p=139257#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fivemor.com\/?bp_activities=1"},{"@type":"ListItem","position":2,"name":"Measure SERP Bounce Time With GTM"}]},{"@type":"WebSite","@id":"https:\/\/fivemor.com\/#website","url":"https:\/\/fivemor.com\/","name":"Som2ny Network","description":"Daily Deals","publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fivemor.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/fivemor.com\/#organization","name":"Som2ny Network","url":"https:\/\/fivemor.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","width":300,"height":86,"caption":"Som2ny Network"},"image":{"@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","caption":"admin"},"sameAs":["https:\/\/fivemor.com"],"url":"https:\/\/fivemor.com\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/139257","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=139257"}],"version-history":[{"count":0,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/139257\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/media\/139258"}],"wp:attachment":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=139257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=139257"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=139257"},{"taxonomy":"dealstore","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fdealstore&post=139257"},{"taxonomy":"offerexpiration","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fofferexpiration&post=139257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}