Acasă/Blog/Consent Mode v2: implementare corectă pentru GA4 și Google Ads

Consent Mode v2: implementare corectă pentru GA4 și Google Ads

Consent Mode v2 pas cu pas: valorile implicite, ordinea scripturilor, actualizarea la acord, Meta Pixel și TikTok și cum testezi că măsurarea chiar funcționează.

Alegerea utilizatorului prin Acceptă, Refuză și Preferințe, transmisă prin Consent Mode v2 către GA4 și Google Ads.

Dacă rulezi campanii Google Ads sau folosești Google Analytics 4 cu vizitatori din Spațiul Economic European, Consent Mode v2 nu mai e opțional: fără semnalele lui, Google nu poate folosi datele pentru personalizarea reclamelor și pentru măsurarea conversiilor. Problema e că multe implementări arată corect, dar nu transmit nimic: bannerul apare, utilizatorul apasă „Accept”, iar în GA4 nu apare niciun vizitator.

Ghidul explică ce face Consent Mode v2, care e ordinea corectă a scripturilor, cum actualizezi consimțământul la acord, cum se leagă Meta Pixel și TikTok și cum testezi că totul funcționează. Rețeta vine din implementările noastre de pe maxdev.ro, Praxi și alte proiecte, nu din documentația copiată. Nu este sfat juridic: pentru deciziile care țin de GDPR sau de legislația cookie-urilor, consultă un specialist.

Pe scurt: setezi consimțământul implicit pe „refuzat” înainte să se încarce gtag.js, apoi trimiți „acordat” când utilizatorul acceptă, și retrimiți configurarea GA4 în acel moment. Consent Mode nu înlocuiește bannerul de cookie-uri și nu retrimite retroactiv vizita deja trimisă sub „refuzat”. Testează în Network și în GA4 Realtime, nu doar în cod.

Consent Mode este mecanismul prin care site-ul îi spune etichetelor Google ce are voie să facă în funcție de alegerea vizitatorului. Versiunea 2 a adăugat două semnale pentru reclame, ad_user_data și ad_personalization, care se cer pentru utilizatorii din Spațiul Economic European în cazul personalizării reclamelor și al măsurării conversiilor. Fără ele, remarketingul și o parte din măsurare nu funcționează cum te aștepți.

De reținut: Consent Mode nu este un banner. Bannerul colectează alegerea utilizatorului; Consent Mode transmite acea alegere către Google. Ai nevoie de ambele, iar textul bannerului trebuie să fie în acord cu politica ta de cookie-uri.

Cele șase semnale

SemnalCe controleazăValoare implicită uzuală
analytics_storageCookie-uri de analytics (GA4)denied
ad_storageCookie-uri de publicitatedenied
ad_user_dataTrimiterea datelor utilizatorului către Google pentru reclamedenied
ad_personalizationPersonalizarea reclamelor (remarketing)denied
functionality_storageFuncții ale site-ului (preferințe)granted
security_storageSecuritate și prevenirea fraudeigranted

Primele patru sunt cele care se schimbă la acordul utilizatorului. Ultimele două sunt, de regulă, strict necesare, deci rămân acordate.

Mod de bază sau mod avansat

Există două moduri de a implementa. În modul de bază, etichetele Google nu se încarcă deloc până când utilizatorul acceptă; nu trimiți nimic înainte de acord. În modul avansat, etichetele se încarcă de la început cu consimțământul implicit pe „refuzat” și pot trimite semnale fără cookie-uri, pe care Google le folosește pentru modelare. Alegerea între ele ține de politica ta de confidențialitate și de ce spune consultantul tău juridic, nu de o preferință tehnică. Implementarea de mai jos urmează modul avansat, adică exact varianta pe care o folosim noi.

Ordinea corectă a scripturilor

Regula care strică cele mai multe implementări: consimțământul implicit trebuie setat înainte de gtag.js. Dacă gtag.js se încarcă primul, primul hit pleacă fără regulile tale.

<script>
  window.dataLayer = window.dataLayer || [];
  function gtag() { dataLayer.push(arguments); }

  gtag('consent', 'default', {
    analytics_storage: 'denied',
    ad_storage: 'denied',
    ad_user_data: 'denied',
    ad_personalization: 'denied',
    functionality_storage: 'granted',
    security_storage: 'granted',
    wait_for_update: 500
  });
</script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
  gtag('js', new Date());
  gtag('config', 'G-XXXXXXXXXX');
</script>

Parametrul wait_for_update: 500 dă bannerului 500 de milisecunde să restaureze un consimțământ deja salvat, la vizitele ulterioare. E suficient pentru restaurarea automată, dar nu pentru decizia activă a unui utilizator nou, care are nevoie de mult mai mult timp ca să citească și să apese. Din cauza asta apare capcana din secțiunea următoare.

Actualizarea la acord: capcana care ascunde vizitatorii

Când utilizatorul apasă „Accept”, trimiți actualizarea. Dar ai o problemă: hit-ul automat de la încărcarea paginii a plecat deja, sub „refuzat”, cu mult înainte de clic, iar Consent Mode nu retrimite hit-urile vechi, ci se aplică doar viitorului. Rezultatul: vizita nu apare în GA4. Soluția, documentată de Google pentru acest caz, este să retrimiți configurarea după actualizare:

