BigQuery Entegrasyonu
1. Neden BigQuery?
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ı
- Ham veri erişimi: Her event, her parametre, her kullanıcı özelliği — işlenmemiş formda.
- Örnekleme yok: Milyonlarca satır üzerinde tam veri analizi.
- Özel hesaplamalar: SQL ile GA4 arayüzünde yapılamayan analizler.
- Veri birleştirme: CRM, ERP, reklam verileri ile GA4 verisini birleştirme.
- Veri saklama: GA4'ün 14 aylık sınırlaması yok — veriler kalıcı olarak BigQuery'de saklanır.
❌ 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ı
- GA4 Admin > Product Links > BigQuery Links
- "Link" butonuna tıklayın.
- Google Cloud projenizi seçin (yoksa oluşturun).
- Veri konumunu seçin (ör. EU veya US).
- Export türünü seçin: Daily (günlük) ve/veya Streaming (gerçek zamanlı).
- Export edilecek event'leri seçin (tümü veya belirli event'ler).
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ütun | Tür | Açıklama |
|---|---|---|
event_name | STRING | Event adı (page_view, purchase, vb.) |
event_timestamp | INTEGER | Microsecond cinsinden zaman damgası |
user_pseudo_id | STRING | Anonim kullanıcı ID |
event_params | RECORD (REPEATED) | Event parametreleri (key-value çiftleri) |
user_properties | RECORD (REPEATED) | Kullanıcı özellikleri |
items | RECORD (REPEATED) | E-ticaret ürün bilgileri |
traffic_source | RECORD | İlk edinim kaynağı |
device | RECORD | Cihaz bilgileri |
geo | RECORD | Coğrafi konum |
b) event_params Yapısı (UNNEST)
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:
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'
4. Temel SQL Sorguları
a) Günlük Event Sayısı
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
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';
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.
- 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.
