Ana Sayfa / Seviye 3 / GTM / dataLayer İleri

dataLayer İleri

📚 Seviye 3 — Uzmanlaşma ⏱ ~15 dakika
📌 Nereden Geliyoruz?
GA4 Event Takibi dersinde GTM üzerinden GA4 event'lerini tetiklemeyi ve temel event parametrelerini yapılandırmayı öğrenmiştik. Şimdi uzmanlaşma seviyesine geçiyoruz: dataLayer'ın teknik yapısını derinlemesine anlayacak, karmaşık veri yapılarını (e-ticaret, form, dinamik içerik) dataLayer üzerinden GTM'ye aktarmayı ve ileri dataLayer stratejilerini uygulayacağız.

1. dataLayer Nedir?

💡 Basit Anlatım
dataLayer, web sitenin GTM'ye bilgi fısıldadığı gizli kanal — bir nevi kulaktan kulağa oyunu. Site diyor ki "kullanıcı ürün sayfasına baktı, ürünün fiyatı 500 TL", GTM duyuyor ve GA4'e/Ads'e iletiyor. Teknik olarak bir JavaScript dizisi (array) ama özünde "siteden GTM'ye mesaj taşıyan bir kutu" olarak düşünebilirsin.

dataLayer, GTM'nin web sayfasından veri almasını sağlayan bir JavaScript nesne dizisidir (array of objects). Sayfa ile GTM arasındaki yapılandırılmış iletişim katmanıdır.

graph LR A["👤 Kullanıcı tıklar"] --> B["🌐 Site dataLayer'a\npush eder"] B --> C["📦 GTM dinler"] C --> D["⚡ Trigger\ntetiklenir"] D --> E["🏷 Tag çalışır"] E --> F["📊 GA4 / Ads'e\nveri gider"] style A fill:#E8F6FC,stroke:#29ABE2 style B fill:#DCFCE7,stroke:#22C55E style C fill:#FEF3C7,stroke:#F59E0B style D fill:#FEE2E2,stroke:#EF4444 style E fill:#E8F6FC,stroke:#29ABE2 style F fill:#DCFCE7,stroke:#22C55E

a) Teknik Yapı

dataLayer aslında basit bir JavaScript array'idir:

window.dataLayer = window.dataLayer || [];
dataLayer.push({
  'event': 'page_view',
  'page_type': 'product',
  'user_status': 'logged_in'
});
📖 Kod Ne Diyor?

Yukarıdaki kodu satır satır okuyalım:

  • window.dataLayer = window.dataLayer || []; → "dataLayer zaten varsa onu kullan, yoksa boş bir liste oluştur." Bu satır güvenlik amaçlıdır — sayfada birden fazla script olabilir.
  • dataLayer.push({...}) → "Bu listeye yeni bir bilgi paketi ekle."
  • 'event': 'page_view' → "Bu bir sayfa görüntüleme olayıdır." GTM bu satırı görünce tetikleyici (trigger) devreye girer.
  • 'page_type': 'product' → "Sayfa türü: ürün sayfası." Bu ek bilgidir, GTM isterse kullanır.
  • 'user_status': 'logged_in' → "Kullanıcı giriş yapmış." Yine ek bilgi.

b) dataLayer.push() Mekanizması

Her dataLayer.push() çağrısı GTM'ye bir mesaj gönderir. Eğer push içinde 'event' anahtarı varsa, GTM bu event'i bir trigger olarak değerlendirir.

