Mert Özen Her Satırda Daha İleri
SEO ve GEO GEO (Generative Engine Optimization) — #07

GEO'yu Ölçmek: Search Console, Bing AI Performance, Referral Trafiği ve Log'lar

Mert Özen 8 Kas 2026 9 dk 4 görüntülenme
GEO'yu Ölçmek: Search Console, Bing AI Performance, Referral Trafiği ve Log'lar

AI görünürlüğünün tek bir ölçüsü yok: Search Console generative AI raporu yalnız impression verir, AI Overviews tıklamaları Web ile birleşiktir, Bing AI Performance citation ve grounding query örneklemi gösterir, kendi tarafında ise referral ve user-initiated fetch log'ları kalır. ASP.NET Core middleware ile AI bot ve referral olaylarını kaydeden ve EF Core ile haftalık özet çıkaran kodu ve prompt panellerinin sınırlarını gösteriyoruz.

Sürüm notu: Bu yazı Google Search Console generative AI (Artificial Intelligence, yapay zekâ) raporlarının (Haziran 2026, 31 Ağustos 2026'dan beri bütün sitelerde) ve Bing Webmaster Tools AI Performance raporunun (Şubat ve Haziran 2026) Kasım 2026 hâlini esas alır; kod örnekleri .NET 10 ve EF (Entity Framework) Core 10.0.14 ile derlenip denenmiştir.

Önce Tahmin Et

Bookstore ekibi GEO (Generative Engine Optimization) çalışmalarının üçüncü ayında yönetime bir rapor hazırlıyor. Yönetimin sorusu basit: "AI cevaplarında kaç kez göründük, bu bize kaç ziyaretçi getirdi?" Sence bu iki sayının hangisini Google'dan, hangisini Bing'den, hangisini kendi log'larından alabilirsin? Google'ın AI Overviews'undan gelen bir tıklamayı normal bir Google tıklamasından ayırabilir misin?

Hangi Kanaldan Hangi Veri?

AI görünürlüğünü ölçmenin tek bir yeri yok; her kanal resmin bir parçasını veriyor ve bazı parçalar hiç yok. Aşağıdaki tablo, Kasım 2026 itibarıyla resmi araçların ve kendi log'larının neyi gösterebildiğini özetliyor:

07-measurement-channels-tr.png

Baştaki soruların kısa cevabı tablodan okunuyor. "Kaç kez göründük?" sorusunun Google tarafı Search Console'un generative AI raporunda impression olarak, Bing tarafı AI Performance raporunda citation olarak var. "Kaç ziyaretçi getirdi?" sorusunun Google tarafında AI Overviews ve AI Mode tıklamaları normal Web tıklamalarıyla birleşik; ayrı bir sayı yok. ChatGPT gibi bazı motorlar için referral ile kısmi bir cevap mümkün.

Search Console: Performance ve Generative AI Raporu

Google'ın "AI features and your website" sayfasına göre AI Overviews ve AI Mode'dan gelen trafik, Performance raporunda "Web" arama tipinin içinde, genel verinin parçası olarak sayılıyor. Yani click, impression ve sorgu verisi var, ama bunları klasik sonuçlardan ayırmanın bir yolu yok.

Google 3 Haziran 2026'da Search Console'a ayrı generative AI performans raporları ekledi; 31 Ağustos 2026 itibarıyla bütün sitelerde. Rapor, sitenin URL'lerinin (Uniform Resource Locator) AI Overviews, AI Mode ve Discover'daki generative AI özelliklerinde ne sıklıkla göründüğünü gösteriyor. Duyuruda anlatılan metrik impression; click'ten söz edilmiyor. Boyutlar sayfa, ülke, cihaz (yalnızca Search sonuçları için) ve saatlik, günlük, haftalık, aylık tarih. Bu veri genel Performance raporuna da dahil; yeni rapor aynı görünürlüğün ayrı bir görünümü. Google ayrıca zamanla ek metrikler ekleyeceğini yazıyor.

Bu raporu okurken iki şeyi unutma. Birincisi, impression bir sayfanın bir AI özelliğinde gösterildiğini söylüyor; kullanıcının o link'i gördüğünü veya cevabın senin içeriğine dayandığını değil. İkincisi, Search Console'daki "Search generative AI" kontrolünü kapatırsan bu rapor da sıfıra iner; kontrolün durumunu raporla birlikte kaydet.

Bing Webmaster Tools AI Performance

Bing, 10 Şubat 2026'da Webmaster Tools'a AI Performance raporunu public preview olarak ekledi. Rapor Microsoft Copilot'ta, Bing'in AI ile ürettiği cevaplarda ve seçili partner entegrasyonlarında sitenin ne kadar alıntılandığını gösteriyor: toplam citation, günlük ortalama alıntılanan sayfa, grounding query'lerin bir örneklemi (AI'ın içeriği bulmak için kullandığı ifadeler), sayfa bazında citation sayıları ve zaman çizgisi. Bing'in kendi uyarısı önemli: sayfa bazındaki veri sayfaların ne sıklıkla alıntılandığını yansıtıyor, önemini, sıralamasını veya konumunu değil.

