Veri odaklı içerik stratejisi: neyi, neden, nasıl ölçmeli
Search Console ve GA4 verisini kendi tarafında birleştirip sorgu-sayfa eşleşmesi çıkarma: hangi metrik kararı değiştirir, hangisi gürültüdür.
Veri odaklı içerik stratejisi denince çoğu ekibin aklına aylık trafik grafiği geliyor. Oysa trafik tek başına bir iş sonucu değil. Ziyaretçi sayısının düzenli arttığı ama teklif formunun aylarca boş kaldığı siteler gördüm; tersine, ayda birkaç yüz kişinin girdiği tek bir sayfanın bütün gelen talebi taşıdığına da tanık oldum. Ölçmeye trafikten başlayınca bu ikisini ayırt edemiyorsunuz.
Sorun iki aracın iki ayrı hikâye anlatmasından kaynaklanıyor. Search Console hangi sorgunun hangi sayfayı sıralattığını bilir ama sayfada sonra ne olduğundan habersizdir. GA4 sayfada ne olduğunu bilir ama sorguyu göremez. GA4'ün Search Console entegrasyonu bu boşluğu tam kapatmıyor: sorgu raporu yalnız tıklama, gösterim ve pozisyon verir; dönüşüm ölçümleri yalnız açılış sayfası düzeyinde yan yana gelir. Sorgu ile dönüşümü aynı satırda görmek istiyorsanız iki ham veriyi kendi tarafınıza çekip birleştirmeniz gerekiyor.
Bu yazıda kendi düzenimi anlatacağım: hangi kararı vermek için hangi sayıya baktığımı, iki kaynağı Python ile nasıl çektiğimi, sayfa düzeyinde nasıl eşleştirdiğimi ve hangi metrikleri bilinçli olarak görmezden geldiğimi.
Önce karar, sonra metrik
Kurarken uyguladığım tek kural şu: bir sayı, alacağım bir kararı değiştirmiyorsa panoda yeri yok. Bu yüzden metrik listesinden değil karar listesinden başlıyorum. İçerik tarafında düzenli aldığım kararlar dört tane:
- Sayfayı yeniden yazmalı mıyım? Gösterim yüksek, tıklama oranı düşük, pozisyon 4-10 arasında. Başlık ve meta açıklama sorguyla konuşmuyor demektir.
- Sayfayı birleştirmeli ya da kaldırmalı mıyım? On iki ayda anlamlı gösterim yok. İçerik ya kimsenin aramadığı bir şeyi anlatıyor ya da başka bir sayfamla aynı sorguya çıkıyor.
- Yeni bir sayfa yazmalı mıyım? Bir sorgu için sıralanan sayfa aslında başka bir konuyu anlatıyor. Sorgu var, doğru cevap yok.
- Formu ya da çağrıyı değiştirmeli miyim? Organik tıklama var, sayfa okunuyor, ama tek bir form gönderimi yok. Sorun içerikte değil sayfanın devamında.
Bu dört kararın her biri Search Console'dan bir sinyal, GA4'ten bir sinyal istiyor. Birleştirme işini bu yüzden yapıyorum; rapor süslemek için değil.
Search Console verisini sorgu ve sayfa boyutuyla çekmek
Arayüzden dışa aktarma bin satırla sınırlı ve sorgu ile sayfayı aynı tabloda vermiyor. API ise iki boyutu birlikte, istek başına 25.000 satıra kadar döndürüyor; startRow ile sayfalayınca tamamını alıyorsunuz. Bir hizmet hesabı açıp e-posta adresini Search Console mülküne kullanıcı olarak ekledikten sonra aşağıdaki betik üç aylık sorgu-sayfa tablosunu CSV'ye yazıyor:
import csv
from google.oauth2 import service_account
from googleapiclient.discovery import build
SCOPES = ["https://www.googleapis.com/auth/webmasters.readonly"]
creds = service_account.Credentials.from_service_account_file("sa.json", scopes=SCOPES)
sc = build("searchconsole", "v1", credentials=creds)
def sorgu_sayfa(site, baslangic, bitis):
start = 0
while True:
body = {
"startDate": baslangic, "endDate": bitis,
"dimensions": ["query", "page"],
"rowLimit": 25000, "startRow": start,
}
cevap = sc.searchanalytics().query(siteUrl=site, body=body).execute()
satirlar = cevap.get("rows", [])
if not satirlar:
break
for r in satirlar:
yield (r["keys"][0], r["keys"][1], r["clicks"],
r["impressions"], r["ctr"], r["position"])
start += len(satirlar)
with open("gsc.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["sorgu", "sayfa", "tiklama", "gosterim", "to", "pozisyon"])
for satir in sorgu_sayfa("sc-domain:ornek.com", "2026-06-01", "2026-08-31"):
w.writerow(satir)
İki noktaya dikkat: Search Console anonimleştirdiği düşük hacimli sorguları bu tablodan tamamen düşürüyor, yani sorgu bazlı toplam sayfa bazlı toplamdan küçük çıkıyor; bu bir hata değil. İkincisi, veri en fazla 16 ay geriye gidiyor. Bu betiği ayda bir çalıştırıp CSV'leri biriktirmek, bir yıl sonra "geçen yıl bu ay" kıyaslamasını mümkün kılan tek yol.
GA4 tarafı ve iki tabloyu kendi tarafınızda birleştirmek
GA4'ten ihtiyacım olan şey mütevazı: açılış sayfası başına organik oturum ve önemli olay sayısı. Önemli olay olarak yalnız gerçekten iş anlamı taşıyan olayı işaretliyorum, örneğin form gönderimi; sayfa kaydırma gibi olayları önemli olay yaparsanız aşağıdaki oran anlamını yitiriyor. Data API ile çektikten sonra iki tabloyu ortak bir anahtarda buluşturmak gerekiyor. Search Console tam URL veriyor, GA4 yalnız yol veriyor; sondaki eğik çizgi ve sorgu dizesi de iki tarafta farklı olabiliyor. Bu yüzden ikisini de normalize edilmiş bir yola indiriyorum:
import pandas as pd
from urllib.parse import urlparse
from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import (
RunReportRequest, DateRange, Dimension, Metric, Filter, FilterExpression)
client = BetaAnalyticsDataClient.from_service_account_file("sa.json")
istek = RunReportRequest(
property="properties/123456789",
date_ranges=[DateRange(start_date="2026-06-01", end_date="2026-08-31")],
dimensions=[Dimension(name="landingPage")],
metrics=[Metric(name="sessions"), Metric(name="keyEvents")],
dimension_filter=FilterExpression(filter=Filter(
field_name="sessionDefaultChannelGroup",
string_filter=Filter.StringFilter(value="Organic Search"))),
)
ga = pd.DataFrame(
[(r.dimension_values[0].value,
int(r.metric_values[0].value), int(r.metric_values[1].value))
for r in client.run_report(istek).rows],
columns=["yol", "oturum", "donusum"])
def yol(u):
return urlparse(u).path.rstrip("/") or "/"
gsc = pd.read_csv("gsc.csv")
gsc["yol"] = gsc["sayfa"].map(yol)
ga["yol"] = ga["yol"].map(yol)
sayfa = gsc.groupby("yol", as_index=False).agg(
tiklama=("tiklama", "sum"), gosterim=("gosterim", "sum"))
en_iyi_sorgu = (gsc.sort_values("tiklama", ascending=False)
.drop_duplicates("yol")[["yol", "sorgu", "pozisyon"]])
birlesik = (sayfa.merge(ga, on="yol", how="left")
.merge(en_iyi_sorgu, on="yol", how="left")
.fillna({"oturum": 0, "donusum": 0}))
# Okunuyor ama iş getirmiyor: form/çağrı adayları
sessiz = birlesik[(birlesik["tiklama"] >= 30) & (birlesik["donusum"] == 0)]
# Görünüyor ama tıklanmıyor: başlık/meta adayları
gorunmez = birlesik[(birlesik["gosterim"] >= 500) &
(birlesik["pozisyon"].between(4, 10)) &
(birlesik["tiklama"] / birlesik["gosterim"] < 0.02)]
Çıkan tabloda her sayfanın yanında onu en çok tıklatan sorgu duruyor. Sorgu-sayfa eşleşmesi dediğim şey tam olarak bu sütun: sayfayı yazarken hedeflediğiniz sorgu ile Google'ın o sayfayı gerçekten gösterdiği sorgu çoğu zaman aynı değil. Farkı görmek, "yeni sayfa mı, mevcut sayfayı mı düzeltmeli" kararını verdiren şey. Eşik değerleri sitenin hacmine göre elle seçiyorum; 30 tıklama ve 500 gösterim küçük bir kurumsal site için makul bir başlangıç, yüksek hacimli bir sitede bu sayılar bambaşka olur.
Hangi metrik kararı değiştirir, hangisi gürültü
Birleşik tablodan sonra hangi sütunlara baktığımı ve hangilerini panodan çıkardığımı netleştireyim. Kararı değiştirenler:
- Sayfa başına organik dönüşüm. Oturum başına önemli olay. Tek başına içeriğin işe yarayıp yaramadığını söyleyen sayı.
- Gösterim-tıklama makası. Yüksek gösterim, düşük tıklama oranı, 4-10 arası pozisyon. En ucuz kazanım burada: başlık ve meta değişir, içerik değişmez.
- Sorgu-sayfa uyumsuzluğu. En iyi sorgusu başlığıyla alakasız olan sayfalar. Yeni içerik listesini bu sütun yazdırıyor.
- 11-20 arası pozisyonda yüksek gösterimli sorgular. İkinci sayfa; tıklama neredeyse sıfır ama talep kanıtlanmış.
Gürültü saydıklarım:
- Toplam trafik ve toplam gösterim. Marka aramaları ve mevsimsellik şişiriyor; hiçbir sayfa kararına dönüşmüyor.
- Site geneli ortalama pozisyon. Yeni sorgulara girmeye başladığınızda düşer; kötüye gittiğinizi değil genişlediğinizi gösterir.
- Ortalama etkileşim süresi. Uzun süre iyi mi kötü mü, sayfaya göre değişiyor; neyi değiştireceğimi söylemiyor.
- Haftalık dalgalanma. Search Console verisi birkaç gün gecikmeli gelir; tek haftaya bakıp karar vermek yerine 28 günlük pencereleri kıyaslıyorum.
Ritim ve tuzaklar
Bu düzeni ayda bir çalıştırıyorum; daha sık bakmak karar üretmiyor, kaygı üretiyor. Çalıştırırken şunlara dikkat ediyorum:
- Search Console tıklaması ile GA4 oturumu eşit olmaz. Çerez rızası vermeyenler ve engelleyici kullananlar GA4'te görünmez. Oranı takip edin, eşitlik beklemeyin; oran aniden değiştiyse ölçüm bozulmuştur, içerik değil.
- GA4'te Google sinyalleri açıkken düşük hacimli satırlar eşikleme yüzünden gizlenebiliyor. Küçük sitede boş görünen sayfa gerçekten boş olmayabilir.
- Önemli olay tanımı değiştiyse önceki aylarla kıyas yapmayın. Tanım tarihini tablonun kenarına not düşüyorum.
- Birleştirme adımında eşleşmeyen yolları atmayın; ayrı listeleyin. Genellikle yönlendirme ya da büyük-küçük harf farkı çıkıyor ve bu başlı başına bir bulgu.
- Her koşumda alınan kararı tabloya bir sütun olarak yazın, üç ay sonra geri dönüp sonucuna bakın. Ölçümün asıl değeri burada ortaya çıkıyor.
Bu aylık koşumu elle yapmak yerine zamanlanmış bir görev olarak kurmak, sunucu izleme betiğinde anlattığım yaklaşımla aynı mantıkla çözülüyor. Çıkan tabloyu Excel'de paylaşıyorsanız, boş hücre ve tutarsız yol gibi hataları paylaşmadan önce yakalamak için Excel kalite kontrol otomasyonu yazısındaki kural motoru doğrudan uyarlanabiliyor.
Trafik grafiği yükseliyor diye içerik stratejisinin çalıştığını söylemek, kasa saymadan dükkânın iyi gittiğini söylemeye benziyor. Search Console ile GA4'ü kendi tarafınızda birleştirip her sayfanın yanına onu getiren sorguyu ve ondan çıkan iş sonucunu koyduğunuzda, panodaki yirmi metrik dört karara iniyor. Gördüğüm kadarıyla asıl zorluk teknik değil; hangi sayılara bakmayı bırakacağınıza karar vermek.
Kendi siteniz için benzer bir ölçüm düzeni kurmayı düşünüyorsanız, veri ve otomasyon çalışmalarıma ana sayfadan göz atabilir, projenizi konuşmak için sitedeki iletişim (/#contact) bölümünden bana ulaşabilirsiniz.