İçeriğe geç
ceaksan

Shopify'da GA4 ve Ads Sinyallerinin Kaynağını Bulmak

Shopify'da GA4 ve Google Ads sinyalleri farklı katmanlardan ve farklı yapılandırmalarla gelebilir: storefront, bir veya daha fazla app pixel, bir veya daha fazla custom pixel. Hangi sinyalin hangi kaynaktan geldiğini, ne taşıdığını ve consent durumunun ne olduğunu DevTools'ta ayıklamak gereksiz bir yüke dönüşür. Yazı bu ayrımın Inspect Signals eklentisiyle tek panelde nasıl okunabileceğini anlatıyor.

5 dk okuma
TL;DR

Shopify'da GA4 ve Google Ads sinyalleri storefront, bir veya daha fazla app pixel ve bir veya daha fazla custom pixel gibi farklı katmanlarda yer alabilir ve farklı yapılandırmalara sahip olabilir. Hangi sinyalin hangi kaynaktan geldiğini, ne taşıdığını ve consent durumunu DevTools'ta ayıklamak gereksiz bir yüke dönüşür. Kaynak, hit'i gönderen frame'in adresinden okunur; Inspect Signals bu ayrımı, sipariş kartlarını ve uyarı kurallarını tek panelde toplar.

Shopify’da GA4 (Google Analytics 4) ve Google Ads sinyalleri farklı katmanlardan gelebilir: tema kodunun bulunduğu storefront, bir veya daha fazla app pixel, bir veya daha fazla custom pixel. Hangi sinyalin hangi kaynaktan geldiğini ve ne taşıdığını DevTools’ta tek tek ayıklamak, her katmanın consent durumunu ayrıca okumak gereksiz bir yüke dönüşebilir.

Debugging için kullanılabilecek pek çok araç var, ancak öne çıkanlar genelde teknik bilgisi olan kullanıcılara yönelik. Bu da ekran görüntüsü alırken veya müşteriyle görüşürken durumu özetlemeyi zorlaştırır. İhtiyaç, teknik bilgisi sınırlı bir müşteriye sonucu anlaşılır biçimde aktarabilmek. Danışmanlık yaptığım müşterilerde benzer soruları tekrar tekrar yanıtladığım bir noktada, taraflar arasındaki iletişimi kolaylaştıracak bir ölçüm debugging aracı yazdım: Inspect Signals, bir Chrome extension. Bu yazı o aracın ne okuduğunu ve bulguları nasıl düzenlediğini anlatıyor.

Aşağıdaki örnekler müşteri projelerindeki gözlemlerime ve bunlardan yeniden oluşturduğum bir test kurulumuna dayanıyor. Her Shopify mağazası için geçerli genel değerler olarak okunmamalıdır.

Aynı Sinyal, Farklı Katmanlar

Müşteri projelerinde gözlemlediğim bir yapıyı, müşteri verisini doğrudan kullanmamak ve daha ayrıntılı inceleyebilmek için bir test kurulumunda benzer şekilde yeniden oluşturdum. Bu kurulumda aynı sipariş numarası farklı katmanlardan üç GA4 property’sine ve iki Ads hesabına ulaştı. Dağılım şöyleydi:

KatmanGönderilen
Storefront ve checkoutpurchase iki GA4 property’sine
Custom pixelpurchase üçüncü GA4 property’sine, bir Ads hesabına iki conversion label
App pixelBaşka bir Ads hesabına bir conversion label

Bunların yanında remarketing ve audience hit’leri de gitti. “Purchase bir kez tetiklendi mi?” sorusu bu yüzden tek yanıtla kapanmaz: soru hangi property’de, hangi hesapta ve hangi katmandan olduğuna bağlıdır. Katmanlar ayrıca kendi consent durumlarını bildirir ve bu durumlar birbirinden farklı olabilir (aşağıda Consent Mode Çelişkisi bölümünde).

DevTools’ta Kaynağı Bulmak

Shopify pixel’leri Lax veya Strict sandbox içinde çalıştırır; app pixel’ler strict sandbox’ta yüklenir.1 Sandbox iframe’den giden isteklerin initiator değeri null görünür. Sayfanın kendi kodundan çıkan hit ile pixel sandbox’ından çıkan hit aynı listede karışır. Müşteri projelerinde gözlemlediğim kurulumlarda DevTools’ta bunun için ilgili isteğin Initiator sekmesi altındaki Request call stack alanına bakmak ve burada shop_events_listener satırını aramak gerekiyor.

