Реалізація воронки конверсії (Conversion Funnel) для мобільного застосунку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація воронки конверсії (Conversion Funnel) для мобільного застосунку
Середній
~3-5 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація воронки конверсії для мобільного додатку

Воронка конверсії без правильного трекінгу — це діаграма, яку рисує продакт за пам'яттю. З трекінгом — це цифри, які показують, де саме і у якого сегмента користувачів деньги йдуть сквозь пальці.

Стандартна помилка: трекати тільки початок і кінець воронки (checkout_startedpayment_succeeded) й потім дивуватися, що 60% drop-off незрозумілі. Правильний підхід — трекати кожен крок з контекстом, достатнім для пояснення причини відвалу.

Проектування воронки

Перед реалізацією потрібно визначити:

  1. Кроки воронки — атомарні події, однозначно відповідні прогресу користувача
  2. Властивості кожного кроку — що потрібно знати про користувача й контекст на цьому кроці
  3. Точки відвалу — що відбувається з користувачем, який не перейшов до наступного кроку

Приклад воронки e-commerce:

Крок Event Ключові властивості
1 product_viewed product_id, category, source
2 add_to_cart product_id, quantity, cart_size
3 checkout_started cart_total, item_count, has_promo
4 checkout_address_completed address_type (new/saved)
5 checkout_payment_opened payment_methods_available
6 payment_method_selected method (card/paypal/apple_pay)
7 payment_initiated method, 3ds_required
8 payment_succeeded order_id, total, method

Крок 7 → 8 з 3ds_required = true дасть окрему гілку воронки. Без цієї властивості незрозуміло, чому на цьому кроці більше drop-off.

Реалізація трекінгу

// 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 Funnels

// 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' }]
});

Аналіз причин drop-off

Чисті дані воронки говорять «тут теряємо 40%». Вони не говорять чому. Для розуміння причин:

  • Сесійні записи на кроці drop-off (UXCam/Smartlook): що робили користувачі перед уходом
  • Властивості користувачів в аналітиці: хто йде — нові чи повернулися, iOS чи Android, який план
  • A/B тест на кроці з високим drop-off: перевірити гіпотезу про покращення
// Трекінг причини відвалу при 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
                )
            )
        }
    }
}

Що ми робимо

  • Проектуємо кроки воронки спільно з продактом: атомарні події з повним контекстом
  • Реалізуємо type-safe wrapper для кожного кроку воронки
  • Додаємо трекінг abandonment з причиною для ключових drop-off точок
  • Налаштовуємо Funnel Report в Amplitude/Firebase з сегментацією по платформі й когорті
  • Підключаємо Session Replay на кроках з найбільшим drop-off для якісного аналізу

Терміни

Проектування таксономії та реалізація трекінгу: 2–3 дні. Дашборди й першопочатковий аналіз: ще 1–2 дні. Вартість розраховується індивідуально.