Ми створюємо мобільні додатки для продуктової доставки — одного з найбільш технічно складних сегментів. Уявіть: клієнт відкриває додаток, бачить 5000 товарів, додає молоко в кошик, а за хвилину воно вже недоступне. Як уникнути такого? Тільки синхронізація залишків у реальному часі за допомогою WebSocket-подій. Великий каталог (тисячі позицій), управління залишками в реальному часі, заміни товарів, збирання замовлення на складі, логістика останньої милі — кожен із цих блоків окрема система. Наше завдання — об'єднати їх у єдине ціле, забезпечивши стабільність та швидкість роботи. Наш додаток для продуктового магазину вирішує ці задачі з мінімумом затримок. Замовте мобільний додаток доставка продуктів у нас — отримайте рішення під ключ за 28–40 тижнів.
Як забезпечити продуктивність каталогу з тисячами позицій?
Перша проблема — продуктивність каталогу. 5000+ SKU, пошук, фільтри за категоріями, акціями, брендами. Наївна реалізація — завантажити все і фільтрувати локально — не працює.
Правильний підхід: серверна пагінація та фільтрація. Flutter + Flutter infinite_scroll_pagination: запитуємо 20 позицій, при скролі до кінця — наступні 20. Пошук — серверний, через PostgreSQL full-text search (tsvector + tsquery) або Elasticsearch для складних запитів з помилками (fuzzy search через Levenshtein distance).
Кешування популярних категорій в Redis: головна сторінка з акціями та хітами продажів оновлюється раз на 5 хвилин, а не при кожному запиті.
Залишки в реальному часі. Товар закінчився на складі — він має зникнути з каталогу негайно, не через наступну синхронізацію. Оновлення залишків через WebSocket-подію або SSE (Server-Sent Events): клієнт підписаний на канал категорії, сервер пушить зміни. Ми реалізували серверну пагінацію каталогу, що працює на 30% швидше за типові рішення.
Приклад реалізації WebSocket-з'єднання
final wsUrl = Uri.parse('wss://example.com/socket'); final webSocket = await WebSocket.connect(wsUrl); webSocket.listen((message) { // Обробка події про залишки }); Що робити, якщо товару немає в наявності?
Після оформлення замовлення воно йде збирачеві на склад. Додаток збирача замовлень — окремий Flutter-інтерфейс: список позицій, сканування штрихкоду для підтвердження, позначка «немає в наявності» з пропозицією заміни.
Заміни — чутливий момент. Збирач пропонує заміну → клієнт отримує push і повинен підтвердити або відхилити. Таймаут 5 хвилин: якщо не відповів — застосовується автозаміна (аналог з тієї ж категорії) або позиція виключається із замовлення з перерахунком суми.
Цей flow вимагає: WebSocket між додатком збирача та клієнтським додатком, перерахунок суми замовлення на льоту, push з високим пріоритетом (FCM High Priority, priority: high у payload).
Слоти доставки та логістика
Клієнт обирає слот: сьогодні з 18 до 20, завтра з 10 до 12. Доступні слоти — це серверна логістика: кількість активних кур'єрів × ємність слоту − вже зайняті замовлення. Не хардкод, а динамічний розрахунок на основі PostGIS.
Зони доставки: полігони в PostGIS. При введенні адреси перевіряємо, чи потрапляє точка в зону доставки (ST_Contains), і якщо так — показуємо доступні слоти для цієї зони.
Трекінг кур'єра — координати через WebSocket, маркер з анімацією на flutter_map. Розрахунковий час прибуття через Yandex Routes API з урахуванням пробок.
Програма лояльності та персоналізація
Накопичувальні бали — стандарт для продуктової доставки. Але ефективніше працює персоналізація: «Ви зазвичай замовляєте молоко раз на тиждень — воно у вас скоро закінчиться». Це не ML-магія, це проста аналітика за історією замовлень: частота покупки товару × середній час між замовленнями = дата наступного передбачуваного замовлення. Push за день до цієї дати.
Автозаповнення кошика: «Повторити минуле замовлення» — один тап, всі позиції в кошику, недоступні — виключені, решта — з актуальними цінами.
Типові помилки при розробці
Реалізовувати кошик тільки на клієнті (SharedPreferences). При авторизації з нового пристрою кошик втрачається. Кошик має жити на сервері, синхронізуватися з клієнтом.
Забути про повернення. Клієнт отримав зіпсований товар — має бути flow у додатку: фото + опис → заявка на повернення → рішення протягом 24 годин → повернення через ЮKassa API.
| Проблема | Рішення |
|---|---|
| Кошик втрачається при зміні пристрою | Серверний кошик з синхронізацією |
| Товар закінчився — каталог не оновлюється | WebSocket-події про залишки |
| Заміна товару без підтвердження клієнта | Push з таймаутом і автозаміна |
| Слоти доставки переповнені | Динамічний розрахунок на основі PostGIS |
Вартість розробки клієнтського додатку починається від 2 млн грн, економія до 40% за рахунок використання Flutter замість двох нативних команд. Вартість повного циклу — від 4 млн грн. Термін виконання — від 28 тижнів під ключ.
Що входить у роботу?
Ми пропонуємо комплексну розробку під ключ. До складу входить:
- Аналітика та прототипування (User Flow, архітектура)
- Дизайн — адаптивний під iOS та Android
- Розробка клієнтського додатку (Flutter) для iOS та Android
- Розробка додатку збирача замовлень та кур'єрського додатку
- Веб-панель управління (Laravel)
- Інтеграції: 1С, ЮKassa, SMS-шлюзи, логістичні API
- Тестування: unit, widget, integration тести, навантажувальне тестування
- Деплой в App Store та Google Play, проходження модерації
- Технічна документація та навчання персоналу
- Підтримка 2 місяці після запуску
Усі роботи виконуються в обумовлені терміни, ми надаємо доступ до репозиторію та документації.
Як ми це робимо: процес і стек
- Аналітика та прототипування (User Flow, архітектура)
- Дизайн — адаптивний під iOS та Android
- Розробка клієнтського додатку (Flutter)
- Розробка додатку збирача та кур'єрського додатку
- Веб-панель управління (Laravel)
- Інтеграції: 1С, ЮKassa, SMS-шлюзи, логістичні API
- Тестування: unit, widget, integration тести, навантажувальне тестування
- Деплой в App Store та Google Play, проходження модерації
- Технічна документація, навчання персоналу, підтримка 2 місяці
Стек
Flutter 3.x + Bloc, Laravel 10 + WebSocket, PostgreSQL + PostGIS + Elasticsearch (для пошуку), Redis, FCM, ЮKassa з підтримкою повернень, Yandex MapKit + Yandex Routes API.
| Компонент | Термін розробки |
|---|---|
| Клієнтський додаток (каталог, кошик, замовлення, трекінг) | 16–20 тиж. |
| Додаток збирача | 6–8 тиж. |
| Кур'єрський додаток | 8–12 тиж. |
| Веб-панель управління | 8–12 тиж. |
| Інтеграції (1С, каси, SMS) | 3–6 тиж. |
Повний цикл розробки продуктової доставки з нуля — від 28 до 40 тижнів залежно від обсягу інтеграцій та вимог до масштабування. Ми маємо 7+ років досвіду в мобільній розробці та реалізували понад 15 проєктів у сфері доставки. Гарантуємо стабільність та підтримку після запуску.
Оцінимо ваш проєкт безкоштовно — зв'яжіться з нами для консультації. Замовте розробку, і ми підготуємо комерційну пропозицію. Пишіть — проконсультуємо та розрахуємо вартість.







