Ми стикалися з ситуацією, коли додаток в App Store отримував скарги на затримки при скролі, хоча в симуляторі все було гладко. Користувач не надішле профіль алокацій, а Xcode Instruments в CI не запустиш. Моніторинг продуктивності в продакшені — це окрема дисципліна: інструменти мають працювати на пристрої, не впливати на UX та надсилати агреговані метрики. Наш досвід показує, що системний моніторинг знижує crash rate на 30% за перший місяць і підвищує retention на 5%. За 10 років ми провели моніторинг для 50+ мобільних додатків з аудиторією від 100 тис. DAU.
Чому моніторинг продуктивності в продакшені критичний?
У лабораторних умовах легко виміряти FPS при ідеальній мережі. У продакшені — тисячі конфігурацій пристроїв, версій ОС, стан батареї, фонове навантаження. Тільки real-user monitoring дає об'єктивні p50/p95/p99 метрики. Наприклад, середній час cold start на iPhone 12 може бути 1.2 с, а на Samsung Galaxy A10 — 4.5 с. Без продакшен-моніторингу ви цього не побачите. Більше того, відстеження швидкодії в бойовому середовищі дозволяє виявляти проблеми, які не відтворюються на тестових пристроях: race conditions, витоки пам'яті під навантаженням, проблеми з multithreading на різних CPU.
Які метрики моніторити для утримання користувачів?
FPS при скролі — один з головних показників сприйнятої продуктивності. Наприклад, смикання UITableView через синхронне декодування JPEG на main thread — класика. Вимірюємо через CADisplayLink і надсилаємо p5 (відсоток кадрів нижче 60 FPS).
Як виміряти FPS при скролі?
Покрокова інструкція для iOS:
- Створіть CADisplayLink і додайте його в main run loop.
- Підраховуйте кадри за секунду.
- Надсилайте метрику з назвою екрану.
class FPSMonitor {
private var displayLink: CADisplayLink?
private var lastTimestamp: CFTimeInterval = 0
private var frameCount = 0
func start() {
displayLink = CADisplayLink(target: self, selector: #selector(tick))
displayLink?.add(to: .main, forMode: .common)
}
@objc private func tick(_ link: CADisplayLink) {
frameCount += 1
if link.timestamp - lastTimestamp >= 1.0 {
let fps = Double(frameCount) / (link.timestamp - lastTimestamp)
MetricsCollector.record("screen_fps", value: fps, screen: currentScreen)
frameCount = 0
lastTimestamp = link.timestamp
}
}
}
На Android використовуємо FrameMetricsAggregator з androidx.core — він дає розбивку по фазах рендерингу. Важно налаштувати збір p5 (нижні 5% кадрів), оскільки середній FPS може приховувати рідкісні лаги.
Memory warnings — iOS надсилає didReceiveMemoryWarning перед тим, як примусово закрити додаток. Логуємо цю подію з поточним екраном та об'ємом пам'яті через task_info. На Android аналог — ActivityManager.getMemoryInfo та логування фрагментів. ANR на Android — ще одна критична метрика: якщо частота перевищує 0.1%, це сигнал до негайної оптимізації main thread. Детальніше про ANR.
Який інструмент моніторингу обрати?
Порівняємо три популярні рішення:
| Інструмент |
Автоматичні метрики |
Кастомні трейси |
Distributed tracing |
Session Replay |
| Firebase Performance |
Cold start, HTTP, Screen render |
✅ |
❌ |
❌ |
| Sentry Performance |
Crash, HTTP, UI events |
✅ |
✅ |
❌ |
| Datadog RUM |
Frame rate, Network, User actions |
✅ |
✅ |
✅ |
Firebase Performance — нульовий поріг входу. SDK сам збирає час холодного старту, HTTP-запити (latency, розмір відповіді), рендеринг екранів. Додаємо кастомні трейси для бізнес-логіки:
let trace = Performance.startTrace(name: "catalog_load")
trace.start()
catalogService.load { [weak self] result in
trace.stop()
self?.handleResult(result)
}
val trace = Firebase.performance.newTrace("catalog_load")
trace.start()
catalogRepository.load { result ->
trace.stop()
handleResult(result)
}
Sentry Performance — якщо ви вже використовуєте Sentry для відстеження крешів, підключення Performance не потребує нового SDK. Чудово підходить для distributed tracing: видно не лише затримку на клієнті, а й розбивку по бекенд-запитах. Datadog RUM — вибір команд з готовою інфраструктурою Datadog. Автоматично записує Session Replay (відео взаємодій), FPS, мережеві запити з повним стектрейсом. Наш досвід впровадження Datadog RUM на проєкті з 500 тис. DAU показав скорочення часу пошуку проблем з 2 годин до 10 хвилин.
Як налаштувати алерти, щоб уникнути хибних спрацювань?
Важно не перевантажувати команду хибними спрацюваннями. Рекомендовані пороги:
| Метрика |
Поріг |
Джерело |
| Cold start time (p75) |
> 3 с |
Apple рекомендує < 400 мс до першого кадру |
| HTTP error rate |
> 2% |
— |
| Screen render time (p95) |
> 500 мс |
— |
| ANR rate (Android) |
> 0.1% |
— |
| App not responding (iOS) |
> 0.05% |
За даними Crashlytics |
Налаштовуємо алерти в Firebase Performance або Datadog на ці пороги з нотифікаціями в Slack/Telegram. Alert fatigue — головний ворог: не ставте пороги занадто низькими. Почніть з p99 та поступово підвищуйте чутливість. Переконайтеся, що алерти містять достатньо контексту (версія додатку, модель пристрою, версія ОС) для швидкої ідентифікації проблеми.
Що входить в роботу?
Ми пропонуємо інтеграцію одного з SDK — Firebase Performance, Sentry Performance або Datadog RUM — за 1–3 дні. Додаємо кастомні трейси на ключові операції, FPS-моніторинг, memory warnings та налаштовуємо алерти з нотифікаціями в Slack/Telegram. Повний дашборд з метриками — до 5 днів. Вартість розраховується індивідуально. Зверніться до нас для підбору інструменту — ми допоможемо обрати оптимальний варіант і налаштувати моніторинг під ключ. Гарантуємо зниження crash rate на 30% за перший місяць.
Аналітика мобільних застосунків: 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 успішних проектів у сфері мобільної розробки. Ми гарантуємо коректність даних і прозорість кожного етапу.
Зв'яжіться з нами, щоб отримати консультацію з налаштування аналітики вашого застосунку. Замовте аудит поточної аналітики — і ми покажемо, які метрики ви втрачаєте.