16 Haziran 2026'da preview'e dört özellik daha geldi. Intents, grounding query'leri Informational, Commercial, Navigational gibi geniş kategorilere ayırıyor. Topics, ilişkili sorguları tematik kümelerde topluyor. Citation Share, aynı grounding query için bütün sitelerin aldığı citation'lar içinde senin payını gösteriyor; Bing bunun gözleme dayalı bir metrik olduğunu, bir sıralama sistemi veya rekabet tablosu olmadığını vurguluyor. Compare ise iki dönemi üst üste koyuyor. Raporun gösterdiği tıklama verisi yok; Bing'in AI cevaplarından gelen ziyaretçiler referral ve klasik Bing trafiği tarafında aranmalı.

Referral Trafiği: utm_source ve Referer

Kendi tarafında ölçebileceğin ilk sinyal, bir AI cevabındaki link'e tıklayıp gelen ziyaretçi. OpenAI bu konuda tek somut belgeyi veriyor: ChatGPT, referral URL'lerine otomatik olarak utm_source=chatgpt.com parametresini ekliyor. Diğer motorlar için ancak Referer header'ına bakabiliyorsun ve bu header'ın gönderilip gönderilmediği tarayıcının referrer policy'sine ve uygulamaya bağlı. Aşağıdaki eşleme listesi bu yüzden bizim listemiz; ChatGPT dışındaki satırlar resmi bir dokümana dayanmıyor:

namespace Bookstore.Web.Seo;

public static class AiReferrers
{
    // kendi eşleme listemiz; yalnızca ChatGPT bir utm_source değeri belgeliyor (chatgpt.com)
    private static readonly Dictionary<string, string> Hosts = new(StringComparer.OrdinalIgnoreCase)
    {
        ["chatgpt.com"] = "ChatGPT",
        ["perplexity.ai"] = "Perplexity",
        ["www.perplexity.ai"] = "Perplexity",
        ["copilot.microsoft.com"] = "Copilot",
        ["gemini.google.com"] = "Gemini",
        ["claude.ai"] = "Claude",
    };

    public static string? Match(HttpRequest request)
    {
        string? utmSource = request.Query["utm_source"];
        if (utmSource is not null && Hosts.TryGetValue(utmSource, out string? fromUtm))
        {
            return fromUtm;
        }

        return Uri.TryCreate(request.Headers.Referer.ToString(), UriKind.Absolute, out Uri? referrer)
            && Hosts.TryGetValue(referrer.Host, out string? fromHost)
                ? fromHost
                : null;
    }
}

