Mobil app

Mobil uygulamada dataLayer karşılığı: Firebase event yapısı

Uygulamada dataLayer yok, logEvent var. İkisinin yapı farkı, Firebase'in olay ve parametre kuralları, sınırlar ve kural çiğnendiğinde Firebase'in size nasıl haber verdiği.

6 ağustos 2026 tarihinde güncellendi9 dk okuma

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.

WEB DATALAYER → FIREBASE4 kavram
  • 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.

FIREBASE ŞEMA SINIRLARIuygulama veri akışı
  • 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.

ŞEMA HATASIAdlandırma kurallara uygun
GİDEN OLAYgeçerli
  • 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ı:

KodNe oldu
2Olay adı geçersiz: boş, çok uzun veya izin verilmeyen karakter var
13Olay adı rezerve
3Parametre adı geçersiz
14Parametre adı rezerve
4Parametre değeri çok uzun
5Olayda 25'ten fazla parametre var, fazlası düştü
18Parametre değerinin tipi eksik veya hatalı
6Kullanıcı özelliği adı geçersiz
15Kullanı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.

AYNI BİLGİ, İKİ ŞEMAkarşılaştırma
  • 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

1Olay adı ve parametreler kurallara uyuyor mu?Firebase
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.
2error olayı basılıyor mu?GA4
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.
3Parametre değerleri doğru tipte mi?GA4
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.

Ücretsiz audit

Kurulumunuzu 48 saat içinde inceleyelim.

Hesap erişimi gerekmiyor. Site adresi ve kısa bilgi yeterli, kalanını biz kontrol ediyoruz.

  1. 01AuditMevcut kurulum 12 madde üzerinden incelenir.
  2. 02Audit raporu12 maddelik incelemenin sonucu: ne çalışıyor, ne çalışmıyor, hangi sırayla düzeltilmeli.
  3. 03Görüşme30 dakikalık arama, soru-cevap. Yükümlülük yok.
  4. 04KararÇalışmak isterseniz plan çıkarırız. İstemezseniz audit raporu sizde kalır.
  • 12 maddelik inceleme
  • 48 saat içinde
  • Yükümlülük yok

Audit talebi

Göndererek gizlilik politikasını kabul etmiş olursunuz. Hesap erişimi bu aşamada istenmez.