Pixel’in kaynağı ise isteği gönderen frame’in adresinden okunur. Pixel sandbox adresleri mağaza alan adı altındadır ve şu kalıbı taşır:

  • App pixel: /web-pixels@<build>/app/web-pixel-<id>@<hash>/sandbox/modern/<sayfa yolu>
  • Custom pixel: /web-pixels@<build>/custom/web-pixel-<id>@<sürüm>/sandbox/modern/<sayfa yolu>

Hit’in kaynağını, taşıdığı veriyi ve consent parametrelerini (gcs, gcd) elle ayıklamak, müşteri projelerindeki gözlemimde yüzlerce hit üretebilen bir alışveriş akışında tekrarlandığında sürdürülemez hale gelir.

Panelde Aynı Bilgi: Katman ve Sipariş Kartı

Inspect Signals yalnızca izin verilen mağazada çalışır; ilk kullanımda Grant access ve ardından Reload page gerekir. Panel o sekmenin hit’lerini sayfa sayfa gruplar ve her hit’in kaynağını yazar: Storefront, App pixel <id>, Custom pixel <id> veya diğer iframe. Bu sayede bir verinin hangi katmandan geldiği kolayca ayırt edilir.

Aynı tanımlayıcıları taşıyan sinyaller her sayfanın başında tek sipariş kartında toplanır. Kart, hangi sinyalin hangi katmandan, hangi değerle gittiğini yan yana gösterir. Google Ads, işlem kimliğinin her işlem için benzersiz olması gerektiğini belirtir.2 Gruplamada Ads oid değeri GG_ ile başlıyorsa bu hit’e özgü bir kimliktir ve sipariş anahtarı sayılmaz. oid hiç göndermeyen conversion hit’leri için aynı sayfada ve kısa bir zaman penceresinde yaklaşık gruplama yapılır; bu kart yalnızca bir kural grubu işaretlediğinde görünür.

Satır düzeyinde okunan bilgiler:

ÖğeNe gösterir
G- ve AW- çipleriGA4 property veya Ads hesabı, her kimlik panelde aynı rengi korur
BadgeConversion, Remarketing, Ecommerce
MarkerYıldız (conversion), kişi (hashed kullanıcı verisi), süslü parantez (Ads data parametresi)
gcs ve gcd çipleriHit’in bildirdiği consent durumu
sid çipiGA4 oturum kimliği, yeni oturumda new etiketi

Inspect Signals paneli, Ads filtresi açık: Google Ads hit'leri sayfa ve kaynak bazında gruplanmış. Her satırda AW- hesap çipi, Remarketing veya Conversion rozeti, gcs ve gcd consent çipleri, istek türü (image, xhr) ve yıldız, kişi, süslü parantez işaretleri görünüyor

Bir satıra tıklayınca Decoded, Params ve Raw sekmeleri açılır. Shopify mağazalarında Decoded içinde o anda okunan cart token, checkout token, order id ve Shopify consent durumu da görünür.

Hangi Tutarsızlık Uyarı Sayılır

Aynı sipariş grubunda farklı katmanlardan birden fazla sinyal olması tek başına uyarı sebebi değildir; farklı label’lar kasıtlı çoklu conversion olabilir. Eklenti 13 kural çalıştırır ve bunlardan bazıları şunlardır:

KuralNeyi yakalar
duplicateAynı GA4 event’in veya aynı Ads label’ın aynı kimliğe birden fazla gönderilmesi
value-mismatchAynı sipariş grubunda farklı değer veya para birimi
items-totalGA4 purchase değerinin item fiyatı çarpı adet eksi indirimle uyuşmaması; yalnızca kupon kodu gönderilmişse uyarı değil bilgi
item-dataSinyaller arasında farklı item id, isim veya fiyat (bilgi)
purchase-no-idtransaction_id olmadan giden purchase
purchase-missingTamamlanmış Shopify checkout’u olduğu halde purchase göndermeyen sayfa (yalnızca Shopify)
consent-conflictAynı sipariş grubunda bir sinyalin bir amacı granted, diğerinin denied göndermesi