graph LR WEB["🌐 Web Sayfası"] -->|"dataLayer.push()"| DL["📦 dataLayer\n(JS Array)"] DL -->|"Event tetiklenir"| GTM["🏷 GTM Container"] GTM -->|"Trigger eşleşirse"| TAGS["📊 Tag'ler Ateşlenir\n(GA4, Meta, vb.)"] style WEB fill:#E8F6FC,stroke:#29ABE2 style DL fill:#DCFCE7,stroke:#22C55E style GTM fill:#FEF3C7,stroke:#F59E0B
🎯 Benzetme: dataLayer bir posta kutusu gibidir. Web sitesi (gönderici) mektupları (verileri) posta kutusuna bırakır. GTM (postacı) kutuyu kontrol eder ve mektupları doğru alıcılara (tag'lere) iletir.
🚫 Yaygın Yanılgı

❌ Yanlış: "dataLayer sadece geliştiricilerin işi"

✅ Doğru: dataLayer tasarımı pazarlamacı ve geliştiricinin ortak sorumluluğudur. Pazarlamacı hangi verilerin toplanması gerektiğini (ürün adı, fiyat, kategori, kullanıcı durumu) belirler, geliştirici ise bu verileri dataLayer'a teknik olarak ekler. Pazarlamacının dataLayer yapısını anlaması, doğru veri talep etmesi ve Preview Mode'da verilerin geldiğini doğrulayabilmesi gerekir. "Ben pazarlamacıyım, kod beni ilgilendirmez" tutumu eksik veri toplamaya yol açar.

2. Data Layer Variable (Veri Katmanı Değişkeni)

GTM'de dataLayer'dan veri okumak için "Data Layer Variable" türünde değişken oluşturulur.

a) Basit Değişken

dataLayer'daki bir anahtarın değerini okur:

b) İç İçe (Nested) Değişken

Nokta notasyonu ile derinlerdeki değerleri okur:

3. Zamanlama: GTM Snippet Öncesi vs Sonrası

💡 Basit Anlatım
Zamanlama meselesi şuna benzer: Bir odaya girdiğinde masada zaten bir not varsa onu hemen okursun. Ama sen odaya girdikten sonra biri not bırakırsa, ancak o an fark edersin. GTM de aynı — sayfa yüklenirken GTM'den önce bırakılan veriler hemen okunur, sonra bırakılanlar ise ancak o an tetiklenir. Kritik fark: GTM yüklenmeden önce bırakılan "event" tetiklenemez çünkü dinleyen henüz yok!

dataLayer push'larının GTM snippet'ine göre zamanlaması kritik öneme sahiptir.

a) GTM Snippet Öncesi (Önerilen)

<!-- Sayfa yüklenirken mevcut olan veriler -->
<script>
  window.dataLayer = window.dataLayer || [];
  dataLayer.push({
    'page_type': 'product',
    'product_id': '12345',
    'product_price': 299.90
  });
</script>

<!-- GTM Snippet -->
<script>(function(w,d,s,l,i){...})(window,document,'script','dataLayer','GTM-XXXXX');</script>

GTM yüklendiğinde veriler zaten hazırdır. Page View trigger'ı ile birlikte kullanılabilir.

b) GTM Snippet Sonrası (Dinamik Event'ler)

📖 Kod Ne Diyor?

Aşağıdaki kod, kullanıcı "sepete ekle" butonuna tıkladığında çalışır:

  • document.getElementById('add-to-cart') → Sayfadaki "add-to-cart" ID'li butonu bul.
  • .addEventListener('click', function() {...}) → Bu butona tıklanınca şunu yap:
  • dataLayer.push({...}) → GTM'ye bir bilgi paketi gönder.
  • 'event': 'add_to_cart' → "Sepete ekleme olayı gerçekleşti" — GTM bu event'i tetikleyici olarak kullanır.
  • 'ecommerce': { 'items': [...] } → Ürün detayları: ID, isim, fiyat ve miktar.
<!-- Kullanıcı etkileşimi sonrası -->
<script>
  document.getElementById('add-to-cart').addEventListener('click', function() {
    dataLayer.push({
      'event': 'add_to_cart',
      'ecommerce': {
        'items': [{
          'item_id': 'SKU-12345',
          'item_name': 'Nike Air Max 90',
          'price': 1299.00,
          'quantity': 1
        }]
      }
    });
  });
</script>
⚠️ Uyarı: GTM snippet'inden önce yapılan push'larda 'event' anahtarı kullanmayın — çünkü GTM henüz yüklenmemiştir ve event tetiklenemez. Snippet öncesi push'lar yalnızca veri taşımalıdır.

4. E-ticaret dataLayer Uygulaması

💡 Basit Anlatım
E-ticaret takibi için Google'ın beklediği belirli bir "dil" var. Nasıl ki bir kargo şirketine paket gönderirken belirli bir form dolduruyorsan (alıcı adı, adres, ağırlık), GA4'e de e-ticaret verisi gönderirken belirli bir formatta veri push'laman gerekiyor. Event adları (view_item, add_to_cart, purchase) ve parametre yapısı (items dizisi, currency, value) hep standart. Bu standarda uyarsan GA4 e-ticaret raporları otomatik çalışır.

GA4 e-ticaret takibi için belirli event'lerin standart formatta dataLayer'a push'lanması gerekir.

graph LR FLOW["🛒 E-ticaret Akışı"] --> VI["view_item\nÜrün detay sayfası"] VI --> ATC["add_to_cart\nSepete ekleme"] ATC --> BC["begin_checkout\nÖdeme başlatma"] BC --> AP["add_payment_info\nÖdeme bilgisi"] AP --> PUR["purchase\nSatın alma"] style VI fill:#E8F6FC,stroke:#29ABE2 style ATC fill:#DCFCE7,stroke:#22C55E style PUR fill:#FEF3C7,stroke:#F59E0B

a) view_item Örneği

