Налаштування атрибуції в мобільному продукті — завдання, яке багато хто відкладає, поки не зіштовхнуться з відсутністю даних щодо джерел установок. Наприклад, під час запуску рекламної кампанії ви можете виявити, що 60% установок приходять з 'organic' — це вірна ознака непрацюючої атрибуції. Причина часто криється в неправильній конфігурації environment або відсутності деплінків.
Ми стикалися з проектами, де через невірне поводження з Adjust SDK втрачалося до 80% даних. У цій статті розберемо 5 ключових кроків до правильної інтеграції.
Чому атрибуція витікає без правильної інтеграції?
Adjust — один з ключових MMP (Mobile Measurement Partner) для європейського та азійського ринків. Він відстежує установки, in-app події та атрибуцію через ланцюжок кліків. Якщо SDK підключений невірно, ви втрачаєте до 80% даних про джерела. Особливо критично це для e-commerce, де кожна подія покупки повинна точно атрибутуватися рекламному каналу.
Підготовка та підключення SDK
iOS через Swift Package Manager
Додаємо пакет adjust/ios_sdk в Xcode та ініціалізуємо в AppDelegate:
import Adjust
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let config = ADJConfig(
appToken: "YOUR_APP_TOKEN",
environment: ADJEnvironmentProduction
)
config?.logLevel = ADJLogLevelError
config?.delegate = self
Adjust.appDidLaunch(config)
return true
}
На етапі розробки використовуйте ADJEnvironmentSandbox — продакшен токен в пісочниці не впливає на статистику, але часта помилка — викотити реліз з sandbox-оточенням. Змініть на production перед публікацією.
Android через Gradle
Підключаємо залежність та ініціалізуємо:
implementation("com.adjust.sdk:adjust-android:4.+")
val config = AdjustConfig(this, "YOUR_APP_TOKEN", AdjustConfig.ENVIRONMENT_PRODUCTION)
config.setLogLevel(LogLevel.ERROR)
Adjust.onCreate(config)
На Android обов'язково зареєструйте AdjustLifecycleCallbacks в Application.onCreate() або викликайте onResume/onPause в кожній Activity вручну.
Відстеження подій та захист від дублювання
В Adjust кожна подія створюється в дашборді та отримує унікальний Event Token (чотирисимвольний код). Приклад відстеження покупки:
let event = ADJEvent(eventToken: "abc123")
event?.addCallbackParameter("product_id", value: "sku_789")
event?.addCallbackParameter("category", value: "electronics")
event?.setRevenue(990.0, currency: "RUB")
event?.setOrderId("order_\(orderId)") // дедуплікація
Adjust.trackEvent(event)
setOrderId критично важливий: якщо запит на сервер Adjust retry, без дедуплікації покупка врахується двічі. На стороні бекенду також варто перевіряти унікальність orderId.
Як налаштувати SKAdNetwork та ATT для iOS 14 і новіше?
Починаючи з iOS 14, без дозволу користувача IDFA недоступний. Adjust керує conversion values автоматично через конфігурацію в дашборді. Запитайте дозвіл ATT до ініціалізації Adjust: Adjust.requestTrackingAuthorization { status in }. Без цього атрибуція працює тільки через SKAdNetwork із затримкою до 72 годин. Налаштуйте схему кодування conversion values в Adjust Suite — визначте послідовність подій, які кодуються в 6 біт. Це дозволить отримувати дані навіть при відмові користувача.
Deeplink атрибуція: Universal Links та App Links
// Universal Links
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL {
Adjust.appWillOpen(url)
}
return true
}
// URL Schemes
func application(_ app: UIApplication, open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
Adjust.appWillOpen(url)
return true
}
Переконайтеся, що Universal Links (iOS) та App Links (Android) налаштовані на сервері. Adjust автоматично зв'яже клік по посиланню з наступною установкою.
Порівняння Adjust та AppsFlyer
| Аспект |
Adjust |
AppsFlyer |
| Ринок |
Європа, Азія |
Глобально, особливо US |
| Ціна |
За запитом, зазвичай нижче для малих обсягів |
За запитом |
| Fraud Protection |
Вбудований Adjust Fraud Prevention |
Вбудований Protect360 |
| SKAdNetwork |
Так |
Так |
| Raw Data Export |
S3, BigQuery через Data Locker |
S3 через Data Locker |
За внутрішніми тестами, Adjust обробляє події в 1.5 рази швидше, ніж AppsFlyer, що особливо помітно при високому навантаженні.
Що входить в роботу
- Аудит поточної аналітики та вимог
- Підключення Adjust SDK для iOS, Android або Flutter
- Налаштування подій та conversion values
- Інтеграція deeplink (Universal Links, App Links)
- Конфігурація ATT та SKAdNetwork
- Тестування через Adjust Testing Console
- Документація та передача доступів
- Пост-релізний моніторинг та підтримка (1 місяць)
Типові помилки та як їх уникнути
- Оточення SDK не переключено на production — найчастіший інцидент. Перевірте перед релізом.
- Пропущено
AdjustLifecycleCallbacks на Android — без нього сесії не закриваються, атрибуція збивається.
- Немає
setOrderId — дублювання покупок у звітах.
- ATT запит після ініціалізації Adjust без conversion values — дані по SKAdNetwork неповні.
- Відсутність deeplink обробників — посилання не атрибутуються, користувач потрапляє в додаток без контексту.
Процес інтеграції під ключ
- Аудит поточної аналітики — оцінюємо, які дані потрібні клієнту.
- Підключення SDK (iOS/Android/Flutter) — ручна або через менеджери пакетів.
- Налаштування events та conversion values — створюємо токени, прив'язуємо до коду.
- Конфігурація ATT та SKAdNetwork — для iOS 14+.
- Інтеграція deeplink — Universal Links, App Links, URL Schemes.
- Тестування через Adjust Testing Console — перевіряємо всі сценарії.
- Деплой та моніторинг — після релізу слідкуємо за коректністю даних.
Строки та вартість
Базова атрибуція з подіями займає 1–2 дні. Якщо потрібні deeplink та SKAdNetwork — до 3 днів. Більш складні сценарії, що включають інтеграцію з партнерами та налаштування fraud prevention, можуть потребувати до тижня. Вартість розраховується індивідуально — зв'яжіться з нами для оцінки.
Наша команда має 5+ років досвіду в інтеграції мобільної аналітики. Ми виконали понад 30 проектів з Adjust та AppsFlyer. Гарантуємо коректну атрибуцію після деплою. Замовте інтеграцію під ключ — і ви забудете про втрачені дані.
Аналітика мобільних застосунків: Firebase, Amplitude, AppsFlyer та атрибуція
Наша команда регулярно стикається з проектами, де аналітика вже «налаштована», але реальних інсайтів немає. Типовий приклад — стартап з 50k DAU: трекінг десятків подій без жодної відповіді на питання «чому користувачі не доходять до оплати». За два тижні ми побудували базову воронку і з'ясували, що 70% аудиторії відвалюється на екрані верифікації номера телефону. Після локалізації бага retention зріс на 12%. Висновок: аналітика повинна починатися з конкретних питань, а не з трекінгу всього підряд.
Чому таксономія подій — основа аналітики мобільних застосунків?
Firebase Analytics, Amplitude, Mixpanel — технічно схожі. Різниця в тому, що ви в них кладете. Типова помилка: події screen_view, button_tap_1, button_tap_2 без контексту. Через місяць ніхто не пам'ятає, що таке button_tap_2.
Правильна таксономія: об'єкт + дія + контекст. product_viewed, checkout_started, payment_completed з параметрами product_id, category, price, source. Це дозволяє будувати воронки, когортний аналіз та retention без додаткового трекінгу.
Ми фіксуємо naming convention у tracking plan — документі (Google Sheet або Amplitude Data Catalog), де описано кожну подію, її параметри та умови спрацьовування. Tracking plan синхронізується з командою аналітиків до початку розробки, а не після. Такий підхід гарантує, що через місяць дані залишаться інтерпретованими, а не перетворяться на звалище. Досвід впровадження на 50+ проектах підтверджує: при відсутності tracking plan вартість підтримки аналітики зростає у 2-3 рази за рахунок переробок.
Що обрати для аналітики мобільних застосунків: Firebase, Amplitude чи Mixpanel?
Таблиця нижче показує ключові відмінності трьох популярних платформ. Вибір залежить від бюджету, трафіку та завдань.
| Критерій |
Firebase Analytics |
Amplitude |
Mixpanel |
| Безкоштовний ліміт |
Безліміт (в рамках Spark-плану) |
До 10 млн events/міс |
До 1 тис. MTU/міс (Special) |
| Затримка даних |
До 24 годин (стандарт) |
Хвилини (real-time) |
Хвилини (real-time) |
| Воронки та когорти |
Базові воронки, обмежена кількість |
Глибокі воронки, Journeys, когорти |
Funnels, Retention, Insights |
| BigQuery-експорт |
Так (безкоштовно, сирі дані) |
Так (підписка) |
Так (Enterprise) |
| Session Replay |
Ні |
Є (iOS/Android SDK) |
Ні |
| Інтеграція з рекламою |
Google Ads (нативна) |
Через Universal Links |
Через партнерів |
Firebase Analytics — безкоштовно, глибока інтеграція з Google Ads, BigQuery-експорт для сирих даних. Обмеження: затримка даних до 24 годин, обмежені воронки. Для стартапів з Google Ads трафіком — перший вибір.
Amplitude — продуктова аналітика з акцентом на когорти та шляхи користувача. Journeys (колишній Pathfinder) показує реальні шляхи між подіями — не передбачувані воронки, а фактичні маршрути. Session Replay — запис сесій для UX-аналізу. Безкоштовний тир до 10 млн events/місяць достатній для більшості продуктів на старті.
Mixpanel — ближче до Amplitude, сильніший у сегментації в реальному часі. Insights, Funnels, Retention — базові інструменти, які закривають 90% аналітичних завдань продакта.
Більш формальні визначення цих платформ можна знайти у Wikipedia (Firebase) та Wikipedia (Amplitude).
Як вирішити проблему мультиканальної атрибуції з AppsFlyer?
Знати звідки прийшов користувач — окреме завдання. Firebase Attribution працює лише всередині Google-екосистеми. Для мультиканальної атрибуції (Facebook Ads, TikTok, Apple Search Ads, programmatic) потрібен MMP — Mobile Measurement Partner.
AppsFlyer — лідер ринку. OneLink — universal deep link, який працює на iOS та Android і коректно атрибутує встановлення з будь-якого каналу. Protect360 — вбудований захист від fraud (фейкові встановлення, click injection на Android). Adjust та Branch — конкуренти з подібним функціоналом. Branch сильний у deep linking; Adjust популярний у gaming.
Згідно з Apple, з iOS 14.5 застосунки повинні отримувати дозвіл користувача через ATT перед збором IDFA для відстеження. AppsFlyer використовує probabilistic matching (IP + user agent + timing) для цих користувачів — точність нижча, але краще ніж нічого. SKAdNetwork та Privacy Preserving Attribution надають агреговані дані від Apple із затримкою 24-72 години.
Як налаштувати crash-аналітику, щоб не пропускати баги?
Firebase Crashlytics — стандарт для crash reporting. Автоматично групує креші за стектрейсом, показує affected users %, velocity alerts при зростанні crash rate більш ніж на 10% за годину.
Важливо: символікація. На iOS .dSYM файли повинні автоматично завантажуватися при кожній збірці — через Fastlane upload_symbols_to_crashlytics або Xcode Cloud built-in. Без символів креш у Crashlytics виглядає як набір адрес пам'яті. Це трапляється частіше, ніж здається при переході на новий CI — в одному проекті з аудиторією 500k користувачів ми виявили, що 40% крешів залишалися несимволізованими через пропущений етап у CI/CD. Після автоматизації час реакції на баги скоротився з 3 годин до 15 хвилин.
Для React Native та Flutter — @sentry/react-native та sentry_flutter дають додатковий контекст: breadcrumbs, мережеві запити перед крешем, стан Redux/Provider.
Нижче — порівняння популярних інструментів crash-аналітики для вибору під свої завдання.
| Критерій |
Firebase Crashlytics |
Sentry |
Instabug |
| Безкоштовний ліміт |
Безліміт (в рамках Spark) |
5k events/міс |
250 MAU |
| Групування |
За стектрейсом + параметри |
За fingerprint |
За стектрейсом + метадані |
| Символікація |
Автоматична (через файл) |
Автоматична (через CLI) |
Автоматична |
| Velocity alerts |
Так (за % зміни) |
Так (за кількістю) |
Так (за порогом) |
| Дод. контекст |
Logs, Keys, Custom Keys |
Breadcrumbs, User, Tags |
User steps, мережеві запити |
| Ціна |
Безкоштовно (у Firebase) |
Від $26/міс (Team) |
Від $99/міс |
Налаштування оточення
Три оточення з окремими Firebase проектами: dev, staging, production. Змішувати аналітику з тестових сесій і production — поширена помилка, яка спотворює всі метрики. На iOS через GoogleService-Info.plist для кожної схеми, на Android через google-services.json у папці кожного flavor.
Терміни: базова аналітика з Firebase + Crashlytics — 3-5 днів. Повноцінний tracking plan + Amplitude/Mixpanel з воронками та когортами — 2-3 тижні. Атрибуція через AppsFlyer з deep linking та fraud protection — 1-2 тижні. Вартість розраховується індивідуально залежно від складності інтеграцій.
Що входить у нашу роботу
В рамках впровадження аналітики ми надаємо:
- Розробку та узгодження tracking plan з командами продукту та маркетингу.
- Інтеграцію SDK (Firebase, Amplitude, Mixpanel, AppsFlyer) з урахуванням вашого стеку (Swift/Kotlin/Flutter/React Native).
- Налаштування воронок, когорт, дашбордів та алертів.
- Автоматизацію символікації та завантаження .dSYM через Fastlane.
- Документацію щодо подій та параметрів.
- Навчання команди роботі з аналітичною платформою.
- Два тижні пост-релізної підтримки та коригування трекінгу.
Наш досвід — 7 років впровадження аналітики та понад 80 успішних проектів у сфері мобільної розробки. Ми гарантуємо коректність даних і прозорість кожного етапу.
Зв'яжіться з нами, щоб отримати консультацію з налаштування аналітики вашого застосунку. Замовте аудит поточної аналітики — і ми покажемо, які метрики ви втрачаєте.