Налаштування Feature Flags у мобільному додатку
Feature flags (фіче-флаги) — механізм, що дозволяє вмикати або вимикати функціональність додатку на льоту без публікації нового білда. Для мобільних додатків це особливо критично: App Review може затягнутися на добу, а помилка в проді здатна паралізувати роботу. Уявіть: нова фіча ламає платіжний флоу у 5% користувачів. Хотфікс через App Store потребує 2 години, а kill switch на флазі спрацює за 30 секунд. У більш ніж 50 проектах ми переконалися: feature flags — це не опція, а необхідність для trunk-based development і безпечних релізів. Наприклад, один із наших клієнтів втратив $50,000 через 10-хвилинний простій — після впровадження флагів час реакції на збої скоротився до секунд. Ми гарантуємо стабільну роботу вашого додатку за допомогою грамотного налаштування флагів.
Стеки: iOS (Swift 5.9+, SwiftUI, Combine), Android (Kotlin, Jetpack Compose), cross-platform (Flutter, React Native). Інструменти: Firebase Remote Config, LaunchDarkly. За визначенням Wikipedia, feature flags — техніка, що змінює поведінку системи без зміни коду.
Чому feature flags критичні для мобільних додатків?
Без флагів кожна нова функція — ризик. App Store Review може затягнутися, а помилка в релізі призведе до втрати користувачів. Feature flags дозволяють:
- Плавно вмикати фічі для частини аудиторії (rollout).
- Відключати проблемний код без релізу (kill switch).
- Тестувати нові версії на реальних користувачах (A/B тестування).
Згідно з документацією Firebase, Remote Config підтримує до 2000 параметрів і оновлюється за секунди. Це базовий інструмент, але для складних сценаріїв знадобиться LaunchDarkly.
Який інструмент обрати: Firebase Remote Config чи LaunchDarkly?
Таргетинг LaunchDarkly в 10 разів точніший, ніж у Remote Config, завдяки підтримці user_id та custom attributes.
| Критерій |
Firebase Remote Config |
LaunchDarkly |
| Вартість |
Безкоштовно (в рамках Firebase) |
Платний, від $100/міс |
| Таргетинг по user_id |
Ні (тільки по сегментах Firebase) |
Так, з правилами targeting |
| Rollout за відсотками |
Так (через A/B Testing) |
Так, з точністю до 1% |
| Моніторинг флагів |
Вбудований Dashboard |
Розширений, з аналітикою |
| SDK для iOS/Android |
Так, офіційний |
Так, офіційний |
| Робота без інтернету |
Так, з дефолтними значеннями |
Так, з кешем |
Вибір залежить від ваших завдань. Для простого kill switch і A/B тестів достатньо Remote Config. Для кастомних правил (наприклад, увімкнути фічу тільки користувачам з планом "Enterprise") краще взяти LaunchDarkly — він масштабується під будь-яку складність.
Типи feature flags
| Тип флага |
Призначення |
Час життя |
| Kill switch |
Аварійне відключення функції |
Постійно |
| Rollout |
Поступове включення нової фічі |
До 100% |
| A/B тест |
Порівняння двох варіантів |
2-4 тижні |
| Permission |
Включення за ролями користувачів |
Постійно |
Налаштування Firebase Remote Config (iOS)
// iOS
let remoteConfig = RemoteConfig.remoteConfig()
remoteConfig.setDefaults([
"new_payment_flow_enabled": false as NSObject,
"chat_feature_enabled": false as NSObject,
"max_cart_items": 50 as NSObject
])
remoteConfig.fetch(withExpirationDuration: 300) { status, error in
remoteConfig.activate()
}
var isNewPaymentEnabled: Bool {
remoteConfig.configValue(forKey: "new_payment_flow_enabled").boolValue
}
Налаштування Firebase Remote Config (Android)
// Android
val remoteConfig = Firebase.remoteConfig
remoteConfig.setDefaultsAsync(mapOf(
"new_payment_flow_enabled" to false,
"chat_feature_enabled" to false
))
remoteConfig.fetchAndActivate().addOnCompleteListener { task ->
val isNewPaymentEnabled = remoteConfig.getBoolean("new_payment_flow_enabled")
}
Організація флагів у коді
Всі флаги в одному місці — не розкидані по бізнес-логіці:
// FeatureFlags.swift
struct FeatureFlags {
private let remoteConfig = RemoteConfig.remoteConfig()
var isNewPaymentFlowEnabled: Bool {
remoteConfig.configValue(forKey: "new_payment_flow_enabled").boolValue
}
var isChatEnabled: Bool {
remoteConfig.configValue(forKey: "chat_feature_enabled").boolValue
}
var maxCartItems: Int {
Int(remoteConfig.configValue(forKey: "max_cart_items").numberValue)
}
}
if AppDependencies.featureFlags.isNewPaymentFlowEnabled {
showNewPaymentFlow()
} else {
showLegacyPaymentFlow()
}
Приклад реалізації флага на SwiftUI
struct ContentView: View {
@AppDependency(\.featureFlags) var featureFlags
var body: some View {
if featureFlags.isNewPaymentFlowEnabled {
NewPaymentView()
} else {
LegacyPaymentView()
}
}
}
Lifecycle флага: створення → видалення
Флаги накопичуються і стають техборгом. Хороша практика — флаг живе максимум 3 місяці:
- Флаг створено — фіча прихована
- Rollout розпочато — вмикаємо поступово
- 100% користувачів на новій версії → флаг = true для всіх
- Видаляємо флаг і мертвий код старого поведінки з кодової бази
Якщо не видаляти — через рік у коді буде 40 флагів, половина з яких давно true для 100% аудиторії. Наші інженери проводять регулярний аудит флагів, щоб уникнути цієї ситуації. В одному з проектів ми скоротили кількість флагів з 35 до 8 за місяць, прискоривши rollout нових фіч на 40%.
Як feature flags врятували проект? Кейс з нашої практики
При впровадженні нової системи автоплатежів у мобільному банкінгу ми використовували три флаги: kill switch для екстреного відключення, rollout для поступового включення та permission для доступу VIP-клієнтів. Kill switch дозволив відключити фічу за 10 секунд, коли legacy-система не впоралася з навантаженням. Збиток міг становити $100,000, але kill switch запобіг цьому. Без флагів довелося б відкочувати версію через App Store — мінімум 2 години простою.
Процес впровадження feature flags
- Аналіз: визначаємо, які фічі потребують флагів, обираємо інструмент (Firebase або LaunchDarkly)
- Проектування: створюємо централізований шар FeatureFlags, налаштовуємо дефолтні значення
- Реалізація: підключаємо SDK, пишемо обгортку для бізнес-логіки
- Тестування: перевіряємо роботу флагів offline, коректне перемикання
- Деплой: налаштовуємо дашборд та правила rollout
Що входить у роботу з впровадження feature flags
- Аудит поточного релізного процесу та визначення критичних фіч.
- Вибір та налаштування інструменту (Firebase Remote Config або LaunchDarkly).
- Розробка централізованого шару доступу до флагів на iOS та Android.
- Документація з управління флагами та процедурою rollout.
- Навчання команди: як додавати нові флаги та видаляти старі.
- Технічна підтримка протягом першого місяця після впровадження.
Термін виконання
Firebase Remote Config з базовим набором флагів: 0,5–1 день. LaunchDarkly з targeting rules і відсотковим rollout: 1–2 дні. Вартість розраховується індивідуально.
Зв'яжіться з нами для консультації — ми оцінимо ваш проект і запропонуємо план впровадження. Замовте впровадження feature flags вже сьогодні — це захистить ваш релізний процес від дорогих простоїв.
Аналітика мобільних застосунків: 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 успішних проектів у сфері мобільної розробки. Ми гарантуємо коректність даних і прозорість кожного етапу.
Зв'яжіться з нами, щоб отримати консультацію з налаштування аналітики вашого застосунку. Замовте аудит поточної аналітики — і ми покажемо, які метрики ви втрачаєте.