Baştaki ikinci sorunun cevabı da burada: hayır. AI Overviews veya AI Mode'dan gelen bir ziyaretçinin referrer'ı Google'ın kendi domain'i; normal bir Google araması ile ayırt edilemiyor. Google tarafının tıklama verisi yalnızca Search Console'da ve orada da Web ile birleşik.

Server Log: Bot'lar ve User-initiated Fetch'ler

İkinci sinyal kendi log'un. Serinin üçüncü yazısındaki AiBots sınıflandırıcısını ve referral eşlemesini aynı middleware'de topladım; her olay bir log satırına ve bir SQLite tablosuna yazılıyor:

namespace Bookstore.Web.Seo;

public sealed class AiTrafficMiddleware(RequestDelegate next, ILogger<AiTrafficMiddleware> logger)
{
    public async Task InvokeAsync(HttpContext context, AnalyticsDbContext db)
    {
        await next(context);

        AiBot? bot = AiBots.Match(context.Request.Headers.UserAgent);
        string? referral = bot is null ? AiReferrers.Match(context.Request) : null;
        if (bot is null && referral is null)
        {
            return;
        }

        AiTrafficEvent traffic = new()
        {
            OccurredAt = DateTime.UtcNow,
            Kind = bot is not null ? "bot" : "referral",
            Source = bot?.Token ?? referral!,
            Purpose = bot?.Purpose.ToString(),
            Path = context.Request.Path,
            Status = context.Response.StatusCode,
        };
        logger.LogInformation("AI {Kind} {Source} {Purpose} {Path} -> {Status}",
            traffic.Kind, traffic.Source, traffic.Purpose, traffic.Path, traffic.Status);

        db.AiTraffic.Add(traffic);
        await db.SaveChangesAsync(context.RequestAborted);
    }
}

Yerel uygulamaya curl ile on bir istek gönderdim: bir GPTBot, iki OAI-SearchBot (OAI: OpenAI), üç ChatGPT-User, bir Perplexity-User isteği; utm_source=chatgpt.com taşıyan iki tarayıcı isteği, Referer: https://www.perplexity.ai/ taşıyan bir istek ve Referer: https://www.google.com/ taşıyan bir istek. Bunlar gerçek trafik değil, yerel bir deneme. Log'a düşen satırlar:

Bookstore.Web.Seo.AiTrafficMiddleware[0] AI bot GPTBot Training /books/async-in-practice -> 200
Bookstore.Web.Seo.AiTrafficMiddleware[0] AI bot OAI-SearchBot Search /books/async-in-practice -> 200
Bookstore.Web.Seo.AiTrafficMiddleware[0] AI bot OAI-SearchBot Search /books/testing-without-fear -> 200
Bookstore.Web.Seo.AiTrafficMiddleware[0] AI bot ChatGPT-User UserFetch /books/async-in-practice -> 200
Bookstore.Web.Seo.AiTrafficMiddleware[0] AI bot ChatGPT-User UserFetch /books/async-in-practice -> 200
Bookstore.Web.Seo.AiTrafficMiddleware[0] AI bot ChatGPT-User UserFetch /books/async-in-practice -> 200
Bookstore.Web.Seo.AiTrafficMiddleware[0] AI bot Perplexity-User UserFetch /books/modeling-bounded-contexts -> 200
Bookstore.Web.Seo.AiTrafficMiddleware[0] AI referral ChatGPT (null) /books/async-in-practice -> 200
Bookstore.Web.Seo.AiTrafficMiddleware[0] AI referral ChatGPT (null) /books/testing-without-fear -> 200
Bookstore.Web.Seo.AiTrafficMiddleware[0] AI referral Perplexity (null) /books/async-in-practice -> 200

Google referrer'lı istek beklendiği gibi listede yok. Log'daki en değerli satırlar user-initiated fetch'ler: her ChatGPT-User veya Perplexity-User isteği, o anda bir kullanıcının senin sayfanla ilgili bir şey sorduğu anlamına geliyor. Bu, AI görünürlüğünün kendi sunucunda görebildiğin en doğrudan izi. User agent'ların taklit edilebildiğini ve doğrulama için operatörlerin IP (Internet Protocol) listelerine bakmak gerektiğini serinin üçüncü yazısında konuşmuştuk.

