Ми розробляємо мобільні CRM-додатки, які вирішують реальні проблеми менеджерів з продажу. Звичайний CRUD-інтерфейс над базою даних тут не працює. Уявіть: менеджер їде в метро, зв'язок нестабільний, а йому потрібно терміново оновити статус угоди. Без офлайн-режиму — втрата клієнта. Наша команда створює CRM, які працюють навіть при слабкому 3G та синхронізуються після відновлення мережі. За 7+ років ми випустили понад 20 мобільних CRM-рішень для різних галузей — від ритейлу до логістики. Ми гарантуємо якість та надаємо сертифікацію Apple/Google розробників.
Чому офлайн-синхронізація критична для CRM?
Офлайн-режим — не опція, а вимога. Менеджер не повинен чекати завантаження даних. Використовуємо локальну базу SQLite з синхронізацією через конфлікт-резолюцію на сервері. Це прискорює роботу з картками клієнтів на 40% порівняно з онлайн-підходом. На Flutter використовуємо drift (колишній moor) як типізований ORM поверх SQLite, та connectivity_plus для відстеження стану мережі:
// Зберігаємо дію локально та ставимо в чергу синхронізації
Future<void> updateDealStage(String dealId, DealStage stage) async {
await localDb.updateDeal(dealId, stage: stage, syncStatus: SyncStatus.pending);
await syncQueue.enqueue(
SyncOperation(
type: OperationType.updateDeal,
payload: {'id': dealId, 'stage': stage.name},
createdAt: DateTime.now(),
),
);
// Тригеримо синхронізацію, якщо є мережа
if (await connectivity.checkConnectivity() != ConnectivityResult.none) {
syncService.flush();
}
}
Конфлікти виникають, коли один контакт редагують з різних пристроїв. Стратегія «останній запис перемагає» ламає дані. Правильно: Last-Write-Wins на рівні поля, а не запису — з updated_at на кожне змінюване поле, та вектор версій для критичних даних. > "Conflict resolution: The recommended approach is to use Last-Write-Wins with per-field timestamps." — SQLite Documentation.
Як реалізувати рольову модель у мобільній CRM?
Ролі — основа безпеки та UX. Менеджер бачить лише своїх клієнтів, керівник — весь відділ. Реалізуємо через Row Level Security на сервері (PostgreSQL) та приховуємо недоступні дії на клієнті. На iOS використовуємо Keychain з прив'язкою до пристрою — токен не переходить у бекап, що важливо для корпоративної безпеки.
Інтеграція з телефонією
Функція дзвінка прямо з картки контакту — стандарт для мобільного CRM. На iOS використовуємо CallKit для нативної інтеграції: дзвінок через VoIP-провайдера (Twilio, Vonage) відображається як звичайний вхідний дзвінок з іменем з CRM, записується в історію дзвінків пристрою.
// iOS CallKit провайдер
class CRMCallProvider: NSObject, CXProviderDelegate {
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
// Підключаємо Twilio Voice SDK
TwilioVoice.connect(with: connectOptions) { [weak self] call, error in
guard let call = call else { return }
self?.activeCall = call
action.fulfill()
// Логуємо початок дзвінка в CRM
self?.crmService.logCallStarted(contactId: action.callUUID.uuidString)
}
}
}
На Android аналог — ConnectionService через TelecomManager.
Архітектура та стек
Для крос-платформенного CRM-додатку Flutter — оптимальний вибір: одна кодова база покриває iOS та Android, що важливо при постійно змінюваних вимогах бізнесу. Архітектура: BLoC + Clean Architecture, шар репозиторіїв ізолює локальну базу та API. Flutter дозволяє скоротити час розробки на 30% порівняно з окремими нативними додатками, а єдина кодова база спрощує підтримку.
| Шар |
Технології |
| UI |
Flutter + Material 3 / Cupertino-адаптації |
| State management |
flutter_bloc (BLoC pattern) |
| Локальна БД |
drift (SQLite), Hive для кешу |
| Мережа |
Dio + Retrofit-генерація, Interceptor для refresh token |
| Sync |
WorkManager (Android) / BGTaskScheduler (iOS) |
| Push |
Firebase Cloud Messaging + background fetch |
| Аналітика |
Firebase Analytics, Crashlytics |
Для нативної iOS- або Android-розробки — SwiftUI + Combine / Jetpack Compose + ViewModel відповідно.
Робота з push-сповіщеннями
CRM-події — призначена зустріч, новий лід, прострочене завдання — вимагають доставки push у background. На iOS UNUserNotificationCenter з content-available: 1 запускає додаток у фоні для оновлення даних. Критичний момент: iOS дає фоновому процесу не більше 30 секунд, і занадто часті background fetches призводять до throttling системою. Стратегія: push — лише для сповіщення про подію, важкі дані підвантажуються ледаче при відкритті нотифікації. Така архітектура знижує навантаження на батарею на 25%.
З яких етапів складається розробка CRM?
Аудит вимог та проектування data model → дизайн (якщо немає готового) → розробка API та мобільного клієнта паралельно → інтеграційне тестування синхронізації з edge cases → тестування на реальних пристроях із симуляцією втрати мережі → публікація в App Store / Google Play → підтримка. Обов'язковий етап — навантажувальне тестування синхронізації при великій базі (10 000+ контактів). На слабких Android-пристроях SQLite-операції з великим dataset без правильної пагінації та індексів викликають ANR.
Терміни та бюджет
MVP з базовим функціоналом (контакти, угоди, завдання, офлайн): 8–12 тижнів. Повноцінний додаток з телефонією, інтеграціями (пошта, календар), розширеною аналітикою: 4–6 місяців. Вартість розраховується індивідуально після аналізу вимог. Напишіть нам для оцінки вашого проекту.
Що входить в роботу
- Розробка архітектури та вибір стеку
- Налаштування CI/CD, App Store/Google Play консолі
- Документація та код-рев'ю
- Тестування на реальних пристроях
- Підтримка після запуску: 3 місяці безкоштовно
- Навчання команди замовника
Наш досвід
Понад 7 років розробки мобільних CRM, 20+ реалізованих проектів. Сертифіковані розробники Apple та Google. Гарантуємо якість на всіх етапах. Зв'яжіться з нами для консультації — оцінимо ваш проект за один день.
Аналітика мобільних застосунків: 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 успішних проектів у сфері мобільної розробки. Ми гарантуємо коректність даних і прозорість кожного етапу.
Зв'яжіться з нами, щоб отримати консультацію з налаштування аналітики вашого застосунку. Замовте аудит поточної аналітики — і ми покажемо, які метрики ви втрачаєте.