Розроблення мобільного додатку для клієнта доставки їжі
Клієнтський додаток доставки їжі — найконкурентніший сегмент мобільної розроблення. Користувачі порівнюють його не з попередньою версією, а з Яндекс.Їдою та Delivery Club. Retention залежить від швидкості відкриття, гладкості скролу меню та точності відстеження курьєра. Будь-який технічний збій тут — видалення додатку.
Продуктивність як архітектурний пріоритет
Меню ресторану — список з зображеннями. Здається простим. На практиці: 80–100 позицій з фото, категорії з горизонтальним скролом, анімація додавання в кошик — і на Snapdragon 660 все це починає дерігатися при швидкому скролі.
Рішення: кешуємо зображення через cached_network_image з disk cache, віддаємо WebP-версії з бекенду (Sharp на Node.js або Imageflow), ліниве завантаження через ListView.builder, передзавантаження наступних 5 позицій через precacheImage. Анімація додавання в кошик — Hero-анімація з мініатюрою, без повноекранних overlay-ефектів.
Час до інтерактивності при холодному старті — критична метрика. Зберігання останнього стану меню локально (Hive): при відкритті показуємо кешоване меню мгновенно, фоном оновлюємо з сервера. Користувач бачить контент, а не спіннер.
Кошик та оформлення замовлення
Кошик — це стан, який має пережити: згортання додатку, перезавантаження телефону, перемикання Wi-Fi на мобільний інтернет. Bloc + HydratedBloc (автозбереження на SharedPreferences) розв'язує це за один вечір.
Оформлення замовлення — воронка, де кожен зайвий крок знижує конверсію. Оптимальний флоу: кошик → адреса (зі збережених або нова) → час доставки → метод оплати → підтвердження. Максимум 4 екрани. Збережені адреси через Google Places API Autocomplete або Dadata — автодповнення при введенні.
Оплата: YooKassa з Apple Pay / Google Pay — це не опція, це вимога. Користувачі, які звикли платити одним нажатті, не будуть вводити 16-значний номер карти. Інтеграція Google Pay через google_pay Flutter plugin, Apple Pay через apple_pay. YooKassa підтримує обох.
Відстеження замовлення — найбільш очікуваний екран
Після оплати користувач хоче знати: де його їжа. Екран відстеження: статус (прийнято → готується → передано курьєру → в дорозі → доставлено) + карта з живим маркером курьєра.
Координати курьєра оновлюються через WebSocket (Laravel Broadcasting). На клієнті — flutter_map (OpenStreetMap/Yandex) з анімацією руху маркера через Tween. Гладка анімація маркера між координатами — через LinearAnimation за lat/lng, не стрибок.
Розраховане час доставки оновлюється з бекенду на основі реальної позиції курьєра та дорожної обстановки (Yandex Routes API або Google Distance Matrix API). Не статичне "30 хвилин", а живий зворотній відлік.
Push-сповіщення та маркетинг
Трансакційні push: "Ваше замовлення прийнято", "Курьєр виїхав", "Замовлення доставлено" — FCM High Priority, без затримки.
Маркетингові push: "Нове в меню", "Промокод на наступне замовлення" — FCM Normal Priority, A/B-тестування через Firebase Remote Config.
Deep links для акційних push через Firebase Dynamic Links (або App Links / Universal Links): натискання на push "-15% на піцу" відкриває додаток прямо на потрібну категорію меню.
Програма лояльності
Бонусні бали за замовлення — базовий рівень. Реалізується через таблицю транзакцій у PostgreSQL. Застосування балів при оплаті — часткове погашення суми. Gamification через рівні (Silver/Gold/Platinum) з різними відсотками кешбеку — збільшує частоту замовлень без знижок на кожний чек.
Реферальна програма: унікальний промокод користувача, бонус при першому замовленні реферала.
Стек
Flutter 3.x + Bloc (HydratedBloc для кошика), Laravel 10 + WebSocket, PostgreSQL, FCM, Redis (кеш меню та сесій), CDN для медіа.
| Складність | Включає | Терміни |
|---|---|---|
| MVP | Меню, кошик, замовлення, відстеження, оплата | 14–18 тиж. |
| Середній | + програма лояльності, push-маркетинг, історія | 20–24 тиж. |
| Повний | + мультиресторан, сплит-замовлення, аналітика, A/B | 28–36 тиж. |
Вартість розраховується індивідуально після аналізу вимог.







