Web tarafında ölçüm kurmuş bir geliştirici uygulamaya geçtiğinde ilk
sorduğu soru genellikle şu oluyor: uygulamada dataLayer'a nasıl push
ediyoruz.
Cevap kısa: etmiyoruz. Uygulamada dataLayer diye bir yapı yok. Yerine
geçen şey var ama aynı şey değil, ve farkı bilmeden yazılan şema altı ay
sonra raporda karşılığı olmayan olaylar olarak geri geliyor.
Bu yazı iki yapıyı yan yana koyuyor: neyin karşılığı ne, hangi kurallar geçerli ve kuralı çiğnediğinizde bunu nereden göreceğiniz.
Web'de dataLayer ne yapıyordu
Hatırlatma niyetine tek paragraf. Web'de dataLayer sayfada duran bir
dizidir. Siteniz ona bir nesne iter, GTM diziyi dinler, gelen nesneyi
okur ve tag'lerini tetikler. Verinin biçimi tamamen size aittir:
istediğiniz anahtarı, istediğiniz derinlikte iç içe nesneyle
gönderebilirsiniz.
window.dataLayer.push({
event: 'purchase',
transaction_id: 'ORD-8841',
value: 254.90,
currency: 'TRY',
items: [{ item_id: 'SKU-4471', price: 249.90, quantity: 1 }]
})
Bu esneklik web'de rahatlık, uygulamada mümkün değil.
Uygulamada karşılığı: logEvent
Uygulamada olayı bir diziye itmiyorsunuz, Firebase SDK'sının
logEvent metodunu çağırıyorsunuz. SDK olayı alır, kendi kurallarına
göre doğrular ve Analytics'e kendisi gönderir.
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.PURCHASE) {
param(FirebaseAnalytics.Param.CURRENCY, "TRY")
param(FirebaseAnalytics.Param.VALUE, 254.90)
param(FirebaseAnalytics.Param.ITEMS, arrayOf(itemAyakkabi))
}
Swift tarafında aynı olay:
Analytics.logEvent(AnalyticsEventPurchase, parameters: [
AnalyticsParameterCurrency: "TRY",
AnalyticsParameterValue: 254.90,
AnalyticsParameterItems: [ayakkabi]
])
İki kod da aynı işi yapıyor ama web'deki push ile aralarında üç yapısal
fark var.
- dataLayer.push()logEvent()
- event: 'purchase'ilk argüman: olay adı
- nesne anahtarlarıparametreler (Bundle / Dictionary)
- iç içe nesneyokYalnız items dizisi destekleniyor, serbest iç içe yapı yok
- alan eşleşti
- alan boş veya tanımlanmamış
Birinci fark: olay adı nesnenin içinde bir anahtar değil, metodun
ilk argümanı. Web'de event anahtarını unutursanız GTM tetiklenmez;
uygulamada olay adını vermemek gibi bir ihtimal yok.
İkinci fark: parametreler tipli. Web'de her şeyi string
gönderebilirsiniz, uygulamada String, Long ve Double ayrı ayrı
belirtilir. Fiyatı string gönderirseniz olay gider, ama gelir raporu
boş kalır.
Üçüncü fark: serbest iç içe yapı yok. Web'de istediğiniz derinlikte
nesne gönderebilirsiniz. Firebase'de yalnızca e-ticaret için items
dizisi destekleniyor, onun dışında düz bir anahtar-değer listesi
gönderiyorsunuz.
Kurallar sayılabilir ve hepsi sert
Web'de bir anahtar adının uzunluğunu kimse denetlemez. Firebase'de her sınır tanımlı ve aşıldığında sessizce kırpma değil, veri kaybı oluyor.
- Olay adı uzunluğu40 karakter
- Parametre adı uzunluğu40 karakter
- Parametre değeri (metin)100 karakter
- Olay başına parametre25
- Farklı olay adı500 (kullanıcı başına)
- Kullanıcı özelliği adı24 karakter
- Kullanıcı özelliği değeri36 karakter
Dikkat çeken iki tanesi var.
Parametre değeri 100 karakter. Ürün adını, arama sorgusunu veya ekran başlığını parametre olarak gönderiyorsanız uzun olanlar tamamen düşer. Kırpılıp gönderilmez, hiç gönderilmez.
Kullanıcı özelliği değeri 36 karakter. Bu çok dar bir alan ve oraya e-posta veya kimlik yazmaya çalışan kurulumlar burada takılıyor. Zaten yazmamak gerekiyor, ama teknik sınır da izin vermiyor.
Rezerve önekler
Üç önek Firebase'e ait ve kullanılamaz: firebase_, google_, ga_.
Bu, tahmin edilebilir bir kural gibi görünüyor ama pratikte
google_ads_id veya ga_session gibi adlar yazan kurulumlar
görüyoruz. O parametreler sessizce reddedilmiyor, aşağıdaki mekanizmayla
işaretleniyor.
Kuralı çiğnediğinizde Firebase size söylüyor
Bu bölüm yazının asıl sebebi, çünkü çoğu ekip bu mekanizmayı bilmiyor ve şema hatalarını aylar sonra fark ediyor.
Firebase geçersiz bir olay veya parametre aldığında sessiz kalmıyor.
error adında bir olay basıyor ve içine ne olduğunu yazıyor:
firebase_error parametresinde hata kodu, firebase_error_value
parametresinde soruna yol açan ad.
- eventadd_to_cart
- item_idSKU-4471
- value249.90
Olay adı ve parametreler kurallara uyuyor. Rapor tarafında beklenen isimle görünür.
Sık karşılaşılan kodlar ve anlamları:
| Kod | Ne oldu |
|---|---|
| 2 | Olay adı geçersiz: boş, çok uzun veya izin verilmeyen karakter var |
| 13 | Olay adı rezerve |
| 3 | Parametre adı geçersiz |
| 14 | Parametre adı rezerve |
| 4 | Parametre değeri çok uzun |
| 5 | Olayda 25'ten fazla parametre var, fazlası düştü |
| 18 | Parametre değerinin tipi eksik veya hatalı |
| 6 | Kullanıcı özelliği adı geçersiz |
| 15 | Kullanıcı özelliği adı rezerve |
Analytics'te error olayının sayısına bakın. Sıfırdan büyükse şemanızda
bir şey yanlış ve Firebase bunu size zaten söylüyor. Kırılım olarak
firebase_error ve firebase_error_value parametrelerini eklediğinizde
hangi ad yüzünden olduğunu doğrudan görürsünüz.
Bu kontrolü ilk kez yapan hesaplarda genellikle bir şey çıkıyor. Kötü haber gibi görünüyor ama tersi doğru: hata görünür olduğu anda düzeltilebilir hale geliyor.
E-ticaret dizisi tek istisna
Serbest iç içe yapı yok dedik, bir istisnası var: e-ticaret olaylarında
ürün listesi. Kotlin tarafında ürünler Bundle dizisi olarak,
Swift tarafında sözlük dizisi olarak gönderiliyor.
val itemAyakkabi = Bundle().apply {
putString(FirebaseAnalytics.Param.ITEM_ID, "SKU-4471")
putString(FirebaseAnalytics.Param.ITEM_NAME, "Kosu ayakkabisi")
putString(FirebaseAnalytics.Param.ITEM_CATEGORY, "ayakkabi")
putDouble(FirebaseAnalytics.Param.PRICE, 249.90)
putLong(FirebaseAnalytics.Param.QUANTITY, 1)
}
Ürün seviyesinde 27 özel parametreye kadar alan var, yani ürün
kırılımını genişletmek mümkün. item_id değerinin Merchant Center
feed'indeki item_id ile aynı olması gerektiğini hatırlatalım: aynı
değilse feed'e bağlı kampanya tipleri ürün seviyesinde eşleşmez.
Şema tasarımında tek kural
Sınırlara bakınca çıkan sonuç şu: az sayıda olay adı, çok sayıda parametre.
Uygulamanın her düğmesine ayrı bir olay adı vermek 500 sınırını zorlar, raporu okunmaz hale getirir ve Ads tarafında dönüşüm eşlemesini karmaşıklaştırır. Aynı bilgi tek bir olay adı ve ayırt edici bir parametreyle çok daha iyi taşınır.
- button_click_homeayrı olay adı
- button_click_cartayrı olay adı
- button_click_profileayrı olay adı
- select_content + content_typetek olay, parametreyle ayrılıyor
Alttaki satır standart raporlarda görünür, üstteki üç satır özel olay olarak kalır ve çoğu raporda hiç çıkmaz.
Doğrulama
- Nerede
- Firebase konsolunda DebugView. Cihazı hata ayıklama moduna alın ve akışı baştan sona yapın.
- Doğru cevap
- Olay beklediğiniz adla görünüyor, parametreler yanında listeleniyor.
- Yanlışsa
- Olayın yanında firebase_error parametresi varsa şema kuralı çiğnenmiş. Koda bakın, tahmin etmeyin.
- Nerede
- Analytics'te Olaylar raporu, arama kutusuna error yazın.
- Doğru cevap
- error olayı listede hiç yok.
- Yanlışsa
- Sayısı sıfırdan büyükse firebase_error_value kırılımını ekleyin, hangi ad yüzünden olduğu orada yazıyor.
- Nerede
- Analytics'te ilgili olayın detayı, value ve currency parametreleri.
- Doğru cevap
- Gelir toplamı sıfırdan büyük ve mağaza raporundaki büyüklüğe yakın.
- Yanlışsa
- Gelir sıfır görünüyorsa değer metin olarak gönderiliyor olabilir. Kod tarafında Double kullanıldığını doğrulayın.
Sonuç
dataLayer esnektir, logEvent kuralcıdır. Web'de çalışan bir şemayı
uygulamaya olduğu gibi taşımak, sınırlara takılan ve raporda karşılığı
olmayan bir kurulum üretiyor.
İyi haber şu: Firebase kural çiğnendiğinde susmuyor. error olayı ve
firebase_error parametresi zaten hesabınızda duruyor, yalnızca kimse
oraya bakmıyor. Şemayı kurmadan önce sınırları bilin, kurduktan sonra o
tek raporu kontrol edin.
Olayların GTM tarafında nasıl yönetildiği ve container'ın iOS ile Android'e nasıl kurulduğu ayrı bir konu: onu GTM ile iOS ve Android'de olay takibi rehberinde adım adım yazdık.
Sık sorulan sorular
Hayır. dataLayer web'e özgü bir yapıdır ve mobil SDK'da karşılığı yoktur. Uygulamada olaylar Firebase SDK'sının logEvent metoduyla kaydedilir.
Kullanmayın. Geçersiz karakter içeren olay adı reddedilir ve Firebase 2 numaralı hata koduyla error olayı basar. Olay adlarını küçük harf ve alt çizgiyle yazın.
Değer kırpılmaz, tamamen düşer. Olay yine gider ama o parametre yerine firebase_error ve firebase_error_value parametreleri eklenir.
Fazlası düşer ve olaya 5 numaralı hata kodu eklenir. Hangi parametrenin düşeceği garanti değildir, bu yüzden sınıra dayanan bir şema kurmayın.
Hayır. Otomatik toplanan olaylar farklı olay adı sınırına sayılmaz, o 500 tamamen sizin tanımladığınız olaylara kalır.