Haftalık Özet Sorgusu

Olayları tabloya yazmanın amacı, haftalık bir özet çıkarabilmek. Kaynak ve amaç başına istek ve farklı sayfa sayısını döndüren endpoint:

public record AiTrafficRow(string Kind, string Source, string? Purpose, int Requests, int Pages);

app.MapGet("/internal/ai-traffic/weekly", async (AnalyticsDbContext db, ILogger<AiTrafficRow> logger, CancellationToken ct) =>
{
    DateTime since = DateTime.UtcNow.AddDays(-7);
    IQueryable<AiTrafficRow> query = db.AiTraffic
        .Where(e => e.OccurredAt >= since)
        .GroupBy(e => new { e.Kind, e.Source, e.Purpose })
        .OrderBy(g => g.Key.Kind).ThenByDescending(g => g.Count())
        .Select(g => new AiTrafficRow(g.Key.Kind, g.Key.Source, g.Key.Purpose,
            g.Count(), g.Select(e => e.Path).Distinct().Count()));
    logger.LogInformation("Weekly AI traffic query:\n{Sql}", query.ToQueryString());
    List<AiTrafficRow> rows = await query.ToListAsync(ct);

    IEnumerable<string> lines = rows.Select(r =>
        $"{r.Kind,-9}{r.Source,-16}{r.Purpose ?? "-",-10}{r.Requests,9}{r.Pages,7}");
    return Results.Text(
        $"{"kind",-9}{"source",-16}{"purpose",-10}{"requests",9}{"pages",7}\n" + string.Join('\n', lines) + "\n");
});

EF Core'un ürettiği SQL (Structured Query Language) ve endpoint'in gerçek çıktısı:

SELECT "a"."Kind", "a"."Source", "a"."Purpose", COUNT(*), COUNT(DISTINCT ("a"."Path")) FROM "AiTraffic" AS "a" WHERE "a"."OccurredAt" >= @since GROUP BY "a"."Kind", "a"."Source", "a"."Purpose" ORDER BY "a"."Kind", COUNT(*) DESC

kind     source          purpose    requests  pages
bot      ChatGPT-User    UserFetch         3      1
bot      OAI-SearchBot   Search            2      2
bot      GPTBot          Training          1      1
bot      Perplexity-User UserFetch         1      1
referral ChatGPT         -                 2      2
referral Perplexity      -                 1      1

Bir not: ilk denememde OrderBy'ı Select'ten sonra, record'un property'leri üzerinden yazmıştım; EF Core 10 bu sorguyu çeviremedi ve "could not be translated" exception'ı fırlattı. Sıralamayı group üzerinde, projection'dan önce yapmak sorunu çözdü ve SQL'de ORDER BY'a dönüştü.

Prompt Panelleri ve "AI Visibility" Araçları

Bu kanalların hiçbiri "hangi sorularda alıntılanıyoruz?" sorusuna tam cevap vermediği için, birçok ekip elle bir prompt paneli kuruyor: bir soru listesi belirleyip bunları düzenli aralıklarla AI motorlarına soruyor ve cevaplardaki kaynakları kaydediyor. Bunu yapabilirsin, ama sonucun neyi ölçtüğünü bil.

Serinin dördüncü yazısındaki 2026 derlemesine göre ticari denetimler platformlar arasında düşük kaynak örtüşmesi ve koşudan koşuya büyük değişkenlik buluyor; aynı soruyu iki kez sormak farklı kaynaklar getirebiliyor. Kişiselleştirme, konum ve oturum geçmişi sonucu değiştirebiliyor. Soru listesi senin seçimin; kullanıcıların gerçekte ne sorduğunu temsil etmeyebilir. Derlemenin önerdiği protokol, yani tekrarlı ölçüm, soru varyantları, kontrol grupları ve insan doğrulaması, bir panelin anlamlı olması için asgari şart. Bir de kural tarafı var: bir motora toplu otomatik sorgu göndermek o motorun kullanım koşullarına takılabilir; Google için Google Search'e izinsiz otomatik sorgu göndermek açıkça bir spam policy konusu.

