Published Aug 15, 2026
Consent Mode v2 After Page Load: Will Blocked Tags Fire When Consent Is Granted?
A practical Cookiebot and GTM guide to what happens when a visitor grants consent after Container Loaded, including default and update states, Basic vs Advanced mode, platform-specific tag behavior, persistence, and reliable testing.
Category: Consent Management · By Mikalai Sasau
This guide explains what actually happens when a visitor grants consent after Google Tag Manager has already processed Container Loaded. It separates a Consent Mode v2 state update from a GTM trigger, then shows how to implement the correct late-consent flow with Cookiebot for Google Analytics 4, Google Ads, Meta Pixel, LinkedIn Insight Tag, Microsoft Advertising UET, and Custom HTML tags.
Practical answer: a consent update changes the consent state from that point forward, but it does not replay an earlier GTM event. Google tags running in Advanced Consent Mode normally adapt without a second firing trigger. A tag that was prevented from executing by Additional Consent Checks, an exception trigger, Cookiebot auto-blocking, or another Basic-mode gate needs a new eligible event - usually cookie_consent_update - or a later page load.
Executive summary
The apparent contradiction in this problem comes from treating two separate mechanisms as if they were the same. Consent Mode changes state. It tells consent-aware tags whether storage, advertising user data, personalization, and analytics storage are currently allowed. Google Tag Manager triggers execution. It evaluates a tag when an event such as gtm.js, gtm.dom, a click, a purchase, or a CMP custom event occurs.
If a tag was evaluated at Container Loaded and failed an Additional Consent Check, changing the state from denied to granted does not make GTM travel back in time and process Container Loaded again. Cookiebot documents this explicitly and recommends a Custom Event trigger named cookie_consent_update for consent-gated page-load tags. The new event gives GTM a new moment at which to evaluate the tag against the now-current consent state.
Google tags are the important exception because Google Analytics, Google Ads conversion and remarketing tags, Floodlight, and Conversion Linker have built-in consent checks. In Advanced Consent Mode, they are allowed to execute under a denied default, avoid disallowed storage, and send consent-labelled measurements without cookies. When the visitor later grants consent, the existing Google tag adapts. You normally should not fire a second GA4 page view merely because the state changed.
In Basic Consent Mode, the tag itself is blocked until consent is granted. If it was blocked on the first page-load event, it must be launched on a later event. The same rule applies to Meta, LinkedIn, ordinary Custom HTML tags, and any third-party template that does not natively respond to the consent update. Microsoft Advertising UET now supports its own Advanced Consent Mode, but it can only adapt if UET was allowed to load under an explicit denied default.
Consent Mode also does not store the visitor's choice. Cookiebot stores and restores that choice, while Google Consent Mode receives a default and an update on each relevant page. This is why Tag Assistant may correctly show denied first and granted later - even for a returning visitor. The sequence is healthy when the denied default exists before measurement, the stored or newly submitted choice updates it promptly, and no disallowed tag or cookie escapes in between.
The central rule: a state change is not an event replay
GTM tags fire in response to events. A Page View trigger is evaluated when the browser begins loading the page; in Tag Assistant this is commonly represented by Container Loaded and the underlying gtm.js event. Consent Initialization runs earlier, specifically so a CMP can establish consent before ordinary tags are evaluated.
Suppose a Meta Pixel Custom HTML tag has these settings:
- Trigger:
All Pages; - Additional Consent Check:
ad_storagemust begranted; - Current consent at
Container Loaded:denied.
GTM evaluates the tag at that event and blocks it. Five seconds later, the visitor clicks Accept all. Cookiebot changes ad_storage to granted, but the All Pages event has already passed. The tag remains unfired unless one of the following happens:
- a new page loads and the Page View trigger occurs again;
- a later event already assigned to the tag occurs;
- Cookiebot emits
cookie_consent_updateand the tag is configured to use that Custom Event trigger; - site code deliberately invokes the vendor's own consent-aware API or loader.
This is not a Cookiebot limitation. It follows GTM's event model: a trigger listens for a specific event, and a tag is evaluated when that event occurs. Cookiebot's custom event is the bridge between a late user choice and tags that need another evaluation opportunity.
| Mechanism | What it changes | What it does not do |
|---|---|---|
consent default | Establishes what is allowed before the visitor's choice is known. | It does not collect consent and does not store the choice. |
consent update | Changes the current consent state after a choice, withdrawal, or restored preference. | It does not replay gtm.js, gtm.dom, a purchase, or any other past event. |
| Built-in consent check | Lets a consent-aware tag change its own storage and request behavior. | It does not mean consent is granted, and it does not automatically make every third-party tag consent-aware. |
| Additional Consent Check | Prevents GTM from firing a tag unless all required types are granted at that trigger event. | It does not schedule an automatic retry when consent changes later. |
cookie_consent_update | Creates a new GTM event after Cookiebot has made consent data available. | It is not itself a Google Consent Mode parameter and should not be confused with the consent state. |
Default consent and consent update
The default state answers what may happen before a decision
Google says that no Consent Mode values are set automatically. The site or CMP must establish them before measurement commands and ordinary tags. In GTM, a CMP template should normally run on Consent Initialization - All Pages. In a direct implementation, the gtag('consent', 'default', ...) command must be queued before the Google tag or GTM snippet sends measurement.
Consent Mode v2 uses four signals that should not be collapsed into one:
ad_storagecontrols advertising-related browser storage;analytics_storagecontrols analytics-related browser storage;ad_user_datacommunicates consent for sending user data to Google for advertising purposes;ad_personalizationcommunicates consent for personalized advertising.
Cookiebot also maps its Preferences and Necessary categories to functionality_storage, personalization_storage, and security_storage. These can be useful for broader tag governance, but they do not replace the four Consent Mode v2 signals expected by Google.
The update answers what this visitor chose
The update must be sent as soon as the visitor confirms a choice. Google specifically recommends processing it on the page where the interaction occurs and before a page transition. If an accept button immediately reloads or redirects the page, the browser can cancel measurements caused by the update, and the first consented session may lose important context.
An update can also move consent from granted back to denied when the visitor changes preferences. The same implementation should therefore handle acceptance, rejection, granular choices, and withdrawal rather than wiring only an Accept all button.
What wait_for_update can and cannot fix
The optional wait_for_update value gives an asynchronously loaded CMP a short window to provide an update before Google sends data. A value such as 500 milliseconds is a common starting point, not a universal target.
It does not persist consent, create a CMP event, re-run a blocked third-party tag, or repair a default that was set after measurement. Treat it as a short race-condition allowance for Google tags, not as a general consent orchestration system.
Built-in consent checks and Additional Consent Checks
GTM exposes both concepts in the same Consent Settings panel, which makes them look interchangeable. They are not.
| Type of check | Who implements the behavior | Behavior when consent is denied | Late-grant result |
|---|---|---|---|
| Built-in consent check | The tag template or vendor code. | The tag can still execute but changes storage and request behavior. Google tags use this for Advanced Consent Mode. | The running consent-aware tag can adapt to the updated state without a second page-load trigger. |
| Additional Consent Check | GTM as a firing gate. | The tag does not execute when any required consent type is not granted at that event. | The old event is not re-evaluated; the tag needs a new matching event. |
| CMP or site-level script blocking | Cookiebot automatic/manual blocking or site code. | The browser never executes the blocked script. | The CMP must release the script, call a vendor API, or produce an event that launches it. |
Google lists the Google tag, GA4, Google Ads conversion and remarketing, Floodlight, and Conversion Linker among tags with built-in consent support. Third-party tags generally need explicit configuration. Even when a community template displays consent information, verify what it actually does: declaring a consent dependency is different from implementing a vendor-side cookieless mode.
Additional checks are evaluated at the moment a tag is triggered. If several types are required, all of them must be granted. Do not add every available type by habit. For example, ad_personalization is not the same permission as basic conversion measurement, and ad_user_data is explicitly defined around sending advertising user data to Google. For Meta or LinkedIn, Cookiebot's ad_storage mapping is a practical Marketing-category gate; organizations with more granular policies can define vendor-specific custom consent types.
Basic and Advanced Consent Mode after a late grant
| Question | Basic Consent Mode | Advanced Consent Mode |
|---|---|---|
| Does the Google tag load before a choice? | No. It is blocked until consent is granted. | Yes. It loads under the default state. |
| What is sent while consent is denied? | No Google tag data, including no consent-status request. | Consent-labelled measurements without disallowed cookies or identifiers. |
| What happens when consent becomes granted? | The blocked tag must be launched on a new event, typically a CMP event. | The already running Google tag adapts, can use permitted storage, and sends full data for subsequent measurement. |
| Should a second GA4 page view be fired on the consent update? | A page-view tag may need to fire for the first time after the grant. | Usually no. Firing another page view merely because consent changed can create duplication. |
| Modeling basis | Google describes a more general model. | Google can use advertiser-specific consent-mode modeling when eligibility requirements are met. |
| Most common implementation error | The tag is blocked at Container Loaded but has no CMP event trigger. | Additional checks or auto-blocking unintentionally convert the setup into Basic mode. |
The correct architecture is a deliberate choice. A team may intentionally choose Basic mode because it does not want any vendor request before consent. Another team may approve Advanced mode for Google measurement. The error is not choosing one or the other; it is configuring one mode and testing it as if it were the other.
For a broader diagnostic framework, including policy warnings and the difference between a green GTM tag and a correct live consent chain, see metricfixer's Consent Mode v2 diagnostics guide. Regional defaults should also follow the website's actual consent model rather than a copied country list; metricfixer's global website consent signals review provides the wider implementation context.
What happens for GA4, Google Ads, Meta, LinkedIn, and Microsoft UET
| Platform or tag | Native response to a late consent update | When a separate CMP trigger is needed |
|---|---|---|
| GA4 / Google tag | Yes in Advanced mode, through built-in consent checks. | When the tag was fully blocked for Basic mode. |
| Google Ads / Conversion Linker | Yes in Advanced mode, through built-in consent checks. | When the tag was fully blocked; conversion events still need their real business trigger. |
| Meta Pixel | Not from Google Consent Mode alone. Meta provides its own revoke/grant API. | When the Pixel is held back as a GTM or Cookiebot Marketing tag. |
| LinkedIn Insight Tag | Do not assume it listens to Google consent updates. | Use a CMP event for a blocked base tag and consent-gate conversion events. |
| Microsoft Advertising UET | Yes when UET Advanced Consent Mode is implemented and the tag is allowed to load under denied. | When UET is intentionally blocked for Basic mode. |
| Generic Custom HTML | No automatic behavior unless the custom code implements it. | Whenever the tag failed its original consent gate and still needs to run after a grant. |
Google Analytics 4
GA4 tags have built-in consent checks. In Advanced mode, the Google tag can fire on its normal Initialization or Page View trigger while analytics_storage is denied. It can send measurements without analytics cookies, then respond to the later update by writing permitted cookies and ensuring later events include full measurement data.
Do not attach an extra GA4 page_view event to cookie_consent_update merely to make GA4 "fire after consent" when the configuration tag already ran in Advanced mode. The update is a state change, not a second page view. Google notes that the tag may write cookies or send events in response to the update, but it does not define Consent Mode as a universal replay queue for every event that happened earlier.
In Basic mode, the Google tag is not present before consent. Its first execution therefore needs a post-consent event. For a page-load configuration tag, use Cookiebot's custom event and require analytics_storage. Keep ordinary GA4 event tags on their actual interaction or ecommerce events, with appropriate consent checks. A form submission is not recreated simply because analytics consent is granted later.
Google Ads and Conversion Linker
Google Ads conversion, remarketing, Floodlight, and Conversion Linker tags also have built-in checks. In Advanced mode they may execute while ad_storage is denied, avoid disallowed advertising storage, and send cookieless or redacted signals. After consent is granted, the Google tag adapts to the new ad_storage, ad_user_data, and ad_personalization values.
A consent update is not a conversion event. Do not fire a purchase, lead, or signup conversion tag on cookie_consent_update unless the business event genuinely occurs at that moment. If the conversion occurred before consent, GTM does not automatically replay it after a later grant. In Advanced mode a consent-labelled cookieless conversion signal may already have been sent; in Basic mode no signal was sent if the tag was blocked. Any deliberate delayed-event queue needs its own event time, deduplication, expiration, and approved privacy logic.
Meta Pixel
A Meta Pixel Custom HTML tag does not become consent-aware simply because GTM contains Google Consent Mode. The safest Basic-mode pattern is:
- classify the base Pixel as Marketing;
- require
ad_storageor an approved Meta-specific consent type; - trigger the base tag on
cookie_consent_update; - set the tag to fire once per page;
- keep Lead, Purchase, and other event tags on their real business events, with the same consent gate.
Meta separately documents a vendor API that can pause Pixel fires with fbq('consent', 'revoke') and resume them with fbq('consent', 'grant'). Meta says revoke should be called on every page. This is an alternative architecture: the Pixel bootstrap is loaded, Meta's own consent state is denied, and Cookiebot later calls grant. It is not Google Advanced Consent Mode, and it should be used only when the organization has approved loading the Meta library before marketing consent.
// Run only after the Meta Pixel bootstrap has created fbq.
// Use this architecture instead of fully blocking the Pixel tag.
fbq('consent', 'revoke');
fbq('init', 'META_PIXEL_ID');
fbq('track', 'PageView');
window.addEventListener('CookiebotOnConsentReady', function () {
if (Cookiebot.consent.marketing) {
fbq('consent', 'grant');
} else {
fbq('consent', 'revoke');
}
}, false);
Do not combine this pattern with a Pixel tag that is completely blocked and then assume fbq exists. Choose one architecture: either release the Pixel after consent, or load it in Meta's revoked state and update Meta directly.
LinkedIn Insight Tag
The standard LinkedIn Insight Tag should be treated as a non-Google marketing tag. LinkedIn's current technical documentation describes installing the Insight Tag, conversion tracking, and first-party click ID handling such as li_fat_id; the official materials reviewed for this article do not establish that the standard browser tag subscribes to Google Consent Mode updates. The operational conclusion is therefore to gate it explicitly rather than assume it will adapt.
Use cookie_consent_update for the base Insight Tag so it can load on the first page immediately after Marketing consent. Use Additional Consent Checks as a second control. Event-specific LinkedIn conversion tags should remain attached to their actual conversion events. If a conversion event occurs while the tag is blocked, a later consent grant does not make GTM reproduce that event.
Microsoft Advertising UET, often called the Bing tag
Microsoft Advertising now supports Basic and Advanced UET Consent Mode. In Advanced mode, UET must be allowed to load early with an explicit ad_storage default of denied. Microsoft says that if a CMP blocks UET completely, Advanced Consent Mode cannot work because the tag never gets a chance to read and apply the denied state.
Cookiebot has built-in UET support and passes the Marketing consent state to an existing window.uetq object. When the visitor grants consent, UET receives granted and adapts in real time. In this architecture, do not add a second UET page-load tag on the Cookiebot event.
window.uetq = window.uetq || [];
window.uetq.push('consent', 'default', {
ad_storage: 'denied'
});
// With Cookiebot's UET integration enabled, later updates are passed
// automatically when window.uetq exists.
For UET Basic mode, hold the tag back and fire it after Marketing consent, using the same event-retry logic as other blocked tags.
Practical Cookiebot implementation in Google Tag Manager
The following blueprint assumes Cookiebot is deployed through its GTM Community Template. Do not also load a second Cookiebot script directly in the site template. Duplicate CMP implementations can produce conflicting defaults, repeated events, and unpredictable banner behavior.
- Install or update the Cookiebot CMP template. Use the current template and enter the Domain Group ID.
- Use Consent Initialization - All Pages. The CMP tag must establish defaults before ordinary Initialization and Page View tags.
- Enable Google Consent Mode v2. Configure the four Google signals and any regional defaults according to the approved consent model.
- Create Cookiebot's custom event trigger. Use the exact event name below.
Trigger type: Custom Event
Event name: cookie_consent_update
This trigger fires on: All Custom Events
- Decide Basic or Advanced for each consent-aware platform. Do not apply one global assumption to every tag.
- For Advanced Google tags, keep normal triggers. Do not add Additional Consent Checks merely because the default is denied. Built-in checks are what let the tags adapt.
- For Basic Google tags, replace page-load triggers. A Google tag that is intentionally blocked must use
cookie_consent_updateor an equivalent post-consent event. - For Meta, LinkedIn, and ordinary Custom HTML base tags, use the CMP event. Add the relevant consent gate and set the tag firing option to once per page.
- Keep business-event tags on business events. A Purchase tag belongs on the purchase event, not on the consent event. Apply consent as a condition, not as a substitute trigger.
- Test a stored choice. On the next page, Cookiebot should restore the decision early enough that the intended tags behave correctly without showing the banner again.
| Tag | Recommended trigger in Advanced mode | Recommended trigger in Basic or strict-gate mode | Consent configuration |
|---|---|---|---|
| Cookiebot CMP | Consent Initialization - All Pages | Sets defaults and updates; no ordinary marketing gate. | |
| Google tag / GA4 configuration | Initialization - All Pages or the site's standard Google tag trigger | cookie_consent_update | Built-in checks in Advanced; require analytics_storage only when intentionally using Basic. |
| Google Ads / Conversion Linker | Normal platform trigger | cookie_consent_update for page-load/base tags | Built-in checks in Advanced; add only purpose-appropriate checks in Basic. |
| Meta Pixel base | Vendor revoke/grant pattern if approved | cookie_consent_update | Marketing gate, commonly ad_storage or a custom Meta type. |
| LinkedIn Insight Tag base | Not assumed | cookie_consent_update | Marketing gate, commonly ad_storage or a custom LinkedIn type. |
| Microsoft UET | Early page-load trigger with UET default denied | cookie_consent_update | UET uses ad_storage; Cookiebot can pass updates automatically. |
| Purchase / Lead / Signup event tag | The real dataLayer or application event | Consent check evaluated at the business event; do not replace it with the CMP event. | |
A useful safeguard for base tags is Once per page. Cookiebot can emit consent-related events when a stored choice becomes ready and when a visitor changes it. Without duplicate protection, a base pixel or page-view tag can initialize twice in one document.
Practical Cookiebot implementation in site code
When Cookiebot is loaded directly in the page and automatic blocking is used alongside GTM, Cookiebot documents this order: Google Consent Mode default, GTM, then Cookiebot. The consent and GTM scripts must be exempt from Cookiebot's automatic blocker so that the default exists before measurement and GTM can load. This example is a technical starting point, not a universal policy configuration.
<!-- 1. Consent Mode default: before GTM -->
<script data-cookieconsent="ignore">
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag('consent', 'default', {
ad_storage: 'denied',
analytics_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied',
functionality_storage: 'denied',
personalization_storage: 'denied',
security_storage: 'granted',
wait_for_update: 500
});
// Optional: enable only if this matches the approved measurement design.
gtag('set', 'ads_data_redaction', true);
</script>
<!-- 2. Google Tag Manager -->
<script data-cookieconsent="ignore">
(function(w,d,s,l,i){
w[l]=w[l]||[];
w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});
var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),
dl=l!='dataLayer'?'&l='+l:'';
j.async=true;
j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;
f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXXX');
</script>
<!-- 3. Cookiebot with automatic blocking -->
<script
id="Cookiebot"
src="https://consent.cookiebot.com/uc.js"
data-cbid="YOUR-DOMAIN-GROUP-ID"
data-blockingmode="auto"
type="text/javascript">
</script>
Cookiebot automatically sends the Google consent update after the visitor submits a choice. Do not add a second hard-coded update handler unless there is a documented reason; duplicate updates make sequencing harder to debug.
Directly embedded non-Google scripts
For scripts outside GTM, Cookiebot can hold them as plain text and execute them only when the required category is granted. This provides the script-release event that an ordinary browser script otherwise lacks.
<script type="text/plain" data-cookieconsent="marketing">
// Load or initialize the approved marketing tag here.
</script>
For dynamically inserted content in a single-page application, Cookiebot exposes Cookiebot.runScripts(). It evaluates eligible marked scripts and executes each only once. Route-level analytics and advertising events still need their own consent-aware event design.
An explicit Cookiebot-to-dataLayer bridge
A site that loads Cookiebot directly can push its own deterministic event for third-party GTM tags. Register the listener before an asynchronously loaded Cookiebot script has a chance to emit the ready event. Cookiebot documents that CookiebotOnConsentReady fires both after a new submission and when an existing consent cookie has been loaded.
window.dataLayer = window.dataLayer || [];
window.addEventListener('CookiebotOnConsentReady', function () {
window.dataLayer.push({
event: 'cookiebot_consent_ready',
consent_preferences: Cookiebot.consent.preferences,
consent_statistics: Cookiebot.consent.statistics,
consent_marketing: Cookiebot.consent.marketing,
consent_has_response: Cookiebot.hasResponse
});
}, false);
In GTM, create a Custom Event trigger for cookiebot_consent_ready and add conditions such as consent_marketing equals true. Do not deploy this bridge in parallel with another integration that already pushes the same logical event unless duplicate handling is explicit.
How the choice persists between pages
Google's developer documentation is explicit: Consent Mode does not save the choice. The CMP or site must persist it and call the appropriate update on later pages. Cookiebot stores the consent state in its first-party CookieConsent cookie and makes the state available on later page requests and visits. Its developer API exposes category values such as Cookiebot.consent.statistics and Cookiebot.consent.marketing.
A healthy returning-visitor page can therefore show this sequence:
- the page establishes its regional default, often
denied; - Cookiebot reads the stored consent;
- Cookiebot updates the state to the saved values;
- consent-aware tags adapt and gated tags receive the Cookiebot event;
- ordinary page and business events continue under the restored state.
Seeing denied followed almost immediately by granted is not automatically an error. The questions are whether the default existed before measurement, whether the restored update arrived promptly, and whether any tag used disallowed storage during the interval.
Persistence becomes more complex across subdomains, separate domains, embedded checkouts, and single-page applications. Verify the cookie domain, Cookiebot domain group, cross-domain consent-sharing configuration, and each application's own consent loader. A choice stored on www.example.com should not be assumed to exist automatically on an unrelated checkout domain.
Why Tag Assistant shows denied first and granted later
Tag Assistant is showing a timeline, not one final field. Google's verification instructions tell testers to inspect the earliest Consent event for the on-page default and the most recent Consent event for the update. A first-visit acceptance should normally contain both.
| Timeline point | Expected observation | Interpretation |
|---|---|---|
| Consent Initialization | Default values are available, commonly denied for the applicable region. | The site has defined the pre-choice behavior. |
| Initialization / Container Loaded | Advanced Google or UET tags may fire; strict-gated tags may be blocked. | Fired does not mean granted, and blocked does not mean permanently broken. |
| Visitor submits choice | A later Consent event shows the selected granted and denied values. | The CMP has communicated the actual choice. |
| Cookiebot custom event | Previously blocked page-load tags can fire if their checks now pass. | This is the new trigger opportunity, not a replay of Container Loaded. |
| Next page | Stored values are restored early; the banner may not appear. | The CMP, not Consent Mode itself, persisted the choice. |
Two common false alarms follow from implementation details. First, Cookiebot's GTM template can register defaults through GTM's internal consent APIs rather than a literal dataLayer command, so the absence of a readable consent default item in a raw dataLayer dump does not prove failure. Second, a green Google tag under denied consent can be correct Advanced-mode behavior.
Testing without drawing the wrong conclusion from Tag Assistant
A reliable test uses separate clean sessions. Do not click through several choices in one browser state and treat the final result as proof for every path.
| Test path | Consent checks | Tag checks | Network and storage checks |
|---|---|---|---|
| Fresh visit, no interaction | Earliest default exists before measurement. | Advanced tags follow denied behavior; Basic and third-party tags remain blocked. | No disallowed cookies. Requests match the intended Basic or Advanced architecture. |
| Reject all | Latest update remains denied for relevant categories. | Strict-gated tags do not run. Advanced tags may continue restricted measurement. | No new advertising or analytics cookies where storage is denied. |
| Accept all after several seconds | Update appears on the same page. | Consent-aware tags adapt; Cookiebot event launches eligible blocked base tags once. | Permitted cookies and full requests appear only after the grant; no duplicate page view. |
| Statistics only | analytics_storage changes while advertising values remain denied. | GA4 follows the chosen architecture; Meta, LinkedIn, and remarketing remain gated. | Analytics and marketing storage differ as intended. |
| Reload and second page | Stored choice is restored promptly. | Base tags fire once under the saved state. | No banner-dependent gap, duplicate initialization, or temporary unauthorized cookie. |
| Withdraw consent | A new update changes granted values to denied. | Future behavior changes; vendor-specific revoke logic runs where used. | New restricted requests stop or become cookieless; cookie cleanup is checked separately. |
In Tag Assistant
- Inspect the earliest Consent event and confirm all four Consent Mode v2 fields are present.
- Inspect the latest Consent event after each banner choice.
- Open each tag and distinguish Built-In Consent Checks from Required Additional Consent.
- Confirm the event on which the tag fired:
gtm.js,cookie_consent_update, a route event, or a real conversion event. - Check for duplicate base tags or page views after the update.
- Test the published production container as well as the draft workspace.
In browser developer tools
- Clear cookies, local storage, and prior consent before each fresh-visit test.
- Preserve the Network log and note request timestamps relative to the consent click.
- Filter separately for Google Analytics, Google Ads, Meta, LinkedIn, and Microsoft endpoints.
- Use the Application or Storage panel to verify when cookies appear and whether withdrawal removes or merely stops future use.
- Throttle the network and CPU to expose races hidden by a fast office connection.
Tag Assistant answers whether GTM observed consent and how it evaluated tags. Network tools answer what the browser actually sent. Storage tools answer what was written. All three are needed. A green row, a visible banner, or a gcd parameter alone is not a complete consent test.
Google Ads diagnostics are a later account-level signal, not a real-time debugger. Google says the active Consent Mode status can take about 48 hours to appear and in some cases up to two weeks. First verify the live browser chain; only then attribute a remaining account warning to detection delay.
Common failure patterns
| Failure | What the team sees | Corrective action |
|---|---|---|
| CMP runs after ordinary tags | Consent looks correct later, but early cookies or requests already occurred. | Move Cookiebot to Consent Initialization or place the inline default before GTM. |
GTM Custom HTML uses gtag('consent', ...) for the CMP | The command appears in the queue but may miss the next GTM event. | Use Cookiebot's template or a custom template built with GTM consent APIs. |
| Advanced Google tag has Additional Consent Checks | The tag is blocked and no cookieless measurement exists. | Remove the extra gate if Advanced mode is the approved architecture. |
Basic page-load tag uses only All Pages | It remains under Tags Not Fired after the visitor accepts. | Replace the page-load trigger with cookie_consent_update. |
Both All Pages and CMP event are attached carelessly | Returning visitors generate two page views or two base-pixel initializations. | Use one deterministic trigger or add explicit once-per-page and state logic. |
| Conversion tag uses the CMP event | A consent click is counted as a lead or purchase. | Keep the conversion on its business event and use consent only as a gate. |
| Cookiebot auto-blocking holds back Google or UET in an intended Advanced setup | The platform never receives the denied-state signal. | Exempt only the consent-aware script after confirming it respects denied storage. |
| Choice updates only after a reload | The first consented page or session_start context is incomplete. | Send the update on the current page before navigation. |
| Consent is not restored on another template or domain | Some pages return to denied or unset state. | Audit every entry template, subdomain, checkout, and cross-domain consent configuration. |
Only raw dataLayer is inspected | Cookiebot defaults appear missing despite a working template. | Use the Tag Assistant Consent tab and GTM's registered consent state. |
Decision checklist
- [ ] Identify whether the tag has a real built-in consent response or only a GTM firing requirement.
- [ ] Document whether the intended platform implementation is Basic or Advanced.
- [ ] Establish the default before Google tags and ordinary GTM triggers.
- [ ] Send the update on the same page immediately after the visitor confirms a choice.
- [ ] For every page-load tag blocked by Additional Consent Checks, provide a new CMP event trigger.
- [ ] Do not trigger a conversion merely because consent changed.
- [ ] Protect base tags from duplicate firing on stored-choice and change events.
- [ ] Restore the saved choice on every page, subdomain, and application surface in scope.
- [ ] Test fresh, reject, granular, accept, reload, return, and withdrawal paths.
- [ ] Verify GTM state, network requests, and browser storage separately.
Methodology and sources
This article was reviewed on 15 August 2026. It is based primarily on current official Google Tag Platform and Google Tag Manager documentation, Cookiebot implementation and developer documentation, Meta Pixel documentation, Microsoft Advertising UET materials, and LinkedIn technical documentation. The platform comparison distinguishes documented vendor behavior from implementation conclusions: in particular, LinkedIn is treated as a consent-gated third-party tag because the official materials reviewed do not document the standard Insight Tag as a listener for Google's consent updates.
- Google Tag Platform: Consent mode overview
- Google Tag Platform: Set up consent mode on websites
- Google Tag Manager consent mode support
- Google: Verify consent mode implementation
- Google Tag Manager page view trigger order
- Cookiebot: Google Tag Manager deployment
- Cookiebot: Configuring tags for Basic Consent Mode
- Cookiebot: Implementing Google Consent Mode
- Cookiebot: Checking a Consent Mode implementation
- Cookiebot: GTM and automatic cookie blocking
- Cookiebot developer resources and consent events
- Cookiebot: Microsoft UET Consent Mode
- Meta Pixel: cookie consent API
- Microsoft Advertising: Advanced Consent Mode for UET
- Microsoft Advertising UET Consent Mode with GTM
- LinkedIn Marketing API: Insight Tag and conversion tracking
- LinkedIn: first-party click IDs and Insight Tag cookies
This article is for technical and operational information only and is not legal advice. The correct consent defaults, regional rules, disclosures, and permitted pre-consent behavior depend on the website's jurisdictions, purposes, contracts, and approved privacy policy. metricfixer is not affiliated with Google, Cookiebot, Meta, Microsoft, LinkedIn, or the other platforms mentioned. Product behavior and documentation may change after publication. Cookiebot editorial links in this article include the requested referral parameter; executable Cookiebot script URLs are left in their functional form.
