Ми часто стикаємося з запитами клієнтів на оперативну зміну параметрів застосунку без повного циклу релізу. Наприклад, потрібно змінити колір promo-кнопки або поріг безкоштовної доставки. Без Remote Config це вимагає хотфіксу, повторного рев'ю та очікування модерації в App Store або Google Play — від кількох годин до доби. З Remote Config достатньо змінити значення в консолі Firebase, і протягом 20–30 секунд новий конфіг застосовується на всіх пристроях. При цьому не потрібне оновлення версії застосунку. Ми використовуємо цей інструмент у всіх проєктах, де важлива гнучкість керування користувацьким досвідом — за останні 5 років інтегрували його в 200+ мобільних застосунків, які обслуговують понад 500 000 активних користувачів сумарно.
Як Firebase Remote Config працює під капотом
Remote Config — це Key-Value сховище з серверною стороною в Firebase Console і клієнтським SDK на iOS/Android/Flutter. Firebase Remote Config Documentation описує дві ключові дії: fetch() та activate(). fetch завантажує конфіг у staging-кеш, activate застосовує його в рантаймі. Розділення навмисне — щоб не ламати поточну сесію користувача. Час життя кешу задається через minimumFetchInterval: у продакшені 3600 секунд, у дебазі можна 0.
// iOS, Swift
let remoteConfig = RemoteConfig.remoteConfig()
let settings = RemoteConfigSettings()
settings.minimumFetchInterval = 3600 // у проді — 1 година, у дебазі можна 0
remoteConfig.configSettings = settings
// Дефолти — обов'язкові, інакше до першого fetch значення nil
remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults")
remoteConfig.fetchAndActivate { status, error in
if status == .successFetchedFromRemote || status == .successUsingPreFetchedData {
let buttonColor = remoteConfig["promo_button_color"].stringValue ?? "#FF5722"
DispatchQueue.main.async { self.applyConfig(buttonColor) }
}
}
На Android через Kotlin:
val remoteConfig = Firebase.remoteConfig
remoteConfig.setConfigSettingsAsync(remoteConfigSettings {
minimumFetchIntervalInSeconds = 3600
})
remoteConfig.setDefaultsAsync(R.xml.remote_config_defaults)
remoteConfig.fetchAndActivate().addOnCompleteListener { task ->
if (task.isSuccessful) {
val threshold = remoteConfig.getLong("free_delivery_threshold")
updateCartUI(threshold)
}
}
Чому дефолти критично важливі?
Якщо до першого успішного fetch (наприклад, при відсутності інтернету) звернутися до ключа без дефолту — отримаєте nil або порожній рядок. Застосунок не крашиться, але поведінка непередбачувана. Дефолти повинні покривати всі ключі, які використовує застосунок. Рекомендуємо зберігати їх в окремому файлі (Plist для iOS, XML для Android) і синхронізувати з ключами в Firebase Console. Ми гарантуємо, що після налаштування дефолтів у вас не буде сюрпризів при першому запуску. В одному з проєктів відсутність дефолту призвела до того, що 15% користувачів бачили заглушку замість банера — виправлення зайняло 2 хвилини в консолі.
Як уникнути стану гонки при запуску?
fetchAndActivate — асинхронний. Якщо UI малюється раніше, ніж завершиться fetch, користувач бачить дефолтні значення. Для критичних параметрів (наприклад, прапорець показу paywall) краще завантажувати конфіг ще на сплеш-екрані та блокувати перехід до отримання відповіді — з таймаутом 2–3 секунди. Ми застосовуємо цей підхід у кожному проєкті: затримка непомітна для користувача, а логіка працює стабільно.
Як налаштувати умовні значення для A/B тестів?
Справжня сила Remote Config — умови. Можна задавати різні значення для:
- конкретних версій застосунку (
app_version < 2.5.0)
- платформи (iOS vs Android)
- країни користувача
- довільного
user_property, заданого через Firebase Analytics
Наприклад, показувати новий onboarding тільки користувачам iOS 16+ в Росії — без окремого релізу. Це прискорює A/B тести та кастомізацію під регіони. Для експерименту в A/B Testing створюється конфігурація, яка призначає різні значення для контрольної та тестової груп. Результати відстежуються через Firebase Analytics. Типова економія часу — до 40 годин на кожному фічі-флагу, який раніше вимагав релізу.
Типова помилка: забули дефолти
При першому запуску без мережі fetch не виконується, і значення ключів без дефолтів стають null. Щоб цього уникнути, завжди задавайте дефолти для всіх ключів. Рекомендуємо зберігати їх в окремому файлі та синхронізувати з консоллю Firebase. В одному проєкті відсутність дефолту призвела до того, що 15% користувачів бачили заглушку замість банера — виправлення зайняло 2 хвилини в консолі.
Таблиця: Платформи та початкове налаштування
| Параметр |
iOS (Swift) |
Android (Kotlin) |
Flutter (Dart) |
| Підключення SDK |
Swift Package Manager firebase-ios-sdk |
Gradle com.google.firebase:firebase-config |
firebase_remote_config pub.dev |
| Дефолти |
Plist-файл |
XML-файл (remote_config_defaults.xml) |
Dart-мапа в setDefaults |
| Мінімальний інтервал |
minimumFetchInterval = 3600 |
minimumFetchIntervalInSeconds = 3600 |
setMinimumFetchInterval(3600) |
| Отримання значення |
config["key"].stringValue |
config.getLong("key") |
config.getString("key") |
| Типізація |
Helper-клас з enum |
Helper-клас з sealed class |
Helper-клас з const |
Таблиця: Популярні типи умов
| Умова |
Приклад |
Застосування |
| Версія застосунку |
app_version < 2.5.0 |
Включити фічу тільки для старих версій |
| Країна |
country == "RU" |
Локалізувати offer |
| Користувацький параметр |
user_property["premium"] == "true" |
A/B тест серед платячих користувачів |
| Випадковий відсоток |
random_percent < 10 |
Поступовий rollout нової фічі |
Що входить в роботу
- Підключення Firebase SDK (через SPM на iOS, Gradle на Android,
firebase_remote_config на Flutter)
- Налаштування
RemoteConfigSettings з правильними інтервалами для debug/release
- Файл дефолтів, що покриває всі ключі
- Хелпер-клас з типізованим доступом до значень (без строкових ключів у коді)
- Інтеграція з точкою ініціалізації застосунку (AppDelegate / Application)
Строки та вартість
Базова інтеграція з типізованим хелпером займає 1 день. Вартість розраховується індивідуально після аналізу вимог. Звертайтеся за консультацією: ми допоможемо оцінити обсяг робіт і налаштувати Remote Config під ваші завдання. Отримайте консультацію — і ви побачите, як просто керувати фічами без релізів. Зв'яжіться з нами, щоб обговорити ваш проєкт.
Аналітика мобільних застосунків: 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 успішних проектів у сфері мобільної розробки. Ми гарантуємо коректність даних і прозорість кожного етапу.
Зв'яжіться з нами, щоб отримати консультацію з налаштування аналітики вашого застосунку. Замовте аудит поточної аналітики — і ми покажемо, які метрики ви втрачаєте.