Üçüncü taraf "AI visibility" araçları da bu panellerin ticari hâli. Google'ın AI optimization rehberi tek cümleyle sınır çiziyor: hiçbir üçüncü taraf aracın Google'ın iç ranking veya AI system'lerine erişimi yok. Böyle bir aracın verdiği "görünürlük skoru" aracın kendi örneklemi ve modeli; resmi bir metrik değil.

Üretimde Dikkat

Middleware'de her istekte veritabanına yazma. Buradaki doğrudan SaveChangesAsync bir demo; gerçek trafikte olayları bir Channel'a yazıp background service ile toplu kaydetmek ya da structured log'u bir log altyapısına gönderip orada sorgulamak daha doğru. Channel ile producer/consumer kurmayı C# serisinin "C# Channels ile Producer/Consumer" yazısında anlattık.

Kişisel veri saklama. Bu tabloya IP adresi, tam URL veya query string yazmak gerekmiyor; kaynak, amaç, path ve status yeterli.

Her kanalı kendi tanımıyla raporla. Search Console impression'ı, Bing citation'ı ve kendi log'undaki fetch üç farklı şey; bunları toplayıp tek bir "AI görünürlüğü" sayısı üretme.

Değişiklik kaydı tut. Search Console'daki generative AI kontrolünü, robots.txt'teki bot kurallarını ve önemli içerik değişikliklerini tarihli kaydet; raporlardaki bir kırılmayı ancak böyle açıklayabilirsin.

Sık Düşülen Tuzaklar

AI Overviews tıklamalarını ayrı ölçebileceğini sanmak. Search Console'da Web ile birleşik, referrer'da Google ile aynı.

Citation'ı ziyaretçi sanmak. Bing'in citation sayısı ve Google'ın AI impression'ı, kimsenin tıkladığı anlamına gelmiyor.

User agent'ı doğrulamadan bot trafiğini raporlamak. Taklit edilmiş bir "GPTBot" grafiği, gerçek bir eğilim gibi görünür.

Bir prompt panelinin tek koşusunu trend sanmak. Tekrar ve kontrol olmadan değişkenliği ölçmüş olursun, görünürlüğü değil.

Küçük Bir Deneme

★☆☆ Kendi sitende Search Console'un generative AI raporunu aç ve en çok impression alan beş sayfayı Performance raporundaki click'leriyle yan yana koy. Bu iki sayının neden doğrudan karşılaştırılamayacağını not et.

★★☆ AiTrafficMiddleware'i bir Channel<AiTrafficEvent> ve bir BackgroundService ile yeniden yaz; olaylar 50'şerli gruplar hâlinde kaydedilsin. Aynı curl denemesiyle haftalık özetin değişmediğini göster.

★★★ Haftalık özete bir sütun ekle: her sayfa için user-initiated fetch sayısı ile AI referral sayısının oranı. Yerel denemede bu oranı hesapla ve bu oranın gerçek trafikte neden yanıltıcı olabileceğini üç maddede yaz.

GEO serisi burada bitiyor: AI cevap motorlarının kaynakları nasıl bulduğunu, Google'ın rehberini, bot'ları, araştırmaların gerçekte ne gösterdiğini, llms.txt'i, agent'lar için siteyi ve ölçümün sınırlarını gördük. Ortak sonuç SEO (Search Engine Optimization) Temelleri serisiyle aynı: sağlam bir teknik temel, özgün içerik ve dürüst ölçüm. Teknik temelin uygulaması Teknik SEO serisinde.