function acceptaTot() {
  gtag('consent', 'update', {
    analytics_storage: 'granted',
    ad_storage: 'granted',
    ad_user_data: 'granted',
    ad_personalization: 'granted'
  });
  // retrimite masurarea, altfel vizita deja trimisa sub "denied" nu apare in GA4
  gtag('config', 'G-XXXXXXXXXX');
}

Două detalii pe care le-am verificat în practică. Primul: un gtag('event', 'page_view') trimis manual nu merge, pentru că gtag.js îl tratează ca duplicat al paginii și îl ignoră; funcționează doar retrimiterea config. Al doilea: apelează funcția globală gtag creată de scriptul din <head>, nu un wrapper propriu care face manual dataLayer.push, pentru că într-un proiect varianta locală nu a funcționat, iar cea globală a rezolvat problema.

Retrimite config doar la tranziția din „refuzat” în „acordat”, nu la fiecare încărcare, altfel dublezi vizitele. La vizitele următoare, cu consimțământul deja salvat, îl restaurezi imediat ce se încarcă pagina.

Meta Pixel și TikTok

Pixelii de marketing au propriile mecanisme, simetrice cu cele ale Google. La Meta, apelezi fbq('consent', 'revoke') înainte de fbq('init', ...), ca să nu se trimită nimic până la acord, iar la acceptare faci fbq('consent', 'grant') și retrimiți manual PageView, pentru că Meta nu deduplică la fel ca gtag.js. La TikTok, apelezi ttq.holdConsent() înainte de ttq.load(...), apoi ttq.grantConsent() sau ttq.revokeConsent() după alegerea utilizatorului. Dacă nu ții pixelii sub consimțământ, bannerul de pe site spune un lucru și site-ul face altul.

Cum testezi

  1. Deschide consola și verifică typeof window.gtag: trebuie să fie "function" înainte să apeși „Accept”.
  2. Inspectează dataLayer și caută comanda consent default ca prim element, înaintea oricărei alte comenzi.
  3. Deschide fila Network, filtrează pe collect și apasă „Accept”: ar trebui să apară o cerere nouă imediat. Parametrul gcs din cerere arată starea de consimțământ trimisă către Google; de obicei, o valoare ca G100 înseamnă refuzat, iar G111 înseamnă acordat pentru analytics și reclame.
  4. Verifică GA4 Realtime după acceptare și, dacă ai nevoie de detalii, DebugView.
  5. Testează refuzul: apasă „Doar necesare” și verifică să nu apară cookie-uri de analytics sau de publicitate și să nu plece cereri către pixeli.
  6. Testează revenirea: reîncarcă pagina cu consimțământul salvat și verifică să fie restaurat de la prima încărcare.

Dacă toate trec și GA4 tot nu arată vizitatori, problema nu e în cod: caută în configurația proprietății (filtre de trafic intern, fluxul de date).

Greșeli frecvente

  • gtag.js se încarcă înaintea consimțământului implicit.
  • Lipsesc ad_user_data și ad_personalization, deci implementarea e de fapt versiunea 1.
  • Retrimiți page_view manual, în loc de config, și nu apare nimic.
  • Bannerul nu salvează alegerea, iar utilizatorul îl vede la fiecare pagină.
  • Pixelii de marketing se încarcă înainte de acord.
  • Mai multe layout-uri, o singură implementare. Dacă aplicația are zone diferite (site public și cont), fiecare trebuie să includă bannerul și parametrii; la Praxi au fost două.
  • Bannerul promite altceva decât face site-ul. Textul trebuie să corespundă cu ce se întâmplă efectiv.

Ce rămâne în sarcina ta

Consent Mode rezolvă partea tehnică a transmiterii consimțământului. Nu rezolvă textul bannerului, politica de cookie-uri, categoriile pe care le oferi sau modul de păstrare a dovezii alegerii. Dacă pornești o campanie plătită, configurarea corectă a măsurării face diferența dintre date utilizabile și date incomplete, iar la nivelul site-ului, un audit de SEO tehnic verifică tagurile, scripturile și indexarea împreună.

Întrebări frecvente

Consent Mode v2 înlocuiește bannerul de cookie-uri?

Nu. Bannerul colectează alegerea utilizatorului; Consent Mode doar o transmite către Google. Ai nevoie de ambele.

De ce nu apar vizitatori în GA4 după ce acceptă cookie-urile?

Pentru că hit-ul de la încărcare a plecat sub „refuzat”, iar actualizarea nu îl retrimite. Retrimite gtag('config', ID) la tranziția în „acordat”.

Care e diferența dintre modul de bază și cel avansat?

În modul de bază nu se încarcă nicio etichetă până la acord. În modul avansat, etichetele se încarcă și trimit semnale fără cookie-uri înainte de acord. Alegerea se face cu consultanță juridică.

Trebuie să schimb ceva și pentru Meta Pixel?

Da. Pixelul Meta are propriul mecanism de consimțământ (revoke înainte de init, apoi grant), iar TikTok la fel, cu holdConsent și grantConsent.

Cum aflu dacă implementarea mea merge?

Verifică în fila Network cererile către collect și parametrul gcs, apoi GA4 Realtime. Dacă apare o cerere nouă imediat după „Accept” și vizita e vizibilă, merge.

Dacă vrei să verificăm împreună măsurarea și consimțământul pe site-ul tău, descrie-ne situația și revenim cu un plan.

Vrei să discutăm despre proiectul tău?

Spune-ne ce ai de rezolvat. Revenim cu idei concrete și o propunere tehnică, nu cu o ofertă șablon.

sau pe email: contact@maxdev.ro