If you haven’t implemented Consent Mode v2 yet, Google has been quietly downgrading your ad attribution since March 2024. Businesses running Google Ads without it face degraded remarketing audiences, broken conversion modelling, and incomplete Analytics data for users who decline cookies.
This guide covers everything you need to implement Consent Mode v2 correctly — from understanding the two consent signals to verifying modelled data is flowing properly.
What Is Consent Mode v2?
Consent Mode is a framework that lets your site communicate user consent choices to Google tags. Instead of blocking Google tags entirely when a user declines cookies, Consent Mode allows tags to fire in a “cookieless” mode — collecting aggregate, anonymised signals that Google uses to model conversions you would otherwise lose.
Version 2 adds two new consent types on top of the original four:
| Signal | Purpose | Required for |
|---|---|---|
analytics_storage | GA4 measurement cookies | GA4 data collection |
ad_storage | Ad measurement cookies (Google Ads, Floodlight) | Conversion tracking |
ad_user_data | Sending user data to Google for ads | Enhanced Conversions |
ad_personalization | Personalised advertising | Remarketing audiences |
functionality_storage | Site functionality cookies | Login, preferences |
security_storage | Security cookies | Fraud detection |
The two new ones — ad_user_data and ad_personalization — are what make this “v2”. You must include them or Google will treat your implementation as non-compliant.
Official reference: Google Consent Mode documentation
Basic Mode vs Advanced Mode
This is where most implementations go wrong. There are two modes, and they behave very differently:
Basic Mode
Tags do not fire at all until the user grants consent. No cookieless pings, no modelling.
- Simpler to implement
- No data collected for users who decline
- Google cannot model conversions for non-consenting users
- Acceptable if you only care about consenting users
Advanced Mode
Tags fire immediately on page load in a restricted, cookieless state. When consent is granted, tags upgrade to full measurement.
- More complex
- Google receives anonymised signals from ALL users (including those who decline)
- Google’s conversion modelling works, recovering ~20-30% of “lost” conversions
- Required for full Consent Mode v2 benefit
- Required if you want to use Google’s conversion modelling for EU traffic
Recommendation: Use Advanced Mode if you run Google Ads and care about attribution.
Prerequisites
Before you start:
- ✅ GA4 property with a web data stream configured
- ✅ GTM container installed on your site
- ✅ A Consent Management Platform (CMP) — e.g., Cookiebot, OneTrust, Consentik, CookieYes
- ✅ Access to your GTM container with Publish rights
If you don’t have a CMP, you’ll need one. Google requires a certified CMP for EEA traffic if you use Google Ads. See the certified CMP list.
Step 1: Set Default Consent State in GTM
The default consent state fires before any CMP banner loads. This tells Google what to assume before the user makes a choice.
For Advanced Mode, set all ad-related signals to denied by default, and optionally set analytics_storage to denied as well (required for strict GDPR compliance):
Create a Consent Initialization Trigger
- In GTM → Triggers → New
- Trigger Type: Consent Initialization
- Name it:
Consent Initialization - All Pages
This trigger fires before any other tag, including before the CMP loads.
Create the Default Consent Tag
- GTM → Tags → New
- Tag Type: Consent Mode → Set Default Consent State
- Configure the signals:
// Advanced Mode defaults (recommended for EU traffic)
analytics_storage: denied
ad_storage: denied
ad_user_data: denied
ad_personalization: denied
functionality_storage: granted // usually fine to grant
security_storage: granted // usually fine to grant
- Trigger: Consent Initialization - All Pages
- Tag firing priority: 999 (must fire first)
Important: If you’re using a CMP template from the GTM Community Template Gallery (like Cookiebot or OneTrust), this step may be handled automatically by the CMP template. Check the template documentation before adding manual defaults.
Step 2: Integrate Your CMP
Option A — Use a GTM Community Template (Recommended)
Most major CMPs have official GTM templates. These handle the gtag('consent', 'update', {...}) call automatically when users make choices.
- GTM → Templates → Search Gallery
- Search for your CMP (e.g., “Cookiebot”, “OneTrust”, “CookieYes”)
- Add the template and follow its specific setup instructions
Cookiebot example:
- Add the Cookiebot CMP template
- It automatically fires
gtag('consent', 'update')based on which categories the user accepts in the Cookiebot banner
Option B — Manual Implementation
If your CMP doesn’t have a GTM template, implement consent updates manually.
Your CMP should call this when a user grants or updates consent:
// Called by your CMP when user makes a choice
function updateGoogleConsent(analyticsGranted, adsGranted) {
gtag('consent', 'update', {
'analytics_storage': analyticsGranted ? 'granted' : 'denied',
'ad_storage': adsGranted ? 'granted' : 'denied',
'ad_user_data': adsGranted ? 'granted' : 'denied',
'ad_personalization': adsGranted ? 'granted' : 'denied',
});
}
In GTM, create a Custom HTML tag that fires on a consent-update dataLayer event:
<script>
// Listen for CMP consent events pushed to dataLayer
window.dataLayer = window.dataLayer || [];
// Example: your CMP pushes an event like this
// dataLayer.push({ event: 'consent_updated', analytics: true, ads: false })
(function() {
var originalPush = window.dataLayer.push;
window.dataLayer.push = function() {
originalPush.apply(this, arguments);
var event = arguments[0];
if (event && event.event === 'consent_updated') {
gtag('consent', 'update', {
analytics_storage: event.analytics ? 'granted' : 'denied',
ad_storage: event.ads ? 'granted' : 'denied',
ad_user_data: event.ads ? 'granted' : 'denied',
ad_personalization: event.ads ? 'granted' : 'denied',
});
}
};
})();
</script>
Step 3: Verify the GA4 Tag Honours Consent
Your GA4 configuration tag must have consent checking enabled.
- Open your GA4 Configuration Tag in GTM
- Click Advanced Settings → Consent Settings
- Set:
- Require additional consent for tag to fire:
analytics_storage
- Require additional consent for tag to fire:
- Save and publish
For Google Ads tags:
- Require:
ad_storage,ad_user_data
Screenshot reference: In GTM tag settings, the Consent Settings section is at the bottom of the tag editor under Advanced Settings. You’ll see a dropdown to add required consent types.
Step 4: Test With GTM Preview Mode
Before publishing, test in GTM Preview:
- GTM → Preview → enter your site URL
- In the Tag Assistant window, look for the Consent tab
- Verify the consent state timeline:
- On page load: all signals should show
denied(from Step 1) - After accepting in the CMP: signals should update to
granted
- On page load: all signals should show
What to check in the Consent tab:
analytics_storagestarts asdenied- After consent grant, it changes to
granted - The GA4 tag shows as “Blocked by consent” before grant, then fires after
Using Chrome DevTools to Verify
Open DevTools → Console and run:
// Check current consent state
dataLayer.filter(d => d[0] === 'consent')
You should see entries like:
// Default state (before CMP)
['consent', 'default', {
analytics_storage: 'denied',
ad_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied'
}]
// Updated state (after user accepts)
['consent', 'update', {
analytics_storage: 'granted',
ad_storage: 'granted',
ad_user_data: 'granted',
ad_personalization: 'granted'
}]
Step 5: Check GA4 for Modelled Data
Once live, GA4 uses consent signals to model conversions for users who declined. You can see this data in GA4 reports.
Verify in GA4 Reports
- GA4 → Reports → Acquisition → Traffic Acquisition
- Click the pencil icon (Customise report) → add Consent Mode status as a dimension
Or check the Consent overview report:
- GA4 → Admin → Data collection and modification → Data streams
- Click your web stream → Consent settings
You should see:
- ✅
ad_user_data— On - ✅
ad_personalization— On - ✅
analytics_storage— On - ✅
ad_storage— On
Verify in Google Ads
- Google Ads → Tools → Conversions
- Click a conversion action → check Conversion source
- Look for “Modelled conversions” label — this confirms Consent Mode v2 is working
Official reference: Verify Consent Mode is working
Common Mistakes
❌ Not Including the Two New Signals
Many agencies implemented Consent Mode v1 and didn’t update to v2. If you’re missing ad_user_data and ad_personalization from your consent calls, you’re non-compliant.
Fix: Update your gtag('consent', 'default') and gtag('consent', 'update') calls to include all six signals.
❌ Setting Default to granted for EEA Users
Some implementations set defaults to granted before the CMP loads, which violates GDPR. The whole point of Advanced Mode is to default to denied and upgrade after consent.
Fix: Ensure your default consent tag (Step 1) sets all ad signals to denied.
❌ CMP Not Triggering the Update
If your CMP fires the banner but Google never receives a consent update call, everything stays denied even when users accept. This is a common integration bug.
Fix: In GTM Preview, click “Accept All” in your CMP and watch the Consent tab. If no update appears, your CMP integration isn’t working.
❌ GA4 Tag Firing Before Consent Initialization
If your GA4 tag fires before the consent defaults are set, the first hit goes out without any consent context.
Fix: Give your consent initialization tag a priority of 999 (higher fires first in GTM).
GA4 Consent Mode Diagnostic Checklist
Use this before going live:
□ Default consent state tag exists with Consent Initialization trigger
□ Priority set to 999 or higher
□ All six consent types included in defaults
□ Ad-related types default to 'denied'
□ CMP template installed in GTM
□ CMP template fires gtag('consent', 'update') correctly
□ GA4 tag has 'analytics_storage' as required consent
□ Google Ads tags have 'ad_storage' and 'ad_user_data' as required
□ Tested in GTM Preview — consent timeline shows denied → granted
□ No direct gtag.js / Google tag scripts outside of GTM
□ Cookieless pings visible in GA4 DebugView for non-consenting users
What Happens to Historical Data?
Nothing — Consent Mode v2 only affects data going forward. Your historical GA4 data is unchanged. However, once live, you’ll notice session counts slightly increase in reports as Google’s modelling fills in previously missing data.
Need Help With Your Implementation?
If you’re running Google Ads in the EU and don’t have Consent Mode v2 in place, you’re losing attribution data every day. We implement Consent Mode v2 as part of every GA4 engagement — including CMP integration, testing, and verification that modelled data is flowing into your Google Ads account.
Book a free consultation to get your consent setup reviewed.