Bir müşteri projesinde indirimli bir siparişte items toplamı 598, value 0 çıktı; yalnızca bir property indirim tutarını ayrıca gönderiyordu. Kural indirim tutarı gönderilmişse onu düşer, yalnızca kupon kodu varsa gözlem olarak not eder.

Uyarılar nedeni teşhis etmez, gözlenen değeri yazar. Panelde Warnings filtresi yalnızca uyarı taşıyan hit’leri listeler.

Inspect Signals panelinde bir purchase satırının Decoded sekmesi: sipariş kartı, kaynak, transaction_id, value ve ürün tablosu görünüyor. Warnings bölümü aynı property'ye purchase hit'inin iki kez gönderildiğini yazıyor

Katmanlar aynı ziyaretçi için farklı consent durumu bildirebilir. Bir müşteri projesinde storefront’tan giden hit’lerde gcd=13l3l3l3l3l1 gördüm. Bu değer dört consent sinyalinin de ayarlanmadığı anlamına gelir. Aynı sayfada pixel sandbox’larından giden hit’ler gcs=G111 ve gcd içinde granted kodları taşıdı. Eklentinin Shopify consent kuralı, Shopify’ın izin vermediği bir amaç için granted ya da consent mode bilgisi taşımadan giden hit’i uyarı, tersi durumda bilgi olarak işaretler.

İki not:

  • gcd çözümü Google’ın yayımladığı bir spesifikasyon değil, tersine mühendislikle derlenmiş bir tabloya dayanıyor.3 Tanınmayan bir harf varsa tahmin etmek yerine “bilinmiyor” denir.
  • Shopify’ın kendi consent durumunu okumak için gözlemlediğim kurulumda en güvenilir kaynak sandbox’ın init verisi4 ve consent güncelleme mesajlarıydı. Customer Privacy API ayrıca consent değiştiğinde visitorConsentCollected document event’ini yayımlar.5

Müşteriye Aktarmak: Flow ve Export

Bulguları müşteriye göstermek için iki yol var. Birincisi paneli ekran kaydında göstermek: yeni satırlar kısa süre vurgulanır, grup başlıkları kaydırırken sabit kalır. İkincisi Flow sayfası:

  • Journey: sayfaların ziyaret sırasına göre Sankey’i; bantlar sayfa, consent veya oturuma göre renklenir.
  • Breakdown: sayfa, kaynak, GA4 property veya Ads hesabı, event ve consent arasındaki dağılım.
  • Timeline: her property veya hesap için bir şerit, sid bölümleri ve consent değişim anları.

Inspect Signals Flow sayfası, Journey görünümü: ürün, sepet ve teşekkür sayfası ziyaret sırasıyla bantlar olarak gösteriliyor. Altta her GA4 property ve Ads hesabı için ayrı şerit ve sinyal noktalarından oluşan bir timeline var

Sahibi olunmayan property’ler filtreden çıkarılabilir; seçim mağaza başına hatırlanır. Export kaydı JSON olarak kaydeder, Flow sayfasındaki Open JSON aynı kaydı sonradan yeniden gösterir. Böylece müşteriyle bir toplantıda tekrar sipariş vermeden aynı kayda bakılabilir.

Yöntemin Sınırları (Şimdilik)

  • Server-side GTM (Google Tag Manager) ve first-party collection endpoint’leri görünmez. Gönderilen hit görülür, sunucu tarafında neyin işlendiği görülmez.
  • “Google bu hit’i kabul etti mi” sorusu yanıtsız kalır. Yalnızca tarayıcının ne gönderdiği ve HTTP sonucu bellidir.
  • Worker içinde çalışan pixel’ler gözlemlenemez. Customer event okuması sandbox iframe’lerin varlığına dayanır; en az bir custom pixel veya iframe tabanlı app pixel olan sayfalarda çalışır.
  • Customer event’lerin okunması Shopify’ın iç mesaj formatına bağlıdır. Bu formatı belgelenmiş bir arayüz olarak bulamadım; değişirse okuma bozulur.
  • Kayıtlar oturum depolamasında tutulur: sekme veya tarayıcı kapanınca silinir. Her sekme en yeni 1500 hit’i saklar; sınırın dışına çıkan hit’ler karşılaştırmalara ve uyarılara girmez.
  • Gözlemler tek tek kurulumlara aittir. Başka bir mağazada pixel dağılımı ve consent akışı farklı olabilir.

