{"id":228394,"date":"2025-05-07T08:04:48","date_gmt":"2025-05-07T08:04:48","guid":{"rendered":"https:\/\/peraltafinancing.com\/analytics\/basic-consent-mode-the-guide\/"},"modified":"2025-05-07T08:04:48","modified_gmt":"2025-05-07T08:04:48","slug":"basic-consent-mode-the-guide","status":"publish","type":"post","link":"https:\/\/fivemor.com\/?p=228394","title":{"rendered":"Basic Consent Mode: The Guide"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div>\n<p>Google\u2019s <a href=\"https:\/\/www.simoahava.com\/analytics\/consent-mode-google-tags\/\">Consent Mode<\/a> is a way to control how tags react to the user\u2019s consent for different tracking purposes. It is specifically designed to work with <strong>Google\u2019s  tags<\/strong>, but especially through Google Tag Manager, you can use Consent Mode\u2019s features and APIs to control other tags, too.<\/p>\n<p>Consent Mode comes in two \u201cflavors\u201d:<\/p>\n<ul>\n<li>\n<p><strong>Advanced Consent Mode<\/strong> is specifically designed for Google\u2019s products. Tags for GA4, Ads, and Floodlight are <em>sensitive<\/em> to the user\u2019s consent choices and change their behavior accordingly. Advanced Consent Mode is <strong>very easy to implement<\/strong> because it basically requires no changes to tags\u2019 existing triggering mechanisms.<\/p>\n<\/li>\n<li>\n<p><strong>Basic Consent Mode<\/strong> means that tags <em>wait<\/em> until appropriate consent has been granted. This means that they need to be manually blocked from firing until the user signals that they consent to tracking for whatever purpose each tag has. Basic Consent Mode is <strong>very difficult to implement<\/strong> because the triggering mechanisms are very awkward to implement.<\/p>\n<\/li>\n<\/ul>\n<div style=\"aspect-ratio: 1782 \/ 554;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/tags-blocked.jpg\" title=\"Tag blocked by additional consent checks\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"554\" width=\"1782\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/tags-blocked.jpg#ZgotmplZ\" alt=\"Tag blocked by additional consent checks\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>In this guide, I will walk you through the latter. Basic Consent Mode is a total headache, because unlike Advanced Consent Mode, there\u2019s nothing automated about it at all. Basic Consent Mode basically means that tags should only ever fire when relevant consent has been granted. If consent has not been granted or if it\u2019s unclear if there is consent, the tags should <em>not fire<\/em>.<\/p>\n<p>The <a href=\"#basic-consent-mode-the-basics\">first part of the guide<\/a> will discuss how to implement Consent Mode itself, either through a <a href=\"#the-consent-management-platform\">Consent Management Platform (CMP)<\/a>, <a href=\"#patching-the-cmp-manually-with-a-custom-template\">manually with a custom template<\/a>, or with a hybrid of the two. The <a href=\"#adjusting-tags-to-work-with-bcm\">second part of the guide<\/a> covers how to adjust your tags to fire only when appropriate consent is granted.<\/p>\n<p>This article will focus on a <strong>Google Tag Manager<\/strong> implementation first and foremost. If you\u2019re using just Google Tag, go ahead and read this guide as much of it is still very relevant. However, you should also consult <a href=\"https:\/\/developers.google.com\/tag-platform\/security\/guides\/consent\">the official guide<\/a>.<\/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=\"basic-consent-mode-the-basics\">Basic Consent Mode: the basics<\/h2>\n<p>Basic Consent Mode (BCM) isn\u2019t really a <em>feature<\/em>. It\u2019s an <em>implementation approach<\/em> that specifies that tags which require consent should never fire until the consent that they require has been <strong>granted<\/strong>.<\/p>\n<p>It\u2019s basically business as usual. This is how you probably orchestrated your tags anyway due to legislation like GDPR and ePrivacy dictating legal bases for processing user data.<\/p>\n<p>However, with BCM, you need to link your tags to how Consent Mode itself has been activated on the page. This means that your Consent Management Platform (CMP) needs to be <strong>integrated<\/strong> with Consent Mode. If it isn\u2019t, you need to engineer the cooperation between your CMP and Consent Mode yourself.<\/p>\n<div style=\"aspect-ratio: 1540 \/ 784;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/consent-default-update.jpg\" title=\"Consent default and update\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"784\" width=\"1540\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/consent-default-update.jpg#ZgotmplZ\" alt=\"Consent default and update\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<h3 id=\"the-consent-mode-calls\">The Consent Mode calls<\/h3>\n<p>Consent Mode has two different types of calls.<\/p>\n<ol>\n<li><strong>Default<\/strong> is invoked <em>as early as possible<\/em>. You should use the <strong>Consent Initialization &#8211; All Pages<\/strong> trigger for this. It\u2019s best to set <strong>all consent states to <code>denied<\/code> by default<\/strong>, <em>even<\/em> if you already know the user\u2019s consent choices by the time the default call is made (<a href=\"#the-ideal-approach\">more on this below<\/a>).<\/li>\n<li><strong>Update<\/strong> is invoked <em>as soon as the user makes a choice or their choice is known otherwise<\/em>. While Default should be executed just once per page load, Update can be called multiple times \u2013 basically whenever the user makes a new choice.<\/li>\n<\/ol>\n<p>Both calls take an object as one of the arguments. This object includes the different consent signals and their states. If consent for a specific signal is denied, the value should be <code>\"denied\"<\/code>. If consent has been granted, the value should be <code>\"granted\"<\/code>. Here\u2019s an example where consent is denied by default:<\/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  ad_storage: <span style=\"color:#a50\">\"denied\"<\/span>,\n  analytics_storage: <span style=\"color:#a50\">\"denied\"<\/span>,\n  ad_user_data: <span style=\"color:#a50\">\"denied\"<\/span>,\n  ad_personalization: <span style=\"color:#a50\">\"denied\"<\/span>\n}\n<\/code><\/pre>\n<\/div>\n<blockquote>\n<p>We will be ignoring all the custom consent signals (<code>funcionality_storage<\/code>, <code>security_storage<\/code> etc.) as they are not officially part of Consent Mode.<\/p>\n<\/blockquote>\n<p>When consent is then granted for analytics, for example, the Update call would be sent with this object:<\/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  ad_storage: <span style=\"color:#a50\">\"denied\"<\/span>,\n  analytics_storage: <span style=\"color:#a50\">\"granted\"<\/span>, <span style=\"color:#aaa;font-style:italic\">\/\/ Consent granted for analytics\n<\/span><span style=\"color:#aaa;font-style:italic\"\/>  ad_user_data: <span style=\"color:#a50\">\"denied\"<\/span>,\n  ad_personalization: <span style=\"color:#a50\">\"denied\"<\/span>\n}\n<\/code><\/pre>\n<\/div>\n<h3 id=\"the-ideal-approach\">The ideal approach<\/h3>\n<p>Here is what I consider the ideal approach. We will be covering this in more detail in subsequent steps of the guide. It\u2019s important to understand that this approach requires a cooperative CMP. If the Consent Management Platform has a quirky integration with Consent Mode, it\u2019s possible you\u2019ll need to pick up the slack and control Consent Mode calls yourself using the appropriate template.<\/p>\n<blockquote>\n<p>The <strong>Default<\/strong> call should always happen on the <strong>Consent Initialization &#8211; All Pages<\/strong> trigger, and it should set all consent signals to <code>\"denied\"<\/code>.<\/p>\n<\/blockquote>\n<div style=\"aspect-ratio: 1376 \/ 668;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/consent-default.jpg\" title=\"Consent Default\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"668\" width=\"1376\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/consent-default.jpg#ZgotmplZ\" alt=\"Consent Default\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You might ask why not set the consent signals to <code>\"granted\"<\/code> already in the Default call, in case that information is available in the cookies (or other browser storage) the CMP sets. Setting defaults to <code>\"denied\"<\/code>, in my opinion, is the most elegant and most consistent approach. By relying <em>solely<\/em> on Update calls, you eliminate possible race conditions that emerge from the consent information not being available at Default time.<\/p>\n<blockquote>\n<p><strong>If consent is known already when the GTM container loads<\/strong>, the <strong>Update<\/strong> call should happen immediately after the <strong>Default<\/strong> call, also on the <strong>Consent Initialization<\/strong> trigger. The <strong>Update<\/strong> call should be immediately followed by a <code>dataLayer.push<\/code> call with a custom event (e.g. <code>gtm_consent_update<\/code>) and details about the consent states. This event is used for triggering tags that need consent.<\/p>\n<\/blockquote>\n<div style=\"aspect-ratio: 1300 \/ 654;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/consent-update.jpg\" title=\"Consent Update\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"654\" width=\"1300\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/consent-update.jpg#ZgotmplZ\" alt=\"Consent Update\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>By running the Default and Update calls with the latter coming immediate after the former, you ensure that all GTM tags can make use of the most current consent states as soon as they are set to fire.<\/p>\n<blockquote>\n<p>If consent is <strong>set<\/strong> or <strong>changed<\/strong> by the user later, or if the consent state is only known once the CMP has loaded, for example, the <strong>Update<\/strong> call should happen immediately when the state of these consent signals is known. Again, this <strong>Update<\/strong> call should be immediately followed by a <code>dataLayer.push<\/code> as explained above.<\/p>\n<\/blockquote>\n<div style=\"aspect-ratio: 1526 \/ 840;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/consent-update-click.jpg\" title=\"Consnet update upon click\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"840\" width=\"1526\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/consent-update-click.jpg#ZgotmplZ\" alt=\"Consnet update upon click\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>In the screenshot above, the Consent Update call is done by a GTM custom template (<a href=\"#patching-the-cmp-manually-with-a-custom-template\">see below<\/a>) that fires on the <code>consent_banner_click<\/code> event.<\/p>\n<blockquote>\n<p>As you can see, the consent update happens already on the <code>consent_banner_click<\/code> event. This is because GTM is specially engineered to immediately apply changes to consent states if the custom template uses the dedicated template APIs (<a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/templates\/api#setdefaultconsentstate\"><code>setDefaultConsentState<\/code><\/a> and <a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/templates\/api#updateconsentstate\"><code>updateConsentState<\/code><\/a>).<\/p>\n<\/blockquote>\n<p>The ideal approach thus makes use of GTM\u2019s templates to engineer consent. Relying on <code>gtag<\/code> alone does work, but it introduces potential <em>race conditions<\/em> where the consent state takes longer than anticipated to be set.<\/p>\n<p>In the rest of the guide, we\u2019ll deconstruct this ideal approach and look at it from the viewpoint of how most CMPs work.<\/p>\n<h2 id=\"the-consent-management-platform\">The Consent Management Platform<\/h2>\n<p>I cannot recommend any CMPs over others. I\u2019ve always preferred to orchestrate interactions with Consent Mode manually, using a custom template (<a href=\"#patching-the-cmp-manually-with-a-custom-template\">see below<\/a>), but there are many CMPs that have their own custom templates that do the job, more or less.<\/p>\n<blockquote>\n<p>Generally, I\u2019d recommend loading the CMP <strong>outside GTM<\/strong>, before Google Tag Manager loads. This is because in some cases GTM is blocked by ad and content blockers, which means your CMP is never loaded at all. This poses a risk in case you have data collection subject to user consent happening outside GTM.<\/p>\n<\/blockquote>\n<p>In any case, when working with a CMP, you need to be careful how much of Consent Mode logic you delegate to the CMP library itself, as it\u2019s often loaded <strong>asynchronously<\/strong>. Asynchronous loading means that the browser initiates the load but then proceeds to execute other tasks in the queue. In other words, there\u2019s no guarantee <em>when<\/em> the CMP has actually loaded and is ready to implement Consent Mode.<\/p>\n<p>Regardless of how the CMP works, here is how I recommend engineering Consent Mode:<\/p>\n<ol>\n<li>\n<p>Use a GTM custom template to set the <strong>Default<\/strong> to <code>\"denied\"<\/code> across the board, and have it fire on the <strong>Consent Initialization &#8211; All Pages<\/strong> trigger. Set the <strong>Tag Priority<\/strong> of this tag to <code>10<\/code>, for example.<\/p>\n<\/li>\n<li>\n<p>Use a GTM custom template to fire an <strong>Update<\/strong> call on <strong>Consent Initialization &#8211; All Pages<\/strong> trigger <em>if<\/em> the user has already established consent previously and this is available in browser cookies or <code>localStorage<\/code>. Adjust the states from <code>\"denied\"<\/code> to <code>\"granted\"<\/code> for all signals whose consent has been granted (you might need to use variables to pull in the consent state from cookies or <code>localStorage<\/code> or the global <code>window<\/code> object).<\/p>\n<\/li>\n<li>\n<p>Use a GTM custom template to fire an <strong>Update<\/strong> call whenever the user adjusts their consent choices.<\/p>\n<\/li>\n<\/ol>\n<p>Now, ideally, it would be the CMP\u2019s <strong>own<\/strong> custom template that handles all of the above. However, CMPs often lack a proper GTM template, or they opt to use <code>gtag<\/code> instead of using the dedicated template APIs. In this case, it might be best to <a href=\"#patching-the-cmp-manually-with-a-custom-template\">orchestrate Consent Mode manually<\/a>.<\/p>\n<p>As a positive example, the <a href=\"https:\/\/tagmanager.google.com\/gallery\/#\/owners\/digidays\/templates\/cookiebanners-gtm-template\">Cookiebanners.nl<\/a> template handles this nicely. You need to set a tag created with this template to fire on the <strong>Consent Initialization &#8211; All pages<\/strong> trigger. The tag will then automatically run the Default call when it first fires, followed by an Update call <strong>if the Cookiebanners.nl consent states are available in a browser cookie<\/strong>. Later, if the user adjusts their consent choices, the Cookiebanners.nl JavaScript library runs a <code>gtag('consent', 'update', ...)<\/code> call to update consent states, followed by a <code>dataLayer.push()<\/code> with an event that can be used to trigger tags with.<\/p>\n<div style=\"aspect-ratio: 1322 \/ 402;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/cookiebanners.jpg\" title=\"Cookiebanners.nl\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"402\" width=\"1322\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/cookiebanners.jpg#ZgotmplZ\" alt=\"Cookiebanners.nl\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<h3 id=\"instructions-for-cmp-designers-on-how-to-implement-consent-mode\">Instructions for CMP designers on how to implement Consent Mode<\/h3>\n<p>If you are working for a CMP or shopping around for a CMP that works ideally with Consent Mode, here are the features it should have:<\/p>\n<ol>\n<li>\n<p>It needs a <strong>dedicated GTM Custom Template<\/strong> that utilizes the custom template consent APIs: <a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/templates\/api#setdefaultconsentstate\"><code>setDefaultConsentState<\/code><\/a> and <a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/templates\/api#updateconsentstate\"><code>updateConsentState<\/code><\/a>. The first should be called immediately when a tag built with the template fires (call it just once per page load, though!), and the second should be called immediately after this, <em>if consent is already known<\/em>. If the user changes their consent settings, <code>updateConsentState<\/code> should be called again. These APIs are <strong>special<\/strong> in that they immediately toggle the consent states in Google Tag Manager instead of having to wait for the container to process a <code>gtag()<\/code> call.<\/p>\n<\/li>\n<li>\n<p>The custom template needs to push a <strong>Data Layer event<\/strong> as soon as any <strong>Update<\/strong> call is made. This is because the Consent Update call itself <strong>cannot be used as a GTM trigger!<\/strong>. If you want to trigger tags when the user\u2019s consent choices are known or when they change, the CMP <strong>must<\/strong> push an event to <code>dataLayer<\/code> that can then be used as the trigger event. The <code>dataLayer.push()<\/code> call could look like this, for example:<\/p>\n<\/li>\n<\/ol>\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>.dataLayer.push({\n  event: <span style=\"color:#a50\">'gtm_consent_update'<\/span>,\n  analytics_storage: <span style=\"color:#a50\">'granted'<\/span>,\n  ad_storage: <span style=\"color:#a50\">'denied'<\/span>,\n  ad_user_data: <span style=\"color:#a50\">'denied'<\/span>,\n  ad_personalization: <span style=\"color:#a50\">'denied'<\/span>\n});\n<\/code><\/pre>\n<\/div>\n<ol start=\"3\">\n<li>The CMP should ideally have an option to suppress the initial <strong>Default<\/strong> and <strong>Update<\/strong> calls, in case the site admin wants to take full control over these vital flows by using their own custom template.<\/li>\n<\/ol>\n<p>For inspiration, see how the <a href=\"https:\/\/github.com\/digidays\/cookiebanners-gtm-template\">Cookiebanners.nl template has been created<\/a>. Full disclosure, I helped build it.<\/p>\n<h3 id=\"patching-the-cmp-manually-with-a-custom-template\">Patching the CMP manually with a custom template<\/h3>\n<p>If you want to take control over at least the crucial initialization flow, you can use my <a href=\"https:\/\/tagmanager.google.com\/gallery\/#\/owners\/gtm-templates-simo-ahava\/templates\/consent-mode\">Consent Mode (Google + Microsoft Tags)<\/a> template available in the <a href=\"https:\/\/tagmanager.google.com\/gallery\/#\/\">Community Template Gallery<\/a>.<\/p>\n<blockquote>\n<p>If you do this, it\u2019s important that the <strong>CMP doesn\u2019t interact with Consent Mode itself<\/strong>, otherwise you might have a situation where multiple, often conflicting Update or Default calls happen. The CMP\u2019s job is to write the user\u2019s consent choices into browser storage (cookies or <code>localStorage<\/code> for example), and then push an event to <code>dataLayer<\/code> that can be used to trigger the custom template tag with.<\/p>\n<\/blockquote>\n<p>Here\u2019s an example of an ideal setup:<\/p>\n<ol>\n<li>Create a new <strong>Default<\/strong> tag with my template.<\/li>\n<li>Set the trigger as <strong>Consent Initialization &#8211; All Pages<\/strong>.<\/li>\n<li>Set all consent signals to <code>\"denied\"<\/code>.<\/li>\n<li>Set the Tag Priority to <code>10<\/code>.<\/li>\n<\/ol>\n<div style=\"aspect-ratio: 1854 \/ 1140;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/custom-template-default.jpg\" title=\"Custom template - default\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1140\" width=\"1854\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/custom-template-default.jpg#ZgotmplZ\" alt=\"Custom template - default\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<ol>\n<li>Next, create a new <strong>Update<\/strong> tag with it.<\/li>\n<li>Set it to fire on the <strong>Consent Initialization &#8211; All Pages<\/strong> trigger.<\/li>\n<li>Block this tag from firing in case the user\u2019s consent choice is not yet known.<\/li>\n<li>Set the consent signals to <code>\"denied\"<\/code> or <code>\"granted\"<\/code> dynamically using variables. Typically this information is stored in a browser cookie or <code>localStorage<\/code> (read the CMP documentation to know for sure).<\/li>\n<li>Toggle the <strong>Push dataLayer event<\/strong> option ON, so that the tag generates an event that you can use to fire your marketing tags.<\/li>\n<\/ol>\n<div style=\"aspect-ratio: 1840 \/ 1844;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/example-custom-template-approach.jpg\" title=\"Example custom template approach\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1844\" width=\"1840\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/example-custom-template-approach.jpg#ZgotmplZ\" alt=\"Example custom template approach\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<div style=\"aspect-ratio: 988 \/ 300;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/push-datalayer-event-option.jpg\" title=\"push-datalayer-event-option.jpg\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"300\" width=\"988\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/push-datalayer-event-option.jpg#ZgotmplZ\" alt=\"push-datalayer-event-option.jpg\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>With these two tags in place, you are handling the critical initial load and configuration of Consent Mode.<\/p>\n<p>When the user then interacts with the consent banner, the CMP should push an event to <code>dataLayer<\/code> that signals a change in the stored consent states. This push should happen <strong>after<\/strong> it is guaranteed that the stored consent choices have been updated.<\/p>\n<p>You can then simply configure the <strong>Update tag<\/strong> that you created earlier to fire with this <code>dataLayer<\/code> event, too. The Update call will happen again, and Consent Mode will be updated with the new consent states.<\/p>\n<div style=\"aspect-ratio: 1850 \/ 694;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/cmp-datalayer-event.jpg\" title=\"CMP dataLayer event\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"694\" width=\"1850\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/cmp-datalayer-event.jpg#ZgotmplZ\" alt=\"CMP dataLayer event\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>A setup like this is pretty much foolproof, guaranteed to work as fast as possible, and you have <strong>full control<\/strong> over how Consent Mode is implemented on the site.<\/p>\n<p>Now that you\u2019re using a CMP that works nicely with Consent Mode, or you\u2019re working with a custom template that handles all the logic, you\u2019re left with the difficult part.<\/p>\n<p>With BCM, you need to <strong>block tags from firing<\/strong> until relevant consent has been granted. This sounds straightforward but it isn\u2019t. Unfortunately, Google has made it extremely difficult to implement BCM vs. the relative ease of working with Advanced Consent Mode.<\/p>\n<p>Before diving into tag-specific configurations, it\u2019s important to be aware of a critical bug that may affect your implementation.<\/p>\n<h3 id=\"bug-with-additional-consent-checks\">Bug with \u201cAdditional Consent Checks\u201d<\/h3>\n<p>There is a very, very annoying bug with <strong>Additional Consent Checks<\/strong> that makes it unusable for tags that have the <strong>Once per page<\/strong> setting toggled on:<\/p>\n<div style=\"aspect-ratio: 1846 \/ 994;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/additional-consent-checks.jpg\" title=\"Additional consent checks\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"994\" width=\"1846\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/additional-consent-checks.jpg#ZgotmplZ\" alt=\"Additional consent checks\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>With this bug, if your tag first tries to fire when consent is <strong>not<\/strong> granted (e.g. at the <strong>Initialization &#8211; All Pages<\/strong> trigger above), it will be rightly blocked by Additional Consent Checks not detecting consent for <code>analytics_storage<\/code>.<\/p>\n<p>However, when the tag then fires on the <code>cmp_consent_banner_click<\/code> and consent <strong>is<\/strong> granted, <strong>it will not fire<\/strong>.<\/p>\n<p>The bug is that Additional Consent Checks <em>consumes<\/em> the \u201cOnce per page\u201d setting. From GTM\u2019s point of view, the tag has already \u201cfired\u201d on that page, even though it was blocked by Additional Consent Checks.<\/p>\n<p>This sucks, and it means that for <em>Once per page<\/em> tags you need to use trigger logic to control the tag firing instead.<\/p>\n<h3 id=\"initialization-tags-that-need-to-fire-just-once-per-page-load\">Initialization tags that need to fire just once per page load<\/h3>\n<p>These are tags like the <strong>Meta pixel<\/strong> or <strong>Google Tag<\/strong> that need to fire as early as possible and that don\u2019t need to access any information that might be available in GTM with a delay.<\/p>\n<p>If you didn\u2019t have Consent Mode in place, you would fire these tags on the <strong>Initialization &#8211; All Pages<\/strong> trigger.<\/p>\n<p>With BCM, the earliest possible moment when it\u2019s certain that consent has been granted would be a <code>dataLayer<\/code> event pushed by the CMP or by a custom template <strong>immediately after<\/strong> consent has been updated with a <code>\"granted\"<\/code> state.<\/p>\n<p>For example, if using <a href=\"#patching-the-cmp-manually-with-a-custom-template\">my custom template<\/a>, the trigger would look like this for tags that need <code>analytics_storage<\/code>:<\/p>\n<div style=\"aspect-ratio: 1160 \/ 568;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/gtm-update-analytics-storage.jpg\" title=\"consent update with analytics_storage\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"568\" width=\"1160\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/gtm-update-analytics-storage.jpg#ZgotmplZ\" alt=\"consent update with analytics_storage\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<blockquote>\n<p><code>{{DLV - analytics_storage}}<\/code> is a Data Layer variable that points to the name <code>analytics_storage<\/code>, because that\u2019s what the custom template uses to reference consent states.<\/p>\n<\/blockquote>\n<p>If you add this trigger to your <strong>Once per page<\/strong> tags, they will only fire when consent is granted for <code>analytics_storage<\/code>. For tags that need <code>ad_storage<\/code>, create a new trigger and adjust accordingly.<\/p>\n<p>You do not need to add Additional Consent Checks, and you do not need to add a blocking trigger to these tags. They will only fire when appropriate consent is granted \u2013 your trigger takes care of that.<\/p>\n<h3 id=\"initialization-tags-that-might-need-to-fire-multiple-times\">Initialization tags that might need to fire multiple times<\/h3>\n<p>This is also relatively easy. Let\u2019s say you have an initialization tag that needs to fire when consent is granted <em>and<\/em> on virtual page views or when the user logs in, for example.<\/p>\n<p>In that case, the tag\u2019s firing setting should be set to <strong>Once per event<\/strong>.<\/p>\n<p>The trigger should be the same trigger as above for cases where the user\u2019s consent state is updated to <code>\"granted\"<\/code>.<\/p>\n<p><em>Additionally<\/em>, the tag should have all the other triggers that you want to add to it.<\/p>\n<p>Finally, set the <strong>Additional Consent Checks<\/strong> setting to the consent state that the tag needs \u2013 <code>analytics_storage<\/code> if following the example above.<\/p>\n<div style=\"aspect-ratio: 1776 \/ 1320;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/google-tag-example.jpg\" title=\"Google Tag example\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1320\" width=\"1776\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/google-tag-example.jpg#ZgotmplZ\" alt=\"Google Tag example\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>In this case, the tag will fire whenever consent is granted for <code>analytics_storage<\/code>. The tag will also fire for all <code>virtual_pageview<\/code> events <em>as long as <code>analytics_storage<\/code> consent has been granted<\/em>.<\/p>\n<h3 id=\"tags-that-must-fire-when-consent-is-granted-but-only-under-special-circumstances\">Tags that must fire when consent is granted but only under special circumstances<\/h3>\n<p>If you use <strong>Additional Consent Checks<\/strong>, tags will be blocked if consent is not granted. However, they will not be automatically fired again when consent is granted at a later stage. You need to engineer this logic yourself.<\/p>\n<p>Some tags need to wait for specific circumstances before they fire. A typical example is an ecommerce <strong>purchase<\/strong> tag, which needs to fire as soon as a <code>purchase<\/code> event is pushed to <code>dataLayer<\/code>.<\/p>\n<p>With tags that need to fire just once, the easiest approach is with a <strong>Trigger Group<\/strong>.<\/p>\n<p>A Trigger Group can take one or more triggers, and it will only activate as soon as all the triggers added to the group have fired.<\/p>\n<p>So, if you have a GA4 <strong>Purchase<\/strong> tag, for example, the Trigger Group would look like this:<\/p>\n<div style=\"aspect-ratio: 1772 \/ 726;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/trigger-group-purchase.jpg\" title=\"Trigger Group - purchase\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"726\" width=\"1772\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/trigger-group-purchase.jpg#ZgotmplZ\" alt=\"Trigger Group - purchase\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>A tag with this trigger will fire only once consent is <code>\"granted\"<\/code> for <code>analytics_storage<\/code> <em>and<\/em> a <code>purchase<\/code> event has been pushed into <code>dataLayer<\/code>.<\/p>\n<p>A tag like this doesn\u2019t need <strong>Additional Consent Checks<\/strong> or blocking triggers, because one of the conditions of it firing is the presence of <code>analytics_storage<\/code> with <code>\"granted\"<\/code> state.<\/p>\n<h3 id=\"tags-that-might-fire-multiple-times\">Tags that might fire multiple times<\/h3>\n<p>Your generic event tags such as <strong>Add to cart<\/strong>, <strong>Scroll<\/strong>, <strong>Login<\/strong>, and <strong>Timer<\/strong> might fire multiple times on the page.<\/p>\n<p>The easiest approach here is to simply use <strong>Additional Consent Checks<\/strong> to block these tags from firing if appropriate consent hasn\u2019t been granted.<\/p>\n<div style=\"aspect-ratio: 1772 \/ 1202;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/example-add-to-cart.jpg\" title=\"Add to cart\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1202\" width=\"1772\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/example-add-to-cart.jpg#ZgotmplZ\" alt=\"Add to cart\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>This configuration means that if consent is not granted, the tag is blocked. When consent is granted, the tag will not automatically fire again. Trigger Groups <strong>will not work here<\/strong> as they can only be activated once per page load.<\/p>\n<p>If you need these tags to automatically fire if consent is granted after the trigger fires, you would need to implement a queue system manually, and that is beyond the scope of this guide. I also don\u2019t think it\u2019s worth the effort \u2013 sometimes it\u2019s OK to have a little data loss in favor of keeping things simple.<\/p>\n<h2 id=\"flowchart\">Flowchart<\/h2>\n<p>Here\u2019s a flowchart of the instructions from the previous section.<\/p>\n<div style=\"aspect-ratio: 2030 \/ 1904;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2025\/05\/flowchart.jpg\" title=\"Basic Consent Mode \u2013 flowchart\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1904\" width=\"2030\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2025\/05\/flowchart.jpg#ZgotmplZ\" alt=\"Basic Consent Mode \u2013 flowchart\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<h2 id=\"edge-cases\">Edge cases<\/h2>\n<p>There are many edge cases to this. The examples above rely on a BCM implementation that mirrors <a href=\"#the-ideal-approach\">my ideal approach<\/a>.<\/p>\n<p>Sometimes the <code>gtm_consent_update<\/code> event cannot be pushed at <strong>Consent Initialization<\/strong> time because the information about the user\u2019s consent choices is simply not available. This is very poor CMP design, but it happens.<\/p>\n<p>Sometimes a <code>virtual_pageview<\/code> event happens already on the initial page load, making it difficult to avoid duplicate page views (one for the <code>gtm_consent_update<\/code> event and one for the <code>virtual_pageview<\/code> event).<\/p>\n<p>Sometimes the CMP refuses to cooperate and pushes a faulty Default or Update call, messing things up.<\/p>\n<p>You can share your questions in the comments, but in most of the cases toggling the CMP\u2019s settings will help fix issues in the CMP\u2019s end. Otherwise, careful trigger design in GTM will ensure that your tags fire only when they should.<\/p>\n<h2 id=\"summary\">Summary<\/h2>\n<p>Implementing Basic Consent Mode is as taxing as reading this guide from top to bottom.<\/p>\n<p>The biggest difficulty is in managing the <em>anticipation flow<\/em>, where tags need to <em>wait<\/em> for granted consent before proceeding with their triggering mechanisms.<\/p>\n<p>Many CMPs load asynchronously, and they use <code>gtag()<\/code> calls instead of custom Google Tag Manager templates to orchestrate Consent Mode interactions. This leads to unnecessary delays, where the tag could have fired a long time ago but now has to wait for a slow CMP to instruct it with the latest Consent Mode states.<\/p>\n<p>For this reason, I\u2019m a huge fan of the DIY approach using custom templates. The CMP\u2019s only role in this is to tell GTM when the user has made a change in their consent choices. The custom template cna read the user\u2019s consent choices from browser storage and activate Consent Mode <em>immediately<\/em>.<\/p>\n<p>If you manage to build your Consent Mode setup like this, then modifying your tags to wait for appropriate consent is quite easy.<\/p>\n<p>If, however, you can\u2019t build the perfect Consent Mode setup and switching to a more cooperative CMP is out of the question, you\u2019ll need to get inventive with triggers and variables.<\/p>\n<p>Please write a comment below if you need clarification about any of the above, or if you have one of those dreaded <em>edge cases<\/em> to share and inquire about.<\/p>\n<\/p><\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>Google\u2019s Consent Mode is a way to control how tags react to the user\u2019s consent for different tracking purposes. It is specifically designed to work with Google\u2019s tags, but especially through Google Tag Manager, you can use Consent Mode\u2019s features and APIs to control other tags, too. Consent Mode comes in two \u201cflavors\u201d: Advanced Consent [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":228395,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12033],"tags":[2959,16490,2059,1430],"dealstore":[],"offerexpiration":[],"class_list":["post-228394","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","tag-basic","tag-consent","tag-guide","tag-mode"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Basic Consent Mode: The Guide - 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=228394\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Basic Consent Mode: The Guide - Som2ny Network\" \/>\n<meta property=\"og:description\" content=\"Google\u2019s Consent Mode is a way to control how tags react to the user\u2019s consent for different tracking purposes. It is specifically designed to work with Google\u2019s tags, but especially through Google Tag Manager, you can use Consent Mode\u2019s features and APIs to control other tags, too. Consent Mode comes in two \u201cflavors\u201d: Advanced Consent [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fivemor.com\/?p=228394\" \/>\n<meta property=\"og:site_name\" content=\"Som2ny Network\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-07T08:04:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/05\/basic-consent-mode-the-guide.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\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=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fivemor.com\/?p=228394#article\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/?p=228394\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\"},\"headline\":\"Basic Consent Mode: The Guide\",\"datePublished\":\"2025-05-07T08:04:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=228394\"},\"wordCount\":3454,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=228394#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/05\/basic-consent-mode-the-guide.jpg\",\"keywords\":[\"Basic\",\"Consent\",\"Guide\",\"Mode\"],\"articleSection\":[\"Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fivemor.com\/?p=228394#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fivemor.com\/?p=228394\",\"url\":\"https:\/\/fivemor.com\/?p=228394\",\"name\":\"Basic Consent Mode: The Guide - Som2ny Network\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=228394#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=228394#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/05\/basic-consent-mode-the-guide.jpg\",\"datePublished\":\"2025-05-07T08:04:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fivemor.com\/?p=228394#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fivemor.com\/?p=228394\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/?p=228394#primaryimage\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/05\/basic-consent-mode-the-guide.jpg\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/05\/basic-consent-mode-the-guide.jpg\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fivemor.com\/?p=228394#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fivemor.com\/?bp_activities=1\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Basic Consent Mode: The Guide\"}]},{\"@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":"Basic Consent Mode: The Guide - 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=228394","og_locale":"en_US","og_type":"article","og_title":"Basic Consent Mode: The Guide - Som2ny Network","og_description":"Google\u2019s Consent Mode is a way to control how tags react to the user\u2019s consent for different tracking purposes. It is specifically designed to work with Google\u2019s tags, but especially through Google Tag Manager, you can use Consent Mode\u2019s features and APIs to control other tags, too. Consent Mode comes in two \u201cflavors\u201d: Advanced Consent [&hellip;]","og_url":"https:\/\/fivemor.com\/?p=228394","og_site_name":"Som2ny Network","article_published_time":"2025-05-07T08:04:48+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/05\/basic-consent-mode-the-guide.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fivemor.com\/?p=228394#article","isPartOf":{"@id":"https:\/\/fivemor.com\/?p=228394"},"author":{"name":"admin","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371"},"headline":"Basic Consent Mode: The Guide","datePublished":"2025-05-07T08:04:48+00:00","mainEntityOfPage":{"@id":"https:\/\/fivemor.com\/?p=228394"},"wordCount":3454,"commentCount":0,"publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"image":{"@id":"https:\/\/fivemor.com\/?p=228394#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/05\/basic-consent-mode-the-guide.jpg","keywords":["Basic","Consent","Guide","Mode"],"articleSection":["Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fivemor.com\/?p=228394#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fivemor.com\/?p=228394","url":"https:\/\/fivemor.com\/?p=228394","name":"Basic Consent Mode: The Guide - Som2ny Network","isPartOf":{"@id":"https:\/\/fivemor.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fivemor.com\/?p=228394#primaryimage"},"image":{"@id":"https:\/\/fivemor.com\/?p=228394#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/05\/basic-consent-mode-the-guide.jpg","datePublished":"2025-05-07T08:04:48+00:00","breadcrumb":{"@id":"https:\/\/fivemor.com\/?p=228394#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fivemor.com\/?p=228394"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/?p=228394#primaryimage","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/05\/basic-consent-mode-the-guide.jpg","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/05\/basic-consent-mode-the-guide.jpg","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/fivemor.com\/?p=228394#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fivemor.com\/?bp_activities=1"},{"@type":"ListItem","position":2,"name":"Basic Consent Mode: The Guide"}]},{"@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\/228394","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=228394"}],"version-history":[{"count":0,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/228394\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/media\/228395"}],"wp:attachment":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=228394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=228394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=228394"},{"taxonomy":"dealstore","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fdealstore&post=228394"},{"taxonomy":"offerexpiration","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fofferexpiration&post=228394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}