מעקב ללא טקסונומיה – מזבלת נתונים
אירועים סטנדרטיים כמו screen_view ו-app_open עונים רק על השאלה "האם המשתמש היה באפליקציה?". לעסק, מה שחשוב יותר הוא: כמה הגיעו לתשלום, איזה תוכן מוביל למנוי, באיזו נקודה במהלך ההרשמה משתמשים נושרים. מעקב אחר אירועים מותאמים אישית מספק תשובות, אבל רק אם המערכת מתוכננת נכון.
ללא טקסונומיה מחושבת היטב, המעקב הופך למזבלה: יותר מ-400 שמות אירועים ייחודיים, שמחציתם מיושנים, נתוני iOS ו-Android נקראים בשמות שונים, ואף אחד לא יכול להסביר מה פירוש btn_click_3. עטיפה טיפוסית (typed wrapper) מעל Firebase Analytics מפחיתה שגיאות מעקב פי 3 בהשוואה לקריאות גולמיות דרך Bundle – זה מאושר על ידי הניסיון שלנו ביותר מ-50 פרויקטים. בנוסף, DebugView מאיץ את תהליך הניפוי פי 10 בהשוואה לניתוח לוגים ידני.
חיסכון בזמן ניפוי מגיע ל-40%, ועלויות האנליטיקה מופחתות ב-20% הודות לדה-דופליקציה אוטומטית ואימות סכמה מובנה.
למה מעקב סטנדרטי לא מספיק
screen_view מראה שהמשתמש פתח מסך, אבל לא עונה על השאלה "מה הם עשו שם?". מעקב אחר אירועים מותאמים אישית לוכד פעולות ספציפיות: לחיצה על כפתור, התחלת מילוי טופס, בחירת תוכנית. ללא אירועים כאלה, אי אפשר לבנות משפך המרה מדויק ולזהות צווארי בקבוק. לדוגמה, בעיה טיפוסית היא אירוע payment_succeeded שנורה פעמיים עקב תנאי מרוץ (race condition): פעם אחת בתגובת ה-API, ופעם נוספת ב-handler של השלמת URLSession. דה-דופליקציה באמצעות דגל הגנה ו-transaction_id פותרת זאת, אבל אם לא מתכננים זאת נכון, זה ינפח את ההמרה.
איך לפתח טקסונומיה וסכמת מאפיינים
תכנית שמות טובה היא [object]_[verb] או [screen]_[action]:
product_viewed
product_added_to_cart
checkout_started
checkout_step_completed ← с property step_name
checkout_abandoned
payment_initiated
payment_succeeded
payment_failed ← с property error_code
subscription_started
subscription_cancelledאנטי-דפוס: product_viewed product_added_to_cart checkout_started checkout_step_completed ← с property step_name checkout_abandoned payment_initiated payment_succeeded payment_failed ← с property error_code subscription_started subscription_cancelled , buttonClicked, screenOpened – אירועים אלה לא אומרים דבר ללא הקשר נוסף.
סכמת המאפיינים חייבת להיות מתועדת או מאוחסנת במערכת כמו Avo.app לפני היישום:
| אירוע | מאפיינים חובה | אופציונליים |
|---|---|---|
userAction |
product_viewed, product_id, product_name |
category, source |
position |
checkout_started, cart_total |
item_count |
promo_code |
payment_succeeded, order_id, total, currency |
payment_method |
installments |
subscription_started, plan_id, billing_period |
price |
השוואת פלטפורמות: Firebase מול Amplitude
| קריטריון | Firebase Analytics | Amplitude |
|---|---|---|
| סוג אירוע | דרך logEvent | דרך track |
| דה-דופליקציה | transaction_id | event_id |
| ייצוא ל-BigQuery | מובנה | דרך תוסף |
| עלות | חינם עד 500 אירועים/שעה | בתשלום לפי מספר אירועים |
בחירת הפלטפורמה תלויה בקנה מידה ובתקציב. Firebase מתאים לסטארטאפים, Amplitude למוצרים עם דרישות אנליטיקה גבוהות.
יישום: Android + Firebase Analytics
לפי התיעוד של Firebase, העברת trial_used מאפשרת דה-דופליקציה של עסקאות בצד הפלטפורמה.
// Wrapper над FirebaseAnalytics для типобезопасности
object Analytics {
private val firebaseAnalytics = FirebaseAnalytics.getInstance(context)
fun trackProductViewed(product: Product, source: String) {
firebaseAnalytics.logEvent("product_viewed") {
param("product_id", product.id)
param("product_name", product.name)
param("category", product.category)
param("price", product.price)
param("currency", "USD")
param("source", source)
}
}
fun trackCheckoutStarted(cart: Cart) {
val items = cart.items.mapIndexed { index, item ->
Bundle().apply {
putString(FirebaseAnalytics.Param.ITEM_ID, item.productId)
putString(FirebaseAnalytics.Param.ITEM_NAME, item.name)
putDouble(FirebaseAnalytics.Param.PRICE, item.price)
putLong(FirebaseAnalytics.Param.QUANTITY, item.quantity.toLong())
putLong(FirebaseAnalytics.Param.INDEX, index.toLong())
}
}
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.BEGIN_CHECKOUT) {
param(FirebaseAnalytics.Param.VALUE, cart.total)
param(FirebaseAnalytics.Param.CURRENCY, "USD")
param(FirebaseAnalytics.Param.ITEMS, items.toTypedArray())
}
}
}אנו משתמשים בקבועים סטנדרטיים transaction_id ו-// Wrapper над FirebaseAnalytics для типобезопасности object Analytics { private val firebaseAnalytics = FirebaseAnalytics.getInstance(context) fun trackProductViewed(product: Product, source: String) { firebaseAnalytics.logEvent("product_viewed") { param("product_id", product.id) param("product_name", product.name) param("category", product.category) param("price", product.price) param("currency", "USD") param("source", source) } } fun trackCheckoutStarted(cart: Cart) { val items = cart.items.mapIndexed { index, item -> Bundle().apply { putString(FirebaseAnalytics.Param.ITEM_ID, item.productId) putString(FirebaseAnalytics.Param.ITEM_NAME, item.name) putDouble(FirebaseAnalytics.Param.PRICE, item.price) putLong(FirebaseAnalytics.Param.QUANTITY, item.quantity.toLong()) putLong(FirebaseAnalytics.Param.INDEX, index.toLong()) } } firebaseAnalytics.logEvent(FirebaseAnalytics.Event.BEGIN_CHECKOUT) { param(FirebaseAnalytics.Param.VALUE, cart.total) param(FirebaseAnalytics.Param.CURRENCY, "USD") param(FirebaseAnalytics.Param.ITEMS, items.toTypedArray()) } } } עבור אירועי מסחר אלקטרוני – הם ממפים אוטומטית ל-Google Ads ול-BigQuery ללא הגדרה נוספת.
יישום: iOS + Amplitude
// Amplitude SDK v1.x (Swift)
import AmplitudeSwift
final class AnalyticsService {
static let shared = AnalyticsService()
private let amplitude = Amplitude(
configuration: Configuration(
apiKey: "YOUR_API_KEY",
defaultTracking: DefaultTrackingOptions(
sessions: true,
appLifecycles: true,
deepLinks: false,
screenViews: false
)
)
)
func trackPaymentSucceeded(order: Order) {
amplitude.track(
eventType: "payment_succeeded",
eventProperties: [
"order_id": order.id,
"total": order.total,
"currency": order.currency,
"payment_method": order.paymentMethod.rawValue,
"item_count": order.items.count
]
)
}
func setUserProperties(user: User) {
let identify = Identify()
identify.set(property: "plan", value: user.plan.rawValue)
identify.set(property: "registration_date", value: user.registrationDate.iso8601)
amplitude.identify(identify: identify)
}
} דה-דופליקציה ובדיקות
בעיה נפוצה אחת היא אירוע שנורה פעמיים. לדוגמה, FirebaseAnalytics.Event.* נקרא גם בתגובת API מוצלחת וגם ב-handler של השלמת URLSession. פתרון – דגל הגנה:
// Android — гарантируем однократную отправку
class CheckoutViewModel : ViewModel() {
private var paymentEventSent = false
fun onPaymentSuccess(order: Order) {
if (paymentEventSent) return
paymentEventSent = true
Analytics.trackPaymentSucceeded(order)
}
}עבור אירועי מסחר אלקטרוני, Firebase ממליצה להעביר FirebaseAnalytics.Param.* – זה מאפשר דה-דופליקציה ברמת פלטפורמת האנליטיקה.
ללא אימות, אירועים נשלחים לייצור ללא בדיקה – ואחרי חודש מגלים ש-// Amplitude SDK v1.x (Swift) import AmplitudeSwift final class AnalyticsService { static let shared = AnalyticsService() private let amplitude = Amplitude( configuration: Configuration( apiKey: "YOUR_API_KEY", defaultTracking: DefaultTrackingOptions( sessions: true, appLifecycles: true, deepLinks: false, screenViews: false ) ) ) func trackPaymentSucceeded(order: Order) { amplitude.track( eventType: "payment_succeeded", eventProperties: [ "order_id": order.id, "total": order.total, "currency": order.currency, "payment_method": order.paymentMethod.rawValue, "item_count": order.items.count ] ) } func setUserProperties(user: User) { let identify = Identify() identify.set(property: "plan", value: user.plan.rawValue) identify.set(property: "registration_date", value: user.registrationDate.iso8601) amplitude.identify(identify: identify) } } ב-iOS ו-payment_succeeded ב-Android הם אותו אירוע עם שמות שונים.
# Firebase DebugView — включить на устройстве
adb shell setprop debug.firebase.analytics.app com.myapp
# Amplitude — debug mode
amplitude.configuration.logLevel = LogLevelEnum.DEBUGהכלי Avo.app מאפשר ליצור סכמת אירועים ולייצר עטיפה טיפוסית (typed SDK-wrapper) ל-iOS/Android – הפרות סכמה נראות מיד בזמן הקומפילציה.
תהליך ולוחות זמנים
- עיצוב טקסונומיית אירועים עם צוות המוצר
- יצירת סכמת מאפיינים עם מאפיינים חובה ואופציונליים
- יישום עטיפה טיפוסית מעל Firebase/Amplitude/Mixpanel
- הגדרת DebugView לאימות אירועים במהלך הפיתוח
- הגדרת ייצוא ל-BigQuery עבור נתונים גולמיים
- בניית דשבורד משפך המרה ראשוני
- הכנת תיעוד אירועים לצוות (QA, אנליטיקה)
במהלך עבודתנו, השלמנו יותר מ-50 פרויקטי מעקב למובייל – מסטארטאפים ועד מוצרי פינטק גדולים. אנו מחזיקים בהסמכות Firebase ו-Amplitude.
לוחות זמנים: טקסונומיה וסכמת אירועים – יום אחד. יישום עטיפה ושילוב בקוד – 2–4 ימים. העלות מחושבת באופן אישי. כדי להעריך את הפרויקט שלך, צור איתנו קשר – נשלח הצעה תוך יום עסקים אחד.
קבל ייעוץ לשיפור המעקב באפליקציה שלך. אם כבר יש לך אינטגרציה קיימת, נבדוק אותה ונציע אפשרויות אופטימיזציה. צור איתנו קשר לאודיט.







