Google Consent Mode v2 (Mart 2024’te EEA ve UK trafiği için zorunlu oldu) dört sinyalli bir yapı üzerinde çalışıyor: ad_storage, analytics_storage, ad_user_data, ad_personalization. Kurulumun özü aynı: sayfa yüklenirken default state denied gönderilir, consent tool kullanıcı tercihini yakaladıktan sonra update komutu ile sinyaller güncellenir. Bu rehber gtag, GTM, Meta Pixel, HubSpot ve Hotjar için güncel kod örneklerini içerir.
Bu yazı Consent Mode v2 uygulamasına dair teknik bir rehberdir, hukuki tavsiye niteliği taşımaz. KVKK (TR) ve GDPR (EEA) yükümlülükleri kendi jurisdiction’ınıza göre değerlendirilmelidir.
Consent Mode v1 → v2: Ne Değişti?
| Sinyal | v1 | v2 | Ne Kontrol Eder |
|---|---|---|---|
ad_storage | ✓ | ✓ | Reklam amaçlı çerez okuma/yazma izni |
analytics_storage | ✓ | ✓ | Analytics çerezleri için izin |
ad_user_data | — | ✓ | Kullanıcı verisinin (hash’lenmiş email, ads click ID) Google’a iletilip iletilmeyeceği |
ad_personalization | — | ✓ | Remarketing ve personalized ads için kullanım izni |
functionality_storage | ✓ | ✓ | Site fonksiyonelliği için çerezler |
personalization_storage | ✓ | ✓ | Site-içi kişiselleştirme çerezleri |
security_storage | ✓ | ✓ | Güvenlik amaçlı çerezler (fraud detection) |
Mart 2024’ten itibaren Google EEA ve UK trafiğinde ad_user_data ve ad_personalization sinyallerini ads personalization, remarketing audience ve modelled conversions için zorunlu kıldı. v2’ye geçmemiş hesaplarda bu özellikler işlevini kaybediyor.
Konuyla ilgili güncel gelişmeler:
- Consent Mode’un ölçüm üzerindeki etkisi ve basic vs advanced mode kıyaslaması: Consent Banner Koydunuz, Trafiğiniz %30 Düştü.
- Consent sınırları içinde Google Ads ve Meta tarafındaki sinyal mimarisi: Consent Sınırları İçinde Reklam Ölçümü.
- GA4 ve Google Ads veri kontrollerinin Haziran 2026’da Consent Mode altında tek noktada birleşmesi: GA4 ve Google Ads Veri Kontrolleri Birleşiyor.
- T-Soft mağazalarında Cookie Law ile Consent Mode v2 uyumsuzluğu ve GTM köprü çözümü: T-Soft Cookie Law ve Google Consent Mode v2.
gtag ile Consent Mode v2 Kurulumu
Tüm gtag consent kurulumlarının iki temel aşaması var: sayfa yüklenirken default komutu ile başlangıç durumu tanımlanır, consent tool kullanıcı tercihini yakaladıktan sonra update komutu ile güncellenir. Default çağrısı Google Tag (gtag.js) yüklenmeden önce yapılmalıdır; aksi halde ilk ağ istekleri consent state olmadan gönderilir.
Default State: Tüm Sinyaller Denied
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag("consent", "default", {
ad_storage: "denied",
analytics_storage: "denied",
ad_user_data: "denied",
ad_personalization: "denied",
wait_for_update: 500,
});
wait_for_update: 500 parametresi gtag’e consent güncelleme için 500ms bekleme talimatı verir. Bu süre içinde consent tool karar verirse ilk hit consent-aware gönderilir. Asenkron consent tool’ları için kritik.
Region Bazlı Default
KVKK açık rıza zorunluluğu TR için geçerli; GDPR EEA ve UK için. Diğer bölgeler farklı default kullanabilir. region parametresi ISO 3166-2 kodları alır (ülke: TR, alt bölge: US-CA).
gtag("consent", "default", {
ad_storage: "denied",
analytics_storage: "denied",
ad_user_data: "denied",
ad_personalization: "denied",
region: [
"TR",
"ES",
"GB",
"DE",
"FR",
"IT",
"NL",
"BE",
"SE",
"DK",
"FI",
"NO",
"PL",
"AT",
"CH",
"IE",
],
});
gtag("consent", "default", {
ad_storage: "granted",
analytics_storage: "granted",
ad_user_data: "granted",
ad_personalization: "granted",
});
Birinci çağrı listelenen bölgelerde default denied uygular; ikinci çağrı default catch-all olarak diğer bölgelere granted atar. Sıra önemli; genel default’u en sona koymak yaygın pattern.
region parametresi sadece default komutunda kullanılır; update komutunda
region filtresi yoktur.
Örnek: Async gtag + Consent Tool Entegrasyonu
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
// Default state
gtag("consent", "default", {
ad_storage: "denied",
analytics_storage: "denied",
ad_user_data: "denied",
ad_personalization: "denied",
wait_for_update: 500,
});
// URL passthrough: gclid/dclid/_gl parametrelerini consent olmadan da sayfalar arası taşır
gtag("set", "url_passthrough", true);
// Ads data redaction: ad_storage denied iken reklam click ID'lerini ağ isteğinden çıkarır
gtag("set", "ads_data_redaction", true);
// Consent tool entegrasyonu
ConsentTool.on("consent-tool-initialized", function (consentObject) {
gtag("consent", "update", {
ad_storage: consentObject.ADVERTISING === "ACCEPT" ? "granted" : "denied",
analytics_storage:
consentObject.ANALYTICS === "ACCEPT" ? "granted" : "denied",
ad_user_data:
consentObject.ADVERTISING === "ACCEPT" ? "granted" : "denied",
ad_personalization:
consentObject.ADVERTISING === "ACCEPT" ? "granted" : "denied",
});
});
ConsentTool.on("consent-saved", function (consentObject) {
gtag("consent", "update", {
ad_storage: consentObject.ADVERTISING === "ACCEPT" ? "granted" : "denied",
analytics_storage:
consentObject.ANALYTICS === "ACCEPT" ? "granted" : "denied",
ad_user_data:
consentObject.ADVERTISING === "ACCEPT" ? "granted" : "denied",
ad_personalization:
consentObject.ADVERTISING === "ACCEPT" ? "granted" : "denied",
});
});
</script>
<script
async
src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"
></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
gtag("config", "GA_MEASUREMENT_ID");
gtag("config", "AW-CONVERSION_ID");
</script>
ad_storage Denied Davranışı
- Yeni reklam çerezleri oluşturulmaz, mevcut reklam çerezleri okunmaz.
- Üçüncü taraf çerezler sadece fraud ve spam tespiti için kullanılır.
- GA4 reklam çerezlerini okumaz, Google Signals tetiklenmez.
- IP adresleri sadece coğrafi konum için kullanılır.
analytics_storage Denied Davranışı
- GA4 birinci taraf çerezlerini okuyamaz ve yazamaz (
_ga,_ga_<property>). - Hit sayımı durmaz; her sayfa yeni bir anonim kimlik ile gönderilir.
gcsparametresi consent state’i taşır.
ad_user_data Denied Davranışı
- Google Ads ve Meta CAPI’ye hashlenmiş user data (email, telefon) gönderilmez.
- Enhanced Conversions çalışmaz.
- Ads click ID (gclid, gbraid, wbraid) iletilmez.
ad_personalization Denied Davranışı
- Kullanıcı remarketing audience’larına eklenmez.
- Personalized ads serve edilmez.
- Lookalike audience kaynağı olarak kullanılmaz.
Consent Mode Google etiketlerinin nasıl davranması gerektiğini belirtir ancak consent yönetimi yapmaz; kullanıcı tercihini yakalamak için bir consent tool gerekir. Tool seçimi için aşağıdaki bölüme bakın.
Google Tag Manager (GTM)
GTM tarafında Consent Mode v2 iki yoldan kurulur: Template Gallery’den hazır template ile veya Custom HTML ile.
Template Gallery: Consent Mode (Google tags)
Simo Ahava’nın Consent Mode (Google tags) template’i v2 sinyallerini destekler1. Google Tag Manager > Templates > Tag Templates > Search Gallery altından eklenir; sonra Tags > New > Tag Configuration > Consent Mode (Google tags) seçilir.
Template default state’i ve region-specific override’ları UI üzerinden konfigüre etmeyi sağlar. CMP (Consent Management Platform) taraf ise Variable > Data Layer Variable veya özel CMP template’i ile okunur. Pratikte: Consent Initialization - All Pages trigger’ına bu tag bağlanır, dolayısıyla tüm diğer tag’lerden önce çalışır.
Custom HTML Yaklaşımı
Template kullanmak istemiyorsan Consent Initialization - All Pages trigger’ına bağlı bir Custom HTML tag ile yukarıdaki gtag kodu doğrudan enjekte edilir. Bu yaklaşım CMP-spesifik event handler’ların (örn. Efilli, Mobildev, Cookiebot) doğrudan yazılmasını mümkün kılar.
T-Soft gibi platformlarda platform-spesifik Cookie Law’ün Consent Mode v2 ile köprülenmesi için örnek uygulama: T-Soft Cookie Law ve Google Consent Mode v2 Uyumsuzluğu.
Tag Consent Ayarları
GTM tarafında her tag için Consent Settings > No additional consent required veya Require additional consent for tag to fire konfigüre edilir. v2 için önerilen ayarlar:
- Google Ads Conversion Tracking:
ad_storage,ad_user_datarequired - Google Ads Remarketing:
ad_storage,ad_user_data,ad_personalizationrequired - GA4 Configuration:
analytics_storagerequired (built-in consent check) - Meta Pixel:
ad_storagerequired
Meta Pixel (Facebook Analytics’in Yerine)
Facebook Analytics 30 Haziran 2021’de kapatıldı. Meta tarafında consent uygulaması şu anda Meta Pixel ve Meta Conversions API (CAPI) üzerinden yapılır. Pixel için native consent parametresi:
// Pixel yüklenmeden önce
fbq("consent", "revoke");
// Pixel yükleme
fbq("init", "<PIXEL_ID>");
fbq("track", "PageView");
// Consent alındığında
fbq("consent", "grant");
Meta CAPI tarafında consent state event payload’ında opt_out: true ile iletilir. Dual-send (Pixel + CAPI) ve event_id üzerinden deduplication için detay: Enhanced Conversions Rehberi.
HubSpot
HubSpot tracking kodu kendi opt-out mekanizması ile yönetilir. Banner entegrasyonu _hsp.push(['revokeCookieConsent']) veya _hsp.push(['addPrivacyConsentListener', callback]) API’leri üzerinden yapılır.
HubSpot tarafında oluşturulan başlıca çerezler:
| Çerez | Süre | Amaç |
|---|---|---|
__hs_opt_out | 13 ay | Kullanıcının opt-out tercihini hatırlar |
__hs_do_not_track | 13 ay | Tracking kodunun anonim mod çalışmasını sağlar |
__hs_initial_opt_in | 7 gün | Banner’ın tekrar gösterimini engeller |
__hs_cookie_cat_pref | 13 ay | İzin verilen çerez kategorilerini hatırlar |
__hstc, hubspotutk, __hssc, __hssrc | Değişken | Analitik çerezler |
HubSpot consent konfigürasyonu Settings > Privacy & Consent > Cookies altından yapılır; ayrıca _hsp API ile dış CMP entegrasyonu mümkün. Opt-out revoke butonu için:
<button
type="button"
onClick="(function(){
var _hsp = window._hsp = window._hsp || [];
_hsp.push(['revokeCookieConsent']);
})()"
>
Çerezleri kaldır
</button>
Hotjar
Hotjar tarafında default davranış tracking kodunun yüklenmesiyle birlikte çerezlerin oluşması. Consent öncesi yükleme istenmiyorsa kod bloğu conditional enjekte edilmeli veya _hjSettings içinde sv parametresi ile opt-out sağlanmalı.
Hotjar form input’larının kayda yansımaması için data-hj-allow veya data-hj-suppress attribute’ları kullanılır. Detay: CF7 Form Elemanını Hotjar Whitelisting.
Microsoft Clarity
Clarity default olarak heatmap ve session recording için çerez ve localStorage kullanır. Consent Mode v2 ile native bir entegrasyonu yok; Clarity kendi clarity('consent') API’si üzerinden kontrol edilir. Consent alınmadan önce Clarity yüklenmemeli veya yüklenirse consent sinyali iletilene kadar veri toplanmamalıdır.
// Sayfa yüklenirken consent status belirsiz
// clarity() çağrılmadan Clarity script'i enjekte edilmemeli
// Consent alındığında Clarity yüklenir ve consent bildirilir
clarity("consent");
// Consent reddedildiğinde (sonradan revoke için)
clarity("consent", false);
Clarity’nin GTM template’i CMP entegrasyonu sunar; Custom HTML kullanıyorsan Clarity init kodu ancak consent granted olduktan sonra DOM’a eklenmelidir. Ek olarak Clarity form input’larını data-clarity-mask attribute’u ile maskelemeyi destekler (Hotjar’ın data-hj-suppress benzeri).
Shopify Customer Privacy API
Shopify mağazalarında consent yönetimi window.Shopify.customerPrivacy API’si üzerinden yapılır. API kullanılmadan önce loadFeatures ile yüklenmelidir; Shopify cookie’lerine (_tracking_consent gibi) doğrudan yazma yapmak desteklenmez ve yeni sürümlerde kırılır.
window.Shopify.loadFeatures(
[{ name: "consent-tracking-api", version: "0.1" }],
(error) => {
if (error) {
// hata durumu
}
},
);
Veri işleme izni kontrolü için dört Allowed metodu mevcut; bunlar merchant ayarı, ziyaretçi lokasyonu ve kullanıcı seçimini birleştirir:
window.Shopify.customerPrivacy.preferencesProcessingAllowed();
window.Shopify.customerPrivacy.analyticsProcessingAllowed();
window.Shopify.customerPrivacy.marketingAllowed();
window.Shopify.customerPrivacy.saleOfDataAllowed();
Consent değiştiğinde (setTrackingConsent çağrıldığında) visitorConsentCollected event’i tetiklenir. Listener sadece değişiklik anında bilgi aldığı için sayfa yüklenişinde mevcut durumu öğrenmek için yukarıdaki metodlar çağrılmalıdır.
document.addEventListener("visitorConsentCollected", (event) => {
// event.detail: { marketingAllowed, saleOfDataAllowed, analyticsAllowed, preferencesAllowed }
});
Consent kaydı yalnızca kullanıcı etkileşiminde yapılır (banner üzerinden kabul/red), otomatik yazım yapılmaz. sale_of_data parametresi opt-in kategorisi olarak değil, ayrı bir CCPA/VCDPA tarzı opt-out akışında kullanılır:
// Standart consent (analytics/marketing/preferences)
window.Shopify.customerPrivacy.setTrackingConsent(
{ analytics: true, marketing: true, preferences: true },
() => {},
);
// Data sale opt-out (ayrı akış)
window.Shopify.customerPrivacy.setTrackingConsent(
{ sale_of_data: false },
() => {},
);
GPC (Global Privacy Control) sinyali opt-out region’larında otomatik onurlandırılır ve setTrackingConsent ile override edilemez.
Faydalı yardımcı metodlar:
shouldShowBanner(): consent henüz alınmamış ve ziyaretçi banner gerektiren region’daysatruedöner.currentVisitorConsent():{ marketing, analytics, preferences, sale_of_data }— değerler'yes','no'veya''(henüz karar verilmedi).getRegion(): ISO 3166-2 kodu (örn.USCA,GBENG). Lokasyon belirlenemezse boş string.saleOfDataRegion(): ziyaretçi opt-out region’ında isetrue.
Custom GTM kurulumu varsa visitorConsentCollected event’i dinlenip Consent Mode v2 update komutu tetiklenir. Hydrogen veya diğer headless storefront’lar için setTrackingConsent’e ek parametreler (headlessStorefront: true, checkoutRootDomain, storefrontRootDomain, storefrontAccessToken) geçirilmeli; ayrıca Storefront API token’ı ve CSP güncellemesi gerekir. Hydrogen için Hydrogen Analytics paketi tercih edilir.
Shopify’ın merchant storefront üzerinde set ettiği cookie envanteri (strictly necessary, analytics, marketing kategorileri ve _tracking_consent, _shopify_essential, _shopify_analytics, _shopify_marketing, _shopify_s, _shopify_y gibi başlıca çerezler) resmi Shopify Çerez Politikası üzerinde güncel. CMP banner konfigürasyonunda bu liste kategori mapping için baz alınır.
Shopify Markets çoklu bölge kurulumunda cross-subdomain consent paylaşımı ayrı bir konu: Shopify Markets Cookie Bridge.
sGTM: Server-Side Consent State
Client-side Consent Mode v2 sinyalleri sGTM container’ına event data ile iletilir. Server-side tag’ler consent state’i event içinde consent_state veya consent alanı üzerinden okur ve koşullu çalışır. Meta CAPI, Google Ads Conversions gibi server tarafındaki tag’ler ad_user_data: 'denied' ise kullanıcı verisini (hash’lenmiş email, phone) event payload’a eklemeden ateşlenmelidir.
// sGTM server-side tag custom template (örnek)
const events = getAllEventData();
const consentState = events.consent_state || {};
if (consentState.ad_user_data === "denied") {
delete events.user_data.em;
delete events.user_data.ph;
}
Pratikte Meta’nın resmi sGTM Tag Template’i bu ayrımı içerir; ad_storage denied durumda CAPI call’u hâlâ gider ama action_source modified, ads click ID’ler çıkarılmış olur. sGTM’nin ajans stack içindeki yeri ve runtime gerçeği: sGTM Hosting Karar Matrisi.
BigQuery: GA4 Export ve Consent State
GA4 BigQuery export şeması consent state’i privacy_info struct’ında saklar:
privacy_info.analytics_storage:Yes/No/Unsetprivacy_info.ads_storage:Yes/No/Unsetprivacy_info.uses_transient_token:true/false
Event bazlı consent state, BigQuery üzerinde consent-segmentli analiz yapmayı mümkün kılar. Attribution modeling consent-aware kullanıcıları ayırıp modelled vs observed conversion karşılaştırması için:
SELECT
event_name,
privacy_info.analytics_storage,
COUNT(*) AS event_count
FROM
`project.analytics_XXXXXX.events_*`
WHERE
_TABLE_SUFFIX BETWEEN '20260401' AND '20260422'
GROUP BY
1, 2
ORDER BY
event_count DESC
Advanced mode çalışan bir hesapta privacy_info.analytics_storage = 'No' ile gelen event’ler cookieless ping’lerdir; Google bu satırları modelling için kullanır, user_pseudo_id event ömrüne özel geçici bir değer alır. BigQuery üzerinde multi-channel attribution ve consent sonrası telafi için: BigQuery Attribution Analizi, Meta Attribution Penceresi BigQuery Telafi.
Araç Seçimi: 4-Kategorili Karar Matrisi
2021’deki tool incelemeleri (CookieBot, CookieFirst, CookieHub, CookiePro, CookieScript, CookieYes) bu yazının ilk sürümünde yer alıyordu. Tool piyasası o zamandan beri önemli ölçüde değişti; fiyatlandırmalar ve özellik setleri güncel değil, bazı ürünler kapandı. Güncel ve ajans perspektifli 4-kategorili karar matrisi (yerli TR, global premium, Cloudflare native, self-hosted) bu yazıda yerine: Ajanslar için Marketing Stack 2026 — Katman 1: Consent.
Pillar’daki kategorilerin kısa özeti:
- Yerli (TR): Efilli, Mobildev, Consentify, Cookieyes TR.
- Global premium: Cookiebot, OneTrust, Termly, Osano, Iubenda.
- Cloudflare native: Zaraz.
- Self-hosted: Klaro, CookieConsent (Orest Bida), Civic, tarteaucitron.
İlgili Yazılar
- Consent Banner Koydunuz, Trafiğiniz %30 Düştü: GDPR ve KVKK’nın Ölçüm Etkisi
- Consent Sınırları İçinde Reklam Ölçümü: Google’ın Sinyal Mimarisi
- GA4 ve Google Ads Veri Kontrolleri Birleşiyor: Haziran 2026’ya Hazırlık Rehberi
- T-Soft Cookie Law ve Google Consent Mode v2 Uyumsuzluğu
- Ajanslar için Marketing Stack 2026
Footnotes
- 01 Consent Mode v2 dört sinyal taşır: ad_storage, analytics_storage, ad_user_data, ad_personalization. İlk iki sinyal v1'den geldi; ad_user_data ve ad_personalization v2 ile eklendi.
- 02 Default state 'denied' olmalı; Google Tag yüklenmeden önce gtag('consent', 'default', {...}) çağrısı yapılır. Consent tool kullanıcı tercihini yakaladıktan sonra 'update' ile sinyaller güncellenir.
- 03 EEA trafiğinde Consent Mode v2 ads personalization (remarketing) ve modelled conversions için zorunlu. Basic mode sinyali iletir, Advanced mode cookieless ping gönderip modelleme yapar.
- 04 GTM tarafında Template Gallery'den ‘Consent Mode (Google tags)' veya Custom HTML ile kurulur. Tag'lerin Consent Initialization trigger'ına bağlanması sırayı garanti altına alır.
- 05 Meta Pixel için fbq('consent', 'revoke'|'grant') komutu Pixel yüklenmeden önce çağrılır; consent sonrası init yapılır. HubSpot ve Hotjar kendi opt-out çerezleri ile yönetilir.
+ Consent Mode v1 ile v2 arasındaki fark nedir?
v1 iki sinyal (ad_storage, analytics_storage) taşıyordu. v2 ad_user_data ve ad_personalization sinyallerini ekledi. ad_user_data Google'a kullanıcı verisi (PII hash, ads click ID) gönderilip gönderilmeyeceğini, ad_personalization remarketing ve personalized ads için kullanılıp kullanılmayacağını kontrol eder.
+ Consent Mode v2 ne zaman zorunlu oldu?
Google, Mart 2024'ten itibaren EEA ve UK trafiğinde ads personalization, remarketing ve modelled conversions için v2 sinyallerini zorunlu kıldı. Uymayan hesaplarda audience ve conversion modellemesi yapılmıyor, remarketing listeleri dolmuyor.
+ Basic mode ile Advanced mode arasındaki fark?
Basic mode consent denied olduğunda Google tag'leri hiç yüklenmez, sadece consent state sinyali gönderilir. Advanced mode denied durumda da cookieless ping gönderir; bu ping modelleme için kullanılır, conversion ve trafik modellemesi sağlar. Advanced mode trafiğin yüksek olduğu hesaplarda %15-25 conversion recovery sağlayabilir.
+ Universal Analytics için Consent Mode hâlâ geçerli mi?
Hayır. Universal Analytics 1 Temmuz 2024'te veri işlemeyi durdurdu. Consent Mode v2 sadece GA4 ve Google Ads için geçerli. UA özelinde yapılan kurulumlar artık işlemez.
+ Facebook Analytics için consent nasıl uygulanır?
Facebook Analytics 30 Haziran 2021'de kapatıldı. Meta tarafında consent uygulaması artık Meta Pixel ve Meta Conversions API (CAPI) üzerinden yürür. fbq('consent', 'revoke') komutu Pixel yüklenmeden önce çağrılır, consent alınınca fbq('consent', 'grant') ile güncellenir.