Methodology v1.0
25 Ağustos 2026 • By AICompatible Ekibi • 7 dk okuma

Aylarca Kör Uçuyorduk: Analytics Kodunda Unutulan Placeholder ID

Sorunun Fark Edilişi: Paneldeki Sessizlik

Mart ayının sonlarıydı. Search Console'u kontrol ederken bir şey dikkatimi çekti: son 28 günde 47 bin gösterim, 2.3 bin tıklama vardı. Güzel rakamlar. Sonra rutin kontrol için Google Analytics 4 panelini açtım ve dondum kaldım. Sıfır kullanıcı. Sıfır oturum. Grafikler tamamen düz çizgi.

İlk düşüncem "AdBlock kullanıyorlar mı bu kadar çok?" oldu. Ama Search Console verileriyle bu kadar büyük bir tutarsızlık mantıklı değildi. Hemen sitenin kaynak kodunu açtım. Google Tag Manager kodu yerindeydi, gtag.js yükleniyordu. Ama bir satır gözüme çarptı:

gtag('config', 'G-MEASUREMENT_ID');

Kalbim bir an durdu. G-MEASUREMENT_ID. Google'ın dokümantasyonundaki placeholder metin. Gerçek bir Measurement ID değil. Yani sitemiz aylardır Analytics kodunu çalıştırıyor, her sayfa yüklenişinde gtag.js'i indiriyor, ama verileri hiçbir yere göndermiyor. Kör uçuyorduk.

Teşhis: Nasıl Bu Noktaya Geldik?

Hemen Git geçmişine baktım. Sorunu bulması 10 saniye sürdü:

// _includes/analytics.html
{% if site.google_analytics %}
<script async src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', '{{ site.google_analytics }}');
</script>
{% endif %}

Kod doğruydu. Sorun _config.yml dosyasındaydı:

google_analytics: G-MEASUREMENT_ID

Siteyi ilk kurduğumuzda bu satırı eklemişiz ama gerçek ID'yi yazmayı unutmuşuz. Jekyll build sırasında uyarı vermedi çünkü teknik olarak bir değer vardı. Browser console'da da hata yoktu çünkü gtag.js geçersiz ID'lerle bile çalışıyor (sadece veri göndermiyor).

Daha kötüsü: sitemiz 11 dilde yayındaydı. Her dil için ayrı _config.yml vardı ve hepsinde aynı placeholder duruyordu:

  • _config.en.yml → G-MEASUREMENT_ID
  • _config.tr.yml → G-MEASUREMENT_ID
  • _config.de.yml → G-MEASUREMENT_ID
  • ...ve 8 dil daha

Neden Daha Önce Farketmedik?

İtiraf etmeliyim: Analytics'i kurmayı ertelemiştik. "Önce içerik, sonra metrikler" mantığıyla hareket ediyorduk. Search Console'dan gelen organik trafik verilerine bakıp "site büyüyor" diyorduk. Ama kullanıcı davranışı, sayfa içi etkileşim, dönüşüm hunisi gibi kritik verilerin hiçbirini göremiyorduk.

Teknik Çözüm: Admin API ile Toplu Güncelleme

Önce GA4'te yeni bir property oluşturmam gerekiyordu. Manuel yapmak yerine Google Analytics Admin API kullanmaya karar verdim. Hem öğrenmiş olurdum hem de gelecekte otomasyona ihtiyaç duyarsak hazır olurdu.

1. Property Oluşturma

from google.analytics.admin import AnalyticsAdminServiceClient
from google.analytics.admin_v1beta.types import Property

client = AnalyticsAdminServiceClient()

property = Property()
property.parent = "accounts/YOUR_ACCOUNT_ID"
property.display_name = "AICompatible.com"
property.time_zone = "Europe/Istanbul"
property.currency_code = "USD"

response = client.create_property(property=property)
measurement_id = response.name.split('/')[-1]  # properties/123456789 -> 123456789

Ama asıl Measurement ID'yi (G-XXXXXXXXXX formatında) almak için data stream oluşturmam gerekiyordu:

from google.analytics.admin_v1beta.types import DataStream

stream = DataStream()
stream.type_ = DataStream.DataStreamType.WEB_DATA_STREAM
stream.display_name = "AICompatible Web"
stream.web_stream_data = {"default_uri": "https://aicompatible.com"}

stream_response = client.create_data_stream(
    parent=response.name,
    data_stream=stream
)

real_measurement_id = stream_response.web_stream_data.measurement_id
print(f"Gerçek ID: {real_measurement_id}")  # G-ABC123XYZ

2. Tüm Config Dosyalarını Güncelleme

11 dosyayı manuel güncellemek yerine basit bir Python scripti yazdım:

import os
import re

MEASUREMENT_ID = "G-ABC123XYZ"  # API'den aldığımız gerçek ID
CONFIG_FILES = [
    "_config.yml", "_config.en.yml", "_config.tr.yml",
    "_config.de.yml", "_config.fr.yml", "_config.es.yml",
    "_config.it.yml", "_config.pt.yml", "_config.nl.yml",
    "_config.pl.yml", "_config.ja.yml", "_config.zh.yml"
]

for config_file in CONFIG_FILES:
    with open(config_file, 'r') as f:
        content = f.read()
    
    updated = re.sub(
        r'google_analytics:\s*G-MEASUREMENT_ID',
        f'google_analytics: {MEASUREMENT_ID}',
        content
    )
    
    with open(config_file, 'w') as f:
        f.write(updated)
    
    print(f"✓ {config_file} güncellendi")

3. Doğrulama

Deploy ettikten sonra Chrome DevTools'u açıp Network sekmesinde collect?v=2 isteklerini izledim. Artık gerçek Measurement ID gidiyordu. 10 dakika içinde GA4 panelinde ilk gerçek zamanlı kullanıcıları gördüm.

Sonuç ve Genel Dersler

Bu sorun bize üç önemli ders verdi:

  1. Placeholder'lar sessiz katillerdir: Build hatası vermezler, console'da görünmezler. Ama işinizi sabote ederler.
  2. Metrik yokluğu da bir metriktir: "Veri gelmiyor" durumu, "veri kötü" durumundan daha tehlikelidir çünkü sorunu fark etmeniz aylar alabilir.
  3. Çok dilli siteler risk çarpanıdır: Bir config hatası 11 kopyaya yayılır ve düzeltmesi manuel yapıldığında hata riski artar.

Bu deneyimden sonra AICompatible.com'un tarayıcısına yeni bir kontrol ekledik: sitedeki tüm üçüncü parti script'leri (Analytics, Tag Manager, vb.) tarayıp placeholder ID'leri tespit ediyor. Şu ana kadar taradığımız 200+ yapay zeka aracı sitesinin %8'inde benzer sorunlar bulduk. Çoğu startup'ın ortak sorunu: hızlı ilerlerken temel altyapı detaylarını atlamak.

Eğer sitenizde Google Analytics kuruluysa ama panelde veri görmüyorsanız, kaynak kodunuza bakın. G-MEASUREMENT_ID, UA-XXXXX-Y veya GTM-XXXXXX gibi placeholder'lar görüyorsanız, aynı durumdasınız demektir. Tarayıcımız bu tür yapılandırma hatalarını otomatik tespit ediyor ve hangi satırda olduğunu gösteriyor. Bazen en büyük sorunlar, en basit unutkanlıklarda gizlidir.