İçeriğe geç
ceaksan

Google Consent Mode v2 Kurulumu: gtag, GTM, Meta Pixel ve Platform Entegrasyonları

Consent Mode v2 dört sinyalli (ad_storage, analytics_storage, ad_user_data, ad_personalization) yapıya geçti. gtag kod örnekleri, GTM template'i, Meta Pixel, HubSpot ve Hotjar için consent uygulamaları.

15 Eyl 2025 6 dk okuma Güncellendi: 22 Nis 2026
TL;DR

Google Consent Mode v2 dört sinyalli yapıya geçti: ad_storage, analytics_storage, ad_user_data, ad_personalization. Mart 2024'ten itibaren EEA trafiğinde ads personalization için zorunlu. Bu rehber gtag kodu, GTM template'i ve Meta Pixel, HubSpot, Hotjar uygulamalarını içerir.

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.

öneri

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.

Sinyalv1v2Ne Kontrol Eder
ad_storageReklam amaçlı çerez okuma/yazma izni
analytics_storageAnalytics çerezleri için izin
ad_user_dataKullanıcı verisinin (hash’lenmiş email, ads click ID) Google’a iletilip iletilmeyeceği
ad_personalizationRemarketing ve personalized ads için kullanım izni
functionality_storageSite fonksiyonelliği için çerezler
personalization_storageSite-içi kişiselleştirme çerezleri
security_storageGü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:

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.

Çerez İzni - Banner Örneği
Çerez İzni - Banner Örneği

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.

not

region parametresi sadece default komutunda kullanılır; update komutunda region filtresi yoktur.

<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.
  • gcs parametresi 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.

Google Tag Manager ve Cookie Araçları
Google Tag Manager ve Cookie Araçları

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.

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_data required
  • Google Ads Remarketing: ad_storage, ad_user_data, ad_personalization required
  • GA4 Configuration: analytics_storage required (built-in consent check)
  • Meta Pixel: ad_storage required

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 cookie yönetimi
Hubspot cookie yönetimi

HubSpot tarafında oluşturulan başlıca çerezler:

ÇerezSüreAmaç
__hs_opt_out13 ayKullanıcının opt-out tercihini hatırlar
__hs_do_not_track13 ayTracking kodunun anonim mod çalışmasını sağlar
__hs_initial_opt_in7 günBanner’ın tekrar gösterimini engeller
__hs_cookie_cat_pref13 ayİzin verilen çerez kategorilerini hatırlar
__hstc, hubspotutk, __hssc, __hssrcDeğişkenAnalitik ç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’daysa true dö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 ise true.

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.

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.

GA4 BigQuery export şeması consent state’i privacy_info struct’ında saklar:

  • privacy_info.analytics_storage: Yes / No / Unset
  • privacy_info.ads_storage: Yes / No / Unset
  • privacy_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

Footnotes

  1. Consent Mode For Google Tags. Simo Ahava’s blog
Önemli Noktalar
  • 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.
Sık Sorulan Sorular (FAQ)
+ 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.