Фітнес-клуб втрачає клієнтів, коли запис на заняття перетворюється на хаос: двоє одночасно бачать одне вільне місце, натискають запис, і обидва отримують підтвердження, а реально приходить лише один. Решта — у WhatsApp-групі з адміністратором. Ми вирішуємо цю проблему на рівні архітектури: серверне оптимістичне блокування з миттєвим сповіщенням через push та лист очікування. Результат — користувачі не йдуть, клуб завантажений на 100%. Зв'яжіться з нами — оцінимо ваш проєкт за один день.
Як вирішити проблему race condition при записі на заняття?
Головний екран — розклад на тиждень з фільтрами за типом тренування (йога, силові, кардіо, басейн), тренеру та майданчику. Кожне заняття показує кількість вільних місць та кнопку запису. Коли двоє натискають одночасно, сервер повертає 409 Conflict для другого. Мобільний клієнт перехоплює помилку та пропонує додатися до листа очікування. Це стандартний патерн оптимістичного блокування: клієнт вірить, що встигне, а сервер розрулює.
Лист очікування будується на чергах. При скасуванні запису перший у черзі отримує push-сповіщення з кнопкою підтвердження (deep link) та 15 хвилин на відповідь. Не відповів — місце передається наступному. Для доставки використовуємо FCM/APNs з пріоритетом high.
Що обрати: Flutter чи нативний стек для фітнес-додатку?
| Критерій | Flutter | Нативний (SwiftUI + Compose) |
|---|---|---|
| Кодова база | Одна на iOS та Android | Дві окремі |
| Швидкість розробки MVP | 4–6 тижнів | 6–10 тижнів |
| Інтеграція HealthKit/Health Connect | Через пакети (health) | Глибока, без обмежень |
| Продуктивність анімацій | 60 FPS, але можливі лаги на складних UI | 120 FPS |
| Команда | Менший поріг входу | Потрібні iOS + Android розробники |
Flutter скорочує час розробки в 2 рази порівняно з нативом — одна кодова база на обидві платформи. Riverpod для управління станом, Dio для HTTP, Hive для локального кешу розкладу. Якщо потрібна глибока інтеграція з HealthKit та Apple Watch, обираємо нативний SwiftUI/Compose — це дає повний доступ до датчиків без обмежень пакетів. Вартість розробки MVP на Flutter значно нижча порівняно з нативним підходом: від $15 000 проти $25 000.
Членство та абонементи
Типи абонементів: безлімітний на місяць, пакет відвідувань, разовий. У профілі — поточний абонемент, залишок, дата закінчення. Автоматичне продовження через In-App Purchases (StoreKit 2 / Billing 6) або зовнішній платіж (Stripe). IAP зручніше для користувача, але комісія 15–30%. Зовнішній платіж дає повний контроль, але вимагає дотримання правил App Store (з iOS 17.4 в ЄС дозволені зовнішні посилання).
| Спосіб оплати | Комісія | Складність реалізації |
|---|---|---|
| In-App Purchase | 15–30% | Низька |
| Зовнішній платіж (Stripe) | 2–3% | Висока |
QR-код для входу генерується як підписаний JWT з userId, membershipId, часом випуску та строком дії 30 секунд. Турнікет верифікує підпис офлайн – онлайн-зв'язок не потрібен. QR-вхід в 5 разів швидший за традиційний пошук у базі.
Приклад верифікації JWT на стороні турнікету (псевдокод)
function verifyQr(token): try: payload = jwt.verify(token, publicKey) if payload.exp < now(): return false return checkMembership(payload.userId, payload.membershipId) except: return false Трекінг прогресу та HealthKit
Журнал тренувань — список минулих занять з ручним введенням ваги та параметрів. Графіки через fl_chart (Flutter) або Charts (натив). Інтеграція з HealthKit: кожне тренування записується як HKWorkout, а дані Apple Watch (пульс, кроки) підтягуються в профіль. За нашою статистикою, 40% користувачів фітнес-додатків використовують Apple Watch.
Тренер та онлайн-заняття
Картка тренера з фото, спеціалізацією, розкладом та рейтингом. Чат — через Stream Chat SDK або Sendbird (не Firebase RTDB для production). Онлайн-трансляції через Zoom SDK або Agora RTC — посилання з'являється за годину до заняття.
Push-кампанії
FCM/APNs для сегментованих сповіщень: «Завтра ваш улюблений клас — залишилося 3 місця», «Абонемент закінчується через 5 днів». Сегментація за історією відвідувань.
Процес роботи
- Аналіз вимог та прототипування — 1–2 тижні
- Дизайн та UX розкладу — 1–2 тижні
- Членство та абонементи — 1 тиждень
- Запис та лист очікування — 1–2 тижні
- QR-вхід — 1 тиждень
- Трекінг та HealthKit — 2–3 тижні
- Push та retention — 1 тиждень
- Онлайн-заняття (опціонально) — 2–3 тижні
- Тестування та публікація — 1–2 тижні
Що входить у роботу
- Вихідний код додатку на обраному стеку
- Доступ до репозиторію та CI/CD
- Документація з налаштування та деплою
- Конфігурація In-App Purchases та push-сповіщень
- Навчання адміністраторів роботі з панеллю
- Підтримка 30 днів після публікації
Орієнтири за термінами: MVP (розклад, запис, профіль, оплата) — 4–6 тижнів. Повноцінний додаток з QR-входом, трекінгом, HealthKit, чатом та онлайн-заняттями — 2–4 місяці. Вартість розраховується індивідуально. Ми маємо 5 років досвіду на ринку, понад 30 успішних проєктів для фітнес-клубів. Сертифіковані розробники Flutter та Swift. Гарантуємо дотримання термінів та якість коду. Отримайте консультацію — напишіть нам, щоб замовити розробку під ключ.







