Consent Mode V2: Tags Not Firing After Consent Accepted - Complete Layer 2 Diagnostic
Why your GTM tags won't fire even after users accept consent in Consent Mode V2. Complete Layer 2 implementation diagnostic with console snippets and fixes.
Quick Navigation
You set up Consent Mode V2. Your users click “Accept All Cookies.” But your marketing tags still won’t fire.
The most frustrating part? GTM Preview Mode shows everything working perfectly. Tag Assistant confirms the setup. But the moment you test on the live site with real consent interactions, nothing happens. Zero data. Zero attribution. Zero revenue tracking.
Your ad campaigns are running blind. You’re spending money with no way to measure results.
This is a Layer 2: Implementation failure—and I’ll show you exactly how to diagnose and fix it.
The Consent Mode Paradox
Here’s what you’re seeing:
✅ GTM container loads successfully (Layer 1: Infrastructure) ✅ Consent banner appears and users can interact with it ✅ User clicks “Accept All” and banner disappears ❌ But marketing tags never fire (Layer 2: Implementation failure)
You check GTM Preview Mode and everything fires correctly there. You look at your trigger configuration and it seems right. You even hired a developer or tried AI tools like Claude/ChatGPT, but the suggestions didn’t work.
Why? Because Consent Mode V2 failures aren’t about whether tags fire—they’re about when and under what conditions they fire.
Understanding the 4-Layer Diagnostic Framework
Before we dive into the fix, let’s understand where Consent Mode V2 sits in the diagnostic hierarchy:
Layer 1: Infrastructure - Is the GTM container loading? Layer 2: Implementation ← You are here Layer 3: Transmission - Is data reaching Google servers? Layer 4: Processing - Is data appearing in reports?
Consent Mode V2 is a Layer 2 implementation issue because:
- The container loads fine (Layer 1 ✓)
- Tags are configured (Layer 2 ?)
- But the consent state and trigger logic are misconfigured (Layer 2 ✗)
This means we need to focus on trigger configuration, consent state management, and tag firing sequences.
Why Consent Mode V2 Fails After Acceptance
Problem 1: Missing Consent Update Triggers
The most common issue: Your marketing tags are configured to fire on page views, but they don’t have consent status triggers.
Here’s what happens:
- Page loads → GTM container fires
- Default consent state = “denied” (ad_storage: denied, analytics_storage: denied)
- User clicks “Accept All”
- Consent state updates to “granted”
- But your tags already tried to fire on page load when consent was “denied”
- Tags don’t re-fire after consent update
Why Preview Mode worked: In Preview Mode, you often load the page after consent is already set, or the consent simulator doesn’t replicate real-world timing issues.
Problem 2: Consent State Not Updating in dataLayer
Your consent management platform (CMP) might not be properly pushing consent updates to the GTM dataLayer.
Expected behavior:
// On consent acceptance, this should appear in dataLayer:
{
'event': 'consent_update',
'ad_storage': 'granted',
'analytics_storage': 'granted',
'ad_user_data': 'granted',
'ad_personalization': 'granted'
}
If this event never fires, GTM never knows consent was granted.
Problem 3: Tag Firing Order Issues
Even if consent updates, your tags might be configured to fire only on the initial page view—not on the consent update event.
Incorrect setup:
- Trigger: All Pages (Page View)
- No consent requirement
Correct setup:
- Trigger: All Pages (Page View) + Consent Update
- Consent requirement: Requires ad_storage = granted
Layer 2 Diagnostic Process: 4 Steps
Step 1: Check Consent State in dataLayer
Open your browser console on the live site (not Preview Mode) and run:
// Check all dataLayer consent events
dataLayer.filter(e => e.event && e.event.includes('consent'))
What you should see:
[
{
event: 'consent_default',
ad_storage: 'denied',
analytics_storage: 'denied'
},
{
event: 'consent_update',
ad_storage: 'granted',
analytics_storage: 'granted'
}
]
If you DON’T see consent_update after clicking “Accept All”:
→ Your CMP isn’t pushing consent updates to the dataLayer.
→ Fix: Configure your CMP (OneTrust, CookieBot, etc.) to push consent events to GTM.
If you see consent_update but tags still don’t fire:
→ Continue to Step 2.
Step 2: Verify ad_storage State
Check the current consent state stored in GTM:
// Check current ad_storage consent state
google_tag_manager['GTM-XXXXXX'].dataLayer.get('ad_storage')
Replace GTM-XXXXXX with your actual GTM container ID.
Expected result after consent acceptance:
"granted"
If you get "denied" or undefined:
→ Consent state isn’t being stored properly.
→ The default consent configuration is wrong.
Step 3: Test Consent Trigger Configuration
In GTM, create a custom trigger:
Trigger Configuration:
- Trigger Type: Custom Event
- Event Name:
consent_update - This trigger fires on: All Custom Events
Then attach this trigger to a test tag (like a GA4 event) and test in Preview Mode.
What should happen:
- Load page with default consent (denied)
- Click “Accept All”
consent_updateevent fires- Your test tag fires on the
consent_updateevent
If the trigger doesn’t fire:
→ Your CMP isn’t sending the consent_update event.
→ Fix your CMP integration.
Step 4: Validate Tag Firing Sequence
In Preview Mode, watch the sequence panel carefully:
Correct sequence:
- Consent Initialization (default: denied)
- Page View → Tags requiring consent DON’T fire
- Consent Update (ad_storage: granted)
- Tags requiring ad_storage fire on consent_update
Incorrect sequence:
- Page View → All tags fire immediately (ignoring consent)
- Consent Update → Nothing happens (tags already fired)
If you see the incorrect sequence, your tags aren’t configured with consent requirements.
The Complete Fix: 3-Part Implementation
Part 1: Configure Default Consent State
In GTM, create a Custom HTML tag that fires on Consent Initialization:
<script>
// Set default consent state BEFORE GTM loads
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('consent', 'default', {
'ad_storage': 'denied',
'analytics_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied',
'wait_for_update': 500 // Wait 500ms for consent choice
});
</script>
Tag Settings:
- Trigger: Consent Initialization (fires before all other tags)
- Tag firing priority: 99 (highest priority)
This ensures tags wait for consent before firing.
Part 2: Configure CMP to Push Consent Updates
Your consent platform must push updates to GTM’s dataLayer. Here’s the format:
For OneTrust:
// OneTrust callback
OptanonWrapper = function() {
window.dataLayer = window.dataLayer || [];
// On consent acceptance
window.dataLayer.push({
'event': 'consent_update',
'ad_storage': 'granted',
'analytics_storage': 'granted',
'ad_user_data': 'granted',
'ad_personalization': 'granted'
});
}
For CookieBot:
// CookieBot callback
window.addEventListener('CookiebotOnAccept', function (e) {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'consent_update',
'ad_storage': 'granted',
'analytics_storage': 'granted',
'ad_user_data': 'granted',
'ad_personalization': 'granted'
});
}, false);
Part 3: Update Marketing Tag Triggers
For every marketing tag (Google Ads, Meta Pixel, GA4 enhanced measurement):
1. Add Consent Update Trigger
Create trigger:
- Trigger Type: Custom Event
- Event Name:
consent_update - Fire on: All Custom Events
2. Add Consent Requirement
In your tag settings:
- Advanced Settings → Consent Settings
- Require additional consent for tag to fire:
ad_storage
3. Update Existing Page View Triggers
Add the consent_update trigger to existing page view triggers:
- Trigger: All Pages OR Consent Update
- This allows tags to fire either on initial page load (if consent pre-granted) or on consent acceptance
Testing the Fix: Real-World Validation
Don’t trust Preview Mode alone. Test on the live site:
Test 1: Fresh Session (No Prior Consent)
- Open incognito/private window
- Navigate to your site
- Open browser console
- Run:
dataLayer.filter(e => e.event && e.event.includes('consent')) - Should see
consent_defaultwith denied states - Click “Accept All”
- Should see
consent_updatewith granted states - Open Network tab → Filter by “google-analytics.com” or “googleadservices.com”
- Should see requests AFTER consent acceptance
Test 2: Tag Assistant Validation
- Install Google Tag Assistant Chrome extension
- Navigate to your site
- Accept cookies
- Tag Assistant should show:
- ✅ Tags loaded with consent granted
- ✅ No “missing consent” errors
- ✅ Requests successfully sent
Test 3: GA4 DebugView Real-Time Check
- Open GA4 → Configure → DebugView
- Load your site in new tab
- Accept consent
- DebugView should show events arriving AFTER consent acceptance
- Check event parameters include
gcs: G111(consent granted)
Common Mistakes That Break Consent Mode V2
Mistake 1: Consent Script Loads After GTM
Problem: GTM fires tags before consent state is set.
Fix: Ensure consent initialization happens in the <head> BEFORE the GTM container snippet:
<head>
<!-- Consent initialization FIRST -->
<script>
gtag('consent', 'default', {...});
</script>
<!-- Then GTM container -->
<script>(function(w,d,s,l,i){...GTM snippet...})</script>
</head>
Mistake 2: Testing Only in Preview Mode
Problem: Preview Mode doesn’t replicate real consent timing.
Fix: Always test on live site with incognito window, fresh session, no prior consent stored.
Mistake 3: Forgetting ad_user_data and ad_personalization
Problem: Consent Mode V2 requires 4 consent states (not just 2).
Fix: Include all 4 states in both default and update:
ad_storageanalytics_storagead_user_data← New in V2ad_personalization← New in V2
Mistake 4: Not Configuring wait_for_update
Problem: Tags fire before consent banner appears.
Fix: Add wait_for_update: 500 to default consent to give users 500ms to interact with banner before tags fire.
When DIY Doesn’t Work: Layer 3 Complications
Sometimes, even after implementing all of the above, tags still don’t fire. This usually means:
Layer 3: Transmission Issues
- Ad blockers preventing consent scripts
- Network requests blocked by corporate firewalls
- CSP (Content Security Policy) blocking GTM modifications
- CMP conflicts with other JavaScript libraries
Layer 4: Processing Issues
- GA4 not recognizing consent parameters
- Google Ads not receiving conversion signals
- Enhanced conversions requiring additional user data
If you’ve followed this diagnostic and tags still won’t fire, you’re likely dealing with a multi-layer failure that requires comprehensive debugging across infrastructure, implementation, transmission, and processing.
Emergency Consent Mode V2 Recovery
If Campaigns Are Blocked Right Now
Immediate workaround (not recommended long-term):
- In GTM, temporarily disable consent requirements on critical conversion tags
- This allows tracking to resume while you fix the root issue
- Note: This breaks GDPR compliance—use only as emergency measure for hours, not days
Proper emergency fix (call for help):
If your campaigns are completely blocked and you need same-day resolution:
- Emergency GTM Recovery: $497 (response within 4 hours)
- Includes: Consent Mode V2 diagnosis + implementation + testing
- Timeline: Same-day fix for critical revenue blocking issues
Get Emergency Consent Mode Fix →
If You Can Wait 24-48 Hours
Comprehensive GTM Diagnostic: $997
- Complete 4-layer diagnostic (Infrastructure → Implementation → Transmission → Processing)
- Consent Mode V2 implementation
- CMP integration setup
- Testing across browsers and devices
- Documentation for your team
Schedule Comprehensive Diagnostic →
Prevention: Monthly GTM Health Monitoring
Consent Mode issues don’t appear overnight. They creep in after:
- CMP updates
- Theme changes
- New plugin installations
- GTM container modifications by other team members
Monthly GTM Health Monitoring: $197/month
- Weekly automated consent state checks
- Alert if consent_update events stop firing
- Monthly reporting on consent acceptance rates
- Priority response if issues detected
Quick Reference: Diagnostic Console Commands
Save these for troubleshooting:
// Check all consent events
dataLayer.filter(e => e.event && e.event.includes('consent'))
// Check current ad_storage state
google_tag_manager['GTM-XXXXXX'].dataLayer.get('ad_storage')
// Monitor consent updates in real-time
dataLayer.push = function(obj) {
Array.prototype.push.call(this, obj);
if (obj.event && obj.event.includes('consent')) {
console.log('Consent Event:', obj);
}
};
// Check if GTM is waiting for consent
google_tag_manager['GTM-XXXXXX'].dataLayer.get('gtm.consent.status')
// Verify consent parameters in GA4 events (check Network tab)
// Look for: gcs=G111 (consent granted) or gcs=G100 (consent denied)
Summary: Fixing Consent Mode V2 Tag Firing
The Problem: Tags won’t fire after consent acceptance despite correct CMP configuration.
The Root Cause: Layer 2 Implementation failure—missing consent update triggers, improper tag configuration, or incorrect consent state management.
The 4-Step Diagnostic:
- Check consent state in dataLayer (
consent_updateevent) - Verify ad_storage state (should be “granted” after acceptance)
- Test consent trigger configuration
- Validate tag firing sequence
The 3-Part Fix:
- Configure default consent state (with wait_for_update)
- Configure CMP to push consent updates to dataLayer
- Update marketing tag triggers (add consent_update trigger + consent requirements)
Testing: Always test on live site with fresh session, not just Preview Mode.
When to Get Help: If implementing this diagnostic doesn’t solve the issue within 2 hours, you likely have a Layer 3 transmission or Layer 4 processing problem requiring comprehensive debugging.
Have Consent Mode V2 tags that won’t fire after user acceptance? Get same-day emergency fix for $497 →
Need a complete GTM diagnostic covering all 4 layers? Schedule comprehensive audit for $997 →
Want to prevent consent issues before they happen? Start monthly monitoring for $197/month →
Posted in Diagnostics, Consent Mode
Tags: GTM, Consent Mode V2, Layer 2, Implementation, GDPR
GTM Setup Services
Emergency GTM recovery and tracking experts. 247+ successful recoveries completed.
Having GTM Tracking Issues?
Get your tracking fixed by the experts. Emergency recovery in 2-4 hours.
Get Emergency GTM Fix - $397