Consent Mode v2 instellen: gids voor GTM, gtag.js en AdSense
Zo stel je Google Consent Mode v2 in: de keuze tussen basic en advanced, de zeven consent-signalen, implementatie via gtag.js of Google Tag Manager, de instellingen van de gratis AdSense-banner en de controle in Tag Assistant. Met instelstappen voor WordPress (Site Kit), Shopify en Next.js en de Google-wijzigingen sinds 2025.
Google Consent Mode v2 geeft de toestemmingsstatus van je bezoekers door aan Google-tags, zodat die hun gedrag daarop aanpassen. In deze gids komen de keuze tussen de basic- en de advanced-variant aan bod, de implementatie via gtag.js of via Google Tag Manager, de instellingen van de gratis AdSense-banner, de controle achteraf en de aanpak per platform (WordPress met Site Kit, Shopify en Next.js). Het kopieerbare consent script staat in stap 2.
Voor wie: websites die Google Analytics, Google Ads of AdSense gebruiken en bezoekers uit de EER, het Verenigd Koninkrijk of Zwitserland hebben. De AdSense-stappen zijn geschreven voor sites die de gratis 'Privacy en berichten'-banner als toestemmingsoplossing gebruiken.
TL;DR: kies basic of advanced, plaats het default consent script BOVEN je GTM-code (stap 2), zet de consent-instelling van elke tag goed (stap 3) en controleer het resultaat in Tag Assistant (stap 4).
Kort samengevat
- Consent Mode is de API waarmee je toestemmingsbanner aan Google-tags doorgeeft wat ze mogen doen. Een banner die de vraag stelt heb je er dus nog steeds bij nodig.
- Er zijn zeven consent-types. Vier daarvan zijn relevant voor advertenties en analytics:
ad_storage,ad_user_data,ad_personalizationenanalytics_storage. - Bij de basic-variant laden Google-tags pas na een keuze van de bezoeker. Bij de advanced-variant laden ze meteen en sturen ze metingen zonder cookies zolang toestemming ontbreekt.
- Plaats het default consent script in je
<head>BOVEN de GTM-container, zodat de standaardstatus bekend is voordat er tags kunnen vuren. - Google-tags zoals GA4, Google Ads en Floodlight hebben een ingebouwde consent check. Voor tags zonder die check, bijvoorbeeld Facebook Pixel of Hotjar, stel je de vereiste toestemming zelf in GTM in.
- Test met Tag Assistant: op het Consent-tabblad zie je de kolommen 'On-page Default' en 'On-page Update'. Blijft dat tabblad leeg, dan staat in mijn ervaring het default-script niet in de pagina of laadt de Google-tag niet.
- Bij geweigerde toestemming kan Google gedrag en conversies modelleren, maar alleen als je account genoeg data verzamelt. De drempels voor GA4 en Google Ads staan verderop in deze gids.
- Gebruik je WordPress met Site Kit, Shopify of Next.js, dan hoef je het script uit stap 2 niet altijd zelf te plaatsen. De sectie per platform beschrijft wat elk systeem al doet en wat je zelf moet regelen.
- Sinds 15 juni 2026 bepaalt alleen nog de parameter
ad_storageof GA4 Google Ads-cookies en -ID's verzamelt; de instelling Google Signals doet dat niet meer.
Wat is Consent Mode v2 van Google?
Consent Mode laat je de toestemmingsstatus van bezoekers doorgeven aan Google, waarna de tags hun gedrag daarop aanpassen. De vraag aan de bezoeker stelt je banner, en Consent Mode vertaalt het antwoord naar parameters waar Google Analytics, Google Ads en Floodlight mee kunnen werken.
De zeven consent-types en wat ze regelen:
| Consent-type | Wat het regelt |
|---|---|
ad_storage |
Opslag zoals cookies of apparaat-ID's voor advertentiedoeleinden |
ad_user_data |
Het sturen van gebruikersgegevens naar Google voor online advertenties |
ad_personalization |
Gepersonaliseerde advertenties |
analytics_storage |
Opslag voor analytics, bijvoorbeeld de duur van een bezoek |
functionality_storage |
Opslag die de werking van de site of app ondersteunt |
personalization_storage |
Opslag voor personalisatie, bijvoorbeeld video-aanbevelingen |
security_storage |
Opslag voor beveiliging, zoals authenticatie en fraudepreventie |
Elk type heeft twee mogelijke waarden: granted of denied.
Wat er gebeurt als toestemming ontbreekt
Staat een type op denied, dan mogen de bijbehorende cookies niet gelezen of geschreven worden. Google-tags sturen dan metingen zonder cookies. Zet je daarnaast ads_data_redaction aan, dan worden advertentie-identifiers in de netwerkverzoeken van Google Ads- en Floodlight-tags geredigeerd zolang ad_storage op denied staat, en lopen die verzoeken via een domein zonder third-party cookies zoals pagead2.googlesyndication.com. Ook pagina-URL's die een klik-identifier zoals gclid of dclid bevatten, worden dan geredigeerd; de aanname dat de volledige URL met klikparameters gewoon meegaat, klopt dus niet. Staat ad_storage op granted, of ontbreekt het consent-commando helemaal, dan doet ads_data_redaction niets.
Basic of advanced: welke variant kies je?
Google onderscheidt twee implementaties. Het verschil zit in het moment waarop de tags laden.
| Basic | Advanced | |
|---|---|---|
| Laden van tags | Geblokkeerd tot de bezoeker een keuze maakt | Direct, met standaardwaarden op denied |
| Data vóór de keuze | Geen Google-tags en geen metingen | Metingen zonder cookies |
| Na toestemming | Volledige meting | Volledige meting |
| Modellering | Algemeen model | Adverteerder-specifiek model |
De advanced-variant levert rijkere modellering op, omdat Google in dat geval iets heeft om op te modelleren: een adverteerder-specifiek model in plaats van een algemeen model, zoals Google het in de uitleg over Consent Mode noemt. Kies je basic, dan laden er geen Google-tags en gaan er geen metingen naar Google tot de bezoeker akkoord gaat. Welke variant bij je site past hangt af van de juridische afweging die je organisatie maakt over meten zonder cookies. De rest van deze gids beschrijft de advanced-variant, want dat is wat het script in stap 2 doet.
Drempels voor gedragsmodellering in GA4
Modellering start niet automatisch. Voor gedragsmodellering in GA4 gelden twee drempelwaarden:
- minstens 1.000 events per dag met
analytics_storage='denied'gedurende minstens 7 dagen - minstens 1.000 dagelijkse gebruikers die events sturen met
analytics_storage='granted'op minstens 7 van de afgelopen 28 dagen
Ook als je die aantallen haalt, is modellering niet gegarandeerd. Google hanteert daarnaast interne criteria, onder meer rond de verhouding tussen nieuwe en terugkerende gebruikers. Voor kleinere sites betekent dit in de praktijk dat de gaten in de data blijven bestaan.
Wat Google verlangt, en sinds wanneer
Wanneer je toestemming nodig hebt, volgt uit de AVG en de ePrivacy-regels. Consent Mode is het kanaal waarlangs die toestemming bij Google terechtkomt, en Google stelt daar eigen eisen bij.
- Vanaf maart 2024 moeten bepaalde functies gebruikerstoestemming binnenhalen volgens het EU-gebruikerstoestemmingsbeleid, waaronder Klantenmatch in combinatie met uploads van winkelverkopen. Google noemt op die pagina meting, advertentiepersonalisatie en remarketing als de functies die je kwijtraakt wanneer je geen toestemmingssignalen deelt. De parameters die daarvoor gelden zijn
ad_user_dataenad_personalization, de twee die in versie 2 zijn toegevoegd. - Voor uitgevers geldt een aparte eis. Sinds 16 januari 2024 heb je voor gepersonaliseerde advertenties in de EER en het Verenigd Koninkrijk een door Google gecertificeerde CMP nodig die met het IAB TCF is geïntegreerd. Voor Zwitserland geldt dat sinds 31 juli 2024. Verkeer van een niet-gecertificeerde CMP komt alleen nog in aanmerking voor beperkte advertenties.
- Het bericht over Europese regelgeving uit 'Privacy en berichten' van AdSense, Ad Manager en AdMob ondersteunt TCF v2.3 en voldoet daarmee aan die eis. Gebruik je een andere CMP, controleer dan of die op de lijst met gecertificeerde CMP's staat.
Implementatie: rechtstreeks in de code of via Tag Manager
Rechtstreeks met gtag.js
Je zet de standaardstatus met een default-commando, dat je afvuurt voordat er meetdata verstuurd wordt:
gtag('consent', 'default', {
'ad_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied',
'analytics_storage': 'denied'
});
Zodra de bezoeker een keuze maakt, stuur je een update-commando met de nieuwe waarden:
gtag('consent', 'update', {
'ad_storage': 'granted',
'ad_user_data': 'granted',
'ad_personalization': 'granted',
'analytics_storage': 'granted'
});
Drie optionele instellingen die hierbij horen:
wait_for_updategeeft in milliseconden aan hoe lang tags moeten wachten op een update-commando. Met de waarde 500 krijgt je toestemmingsoplossing een halve seconde de tijd voordat de tags op de standaardstatus afgaan.regionbeperkt een default-commando tot bepaalde gebieden, met codes volgens ISO 3166-2. Gebruik je meerdere region-commando's die elkaar overlappen, controleer dan in Tag Assistant welke default een bezoeker uit zo'n gebied daadwerkelijk krijgt.gtag('set', 'url_passthrough', true)geeft klik- en sessiegegevens door via URL-parameters wanneer opslag geweigerd is. Het gaat om de parametersgclid,dclid,gclsrc,_glenwbraid. url_passthrough vervangt geen toestemming; eengclidin de URL van de volgende pagina laatad_storageopdeniedstaan.
Via Google Tag Manager
Laad je je banner via de GTM-container, dan gebruik je de API's van Tag Manager in plaats van de gtag-commando's: setDefaultConsentState, updateConsentState en gtagSet. Google schrijft in die documentatie dat je gtag('consent', 'update', ...) niet in plaats van updateConsentState moet gebruiken. Simo Ahava legt uit waarom dat uitmaakt: de template-API's schakelen de toestemmingsstatus in Tag Manager meteen om, terwijl een gtag()-aanroep eerst door de container verwerkt moet worden.
Elke webcontainer heeft standaard de trigger Consent Initialization - All Pages. Die is bedoeld voor tags die de toestemmingsstatus zetten, en vuurt vóór alle andere triggers, ook vóór de Initialization-triggers. Hang je toestemmingsplatform daaraan, dan staan de consent-instellingen vast voordat de rest van je container in beweging komt. Tags die alleen maar vroeg moeten vuren, horen er niet op; daarvoor is de gewone Initialization-trigger. Voor een aantal CMP's heeft Google eigen instructiepagina's in de Tag Manager-help, bijvoorbeeld voor consentmanager.
Stap 1: AdSense consent banner configureren
Open je Google AdSense-dashboard, ga naar Privacy en berichten en klik op de kaart van het berichttype Europese regelgeving op het instellingenicoon. Daar staat het onderdeel Toestemmingsmodus, dus niet in het afzonderlijke bericht zelf.
Controleer deze punten:
- Het bericht over Europese regelgeving staat actief en is gepubliceerd op je site.
- Kies een knopindeling waarin de bezoeker ook kan weigeren. Ik gebruik zelf "Toestemming geven, Geen toestemming geven, Opties beheren". Welke indelingen Google aanbiedt, staat in de hulppagina over het maken van een bericht over Europese regelgeving.
- Achter het instellingenicoon staat Zet de toestemmingsmodus aan voor advertentiedoeleinden aan. Daarmee mogen andere Google-producten de bestaande toestemmingskeuzes uit de EER, het VK en Zwitserland lezen voor advertentieopslag, advertentiepersonalisatie en gebruikersgegevens voor advertenties.
- Meet je ook met Analytics, zet dan Toestemmingsmodus aanzetten voor analysedoeleinden aan. Daarmee verzamelt je bericht ook toestemming voor
analytics_storage. In mijn AdSense-account verscheen dat tweede vinkje pas nadat het eerste aanstond.
Berichten die je in Privacy en berichten maakt, ondersteunen de TCF v2.3-specificatie van het IAB. Je bestaande bericht verandert niet door deze schakelaars; ze regelen alleen wat andere Google-producten met de keuze mogen doen voor advertentiemeting, personalisatie en productoptimalisatie.
Stap 2: Default consent script plaatsen
Dit script definieert de standaardstatus voordat je banner laadt. Alle types starten op denied, behalve security_storage, zodat er geen data verzameld wordt zonder toestemming.
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
// Standaard: alles op denied, behalve security
gtag('consent', 'default', {
'ad_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied',
'analytics_storage': 'denied',
'functionality_storage': 'denied',
'personalization_storage': 'denied',
'security_storage': 'granted',
'wait_for_update': 500
});
</script>
Plaatsing in je <head>
De volgorde luistert nauw:
- Eerst: dit consent script
- Daarna: de GTM container code
Het consent script moet geladen zijn voordat GTM start. Anders kunnen je tags al vuren voordat de default consent status bekend is.
<head>
<!-- 1. Consent defaults -->
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('consent', 'default', { ... });
</script>
<!-- 2. GTM container -->
<script>(function(w,d,s,l,i){...})(window,document,'script','dataLayer','GTM-XXXX');</script>
</head>
Stap 3: GTM tags configureren
Google-tags hebben een ingebouwde consent check en passen hun gedrag aan op de toestemming die is verleend. Voor tags zonder die check stel je de controle zelf in.
| Tag type | Consent instelling | Waarom |
|---|---|---|
| GA4, Google Ads, Floodlight | No additional consent required | Ingebouwde consent check |
| Facebook Pixel | Require additional consent: ad_storage |
Geen ingebouwde check |
| Hotjar en andere analytics-scripts | Require additional consent: analytics_storage |
Geen ingebouwde check |
| Overige custom scripts | Require additional consent: het type dat bij de tag past | Geen ingebouwde check |
Voor Google tags (GA4, Ads):
- Open de tag in GTM
- Ga naar Advanced Settings → Consent Settings
- Selecteer No additional consent required
Voor third-party tags:
- Open de tag in GTM
- Ga naar Advanced Settings → Consent Settings
- Selecteer Require additional consent for tag to fire
- Voeg
ad_storagetoe (of het consent type dat bij de tag past)
De derde optie in dat menu is Not set, de standaardwaarde. Wil je weten welke tags nog op die stand staan, open dan het Consent Overview-scherm in je container. Dat scherm staat standaard uit: je zet het aan via Admin → Container Settings → Additional Settings → Enable consent overview, waarna het icoon in het Tags-overzicht verschijnt. Het verdeelt je tags in 'Consent Not Configured' en 'Consent Configured' en laat je de instelling voor meerdere tags tegelijk aanpassen.
Stap 4: Configuratie testen
Google raadt Tag Assistant aan om je implementatie te controleren. Start een sessie op tagassistant.google.com met de URL van je site, of gebruik GTM Preview Mode.
Test 1: default consent
Selecteer het eerste Consent-event en open het Consent-tabblad. In de kolom 'On-page Default' horen ad_storage, ad_user_data, ad_personalization en analytics_storage op Denied te staan. Alleen security_storage staat op Granted.
Test 2: na toestemming
Klik op 'Akkoord' in je banner en selecteer het meest recente Consent-event. In de kolom 'On-page Update' springen de types waar je toestemming voor vraagt naar Granted.
Test 3: tags vuren correct
Klik in het Summary-gedeelte op het Tags-tabblad en open een tag om te zien of die zich aan de consent-instellingen hield. Google-tags vuren pas na de consent update. Third-party tags vuren alleen als hun vereiste toestemming op Granted staat.
Test 4: controle in de Google-producten zelf
In GA4 ga je naar Beheerder → Verzameling en wijziging van gegevens → Instellingen voor toestemming. Daar zie je welk percentage van je verkeer en je conversies uit de EER komt, plus meldingen per gegevensstream zoals 'Ads Measurement Consent Signals Not Detected' en 'Ads Personalization Consent Signals Not Detected'. Heb je iets gerepareerd, reken dan op 48 tot 72 uur voordat die meldingen bijwerken.
In Google Ads vind je de status via Goals → Conversions → Summary, waar je een websiteconversieactie opent en naar het tabblad Diagnostics gaat. Daar verschijnt 'De toestemmingsmodus is geïmplementeerd' zodra alles staat. Er is een tussenstatus voor accounts die de drempels nog niet halen; voor conversiemodellering vraagt Google 700 advertentieklikken in 7 dagen per combinatie van domein en land. Zodra dat lukt, staat er 'De toestemmingsmodus is geïmplementeerd en de modellering is geactiveerd', met daarbij een tabel met de uplift per domein en land die vier weken na de start van de modellering zichtbaar blijft.
Over functionality en personalization_storage
De AdSense banner stuurt volgens de hulppagina over de Consent Mode-instellingen updates voor:
ad_storagead_user_dataad_personalizationanalytics_storage
functionality_storage en personalization_storage worden niet door AdSense aangestuurd. Dat is normaal gedrag, want deze categorieën zijn bedoeld voor andere functionaliteit dan advertenties, zoals het onthouden van een taalvoorkeur.
Belangrijk: de AVG vraagt toestemming per doel. Je mag deze categorieën dus niet automatisch meeliften op de toestemming die iemand voor advertenties of analytics geeft.
Veelgemaakte fouten
- Het default-commando komt te laat. Zet je de standaardstatus pas nadat de eerste tags geladen zijn, dan heeft die geen effect meer. Het commando hoort vóór elke andere code die de toestemmingsstatus gebruikt of aanpast; in GTM dus op de Consent Initialization-trigger.
- Alleen de oude twee parameters zetten. Een configuratie met alleen
ad_storageenanalytics_storageis niet compleet. Zonderad_user_dataenad_personalizationontbreken de twee parameters die versie 2 toevoegde. gtag('consent', 'update', ...)gebruiken in een custom HTML-tag in GTM. Gebruik daarupdateConsentState, anders loop je het risico dat de update te laat verwerkt wordt.- Geen update-mechanisme. Blijft de status na een klik op de banner hangen op Denied, dan stuurt je banner geen update-commando. Bij een CMP van een derde partij controleer je in de instellingen van die CMP of de Consent Mode-koppeling aanstaat.
- TCF en Consent Mode allebei handmatig naast elkaar zetten. Google adviseert om het een of het ander te implementeren, om onbedoelde interacties te voorkomen en je tagging licht te houden. Wat Google doet als de twee elkaar tegenspreken, beschrijft die pagina niet, en dat is de situatie die je wilt vermijden.
- Testen met een oude cache. Een consent-keuze wordt onthouden. Test in een incognitovenster of leeg je cache, anders zie je de default-status nooit terug.
Consent Mode v2 instellen per platform
De stappen hierboven gaan uit van een site waar je zelf bij de <head> kunt. Op WordPress, Shopify en Next.js zit er een laag tussen, en elk van die drie lost het default-commando anders op.
WordPress met Site Kit
Site Kit heeft een eigen schakelaar voor Consent Mode: Site Kit → Settings → tabblad Admin Settings → sectie Consent Mode. Die staat standaard uit. De sectie zit in de plugin sinds versie 1.122.0 van 11 maart 2024, samen met de front-end-koppeling aan de WP Consent API. Diezelfde release markeert de oude optie block_on_consent voor de Analytics-webtag als verouderd zodra Consent Mode aanstaat.
De schakelaar alleen is niet genoeg. Site Kit vraagt om de plugin WP Consent API plus een cookie-plugin die daarmee werkt, en biedt de installatie van WP Consent API onder de schakelaar aan. WP Consent API is een gedeelde laag zonder eigen banner, waarin je cookie-plugin de categorieën functional, preferences, statistics, statistics-anonymous en marketing registreert, en waar andere plugins de status uitlezen met wp_has_consent of op wijzigingen luisteren met wp_listen_for_consent_change.
Zodra de schakelaar aanstaat, print Site Kit met wp_head-prioriteit 1 een gtag('consent', 'default')-snippet. In de broncode van de plugin staan alle zeven types op denied, ook security_storage, met wait_for_update op 500 en een region-lijst. Die lijst bevat sinds versie 1.128.0 deze 32 codes: AT, BE, BG, CH, CY, CZ, DE, DK, EE, ES, FI, FR, GB, GR, HR, HU, IE, IS, IT, LI, LT, LU, LV, MT, NL, NO, PL, PT, RO, SE, SI en SK. Buiten die regio's zet Site Kit geen default. Dat Site Kit ook security_storage op denied zet, wijkt af van mijn script uit stap 2, en het verschil zit in wie het type daarna bijwerkt. Site Kit koppelt de WP-categorie functional aan functionality_storage en security_storage, dus de cookie-plugin zet die twee na de keuze weer op granted. De AdSense-banner stuurt voor security_storage geen update, en daarom start dat type in stap 2 al op granted. Wil je controleren of het snippet er staat, zoek dan in de broncode van je pagina naar het HTML-commentaar van Site Kit. De documentatie noemt 'Google tag (gtag.js) Consent Mode snippet added by Site Kit'; de huidige code print 'Google tag (gtag.js) Consent Mode dataLayer added by Site Kit'.
De update na een bannerkeuze regelt Site Kit ook. Het front-end-script luistert naar het event wp_listen_for_consent_change en stuurt daarna gtag('consent', 'update'). De vertaling van WP-categorieën naar Google-types zit in de PHP-kant van de plugin: statistics wordt analytics_storage; marketing wordt ad_storage, ad_user_data en ad_personalization; functional wordt functionality_storage en security_storage; preferences wordt personalization_storage. Omdat gtag.js meteen laadt met de defaults op denied, werkt de koppeling als advanced Consent Mode, met cookieloze pings en de mogelijkheid van modellering.
Bij Complianz kies je één eigenaar van Consent Mode. Gebruik je de schakelaar van Site Kit, zet dan in Complianz de eigen Google Consent Mode v2 en de Site Kit-integratie uit, zodat er geen tweede default-blok of gtag.js-snippet op de pagina komt. Complianz werkt de WP Consent API bij en Site Kit leest die uit. Complianz heeft wel eigen ondersteuning voor Consent Mode v2 (Complianz → Integrations → Google Consent Mode); de readme van versie 7.5.5 bevestigt de WP Consent API-integratie en de Site Kit-integratie, die in versie 7.1.0 van 14 mei 2024 is bijgewerkt. Werk je met CookieYes, dan registreert die plugin de categorieën in de WP Consent API, waardoor Site Kit de keuze kan uitlezen.
Shopify
Shopify heeft een ingebouwde cookiebanner die als toestemmingsoplossing kan dienen. Je zet hem aan via Settings → Customer privacy → sectie Privacy settings → Cookie banner, en je kiest per regio waar de banner en de opt-out-pagina verschijnen. Zodra de banner aanstaat, is Consent Mode volgens Google automatisch actief. Gebruik je de Google & YouTube-app voor conversiemeting, dan zou Consent Mode volgens diezelfde pagina vanzelf moeten werken.
Een andere CMP kan ook, mits die aan de Customer Privacy API van Shopify koppelt. De ingebouwde banner schrijft de keuze zelf naar die API. In de Hydrogen-broncode zie je wat die API biedt: de booleans analyticsProcessingAllowed(), marketingAllowed(), preferencesProcessingAllowed() en saleOfDataAllowed(), de methode setTrackingConsent() en het event visitorConsentCollected. De bibliotheek laadt via consent-tracking-api.js.
De Google & YouTube-app leest de beslissing uit die API en zet zelf de Consent Mode-parameters in de dataLayer. Laat een CMP of een GTM-script die parameters dan niet ook schrijven: één integratie moet eigenaar zijn van dat schrijfpad. Shopify respecteert de keuze in de eigen systemen bovendien alleen als de banner of de CMP correct met de Customer Privacy API is geïntegreerd. Draai je headless op Hydrogen, dan heeft Shopify daar een aparte pagina voor: Get consent for analytics and customer privacy.
Next.js
Met @next/third-parties plaats je <GoogleTagManager gtmId="GTM-XYZ" /> in de root layout (app/layout.tsx). Het component haalt gtm.js volgens de Next.js-documentatie pas op na hydration, dus als een Script zonder strategy, wat neerkomt op afterInteractive. In de broncode van het component zie je dat het de dataLayer zelf initialiseert: eerst gtm.start en gtm.js, en pas daarna de inhoud van de prop dataLayer als gewoon object. Een consent-default hoort daar dus niet in. gtag('consent', 'default') moet als arguments-object in de dataLayer staan, en vóór gtm.js.
De gangbare oplossing is een apart <Script> met strategy="beforeInteractive" in app/layout.tsx, geplaatst vóór <GoogleTagManager />. beforeInteractive draait vóór hydration en dus vóór het GTM-script, en Next.js zet zo'n script altijd in de <head>, waar je het in de layout ook neerzet:
// app/layout.tsx
import Script from 'next/script';
import { GoogleTagManager } from '@next/third-parties/google';
const consentDefault = `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('consent', 'default', {
'ad_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied',
'analytics_storage': 'denied',
'wait_for_update': 500
});
`;
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="nl">
<Script
id="consent-default"
strategy="beforeInteractive"
dangerouslySetInnerHTML={{ __html: consentDefault }}
/>
<GoogleTagManager gtmId="GTM-XYZ" />
<body>{children}</body>
</html>
);
}
Deze aanpak komt uit communitypraktijk en is geen officieel advies van Vercel. De GitHub-discussies #64497 en #66718 (die laatste van 10 juni 2024) over Consent Mode met @next/third-parties zijn door de maintainers onbeantwoord gebleven, en de oplossingen die daar gedeeld worden komen allemaal neer op een inline Script met dangerouslySetInnerHTML vóór GTM. De update na een bannerkeuze doe je in een client component met window.gtag('consent', 'update', {...}); zorg dat gtag als functie op window bestaat (je definieert hem in het default-script) of push de arguments rechtstreeks naar window.dataLayer. Een secundaire bron noemt als beperking dat @next/third-parties geen voorziening heeft om een eerder opgeslagen keuze uit een cookie als default te laden voordat GTM start; dat bouw je dus zelf.
Werk je met gtag.js zonder GTM, via het GoogleAnalytics-component of een eigen Script, dan geldt dezelfde volgorde: het default-Script met beforeInteractive vóór het component, en events daarna via sendGAEvent of gtag().
Wat er sinds 2025 veranderd is
- Sinds 21 juli 2025 is Google actief gaan handhaven. Accounts die geen correcte Consent Mode v2-parameters voor EER- en VK-verkeer sturen, verliezen gepersonaliseerde advertenties, remarketing, conversiemeting en demografische rapportage. Google's eigen aankondiging heet 'Updates to Consent Mode for traffic in European Economic Area (EEA)'.
- Op 28 februari 2026 verliep de deadline voor de migratie naar IAB TCF v2.3. Oude consent strings zijn sindsdien ongeldig en ad requests met zo'n string vallen terug op Limited Ads. Google's eigen Privacy en berichten ondersteunt v2.3.
- Sinds 15 juni 2026 regelt de instelling Google Signals in GA4 niet langer het verzamelen van Google Ads-cookies en -ID's. Alleen de parameter
ad_storagebepaalt dat nog; Google Signals gaat alleen nog over het koppelen van GA-data aan ingelogde gebruikers voor gedragsrapportage. - Later in 2026 volgt dezelfde stap voor advertentiepersonalisatie. Het gebruik van GA-data daarvoor wordt volgens dezelfde aankondiging uitsluitend via de Ads-instellingen en de parameter
ad_personalizationgeregeld. - De eigen CMP van Google (Privacy en berichten in AdSense, Ad Manager en AdMob) heeft ondersteuning voor Consent Mode gekregen met de twee schakelaars uit stap 1, voor advertentie- en analysedoeleinden. Een publicatiedatum staat er op die hulppagina niet bij.
- GA4 toont in Beheerder → Instellingen voor toestemming per gegevensstream meldingen over ontbrekende toestemmingssignalen voor advertentiemeting en advertentiepersonalisatie, met de bijwerktijd van 48 tot 72 uur uit stap 4.
- In een supportdraad over Site Kit 1.182.0 en Complianz 7.5.0 (2026) valt het begrip consent owner: je bepaalt welke plugin het default-blok schrijft en zet de ander uit.
Veelgestelde vragen
Is Consent Mode v2 verplicht?
Consent Mode zelf komt in geen enkele wet voor. De AVG bepaalt wanneer je toestemming nodig hebt en Consent Mode is de manier om die toestemming aan Google door te geven. Google schrijft zelf dat het EU-gebruikerstoestemmingsbeleid de eisen van de ePrivacy-richtlijn en de AVG weerspiegelt. Sinds maart 2024 verlangt Google wel dat je toestemmingssignalen stuurt voor bepaalde functies, en sinds 21 juli 2025 schakelt Google advertentiefuncties uit bij accounts die dat niet doen. Voor uitgevers die advertenties tonen in de EER en het VK geldt sinds 16 januari 2024 bovendien de eis van een door Google gecertificeerde CMP met TCF-integratie.
Wat is het verschil tussen basic en advanced consent mode?
Bij de basic-variant laden Google-tags pas nadat de bezoeker een keuze heeft gemaakt, en gaan er vóór dat moment geen metingen naar Google. Bij de advanced-variant laden de tags meteen met de standaardwaarden op denied en sturen ze metingen zonder cookies zolang toestemming ontbreekt. De advanced-variant geeft een adverteerder-specifiek model voor de modellering, de basic-variant een algemeen model.
Vervangt Consent Mode mijn cookiebanner?
Nee. Je hebt nog steeds een banner nodig die de vraag stelt en de keuze vastlegt. Consent Mode geeft die keuze alleen door aan de Google-tags.
Werkt dit voor Cookiebot of OneTrust?
De AdSense-stappen in deze gids gelden voor de gratis banner uit Privacy en berichten. Cookiebot en andere CMP's hebben eigen GTM-integraties met vergelijkbare functionaliteit. Voor een aantal CMP's heeft Google eigen instructiepagina's in de Tag Manager-help, en de CMP's zelf leveren hun koppeling.
Mijn Consent-tabblad in Tag Assistant blijft leeg
In mijn test betekende dat steeds dat het default-script niet in de broncode van de pagina stond, of dat een adblocker of scriptblokkering de Google-tag tegenhield. Controleer die twee punten eerst. Google heeft voor de overige gevallen een aparte pagina over het oplossen van problemen met Consent Mode in Tag Assistant.
Mijn tags vuren niet na toestemming
Controleer in dat geval deze punten:
- Het consent script staat BOVEN je GTM code
- Je hebt je browser cache geleegd (of je test in een incognitovenster)
- Je GTM container is opnieuw gepubliceerd
- Je AdSense banner is actief en gepubliceerd
Waarom zie ik nog geen gemodelleerde data in GA4?
Modellering begint pas als je property genoeg data verzamelt. Voor gedragsmodellering vraagt Google minstens 1.000 events per dag met analytics_storage='denied' gedurende zeven dagen, plus minstens 1.000 dagelijkse gebruikers met toestemming op zeven van de afgelopen 28 dagen. Kleinere sites halen die aantallen zelden. Voor conversiemodellering in Google Ads geldt een andere drempel, 700 advertentieklikken in 7 dagen per domein en land, en die status lees je af op het tabblad Diagnostics van de conversieactie.
Checklist: Consent Mode v2 configuratie
Na deze handleiding heb je het volgende staan:
- Keuze gemaakt tussen de basic- en de advanced-variant
- Default consent script geplaatst vóór GTM
- Alle types starten op Denied, behalve
security_storage ad_user_dataenad_personalizationzitten in het default-commando- Consent banner stuurt update-commando's na een keuze
- Google tags geconfigureerd zonder extra consent
- Third-party tags geconfigureerd met consent vereisten
- Geen tags meer op 'Not set' in het Consent Overview-scherm
- Op WordPress, Shopify of Next.js: één eigenaar van het default-blok, gecontroleerd in de broncode
- Alles gecontroleerd in Tag Assistant, GA4 en Google Ads
Daarmee is de configuratie afgerond. Voeg je later een nieuwe tag toe aan je container, loop dan opnieuw door stap 3 en 4 om de consent instelling en het vuurgedrag van die tag te controleren.
Bronnen
- Consent mode overview, Google for Developers
- Set up consent mode on websites, Google for Developers
- Troubleshoot consent mode with Tag Assistant, Google for Developers
- Create a consent mode template, Google for Developers
- About consent mode, Google Ads Help
- Google Ads integration with the IAB Transparency & Consent Framework (TCF), Google Ads Help
- Verify consent mode implementation, Google Ads Help
- Behavioral modeling for consent mode, Google Analytics Help
- Verify and update consent settings in Google Analytics, Google Analytics Help
- Google Analytics Help over consent mode met de Shopify-cookiebanner, Google
- Google Analytics Help over de wijziging van Google Signals per 15 juni 2026, Google
- Obtain user consent, Google Tag Manager Help
- Page view triggers, Google Tag Manager Help
- Tag Manager consent mode support, Google Tag Manager Help
- Verify consent mode implementation, Google Tag Manager Help
- Set up consentmanager to obtain user consent, Google Tag Manager Help
- Google consent management requirements for serving ads in the EEA, the UK, and Switzerland, Google AdSense Help
- About European regulations messages, Google AdSense Help
- Create a European regulations message, Google AdSense Help
- Manage consent mode settings, Google AdSense Help
- Google's CMP launches support for consent mode, Google AdSense Help
- Google Consent Mode v2 Parameters Explained, Secure Privacy Knowledge Base
- Google Certified CMPs: What Publishers Need to Know About New Consent Requirements, Secure Privacy
- Google extends consent requirements to advertisers in Switzerland, Clym
- IAB TCF v2.3: What Publishers Must Do by February 2026, CookieYes
- WP Consent API, CookieYes
- Consent Mode V2 For Google Tags, Simo Ahava
- GA Consent Mode v2 is now non-negotiable: what you need to know and fix fast, Fresh Egg
- Site Kit-documentatie: Settings, Google
- Site Kit-documentatie: Consent mode, Google
- Site Kit 1.122.0 release, Google op GitHub, 11 maart 2024
- Consent_Mode.php, Site Kit-broncode op GitHub
- Regions.php, Site Kit-broncode op GitHub
- consent-mode.ts, Site Kit-broncode op GitHub
- WP Consent Level API, WordPress op GitHub
- Site Kit 1.182.0 + Complianz 7.5.0: consent owner and global opt-in, WordPress.org-supportforum
- Complianz readme.txt, Really Simple Plugins op GitHub, changelog 8 september 2026
- Shopify Help Center: privacy settings, Shopify
- Shopify Help Center: understanding customer privacy settings, Shopify
- ShopifyCustomerPrivacy.tsx, Hydrogen-broncode op GitHub
- Get consent for analytics and customer privacy, Shopify.dev
- Cookie Consent Manager Shopify App Integration, TrustArc
- Third-party libraries, Next.js-documentatie
- gtm.tsx, Next.js-broncode op GitHub
- Consent mode with @next/third-parties, discussie #64497, Next.js op GitHub, 2024
- How to set up Google Tag Manager with consent mode in Next.js, Aclarify
- Integrating Google Tag Manager with Consent Mode in Next.js 15, Spencer Marx op dev.to
