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:
| Katman | Gönderilen |
|---|---|
| Storefront ve checkout | purchase iki GA4 property’sine |
| Custom pixel | purchase üçüncü GA4 property’sine, bir Ads hesabına iki conversion label |
| App pixel | Baş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:
| Öğe | Ne gösterir |
|---|---|
G- ve AW- çipleri | GA4 property veya Ads hesabı, her kimlik panelde aynı rengi korur |
| Badge | Conversion, Remarketing, Ecommerce |
| Marker | Yıldız (conversion), kişi (hashed kullanıcı verisi), süslü parantez (Ads data parametresi) |
gcs ve gcd çipleri | Hit’in bildirdiği consent durumu |
sid çipi | GA4 oturum kimliği, yeni oturumda new etiketi |
![]()
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:
| Kural | Neyi yakalar |
|---|---|
| duplicate | Aynı GA4 event’in veya aynı Ads label’ın aynı kimliğe birden fazla gönderilmesi |
| value-mismatch | Aynı sipariş grubunda farklı değer veya para birimi |
| items-total | GA4 purchase değerinin item fiyatı çarpı adet eksi indirimle uyuşmaması; yalnızca kupon kodu gönderilmişse uyarı değil bilgi |
| item-data | Sinyaller arasında farklı item id, isim veya fiyat (bilgi) |
| purchase-no-id | transaction_id olmadan giden purchase |
| purchase-missing | Tamamlanmış Shopify checkout’u olduğu halde purchase göndermeyen sayfa (yalnızca Shopify) |
| consent-conflict | Aynı 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.
![]()
Consent Mode Çelişkisi
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
initverisi4 ve consent güncelleme mesajlarıydı. Customer Privacy API ayrıca consent değiştiğindevisitorConsentCollecteddocument 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,
sidbölümleri ve consent değişim anları.
![]()
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
- Shopify Analytics vs GA4: Neden Farklı Rakamlar Gösteriyorlar?
- Shopify Siparişini Reklam Tıklamasına Bağlamak
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 GitFootnotes
- 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. ↩
- 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.” ↩
-
Consent Mode Decoder by DWC.
gcddeğ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. ↩ -
init standard API (Shopify Web Pixels API).
customerPrivacyalanı bu sayfada tanımlıdır. ↩ -
Customer Privacy API (Shopify). “The Customer Privacy API publishes the document event
visitorConsentCollectedwhen consent changes.” ↩
- 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_idile tek kartta toplanır; AdsGG_ile başlayanoiddeğ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.
+ 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.