GA4 14 min read

GA4 Consent Mode v2: Complete Implementation Guide for 2025

Step-by-step guide to implementing Google Consent Mode v2 in GA4 and GTM — covering Basic and Advanced modes, CMP integration, and how to verify modeled data is working correctly.

A
Aumlytics Team
·

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.

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:

SignalPurposeRequired for
analytics_storageGA4 measurement cookiesGA4 data collection
ad_storageAd measurement cookies (Google Ads, Floodlight)Conversion tracking
ad_user_dataSending user data to Google for adsEnhanced Conversions
ad_personalizationPersonalised advertisingRemarketing audiences
functionality_storageSite functionality cookiesLogin, preferences
security_storageSecurity cookiesFraud 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:

  1. ✅ GA4 property with a web data stream configured
  2. ✅ GTM container installed on your site
  3. ✅ A Consent Management Platform (CMP) — e.g., Cookiebot, OneTrust, Consentik, CookieYes
  4. ✅ 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.


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):

  1. In GTM → Triggers → New
  2. Trigger Type: Consent Initialization
  3. Name it: Consent Initialization - All Pages

This trigger fires before any other tag, including before the CMP loads.

  1. GTM → Tags → New
  2. Tag Type: Consent ModeSet Default Consent State
  3. 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
  1. Trigger: Consent Initialization - All Pages
  2. 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

Most major CMPs have official GTM templates. These handle the gtag('consent', 'update', {...}) call automatically when users make choices.

  1. GTM → Templates → Search Gallery
  2. Search for your CMP (e.g., “Cookiebot”, “OneTrust”, “CookieYes”)
  3. 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>

Your GA4 configuration tag must have consent checking enabled.

  1. Open your GA4 Configuration Tag in GTM
  2. Click Advanced SettingsConsent Settings
  3. Set:
    • Require additional consent for tag to fire: analytics_storage
  4. 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:

  1. GTM → Preview → enter your site URL
  2. In the Tag Assistant window, look for the Consent tab
  3. 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

What to check in the Consent tab:

  • analytics_storage starts as denied
  • 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

  1. GA4 → ReportsAcquisitionTraffic Acquisition
  2. Click the pencil icon (Customise report) → add Consent Mode status as a dimension

Or check the Consent overview report:

  1. GA4 → AdminData collection and modificationData streams
  2. 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

  1. Google Ads → ToolsConversions
  2. Click a conversion action → check Conversion source
  3. 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.

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).


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.

#ga4#consent-mode#gdpr#ccpa#cmp#google-tag-manager#privacy

Want This Implemented Correctly?

Let our team apply these concepts to your specific setup — with QA validation and 30 days of support.