Ana Sayfa / Seviye 3 / GA4 / BigQuery Entegrasyonu

BigQuery Entegrasyonu

📚 Seviye 3 — Uzmanlaşma ⏱ ~15 dakika
📌 Nereden Geliyoruz?
GA4 Entegrasyonları dersinde GA4'ü Google Ads, Search Console ve diğer araçlarla bağlamayı öğrenmiştik. Şimdi uzmanlaşma seviyesine geçiyoruz: GA4 verisini BigQuery'ye aktararak ham event-level veri üzerinde SQL ile örnekleme olmadan ileri analizler yapacağız.

1. Neden BigQuery?

💡 Basit Anlatım
GA4 raporları hazır tabloları gösterir — Excel'deki pivot tablo gibi. "Şu kanaldan şu kadar kullanıcı geldi" der ama detayı vermez. BigQuery ise ham veriye ulaşmanı sağlar — Excel'deki tüm satırlara bakabilmek gibi. Neden ihtiyaç var? Bazen standart raporlar sorunun cevabını veremez. Mesela "pazartesi günleri saat 14-16 arası mobil cihazdan gelen kullanıcıların ortalama sepet tutarı nedir?" gibi spesifik bir soruya GA4 arayüzü cevap veremez. BigQuery'de SQL ile bu soruyu doğrudan sorarsın.

GA4 arayüzü örneklenmiş (sampled) veriler gösterebilir ve belirli analiz türlerini desteklemez. BigQuery, ham event-level veriye doğrudan erişim sağlar.

a) BigQuery'nin Avantajları

🎯 Benzetme: GA4 arayüzü bir restoranın menüsü gibidir — belirli yemeklerden (raporlardan) seçim yaparsınız. BigQuery ise restoranın mutfağıdır — tüm malzemelere (ham veriye) erişir ve istediğiniz tarifi (analizi) kendiniz yaparsınız.
🚫 Yaygın Yanılgı

❌ Yanlış: "BigQuery'ye veri aktarınca GA4'teki veri silinir"

✅ Doğru: BigQuery export bir KOPYA oluşturur, GA4'teki orijinal veriyi etkilemez. GA4 raporlarınız aynen çalışmaya devam eder. BigQuery'deki veri GA4'ten bağımsızdır: GA4'te veri silinse bile BigQuery'deki kopya kalır. Bu nedenle BigQuery, GA4'ün 14 aylık Data Retention sınırlamasını aşmak için de kullanılır — BigQuery'ye aktarılan veri kalıcı olarak saklanır ve yıllar sonra bile analiz edilebilir.

2. BigQuery Bağlantısı Kurma

a) Kurulum Adımları

  1. GA4 Admin > Product Links > BigQuery Links
  2. "Link" butonuna tıklayın.
  3. Google Cloud projenizi seçin (yoksa oluşturun).
  4. Veri konumunu seçin (ör. EU veya US).
  5. Export türünü seçin: Daily (günlük) ve/veya Streaming (gerçek zamanlı).
  6. Export edilecek event'leri seçin (tümü veya belirli event'ler).
graph LR GA4["📊 GA4"] -->|"Daily Export\n(Günlük tablo)"| BQ["🗄 BigQuery"] GA4 -->|"Streaming Export\n(Anlık veri)"| BQ BQ --> ANALYSIS["📈 SQL Analizi"] BQ --> LOOKER["📊 Looker Studio"] BQ --> DS["📋 Data Science\n(Python, R)"] style GA4 fill:#E8F6FC,stroke:#29ABE2 style BQ fill:#DCFCE7,stroke:#22C55E
⚠️ Uyarı: BigQuery maliyeti kullanıma göre değişir. Daily export genellikle düşük maliyetlidir (ayda birkaç dolar). Streaming export ise yüksek trafikli sitelerde maliyeti önemli ölçüde artırabilir. Başlangıçta yalnızca daily export ile başlayın.

3. GA4 BigQuery Export Şeması

GA4 verileri BigQuery'de belirli bir şema (yapı) ile saklanır. Bu yapıyı anlamak SQL sorguları yazmak için zorunludur.

a) Ana Tablo Yapısı

Her gün için bir tablo oluşturulur: events_YYYYMMDD (ör. events_20250401)

SütunTürAçıklama
event_nameSTRINGEvent adı (page_view, purchase, vb.)
event_timestampINTEGERMicrosecond cinsinden zaman damgası
user_pseudo_idSTRINGAnonim kullanıcı ID
event_paramsRECORD (REPEATED)Event parametreleri (key-value çiftleri)
user_propertiesRECORD (REPEATED)Kullanıcı özellikleri
itemsRECORD (REPEATED)E-ticaret ürün bilgileri
traffic_sourceRECORDİlk edinim kaynağı
deviceRECORDCihaz bilgileri
geoRECORDCoğrafi konum

b) event_params Yapısı (UNNEST)

