לקוחות רבים פונים אלינו עם בעיה: משפך המוצר נראה כמו קופסה שחורה. אנו רואים שאחרי שלב add_to_cart, 40% מהמשתמשים אובדים, אבל הסיבה לא ידועה. כסף הולך לפרסום במקום לשיפורים. אנו פותרים זאת על ידי הטמעת מעקב מקצה לקצה מאפס. במשך 5 שנים, הטמענו מעקב עבור יותר מ-50 פרויקטים ניידים — מ-MVP ועד אפליקציות ארגוניות עם מיליוני משתמשים.
משפך המרות ללא מעקב תקין הוא דיאגרמה שצוירה מהזיכרון על ידי מנהל מוצר. עם מעקב, זה מספרים שמראים בדיוק היכן ועבור איזה פלח משתמשים כסף מחליק בין האצבעות. טעות נפוצה: לעקוב רק אחרי התחלה וסוף המשפך (checkout_started → payment_succeeded) ואז לתהות למה 60% נשירה לא ברורה. הגישה הנכונה היא לעקוב אחרי כל שלב עם מספיק הקשר כדי להסביר את סיבת הנשירה.
למה משפכים סטנדרטיים לא מספיקים
לעתים קרובות, משפכים בנויים מאירועים כלליים מדי: screen_viewed במקום checkout_payment_opened. ללא גרנולריות, אי אפשר לדעת איזה מסך או פעולה גורמים לנשירה. לדוגמה, אם 30% מהמשתמשים נושרים ב-payment_opened, זה יכול להיות בגלל טעינה איטית, היעדר Apple Pay, או שגיאת 3DS. בניסיון שלנו, אחרי הוספת 3ds_required למאפייני האירוע, הנשירה ב-onCleared() הצטמצמה בחצי — פשוט כי ראינו ש-80% מהנשירות עברו דרך 3DS וייצבנו את התהליך הזה.
איך אנחנו פותרים את זה: הטמעת Wrapper בטיחותי לטיפוסים
אנחנו מתכננים wrapper בטיחותי לטיפוסים עבור אירועי משפך, ומבטיחים שלכל שלב יש הקשר חובה. לדוגמה, בפרויקט פינטק, שמנו לב שלשלב התשלום יש נשירה של 50%. על ידי הוספת מאפיינים כמו product_viewed ו-add_to_cart, זיהינו שמשתמשים עם רק אמצעי תשלום אחד נוטים לנטוש פי 3 יותר. הפתרון היה הוספת אפשרות חלופית, שהפחיתה את הנשירה ב-25%.
עיצוב המשפך
לפני ההטמעה, אנו מגדירים:
- שלבי משפך — אירועים אטומיים שמתאימים באופן חד-משמעי להתקדמות המשתמש
- מאפיינים לכל שלב — מה צריך לדעת על המשתמש וההקשר באותו שלב
- נקודות נשירה — מה קורה כשמשתמש לא ממשיך לשלב הבא
דוגמה למשפך מסחר אלקטרוני:
| שלב | אירוע | מאפיינים מרכזיים |
|---|---|---|
| 1 | checkout_started |
product_id, category, source |
| 2 | checkout_address_completed |
product_id, quantity, cart_size |
| 3 | checkout_payment_opened |
cart_total, item_count, has_promo |
| 4 | payment_method_selected |
address_type (new/saved) |
| 5 | payment_initiated |
payment_methods_available |
| 6 | payment_succeeded |
method (card/paypal/apple_pay) |
| 7 | // Android — типобезопасный wrapper для воронки object CheckoutFunnel { fun trackStepCompleted(step: CheckoutStep, props: Map<String, Any> = emptyMap()) { val eventName = when (step) { CheckoutStep.ADDRESS -> "checkout_address_completed" CheckoutStep.PAYMENT_OPENED -> "checkout_payment_opened" CheckoutStep.PAYMENT_METHOD_SELECTED -> "checkout_payment_method_selected" CheckoutStep.PAYMENT_INITIATED -> "payment_initiated" CheckoutStep.PAYMENT_SUCCEEDED -> "payment_succeeded" CheckoutStep.PAYMENT_FAILED -> "payment_failed" } val baseProps = mapOf( "session_id" to sessionManager.currentSessionId, "cart_id" to cartManager.currentCartId, "user_id" to authManager.currentUserId, "timestamp" to System.currentTimeMillis() ) analyticsClient.track(eventName, baseProps + props) } } // Использование в ViewModel checkoutViewModel.onAddressConfirmed.observe(this) { address -> CheckoutFunnel.trackStepCompleted( CheckoutStep.ADDRESS, mapOf( "address_type" to if (address.isNew) "new" else "saved", "country" to address.country ) ) } |
method, 3ds_required |
| 8 | // iOS — аналогичный подход enum CheckoutStep { case addressCompleted(isNew: Bool, country: String) case paymentOpened(availableMethods: [String]) case paymentMethodSelected(method: String, requires3DS: Bool) case paymentSucceeded(orderId: String, total: Double, method: String) case paymentFailed(errorCode: String, method: String) } extension AnalyticsService { func track(checkoutStep: CheckoutStep) { let (eventName, props) = checkoutStep.analyticsPayload amplitude.track(eventType: eventName, eventProperties: props) } } extension CheckoutStep { var analyticsPayload: (String, [String: Any]) { switch self { case .paymentMethodSelected(let method, let requires3DS): return ("checkout_payment_method_selected", [ "payment_method": method, "requires_3ds": requires3DS, "cart_id": CartManager.shared.currentCartId ]) // ... } } } |
order_id, total, method |
שלב 7 → 8 עם // Amplitude Chart — настройка через UI или API { "chart_type": "FUNNEL", "steps": [ { "event_type": "product_viewed" }, { "event_type": "add_to_cart" }, { "event_type": "checkout_started" }, { "event_type": "payment_succeeded" } ], "funnel_type": "ordered", // строгий порядок "conversion_window": 7, // 7 дней на прохождение воронки "conversion_window_unit": "days", "segment_definitions": [ { "name": "iOS users", "filters": [{"subprop_key": "platform", "subprop_value": ["iOS"]}] }, { "name": "Android users", "filters": [{"subprop_key": "platform", "subprop_value": ["Android"]}] } ] } נותן ענף נפרד במשפך. ללא מאפיין זה, לא ברור למה יש יותר נשירה בשלב זה.
פרטי הטמעה
// Android — типобезопасный wrapper для воронки
object CheckoutFunnel {
fun trackStepCompleted(step: CheckoutStep, props: Map<String, Any> = emptyMap()) {
val eventName = when (step) {
CheckoutStep.ADDRESS -> "checkout_address_completed"
CheckoutStep.PAYMENT_OPENED -> "checkout_payment_opened"
CheckoutStep.PAYMENT_METHOD_SELECTED -> "checkout_payment_method_selected"
CheckoutStep.PAYMENT_INITIATED -> "payment_initiated"
CheckoutStep.PAYMENT_SUCCEEDED -> "payment_succeeded"
CheckoutStep.PAYMENT_FAILED -> "payment_failed"
}
val baseProps = mapOf(
"session_id" to sessionManager.currentSessionId,
"cart_id" to cartManager.currentCartId,
"user_id" to authManager.currentUserId,
"timestamp" to System.currentTimeMillis()
)
analyticsClient.track(eventName, baseProps + props)
}
}
// Использование в ViewModel
checkoutViewModel.onAddressConfirmed.observe(this) { address ->
CheckoutFunnel.trackStepCompleted(
CheckoutStep.ADDRESS,
mapOf(
"address_type" to if (address.isNew) "new" else "saved",
"country" to address.country
)
)
} // iOS — аналогичный подход
enum CheckoutStep {
case addressCompleted(isNew: Bool, country: String)
case paymentOpened(availableMethods: [String])
case paymentMethodSelected(method: String, requires3DS: Bool)
case paymentSucceeded(orderId: String, total: Double, method: String)
case paymentFailed(errorCode: String, method: String)
}
extension AnalyticsService {
func track(checkoutStep: CheckoutStep) {
let (eventName, props) = checkoutStep.analyticsPayload
amplitude.track(eventType: eventName, eventProperties: props)
}
}
extension CheckoutStep {
var analyticsPayload: (String, [String: Any]) {
switch self {
case .paymentMethodSelected(let method, let requires3DS):
return ("checkout_payment_method_selected", [
"payment_method": method,
"requires_3ds": requires3DS,
"cart_id": CartManager.shared.currentCartId
])
// ...
}
}
} בניית משפכים ב-Amplitude
ב-Amplitude Funnel Analysis:
// Amplitude Chart — настройка через UI или API
{
"chart_type": "FUNNEL",
"steps": [
{ "event_type": "product_viewed" },
{ "event_type": "add_to_cart" },
{ "event_type": "checkout_started" },
{ "event_type": "payment_succeeded" }
],
"funnel_type": "ordered", // строгий порядок
"conversion_window": 7, // 7 дней на прохождение воронки
"conversion_window_unit": "days",
"segment_definitions": [
{
"name": "iOS users",
"filters": [{"subprop_key": "platform", "subprop_value": ["iOS"]}]
},
{
"name": "Android users",
"filters": [{"subprop_key": "platform", "subprop_value": ["Android"]}]
}
]
}conversion_window הוא פרמטר קריטי. לרכישת מוצר, 7 ימים הם סבירים. למנוי SaaS, זה עשוי להיות 30 ימים. חלון קצר מדי מוריד את ההמרה.
משפכים ב-Firebase Analytics
// Firebase funnel через Google Analytics
// Настраивается в GA4 → Explore → Funnel Exploration
// Через API:
const { BetaAnalyticsDataClient } = require('@google-analytics/data');
const client = new BetaAnalyticsDataClient();
const [response] = await client.runFunnelReport({
property: 'properties/YOUR_PROPERTY_ID',
funnelSteps: [
{
name: 'Product Viewed',
filterExpression: {
filter: {
fieldName: 'eventName',
stringFilter: {
value: 'product_viewed'
}
}
}
},
{
name: 'Add to Cart',
filterExpression: {
filter: {
fieldName: 'eventName',
stringFilter: {
value: 'add_to_cart'
}
}
}
},
{
name: 'Purchase',
filterExpression: {
filter: {
fieldName: 'eventName',
stringFilter: {
value: 'purchase'
}
}
}
}
],
dateRanges: [
{
startDate: '30daysAgo',
endDate: 'today'
}
]
});
השוואת כלי מעקב
| כלי | מגבלת חינם | גמישות פילוח | הקלטות סשן |
|---|---|---|---|
| Amplitude | 10M אירועים/חודש | גבוהה: קבוצות, פלחים התנהגותיים | לא |
| Firebase Analytics | ללא הגבלה (GA4) | בינונית: רק פלחי משתמשים | לא |
| Mixpanel | 20M אירועים/חודש | גבוהה: דוחות מותאמים אישית, מקרנים | לא |
Amplitude מאפשר בניית משפכים מהירה יותר מאשר Firebase, במיוחד עם פילוח מורכב. Firebase מנצח במחיר — הוא חינמי כמעט לכל נפח נתונים.
ניתוח סיבות נשירה
נתוני משפך גולמיים אומרים "אנחנו מאבדים 40% כאן." הם לא אומרים למה. כדי להבין את הסיבות:
- הקלטות סשן בשלב הנשירה (UXCam/Smartlook): מה המשתמשים עשו לפני שעזבו
- מאפייני משתמש באנליטיקה: מי עוזב — חדש או חוזר, iOS או Android, איזה תוכנית
- בדיקת A/B בשלב עם נשירה גבוהה: לבדוק השערה לשיפור
// Трекинг причины отвала при abandonment
class PaymentViewModel : ViewModel() {
override fun onCleared() {
super.onCleared()
if (!paymentCompleted) {
CheckoutFunnel.trackStepCompleted(
CheckoutStep.ABANDONED,
mapOf(
"last_step" to currentStep.name,
"time_on_step_seconds" to stepTimer.elapsed(),
"error_shown" to lastErrorShown
)
)
}
}
} איך לפרש תוצאות משפך
אחרי הגדרת המעקב, חשוב לא רק להסתכל על אחוזים אלא גם להשוות פלחים. לדוגמה, ההמרה ב-iOS עשויה להיות 15% בעוד ב-Android היא 10%. זו סיבה לבדוק הבדלים ב-UI/UX בין הפלטפורמות. כמו כן, הסתכלו על הזמן בין שלבים: עלייה חדה בזמן בשלב עשויה להצביע על תסכול משתמש.
גישת תיאור המשפך מבוססת על תיעוד Amplitude's Funnel Analysis: מאפייני אירוע וחלון המרה קובעים את דיוק הניתוח.
מה כלול בשירות שלנו
- ביקורת אירועים וטקסונומיה נוכחית.
- עיצוב מפת משפך מלאה: אירועים אטומיים עם הקשר.
- הטמעת wrappers בטיחותיים לטיפוסים ב-Kotlin/Swift.
- אינטגרציה עם Amplitude/Firebase, הגדרת דוח משפך עם פילוח.
- חיבור הקלטות סשן בשלבים קריטיים.
- תיעוד טקסונומיה והדרכת צוות באנליטיקה.
- תמיכה שוטפת — התאמת אירועים כשההיגיון משתנה.
לוח זמנים ומחיר
עיצוב טקסונומיה והטמעה: 2–3 ימים. דשבורדים וניתוח ראשוני: עוד 1–2 ימים. המחיר נקבע באופן אישי לאחר ביקורת. נבחן את הפרויקט שלך תוך יום אחד — צור קשר.
למה לבחור בנו
יש לנו 5 שנות ניסיון באנליטיקה ניידת — הטמענו מעקב בפינטק, מסחר אלקטרוני ו-SaaS. אנו מבטיחים שכל שלב במשפך יגיע עם הקשר ברור, לא רק שם אירוע. אחרי ההטמעה, אתה מקבל לא רק מספרים אלא כלי לאופטימיזציה יומיומית. הזמן ביקורת של המשפך הנוכחי שלך — נפרק את הטקסונומיה שלך ונציע תוכנית פעולה.
צור קשר איתנו לייעוץ — ננתח את המשפך שלך ונציע תוכנית פעולה.







