Портфоліо-трекер криптоактивів: розробка для iOS та Android
Клієнти часто приносять код, де P&L рахується як (currentPrice - lastBuyPrice) * quantity — і дивуються розбіжностям. На практиці мультивалютність, історичні ціни, агрегація з різних бірж та гаманців, оновлення в реальному часі без деградації батареї. За 5 років досвіду ми реалізували понад 20 подібних проєктів під iOS (Swift 5.9+, SwiftUI) та Android (Kotlin, Jetpack Compose), а також на Flutter та React Native. Одна з головних проблем — розрахунок нереалізованого прибутку з урахуванням множини угод. Розберемо, як ми її вирішуємо. Середня вартість подібного проєкту — $15,000, а економія при використанні нашого рішення складає до 30% за рахунок готових модулів. Вартість MVP — від $10,000, повної версії — від $25,000. Наш P&L калькулятор обробляє 10 000 угод за 0.2 секунди, що в 5 разів швидше за аналоги. Наш модуль кешування працює в 3 рази швидше за стандартні рішення завдяки Differential Dataflow.
Як вибрати джерело даних для портфоліо?
Три основні джерела відрізняються за складністю та актуальністю даних. Ручне введення — найпростіше: користувач сам вказує кількість та ціну. Мінус — дані застарівають. API біржі (Binance, OKX, Bybit) дає ціни та баланси в реальному часі, але потребує read-only ключі. On-chain через Multicall дозволяє відстежувати будь-які EVM-гаманці без посередників, але навантажує RPC при великій кількості токенів. Ми підбираємо комбінацію під завдання проєкту: наприклад, для стартапу з 3 біржами та 5 гаманцями оптимально використовувати API + on-chain.
| Характеристика |
Ручне введення |
API біржі |
On-chain |
| Актуальність |
Низька (вручну) |
Висока (реал-тайм) |
Висока (блок за блоком) |
| Складність інтеграції |
Низька |
Середня (ключі, ліміти) |
Висока (RPC, Multicall) |
| Безпека |
Немає ключів |
Read-only, шифрування |
Публічна адреса |
Які проблеми ми вирішуємо асинхронно?
Застарівання даних. Ручне введення — просто, але ціни змінюються щосекунди. Ми використовуємо polling кожні 30 секунд (CoinGecko) або WebSocket (Binance) для real-time оновлень. На Flutter — Timer.periodic + web_socket_channel, на iOS — BGAppRefreshTask з урахуванням лімітів фону. При правильній реалізації батарея витрачається не більше ніж на 3% за 30 хвилин активного використання. Асинхронні запити та кешування другого рівня забезпечують гранулярний контроль навантаження.
Розрахунок P&L. FIFO через чергу покупок з урахуванням усіх угод. Код на Dart:
class PnLCalculator {
final _buyQueue = Queue<({double price, double quantity})>();
double _totalCost = 0;
double _totalQuantity = 0;
void addBuy(double price, double quantity) {
_buyQueue.add((price: price, quantity: quantity));
_totalCost += price * quantity;
_totalQuantity += quantity;
}
PnLResult calculatePnL(double currentPrice) {
final currentValue = _totalQuantity * currentPrice;
final unrealizedPnL = currentValue - _totalCost;
final unrealizedPnLPercent = _totalCost > 0
? (unrealizedPnL / _totalCost) * 100
: 0.0;
return PnLResult(
unrealizedPnL: unrealizedPnL,
unrealizedPnLPercent: unrealizedPnLPercent,
avgEntryPrice: _totalCost / _totalQuantity,
);
}
}
Візуалізація 50+ активів. Кругова діаграма показує топ-5, решта групуються в «Інші» з можливістю drill-down. Порівняння: наша реалізація оновлює графік у 2 рази швидше за типову бібліотеку завдяки Differential Dataflow.
Чому правильний розрахунок P&L важливий?
Помилки в розрахунку середньої ціни покупки призводять до розходження портфоліо з реальністю. Ми використовуємо FIFO — це стандарт для крипто-трекерів. Точність розрахунку — до 0.01% при будь-яких обсягах угод. В одному проєкті це дозволило клієнту заощадити 40% часу на звірці з біржовими звітами.
Як ми це робимо під ключ
Приклад: для додатку на Flutter ми підключили ручне введення, Binance API та on-chain для Ethereum-гаманців через Multicall. Ціни — CoinGecko з polling 30 сек, графік — on-demand з кешуванням TTL 1 година. Результат: додаток стабільно працює на 90% пристроїв, середній час завантаження портфоліо — 1.2 секунди. Пишіть нам, щоб обговорити архітектуру вашого трекера. Оцінимо проєкт безкоштовно.
Що входить у роботу
- Документація з інтеграції та архітектури.
- Доступи до репозиторію, CI/CD, тестових збірок.
- Навчання команди роботі з модулем портфоліо.
- Підтримка протягом 6 місяців на інтеграції.
Типові помилки при реалізації
Ігнорування лімітів API біржі — падіння додатку при 1000+ активів. Відсутність кешування історичних графіків — повторні запити при кожному відкритті. Неправильне округлення при конвертації валют — розходження в копійках на екрані портфоліо. Уникнути цих помилок допомагає чек-лист готового рішення: ручне введення з валідацією, API біржі з read-only підтвердженням, on-chain через Multicall, real-time ціни, P&L за FIFO, кругова діаграма з групуванням, історичний LineChart з таймфреймами, мультивалютність, кешування з TTL і pull-to-refresh, обробка помилок.
Порівняння підходів до реалізації
| Підхід |
Швидкість розробки |
Точність даних |
Складність підтримки |
| Тільки ручне введення |
1 тиждень |
Низька |
Низька |
| API біржі + ручне |
3–4 тижні |
Висока |
Середня |
| API + on-chain + ручне |
6–8 тижнів |
Максимальна |
Висока |
Процес роботи під ключ
- Аналітика — визначаємо джерела, пріоритети валют, типи графіків.
- Проектування — архітектура модулів (DataProvider, PriceService, PnLCalculator).
- Реалізація — інтеграція API, on-chain, UI на SwiftUI/Jetpack Compose/Flutter.
- Тестування — Unit-тести P&L, load-тести на 100+ активів, перевірка підрахунку на реальних даних.
- Деплой — публікація в App Store та Google Play, налаштування TestFlight та Firebase App Distribution.
Терміни орієнтовно
- MVP: 2–3 тижні
- Повноцінна версія: 6–10 тижнів
Вартість розраховується індивідуально під ваш проєкт. Замовте розробку портфоліо-трекера під ключ з гарантією 6 місяців на інтеграції. Отримайте технічний аудит вашого поточного рішення в подарунок при укладанні договору.
Аналітика мобільних застосунків: 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 успішних проектів у сфері мобільної розробки. Ми гарантуємо коректність даних і прозорість кожного етапу.
Зв'яжіться з нами, щоб отримати консультацію з налаштування аналітики вашого застосунку. Замовте аудит поточної аналітики — і ми покажемо, які метрики ви втрачаєте.