{"id":65606,"date":"2025-02-03T06:26:26","date_gmt":"2025-02-03T06:26:26","guid":{"rendered":"https:\/\/peraltafinancing.com\/analytics\/measure-ad-blocker-impact-with-server-side-gtm\/"},"modified":"2025-02-03T06:26:26","modified_gmt":"2025-02-03T06:26:26","slug":"measure-ad-blocker-impact-with-server-side-gtm","status":"publish","type":"post","link":"https:\/\/fivemor.com\/?p=65606","title":{"rendered":"Measure Ad Blocker Impact With Server-side GTM"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div>\n<p>For many, it seems, one of the most important justifications for <a href=\"https:\/\/www.simoahava.com\/analytics\/server-side-tagging-google-tag-manager\/\">server-side Google Tag Manager<\/a> is its resilience to <strong>ad and content blockers<\/strong>. After all, by virtue of serving the container JavaScript <em>from your own domain<\/em>, you escape many of the heuristic devices today\u2019s blocker technologies employ.<\/p>\n<p>Well, I\u2019ve gone on record over and over again to say how this is <strong>poor justification<\/strong> for using server-side GTM. By circumventing the user\u2019s <em>wish<\/em> to block scripts, you are disrespecting them and forcing their browser to download scripts that they wanted to avoid downloading in the first place.<\/p>\n<p>However, this is not another article lamenting this disconnect between data-hungry analysts and their unsuspecting site visitors.<\/p>\n<p>Instead, I want to take the technology that allows you to <strong>circumvent<\/strong> and instead use it to <strong>detect<\/strong>.<\/p>\n<p>While ad and content blockers should be allowed to run their course, I do think it\u2019s absolutely vital that their impact be measured. That way you can calculate just how many of your analytics and ad requests are blocked due to these tools.<\/p>\n<div style=\"aspect-ratio: 1102 \/ 720;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/blocker-data.jpg\" title=\"Blocker data\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"720\" width=\"1102\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/blocker-data.jpg#ZgotmplZ\" alt=\"Blocker data\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You can even use the detection technology to conditionally block your server-side tags! That way you can truly act according to the user\u2019s wishes <em>and<\/em> keep those data streams between the browser and the server container alive.<\/p>\n<blockquote>\n<p>By the way, if you\u2019re interested in knowing more about ad and content blockers in general, I recommend you listen to <a href=\"https:\/\/www.teamsimmer.com\/2021\/07\/13\/ad-blockers-with-pete-snyder\/\">this Technical Marketing Handbook podcast episode<\/a>, where I interviewed <strong>Pete Snyder<\/strong> of Brave about this very topic.<\/p>\n<\/blockquote>\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=\"measuring-blocker-impact\">Measuring blocker impact<\/h2>\n<p>Let\u2019s start with a major caveat (first of many):<\/p>\n<blockquote>\n<p>This is a <strong>proof of concept<\/strong>. What I\u2019m showing you here are some of the components you need to create the detection system, but most of the work needs to be done client-side (where the detection happens), so you need to adjust these ideas to make sense for what <strong>your<\/strong> site runs on.<\/p>\n<\/blockquote>\n<p>In this article, I\u2019ll show you how I\u2019m measuring three different things:<\/p>\n<ul>\n<li>The ratio of homepage views where <strong>ads<\/strong> were blocked.<\/li>\n<li>The ratio of homepage views where <strong>Google Analytics<\/strong> was blocked.<\/li>\n<li>The ratio of homepage views where <strong>Google Tag Manager<\/strong> was blocked.<\/li>\n<\/ul>\n<p>There are additional caveats related to each of these measurements, but I\u2019ll tackle those when they come up.<\/p>\n<p>Note that to understand everything that\u2019s happening here, you need a fairly good grasp of <strong>server-side tagging<\/strong>. If you haven\u2019t set it up yet, I recommend you take a look at <a href=\"https:\/\/www.simoahava.com\/analytics\/server-side-tagging-google-tag-manager\/\">my article on the topic<\/a>.<\/p>\n<h2 id=\"custom-client-template\">Custom Client template<\/h2>\n<p>I\u2019m using a custom <a href=\"https:\/\/gist.github.com\/sahava\/5d981c3cdee08ecff93c29e7c455530e\">Client template<\/a> in the Server container to pick up requests for the ad blocker <em>bait file<\/em> as well as for the pixel that is used to generate an <a href=\"https:\/\/www.simoahava.com\/analytics\/server-side-tagging-google-tag-manager\/#event-model\">event data object<\/a>.<\/p>\n<div style=\"aspect-ratio: 1024 \/ 808;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/ad-blocker-client.jpg\" title=\"Ad blocker client\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"808\" width=\"1024\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/ad-blocker-client.jpg#ZgotmplZ\" alt=\"Ad blocker client\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>The bait file contains instructions for the browser to generate an element with the ID <code>GxsCRdhiJi<\/code>. This is the element you need to search for to see if the file was blocked or not.<\/p>\n<h2 id=\"client-side-script\">Client-side script<\/h2>\n<p>Most of the magic needs to be done client-side.<\/p>\n<p>In the page template of my site, I\u2019m running the following script in the page HTML. Yes, you need to do this outside Google Tag Manager, because if GTM is blocked then you won\u2019t be able to measure the impact due to the client-side script being blocked, too.<\/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\">function<\/span>() {\n  <span style=\"color:#aaa;font-style:italic\">\/\/ Set these to the endpoints configured in the Client template\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>  <span style=\"color:#00a\">var<\/span> baitPath = <span style=\"color:#a50\">'https:\/\/sgtm.simoahava.com\/ads-min.js'<\/span>;\n  <span style=\"color:#00a\">var<\/span> pixelPath = <span style=\"color:#a50\">'https:\/\/sgtm.simoahava.com\/4dchk'<\/span>;\n  \n  <span style=\"color:#aaa;font-style:italic\">\/\/ Prevent the script from running outside the home page\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>  <span style=\"color:#00a\">if<\/span> (<span style=\"color:#0aa\">document<\/span>.location.pathname !== <span style=\"color:#a50\">'\/'<\/span>) <span style=\"color:#00a\">return<\/span>;\n  \n  <span style=\"color:#aaa;font-style:italic\">\/\/ Inject the bait file\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>  <span style=\"color:#00a\">var<\/span> el = <span style=\"color:#0aa\">document<\/span>.createElement(<span style=\"color:#a50\">'script'<\/span>);\n  el.src = baitPath;\n  <span style=\"color:#0aa\">document<\/span>.body.appendChild(el);\n  \n  <span style=\"color:#00a\">var<\/span> gaBlocked = <span style=\"color:#00a\">false<\/span>;\n  \n  <span style=\"color:#aaa;font-style:italic\">\/\/ Run the detections at page load to avoid race conditions\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>  <span style=\"color:#0aa\">window<\/span>.addEventListener(<span style=\"color:#a50\">'load'<\/span>, <span style=\"color:#00a\">function<\/span>() {\n    <span style=\"color:#aaa;font-style:italic\">\/\/ Send a HEAD request for the Universal Analytics library to see if it's blocked\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>    fetch(<span style=\"color:#a50\">'https:\/\/www.google-analytics.com\/analytics.js'<\/span>, {method: <span style=\"color:#a50\">'HEAD'<\/span>, mode: <span style=\"color:#a50\">'no-cors'<\/span>})\n      .<span style=\"color:#00a\">catch<\/span>(<span style=\"color:#00a\">function<\/span>() {\n        <span style=\"color:#aaa;font-style:italic\">\/\/ If the load failed, assume GA was blocked\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>        gaBlocked = <span style=\"color:#00a\">true<\/span>;\n      })\n      .<span style=\"color:#00a\">finally<\/span>(<span style=\"color:#00a\">function<\/span>() {\n        <span style=\"color:#aaa;font-style:italic\">\/\/ Build the GA4 parameters, add additional parameters at your leisure\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>        <span style=\"color:#00a\">var<\/span> params = {\n          ads_blocked: !<span style=\"color:#0aa\">document<\/span>.querySelector(<span style=\"color:#a50\">'#GxsCRdhiJi'<\/span>), <span style=\"color:#aaa;font-style:italic\">\/\/ Detect if the bait file was blocked\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>          gtm_blocked: !(<span style=\"color:#0aa\">window<\/span>.google_tag_manager &amp;&amp; <span style=\"color:#0aa\">window<\/span>.google_tag_manager.dataLayer), <span style=\"color:#aaa;font-style:italic\">\/\/ Detect if gtm.js was blocked\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>          ga_blocked: gaBlocked <span style=\"color:#aaa;font-style:italic\">\/\/ Detect if analytics.js was blocked\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>        };\n        \n        <span style=\"color:#aaa;font-style:italic\">\/\/ Build the pixel request with a unique, random Client ID\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>        <span style=\"color:#00a\">var<\/span> cid = <span style=\"color:#0aa\">Math<\/span>.floor((<span style=\"color:#0aa\">Math<\/span>.random() * <span style=\"color:#099\">1000000<\/span>) + <span style=\"color:#099\">1<\/span>) + <span style=\"color:#a50\">'_'<\/span> + <span style=\"color:#00a\">new<\/span> <span style=\"color:#0aa\">Date<\/span>().getTime();\n        <span style=\"color:#00a\">var<\/span> img = <span style=\"color:#0aa\">document<\/span>.createElement(<span style=\"color:#a50\">'img'<\/span>);\n        img.style = <span style=\"color:#a50\">'width: 1; height: 1; display: none;'<\/span>;\n        img.src = pixelPath + <span style=\"color:#a50\">'?client_id='<\/span> + cid + <span style=\"color:#a50\">'&amp;'<\/span> + <span style=\"color:#0aa\">Object<\/span>.keys(params).reduce(<span style=\"color:#00a\">function<\/span>(acc, cur) { <span style=\"color:#00a\">return<\/span> acc.concat(cur + <span style=\"color:#a50\">'='<\/span> + params[cur]);}, []).join(<span style=\"color:#a50\">'&amp;'<\/span>);\n        <span style=\"color:#0aa\">document<\/span>.body.appendChild(img);\n      });\n  });\n})();\n<\/code><\/pre>\n<\/div>\n<p>I only want to run this script on the home page, and because I\u2019m so lazy at editing my templates, I simply exit the function if the current page path isn\u2019t the root of the site.<\/p>\n<p>For <code>baitPath<\/code> and <code>pixelPath<\/code>, configure the corresponding settings you added to the Client template. The default values are <code>\/ads-min.js<\/code> for the bait file path, and <code>\/4dchk<\/code> for the pixel path.<\/p>\n<p>In the following chapters, I\u2019ll tell you how I\u2019m measuring ad blocker use, Google Analytics blocking, and Google Tag Manager blocking.<\/p>\n<h2 id=\"measuring-ad-blockers\">Measuring ad blockers<\/h2>\n<p>To measure the impact of <strong>ad blockers<\/strong>, I\u2019m using an age-old heuristic system to detect if the browser is blocking ads.<\/p>\n<p>The browser sends a request to the Server container, where the <a href=\"https:\/\/gist.github.com\/sahava\/5d981c3cdee08ecff93c29e7c455530e\">Client template<\/a> picks it up. The request needs to be for a file that is most commonly blocked by ad blockers, such as <strong>ads-min.js<\/strong>.<\/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\">...\n<span style=\"color:#00a\">var<\/span> baitPath = <span style=\"color:#a50\">'https:\/\/sgtm.simoahava.com\/ads-min.js'<\/span>;\n<span style=\"color:#00a\">var<\/span> el = <span style=\"color:#0aa\">document<\/span>.createElement(<span style=\"color:#a50\">'script'<\/span>);\nel.src = baitPath;\n<span style=\"color:#0aa\">document<\/span>.body.appendChild(el);\n...\n<\/code><\/pre>\n<\/div>\n<div style=\"aspect-ratio: 1442 \/ 288;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/ads-min-blocked.jpg\" title=\"ads-min.js blocked\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"288\" width=\"1442\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/ads-min-blocked.jpg#ZgotmplZ\" alt=\"ads-min.js blocked\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>The purpose of the file is to create a dummy HTML element on the page with a specific ID (<code>GxsCRdhiJi<\/code> if you\u2019re using the default template). If the element doesn\u2019t exist when you query it, it means that the download failed for some reason or other, one of which could be due to ad blockers.<\/p>\n<blockquote>\n<p><strong>Caveat<\/strong>: We don\u2019t know why the download failed. It could be due to an ad blocker, but it could also be due to a network error or something else. So there\u2019s always some uncertainty in this regard.<\/p>\n<\/blockquote>\n<p>Note also that filter lists such as <a href=\"https:\/\/disconnect.me\/trackerprotection\">Disconnect.me<\/a>, used in e.g. Mozilla Firefox and Microsoft Edge, pattern match against the domain name, which makes detecting them with a custom solution very difficult to do.<\/p>\n<h2 id=\"measuring-ga-blockers\">Measuring GA blockers<\/h2>\n<p>To measure whether Google Analytics is blocked or not, I\u2019m using a very simple method. I run a <code>fetch()<\/code> call for the Universal Analytics JavaScript library. If that request fails, I\u2019ll chalk it up to GA being blocked.<\/p>\n<p>The request is sent with the HEAD method to prevent exerting browser resources, and it\u2019s sent with the <code>no-cors<\/code> mode to avoid CORS issues.<\/p>\n<p>Here\u2019s what the request looks like:<\/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\">...\nfetch(<span style=\"color:#a50\">'https:\/\/www.google-analytics.com\/analytics.js'<\/span>, {method: <span style=\"color:#a50\">'HEAD'<\/span>, mode: <span style=\"color:#a50\">'no-cors'<\/span>})\n  .<span style=\"color:#00a\">catch<\/span>(() =&gt; {\n    <span style=\"color:#aaa;font-style:italic\">\/\/ GA is blocked\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>  });\n...\n<\/code><\/pre>\n<\/div>\n<blockquote>\n<p><strong>Caveat<\/strong>: Again, we don\u2019t know if it\u2019s a blocker that prevents GA from loading. Also, in e.g. Firefox, even in Private Windows, Google Analytics is allowed to load, but its main methods are <strong>shimmed<\/strong> to prevent it from working. This particular approach would not be able to detect that type of blocking.<\/p>\n<\/blockquote>\n<h2 id=\"measuring-gtm-blockers\">Measuring GTM blockers<\/h2>\n<p>For GTM, we\u2019re taking an <em>even<\/em> simpler approach. At window loaded time, we\u2019ll check if the <code>window.google_tag_manager<\/code> interface has been created and that it also has the nested object <code>window.google_tag_manager.dataLayer<\/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\">...\ngtm_blocked: !(<span style=\"color:#0aa\">window<\/span>.google_tag_manager &amp;&amp; <span style=\"color:#0aa\">window<\/span>.google_tag_manager.dataLayer)\n...\n<\/code><\/pre>\n<\/div>\n<blockquote>\n<p><strong>Caveat<\/strong>: All the aforementioned caveats apply, again. And it\u2019s important to remember that on e.g. Firefox, the global <code>window.google_tag_manager<\/code> interface <em>is<\/em> created, but since <code>dataLayer.push<\/code> is shimmed, GTM itself won\u2019t work.<\/p>\n<\/blockquote>\n<h2 id=\"sending-the-pixel-request-to-the-server-container\">Sending the pixel request to the Server container<\/h2>\n<p>Once you have your Booleans for whether or not these three vectors are being blocked, it\u2019s time to put everything together.<\/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:#0aa\">window<\/span>.addEventListener(<span style=\"color:#a50\">'load'<\/span>, <span style=\"color:#00a\">function<\/span>() {\n  fetch(<span style=\"color:#a50\">'https:\/\/www.google-analytics.com\/analytics.js'<\/span>, {method: <span style=\"color:#a50\">'HEAD'<\/span>, mode: <span style=\"color:#a50\">'no-cors'<\/span>})\n    .<span style=\"color:#00a\">catch<\/span>(<span style=\"color:#00a\">function<\/span>() {\n      gaBlocked = <span style=\"color:#00a\">true<\/span>;\n    })\n    .<span style=\"color:#00a\">finally<\/span>(<span style=\"color:#00a\">function<\/span>() {\n      <span style=\"color:#00a\">var<\/span> params = {\n        ads_blocked: !<span style=\"color:#0aa\">document<\/span>.querySelector(<span style=\"color:#a50\">'#GxsCRdhiJi'<\/span>),\n        gtm_blocked: !(<span style=\"color:#0aa\">window<\/span>.google_tag_manager &amp;&amp; <span style=\"color:#0aa\">window<\/span>.google_tag_manager.dataLayer),\n        ga_blocked: gaBlocked\n      };\n      <span style=\"color:#00a\">var<\/span> cid = <span style=\"color:#0aa\">Math<\/span>.floor((<span style=\"color:#0aa\">Math<\/span>.random() * <span style=\"color:#099\">1000000<\/span>) + <span style=\"color:#099\">1<\/span>) + <span style=\"color:#a50\">'_'<\/span> + <span style=\"color:#00a\">new<\/span> <span style=\"color:#0aa\">Date<\/span>().getTime();\n      <span style=\"color:#00a\">var<\/span> img = <span style=\"color:#0aa\">document<\/span>.createElement(<span style=\"color:#a50\">'img'<\/span>);\n      img.style = <span style=\"color:#a50\">'width: 1; height: 1; display: none;'<\/span>;\n      img.src = pixelPath + <span style=\"color:#a50\">'?client_id='<\/span> + cid + <span style=\"color:#a50\">'&amp;'<\/span> + <span style=\"color:#0aa\">Object<\/span>.keys(params).reduce(<span style=\"color:#00a\">function<\/span>(acc, cur) { <span style=\"color:#00a\">return<\/span> acc.concat(cur + <span style=\"color:#a50\">'='<\/span> + params[cur]);}, []).join(<span style=\"color:#a50\">'&amp;'<\/span>);\n      <span style=\"color:#0aa\">document<\/span>.body.appendChild(img);\n    });\n});\n<\/code><\/pre>\n<\/div>\n<p>The pixel request waits for the window to completely load <strong>and<\/strong> for the Google Analytics <code>fetch()<\/code> request to complete. This way any possible asynchronous race conditions won\u2019t spoil the measurement.<\/p>\n<p>In the <code>params<\/code> object, you can add any parameters you wish to end up in the event data object. If you <em>don\u2019t<\/em> provide the <code>page_location<\/code> parameter, you\u2019ll need to add it to the tag (see below). You can also provide a custom <code>event_name<\/code> parameter, and the Client template will default to <code>page_view<\/code> if you don\u2019t.<\/p>\n<p>The <code>client_id<\/code> is automatically generated as a unique, random value for each request.<\/p>\n<blockquote>\n<p><strong>Caveat<\/strong>: This means that we\u2019re not measuring <strong>users<\/strong> who use blockers but rather <strong>individual hits<\/strong> and whether they\u2019re blocked or not. I wanted to ignore <strong>users<\/strong> simply because I don\u2019t want to start setting cookies or fingerprinting just for the purpose of this exercise.<\/p>\n<\/blockquote>\n<p>Finally, a pixel request is sent to your server container, which grabs it and creates an Event Data Object with the parameters:<\/p>\n<div style=\"aspect-ratio: 2166 \/ 1222;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/event-data-object.jpg\" title=\"Event Data Object\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1222\" width=\"2166\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/event-data-object.jpg#ZgotmplZ\" alt=\"Event Data Object\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<h2 id=\"setup-the-ga4-tag\">Setup the GA4 tag<\/h2>\n<p>In the Server container, you can then configure a GA4 tag to fire when this particular event data object is generated. For this purpose, <strong>I recommend you create a new data stream just for this data<\/strong>. That way you don\u2019t pollute your marketing analytics data with this ad blocker coverage.<\/p>\n<div style=\"aspect-ratio: 1804 \/ 1500;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/ga4-tag.jpg\" title=\"GA4 tag\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1500\" width=\"1804\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/ga4-tag.jpg#ZgotmplZ\" alt=\"GA4 tag\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>As you can see, I\u2019m redacting the visitor\u2019s IP address (I consider that to be a required setting in ALL GA4 measurement).<\/p>\n<p>Remember to add your data stream Measurement ID to the tag. You don\u2019t need to add any of the custom parameters from the pixel request \u2013\u00a0they will automatically be sent to GA4 just by virtue of being in the event data object.<\/p>\n<p>Finally, here\u2019s what the trigger looks like:<\/p>\n<div style=\"aspect-ratio: 1810 \/ 678;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/server-custom-trigger.jpg\" title=\"Server custom trigger\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"678\" width=\"1810\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/server-custom-trigger.jpg#ZgotmplZ\" alt=\"Server custom trigger\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>In Google Analytics 4, remember to configure the custom parameters as custom dimensions.<\/p>\n<div style=\"aspect-ratio: 1866 \/ 606;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/custom-dimensions-ga4.jpg\" title=\"GA4 custom dimensions\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"606\" width=\"1866\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/custom-dimensions-ga4.jpg#ZgotmplZ\" alt=\"GA4 custom dimensions\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<h2 id=\"test-the-setup\">Test the setup<\/h2>\n<p>Once everything is in place, you can check the Server container preview mode while loading the homepage of your site.<\/p>\n<div style=\"aspect-ratio: 1938 \/ 984;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/ads-min-4dchk.jpg\" title=\"ads-min.js and 4dchk\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"984\" width=\"1938\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/ads-min-4dchk.jpg#ZgotmplZ\" alt=\"ads-min.js and 4dchk\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You should see a request for <code>\/ads-min.js<\/code> followed shortly by a request for the <code>\/4dchk<\/code> pixel.<\/p>\n<p>In Google Analytics 4, you should see your events land in the Real Time report.<\/p>\n<div style=\"aspect-ratio: 844 \/ 894;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/page-view-event.jpg\" title=\"Page View event\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"894\" width=\"844\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/page-view-event.jpg#ZgotmplZ\" alt=\"Page View event\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<blockquote>\n<p>Note that everything else in GA4 should be pretty much flatlining. As you\u2019re not using the recommended SDKs, you\u2019re also not measuring user activity and engagement correctly. But we don\u2019t care about that \u2013\u00a0we just care about the events.<\/p>\n<\/blockquote>\n<p>You can then compile them into whatever reports you wish using the <strong>Explore<\/strong> section of Google Analytics 4 or even <strong>Google BigQuery<\/strong> if you\u2019ve configured the export for this data stream.<\/p>\n<p>Remember to also test with a variety of blockers! For example, this is what it looks like in the browser\u2019s network requests when I load the homepage with the Brave browser:<\/p>\n<div style=\"aspect-ratio: 2158 \/ 388;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/all-blocked.jpg\" title=\"All blocked\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"388\" width=\"2158\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/all-blocked.jpg#ZgotmplZ\" alt=\"All blocked\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>As you can see, all three parameters have the value <code>true<\/code>, indicating that on Brave, everything is blocked.<\/p>\n<p>In Firefox Private Windows, however:<\/p>\n<div style=\"aspect-ratio: 1094 \/ 216;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/09\/firefox-private.jpg\" title=\"Firefox private windows\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"216\" width=\"1094\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/09\/firefox-private.jpg#ZgotmplZ\" alt=\"Firefox private windows\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Nothing is blocked!<\/p>\n<p>Well, I\u2019m using <code>ads-min.js<\/code> as the bait file, and the filter list that Firefox uses (<a href=\"https:\/\/disconnect.me\/trackerprotection\">Disconnect.me<\/a>) doesn\u2019t match against file names but rather against tracking domains themselves. And while GA and GTM aren\u2019t technically <em>blocked<\/em>, their main methods are <em>shimmed<\/em>, meaning they won\u2019t work in Firefox.<\/p>\n<blockquote>\n<p><strong>Shimming<\/strong> means that the methods exist to avoid pages from breaking due to reference errors, but they are overwritten in a way that prevents them from doing what they were intended to do.<\/p>\n<\/blockquote>\n<h2 id=\"summary\">Summary<\/h2>\n<p>You might have noticed how many caveats there were listen in the article. That\u2019s because detecting ad and content blockers <em>is hard<\/em>.<\/p>\n<p>Blockers are designed in a way to make them as unobtrusive as possible, and while they rarely succeed in being transparent, they do make it difficult to detect and adjust in code.<\/p>\n<p>I\u2019m sure there are more sophisticated ways to detect different blocking mechanisms than those I introduced in this article, but the purpose of this article wasn\u2019t to show you how to <em>detect<\/em> blockers but rather how to <em>measure<\/em> their impact.<\/p>\n<p>With a Google Tag Manager Server container, you have an inexpensive API endpoint that\u2019s relatively easy to set up. It runs on your own domain, so the ad blocker detector itself isn\u2019t blocked by, well, ad blockers.<\/p>\n<p>It\u2019s a nice use case for a Server container, again.<\/p>\n<p>With this method, you could selectively block your Server tags from firing if the user is using an ad blocker. Of course, this wouldn\u2019t help with the use cases where the user uses blockers to simply prevent <em>any<\/em> extraneous scripts from firing in their browser. It\u2019s up to you to decide how far you want to take your respect for the user\u2019s wishes.<\/p>\n<p>If you\u2019re curious, in my tests I found the following:<\/p>\n<ul>\n<li><strong>~7%<\/strong> of page loads happened where <strong>Google Tag Manager<\/strong> was blocked.<\/li>\n<li><strong>~10%<\/strong> of page loads happened where <strong>Google Analytics<\/strong> was blocked.<\/li>\n<li><strong>~18%<\/strong> of page loads happened where <strong>ads-min.js<\/strong> and thus, by proxy, <em>ads<\/em> were blocked.<\/li>\n<\/ul>\n<p>Please let me know in the comments if you have questions about this setup or comments about ad \/ content blocking in general.<\/p>\n<\/p><\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>For many, it seems, one of the most important justifications for server-side Google Tag Manager is its resilience to ad and content blockers. After all, by virtue of serving the container JavaScript from your own domain, you escape many of the heuristic devices today\u2019s blocker technologies employ. Well, I\u2019ve gone on record over and over [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":65607,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12033],"tags":[35363,32680,4197,16556,18475],"dealstore":[],"offerexpiration":[],"class_list":["post-65606","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","tag-blocker","tag-gtm","tag-impact","tag-measure","tag-serverside"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Measure Ad Blocker Impact With Server-side 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=65606\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Measure Ad Blocker Impact With Server-side GTM - Som2ny Network\" \/>\n<meta property=\"og:description\" content=\"For many, it seems, one of the most important justifications for server-side Google Tag Manager is its resilience to ad and content blockers. After all, by virtue of serving the container JavaScript from your own domain, you escape many of the heuristic devices today\u2019s blocker technologies employ. Well, I\u2019ve gone on record over and over [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fivemor.com\/?p=65606\" \/>\n<meta property=\"og:site_name\" content=\"Som2ny Network\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-03T06:26:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/measure-ad-blocker-impact-server-side-gtm-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1441\" \/>\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=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fivemor.com\/?p=65606#article\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/?p=65606\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\"},\"headline\":\"Measure Ad Blocker Impact With Server-side GTM\",\"datePublished\":\"2025-02-03T06:26:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=65606\"},\"wordCount\":1941,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=65606#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/measure-ad-blocker-impact-server-side-gtm-scaled.jpg\",\"keywords\":[\"Blocker\",\"GTM\",\"Impact\",\"Measure\",\"Serverside\"],\"articleSection\":[\"Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fivemor.com\/?p=65606#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fivemor.com\/?p=65606\",\"url\":\"https:\/\/fivemor.com\/?p=65606\",\"name\":\"Measure Ad Blocker Impact With Server-side GTM - Som2ny Network\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=65606#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=65606#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/measure-ad-blocker-impact-server-side-gtm-scaled.jpg\",\"datePublished\":\"2025-02-03T06:26:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fivemor.com\/?p=65606#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fivemor.com\/?p=65606\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/?p=65606#primaryimage\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/measure-ad-blocker-impact-server-side-gtm-scaled.jpg\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/measure-ad-blocker-impact-server-side-gtm-scaled.jpg\",\"width\":2560,\"height\":1441},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fivemor.com\/?p=65606#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fivemor.com\/?bp_activities=1\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Measure Ad Blocker Impact With Server-side 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 Ad Blocker Impact With Server-side 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=65606","og_locale":"en_US","og_type":"article","og_title":"Measure Ad Blocker Impact With Server-side GTM - Som2ny Network","og_description":"For many, it seems, one of the most important justifications for server-side Google Tag Manager is its resilience to ad and content blockers. After all, by virtue of serving the container JavaScript from your own domain, you escape many of the heuristic devices today\u2019s blocker technologies employ. Well, I\u2019ve gone on record over and over [&hellip;]","og_url":"https:\/\/fivemor.com\/?p=65606","og_site_name":"Som2ny Network","article_published_time":"2025-02-03T06:26:26+00:00","og_image":[{"width":2560,"height":1441,"url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/measure-ad-blocker-impact-server-side-gtm-scaled.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fivemor.com\/?p=65606#article","isPartOf":{"@id":"https:\/\/fivemor.com\/?p=65606"},"author":{"name":"admin","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371"},"headline":"Measure Ad Blocker Impact With Server-side GTM","datePublished":"2025-02-03T06:26:26+00:00","mainEntityOfPage":{"@id":"https:\/\/fivemor.com\/?p=65606"},"wordCount":1941,"commentCount":0,"publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"image":{"@id":"https:\/\/fivemor.com\/?p=65606#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/measure-ad-blocker-impact-server-side-gtm-scaled.jpg","keywords":["Blocker","GTM","Impact","Measure","Serverside"],"articleSection":["Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fivemor.com\/?p=65606#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fivemor.com\/?p=65606","url":"https:\/\/fivemor.com\/?p=65606","name":"Measure Ad Blocker Impact With Server-side GTM - Som2ny Network","isPartOf":{"@id":"https:\/\/fivemor.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fivemor.com\/?p=65606#primaryimage"},"image":{"@id":"https:\/\/fivemor.com\/?p=65606#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/measure-ad-blocker-impact-server-side-gtm-scaled.jpg","datePublished":"2025-02-03T06:26:26+00:00","breadcrumb":{"@id":"https:\/\/fivemor.com\/?p=65606#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fivemor.com\/?p=65606"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/?p=65606#primaryimage","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/measure-ad-blocker-impact-server-side-gtm-scaled.jpg","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/measure-ad-blocker-impact-server-side-gtm-scaled.jpg","width":2560,"height":1441},{"@type":"BreadcrumbList","@id":"https:\/\/fivemor.com\/?p=65606#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fivemor.com\/?bp_activities=1"},{"@type":"ListItem","position":2,"name":"Measure Ad Blocker Impact With Server-side 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\/65606","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=65606"}],"version-history":[{"count":0,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/65606\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/media\/65607"}],"wp:attachment":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=65606"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=65606"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=65606"},{"taxonomy":"dealstore","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fdealstore&post=65606"},{"taxonomy":"offerexpiration","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fofferexpiration&post=65606"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}