💡 Basit Anlatım — UNNEST Nedir?
GA4 verileri iç içe geçmiş kutular gibi saklanır: bir event'in içinde parametreler, parametrelerin içinde değerler var. Bunu şöyle düşün: bir kargo paketi (event satırı) açıyorsun, içinden küçük kutular (event_params) çıkıyor, her küçük kutunun üzerinde bir etiket (key) ve içinde bir değer (value) var. UNNEST bu kutuları açıp düz bir tablo haline getirir — böylece Excel gibi satır satır okuyabilirsin. UNNEST olmadan iç içe veriye erişemezsin.

event_params iç içe (nested) bir yapıdadır. Değerlere erişmek için UNNEST fonksiyonu kullanılır:

📖 SQL Ne Diyor?
  • SELECT event_name, ... → "Bana şu sütunları göster: event adı ve ..."
  • (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') → "event_params kutularını aç, 'page_location' etiketli olanı bul, metin değerini al."
  • FROM `project.dataset.events_*` → "Verileri events tablosundan çek (* = tüm günler)."
  • WHERE _TABLE_SUFFIX BETWEEN '20250301' AND '20250331' → "Sadece Mart 2025 tablolarını tara (maliyet tasarrufu!)."
SELECT
  event_name,
  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS page_url,
  (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'engagement_time_msec') AS engagement_time
FROM `project.dataset.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20250301' AND '20250331'
graph TD ROW["📄 Tek Event Satırı"] --> EN["event_name\n'purchase'"] ROW --> EP["event_params\n(REPEATED)"] ROW --> UP["user_properties\n(REPEATED)"] ROW --> IT["items\n(REPEATED)"] EP --> EP1["key: 'transaction_id'\nvalue: 'T-123'"] EP --> EP2["key: 'value'\nvalue: 3847.80"] EP --> EP3["key: 'currency'\nvalue: 'TRY'"] IT --> IT1["item_id: 'SKU-A100'\nitem_name: 'Trençkot'\nprice: 1899.00"] style ROW fill:#E8F6FC,stroke:#29ABE2 style EP fill:#DCFCE7,stroke:#22C55E style IT fill:#FEF3C7,stroke:#F59E0B

4. Temel SQL Sorguları

a) Günlük Event Sayısı

📖 SQL Ne Diyor?
  • SELECT event_name, COUNT(*) AS event_count → "Her event adını ve kaç kez gerçekleştiğini say."
  • FROM `project.dataset.events_20250401` → "1 Nisan 2025 tablosundan çek."
  • GROUP BY event_name → "Event adına göre grupla (her event adı bir satır olsun)."
  • ORDER BY event_count DESC → "En çok gerçekleşenden en aza sırala."
  • LIMIT 20 → "Sadece ilk 20 sonucu göster."
SELECT
  event_name,
  COUNT(*) AS event_count
FROM `project.dataset.events_20250401`
GROUP BY event_name
ORDER BY event_count DESC
LIMIT 20;

b) Kaynak/Ortam Bazlı Dönüşümler

📖 SQL Ne Diyor?
  • traffic_source.source, traffic_source.medium → "Trafik kaynağını ve ortamını göster (ör. google / cpc)."
  • COUNTIF(event_name = 'purchase') → "Sadece 'purchase' event'lerini say = satın alma sayısı."
  • SUM((SELECT value.double_value FROM UNNEST(event_params) WHERE key = 'value')) → "Her purchase'ın 'value' parametresini (tutarını) topla = toplam gelir."
  • GROUP BY 1, 2 → "1. ve 2. sütuna (source, medium) göre grupla."
SELECT
  traffic_source.source,
  traffic_source.medium,
  COUNTIF(event_name = 'purchase') AS purchases,
  SUM(
    (SELECT value.double_value FROM UNNEST(event_params) WHERE key = 'value')
  ) AS total_revenue
FROM `project.dataset.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20250301' AND '20250331'
  AND event_name = 'purchase'
GROUP BY 1, 2
ORDER BY purchases DESC;

c) Benzersiz Kullanıcı Sayısı

SELECT
  COUNT(DISTINCT user_pseudo_id) AS unique_users
FROM `project.dataset.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20250301' AND '20250331';
💡 İpucu: BigQuery'de events_* ile wildcard kullanıp _TABLE_SUFFIX ile tarih filtrelemek, sorgu maliyetini önemli ölçüde azaltır. Tüm tabloyu taramak yerine yalnızca ihtiyacınız olan tarihleri sorgulayın.
🎯 Bu Dersten Öğrenmen Gerekenler
  • GA4 verilerini BigQuery'ye aktararak örnekleme olmadan ham event-level analiz yapabilirsin.
  • BigQuery'nin nested/repeated veri yapısını (events, event_params, items) anlayıp UNNEST ile sorgulayabilirsin.
  • Temel SQL sorgularıyla kullanıcı bazlı, oturum bazlı ve ürün bazlı analizler yazabilirsin.
  • GA4'ün 14 aylık veri saklama sınırını BigQuery ile aşarak uzun vadeli trend analizi yapabilirsin.

📝 Quiz — Bilgini Test Et

← Önceki Ders Sonraki Ders →