İlgili Yazılar

Sinyallerin Kaynağını Tek Panelde Okumak

Storefront, app pixel ve custom pixel kaynaklı GA4 ve Google Ads hit'lerini, taşıdıkları veriyi ve consent durumunu tek panelde okuyan Chrome extension'ın proje sayfası.

Proje Sayfasına Git
Neler var
  • Hit başına kaynak: Storefront, App pixel, Custom pixel
  • Sipariş kartları ve 13 uyarı kuralı
  • Flow görünümü ve JSON ile dışa aktarım

Footnotes

  1. Web Pixels API (Shopify). “For app developers integrating app web pixels, pixels are loaded in a strict sandbox.” Sayfa pixel’lerin “one of our Lax or Strict sandboxes” içinde çalıştığını da belirtir. ↩
  2. Use a transaction ID to minimize duplicate conversions (Google Ads Help). “The transaction ID must be unique for every single transaction and must be dynamically generated by your website’s backend or e-commerce platform for each purchase.” ↩
  3. Consent Mode Decoder by DWC. gcd değerinin konum ve harf çözümü için başvurulan kaynak; Google’ın yayımladığı bir spesifikasyon değil, tersine mühendislikle derlenmiş bir referanstır. ↩
  4. init standard API (Shopify Web Pixels API). customerPrivacy alanı bu sayfada tanımlıdır. ↩
  5. Customer Privacy API (Shopify). “The Customer Privacy API publishes the document event visitorConsentCollected when consent changes.” ↩
Önemli Noktalar
  • 01 Shopify'da GA4 ve Ads sinyalleri farklı katmanlardan gelebilir (storefront, bir veya daha fazla app pixel, bir veya daha fazla custom pixel); hangisinin hangi kaynaktan geldiği hit'te yazmaz, taşıdığı veri ve consent durumu ise parametre parametre okunmak zorundadır.
  • 02 Sandbox frame adresi pixel türünü ve kimliğini taşır; kaynak tespiti /web-pixels@.../app|custom/web-pixel-<id>@... kalıbına dayanır.
  • 03 Sipariş sinyalleri transaction_id ile tek kartta toplanır; Ads GG_ ile başlayan oid değerleri hit'e özgü kimliktir ve sipariş anahtarı sayılmaz.
  • 04 Uyarı kuralları 'ne gönderildi' sorusunu yanıtlar; 'Google ne kabul etti' sorusu ve sGTM bu görünümün dışında kalır.
  • 05 Kayıt JSON olarak dışa aktarılıp Flow sayfasında yeniden açılabilir; müşteriyle konuşmak için ekran kaydı veya dosya yeterlidir.
Sık Sorulan Sorular (FAQ)
+ Shopify custom pixel hit'inin hangi pixel'den geldiği DevTools'ta neden doğrudan görünmüyor?

Sandbox iframe'den giden isteklerin initiator değeri null olarak görünür, bu yüzden istek sayfa kaynağıyla doğrudan ilişkilendirilemez. Kaynak, isteği gönderen frame'in adresinden okunur: adresteki /web-pixels@.../custom/web-pixel-<id>@... kalıbı pixel türünü ve kimliğini verir.

+ Aynı siparişte farklı property'lerin farklı item id ve isim göndermesi hata mıdır?

Tek başına hata kanıtı değildir. Shopify Markets kullanan mağazalarda veya farklı veri kaynaklarına bağlı property'lerde item id ve item name değerleri farklı olabilir. Inspect Signals bu farkı hata değil, bilgi olarak işaretler.

+ Bu yöntem server-side GTM ile gönderilen hit'leri de gösterir mi?

Hayır. Yöntem tarayıcının Google adreslerine gönderdiği istekleri okur. First-party bir collection endpoint'e giden istekler ve Google'ın sunucu tarafında neyi kabul ettiği bu görünümün dışındadır.

+ Kaydedilen veriler bir yere gönderiliyor mu?

Hayır. Eklentinin sunucusu yoktur; kayıtlar tarayıcının oturum depolamasında tutulur ve sekme veya tarayıcı kapanınca silinir. Dışa aktarma yalnızca Export düğmesine basıldığında bir dosya yazar.

Geri bildirim

Seçtiğin paragraflar hakkında görüşünü ilet. Yanıt verebilmek için e-posta gerekli.

Tür