📖 Kod Ne Diyor?
  • dataLayer.push({ ecommerce: null }) → Önce eski e-ticaret verisini temizle (önceki sayfadan kalıntı olmasın).
  • 'event': 'view_item' → "Kullanıcı bir ürün detay sayfasını görüntüledi."
  • 'currency': 'TRY' → Para birimi: Türk Lirası.
  • 'value': 1299.00 → Ürünün değeri.
  • 'items': [...] → Ürün bilgileri listesi — her ürün için ID, isim, marka, kategori, fiyat ve miktar.
dataLayer.push({ ecommerce: null }); // Önceki ecommerce verisini temizle
dataLayer.push({
  'event': 'view_item',
  'ecommerce': {
    'currency': 'TRY',
    'value': 1299.00,
    'items': [{
      'item_id': 'SKU-12345',
      'item_name': 'Nike Air Max 90',
      'item_brand': 'Nike',
      'item_category': 'Ayakkabi',
      'item_category2': 'Spor',
      'price': 1299.00,
      'quantity': 1
    }]
  }
});

b) add_to_cart Örneği

dataLayer.push({ ecommerce: null });
dataLayer.push({
  'event': 'add_to_cart',
  'ecommerce': {
    'currency': 'TRY',
    'value': 1299.00,
    'items': [{
      'item_id': 'SKU-12345',
      'item_name': 'Nike Air Max 90',
      'price': 1299.00,
      'quantity': 1
    }]
  }
});

c) purchase Örneği

dataLayer.push({ ecommerce: null });
dataLayer.push({
  'event': 'purchase',
  'ecommerce': {
    'transaction_id': 'T-98765',
    'value': 2598.00,
    'tax': 467.64,
    'shipping': 29.90,
    'currency': 'TRY',
    'items': [{
      'item_id': 'SKU-12345',
      'item_name': 'Nike Air Max 90',
      'price': 1299.00,
      'quantity': 2,
      'item_brand': 'Nike',
      'item_category': 'Ayakkabi'
    }]
  }
});
💡 İpucu: Her e-ticaret push'undan önce dataLayer.push({ ecommerce: null }) satırını ekleyin. Bu, önceki event'ten kalan ecommerce verisinin yeni event'e karışmasını önler. GA4'ün resmi belgelerinde de bu yöntem önerilir.
sequenceDiagram participant P as Sayfa participant DL as dataLayer participant GTM as GTM participant GA4 as GA4 P->>DL: push({ecommerce: null}) P->>DL: push({event: 'purchase', ecommerce: {...}}) DL->>GTM: Custom Event: purchase GTM->>GTM: Trigger eşleşir GTM->>GA4: purchase event + items gönder
🎯 Bu Dersten Öğrenmen Gerekenler
  • dataLayer.push() mekanizmasını anlayıp event anahtarıyla GTM trigger'larını tetikleyebilirsin.
  • E-ticaret, form ve dinamik içerik verilerini dataLayer üzerinden yapılandırılmış biçimde GTM'ye aktarabilirsin.
  • dataLayer değişkenlerini GTM'de tanımlayıp tag parametrelerine bağlayabilirsin.
  • Geliştirici ekibe doğru dataLayer spesifikasyonu yazarak ihtiyacın olan veriyi isteyebilirsin.

📝 Quiz — Bilgini Test Et

← Önceki Ders Sonraki Ders →