Google Consent Mode V2 met Drupal + Klaro
Ik schrijf dit vooral als documentatie voor mezelf, want elke keer dat ik hierover moet nadenken krijg ik er hoofdpijn van.
Goed, daar gaan we...
Wat is Google Consent Mode V2?
Google Consent Mode V2 is een uitgebreidere versie van Googles privacyframework waarmee websites het gedrag van Google-tags kunnen aanpassen aan de toestemmingskeuzes van gebruikers. Het gebruikt deze toestemmingsstatussen (waarvan er twee nieuw zijn in V2):
- ad_storage — Regelt de opslag van advertentiecookies
- analytics_storage — Regelt de opslag van analytische cookies
- ad_user_data — Regelt het versturen van gebruikersgegevens naar Google voor advertenties (NIEUW)
- ad_personalization — Regelt gepersonaliseerde advertenties (NIEUW)
- functionality_storage — Regelt de opslag van functionele cookies
- personalization_storage — Regelt de opslag van personalisatiecookies
- security_storage — Regelt beveiligingsgerelateerde opslag
Leuk weetje: de parameter gcd= die je in netwerkverzoeken ziet, is gewoon een Base64-achtig bitmasker van alle zeven toestemmingsvlaggen. Handgemaakte versluiering, rechtstreeks uit Mountain View.
Integratie met Drupal + Klaro
De Klaro-module voor Drupal biedt uitstekend beheer van cookietoestemming, maar voor de integratie met Google Consent Mode V2 was wat extra werk nodig. De grootste uitdaging was dat de bestaande Klaro-module (versie 3.0.7) het nieuwe callbacksysteem voor een goede consent-mode-integratie nog niet ondersteunde.
Dit heb ik gedaan om het werkend te krijgen met een gebruikelijke combinatie van GTM + Analytics + Ads.
Stap 1: Klaro uitbreiden met nieuwe callbacks
De eerste stap was het toepassen van een patch uit Drupal-issue #3484827 om ondersteuning toe te voegen voor de callbacks onInit, onAccept en onDecline. We gebruikten de patch uit Merge Request #79.
Stap 2: De Google Tag Manager-service instellen
We stelden de GTM-service (config/sync/klaro.klaro_app.gtm.yml) in om de initialisatie van toestemming en het laden van de GTM-container af te handelen. Dit is in wezen wat er beschreven staat in https://klaro.org/docs/tutorials/google_tag_manager.
on_init: |
window.dataLayer = window.dataLayer || [];
window.gtag = function(){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'
});
on_accept: |
// Load GTM container
if (!document.querySelector('script[src*="googletagmanager.com/gtm.js"]')) {
(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-TK7LMN4');
}
// Notify GTM about all services that were accepted. These are the custom triggers that
// will be used in Step #5.
for(let k of Object.keys(opts.consents)){
if (opts.consents[k]){
let eventName = 'klaro-'+k+'-accepted';
dataLayer.push({'event': eventName});
}
}
Stap 3: De Google Analytics-service instellen
De GA-service (config/sync/klaro.klaro_app.ga.yml) verwerkt wijzigingen in de toestemming voor analytics:
on_init: |
window.gtag = function(){dataLayer.push(arguments)}
on_accept: |
gtag('consent', 'update', {'analytics_storage': 'granted'});
on_decline: |
gtag('consent', 'update', {'analytics_storage': 'denied'});
Stap 4: De Google Ads-service instellen
Voor advertentietoestemming stelden we de Google Ads-service (config/sync/klaro.klaro_app.google_ads.yml) in:
on_accept: |
gtag('consent', 'update', {
'ad_storage': 'granted',
'ad_user_data': 'granted',
'ad_personalization': 'granted'
});
on_decline: |
gtag('consent', 'update', {
'ad_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied'
});
Stap 5: GTM-triggers instellen
In Google Tag Manager maakten we aangepaste gebeurtenistriggers die luisteren naar Klaro-toestemmingsgebeurtenissen. Hier het voorbeeld voor GA:
- Triggertype: Aangepaste gebeurtenis
- Gebeurtenisnaam:
klaro-ga-accepted - Gebruik: GA4-tags activeren zodra toestemming voor analytics is gegeven
Deze trigger moet je vervolgens aan de relevante tags koppelen.
Onze implementatie volgt nauwgezet de officiële Klaro-handleiding voor GTM-integratie. Daarbij gebruiken we het patroon opts.consents om alle geaccepteerde services te doorlopen en afzonderlijke gebeurtenissen naar de dataLayer te sturen.
Wat als er iets verandert?
Maar wacht! Wat als een marketeer met toegang tot GTM besluit een nieuwe tag van een derde partij toe te voegen, zoals een Facebook-pixel? Het toestemmingsformulier in Drupal wordt niet automatisch bijgewerkt, dus cookies of privacygevoelige gegevens kunnen zonder toestemming naar derden worden verstuurd...
Voor zover ik weet, zijn er twee opties:
- Toestemming beheren via GTM
Voordeel: alles wordt in GTM beheerd.
Nadeel: geen fijnmazige controle per service in de toestemmingspopup; sterkere afhankelijkheid van GTM. - Een stevig beleid en duidelijke verantwoordelijkheden voor het beheer van services van derden.
Voordeel: fijnmazige controle per service, meer flexibiliteit.
Nadeel: moeilijker te beheersen; vraagt discipline, een gestructureerd proces en audits.
Over de auteur
- Albert Skibinski is een zelfstandig ontwikkelaar en co-founder van Jafix
- Ik schrijf over web development, lange fietstochten en lekker eten!