Реалізація Custom Event Tracking для моніторингу бізнес-метрик мобільного застосунку

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

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

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

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

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація Custom Event Tracking для моніторингу бізнес-метрик мобільного застосунку
Середній
~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

Реалізація Custom Event Tracking для мониторингу бізнес-метрик мобільного додатку

Стандартні события screen_view та app_open відповідають на запитання «користувач був у додатку». Custom Event Tracking відповідає на бізнес-запитання: скільки користувачів дійшло до оплати, який тип контенту приводить до підписки, на якому кроці flow реєстрації користувачі йдуть.

Без продуманої таксономії подій трекінг перетворюється на звалище: 400 унікальних event names, половина з яких застаріла, дані від iOS та Android називаються по-різному, та ніхто не може сказати, що означає btn_click_3.

Таксономія подій

Хороша схема найменування — [object]_[verb] або [screen]_[action]:

product_viewed
product_added_to_cart
checkout_started
checkout_step_completed  ← з властивістю step_name
checkout_abandoned
payment_initiated
payment_succeeded
payment_failed           ← з властивістю error_code
subscription_started
subscription_cancelled

Антипаттерн: buttonClicked, screenOpened, userAction — ці события нічого не кажуть без додаткового контексту.

Схема властивостей

Кожна событие має набір властивостей. Схему потрібно зафіксувати в документі (або в системі вроде Avo.app, Segment Protocols) перед початком реалізації:

Событие Обов'язкові властивості Опціональні
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 trial_used

Реалізація: Android + Firebase Analytics

// 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())
        }
    }
}

Використовуйте стандартні константи FirebaseAnalytics.Event.* та FirebaseAnalytics.Param.* для e-commerce подій — вони автоматично маппяться у 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)
    }
}

Дедуплікація подій

Одна з частих проблем — событие стріляє дважди. Наприклад, payment_succeeded викликається і при успішній відповіді API, і в completion handler URLSession:

// Android — гарантуємо однократну відправку
class CheckoutViewModel : ViewModel() {
    private var paymentEventSent = false

    fun onPaymentSuccess(order: Order) {
        if (paymentEventSent) return
        paymentEventSent = true
        Analytics.trackPaymentSucceeded(order)
    }
}

Для e-commerce подій Firebase рекомендує передавати transaction_id — це дозволяє дедуплицировати на рівні аналітичної платформи.

Тестування трекінгу

Без верифікації события йдуть у продакшен без перевірки — і через місяць виявляється, що purchase на iOS та payment_success на Android — це одна й та ж событие з різними іменами.

# Firebase DebugView — включити на пристрої
adb shell setprop debug.firebase.analytics.app com.myapp

# Amplitude — debug mode
amplitude.configuration.logLevel = LogLevelEnum.DEBUG

Avo.app дозволяє створити схему подій та згенерувати типізований SDK-wrapper для iOS/Android — порушення схеми одразу видно на compile time.

Що ми робимо

  • Проектуємо таксономію подій разом з product-командою
  • Створюємо схему властивостей з розбивкою на обов'язкові та опціональні
  • Реалізуємо typed wrapper над Firebase/Amplitude/Mixpanel
  • Налаштовуємо DebugView для верифікації подій на етапі розробки
  • Налаштовуємо BigQuery export для сирих даних
  • Створюємо початковий дашборд конверсійної воронки

Часові оцінки

Таксономія та схема подій: 1 день. Реалізація wrapper та інтеграція у кодову базу: 2–4 дні. Ціна розраховується індивідуально.