Ми стикалися з типовою проблемою: гість сканує QR, гортає меню, додає страви, натискає «Замовити» — і нічого не відбувається. Wi-Fi впав, замовлення втрачено. Наш досвід у створенні ресторанних рішень підказує: надійна real-time синхронізація та коректна обробка збоїв — ключ до успіху.
За роки роботи (понад 10 проєктів у HoReCa) ми виробили архітектуру, яка економить до 20% ФОП та збільшує середній чек на 15–30% за рахунок скорочення часу обслуговування та upsell-підказок. Технологічний стек: Flutter 3.x для клієнта, Laravel 10 з Broadcasting для сервера, PostgreSQL 15 і Redis 7 для зберігання та кешування. Використовуємо WebSocket для миттєвої передачі даних.
Безшовна синхронізація замовлень через WebSocket
Замовлення з додатку має миттєво з'явитися на кухонному дисплеї (KDS). Ми використовуємо WebSocket-з'єднання: додаток надсилає замовлення → Laravel Broadcasting публікує подію в канал кухні → KDS отримує подію та показує нову позицію. Якщо за одним столом декілька пристроїв (планшети та телефони великої компанії), замовлення агрегуються в єдиний kitchen ticket. Ідентифікатор сесії столу — ключ агрегації. WebSocket забезпечує затримку менше 100 мс, що в 5 разів швидше за HTTP-опитування.
| Компонент | Технологія | Версія |
|---|---|---|
| Клієнт | Flutter (або PWA для QR-режиму) | 3.x |
| Сервер | Laravel + Broadcasting | 10 |
| БД | PostgreSQL + Redis | 15, 7 |
| Push | FCM | остання |
| Каса | iiko / r_keeper / Poster | REST API |
Що робити при втраті з'єднання?
Критичний момент: гість натиснув «Замовити», відповіді немає (Wi-Fi впав). Додаток має показати стан «Замовлення надсилається» з повторними спробами через експоненційний backoff, а не мовчки втратити замовлення або видати «Помилка, спробуйте знову». Ми реалізуємо Retry зі збільшуваним інтервалом (1с, 2с, 4с…) до 30 секунд — цього достатньо для відновлення зв'язку. Якщо два гості одночасно додають одну й ту саму страву, сервер використовує оптимістичне блокування — остання операція перемагає, і клієнт отримує оновлений стан.
Синхронізація кошика між пристроями столу
Якщо кілька осіб за столом роблять замовлення з різних пристроїв, кошик — це спільний стан на сервері, а не локальний список. При додаванні позиції будь-яким учасником — усі пристрої столу отримують оновлення через WebSocket. Архітектура змінюється: замість локального HydratedBloc — серверний кошик з WebSocket-підпискою, optimistic update на клієнті та підтвердження з сервера. Дані шифруються, канал захищений сертифікатом.
Ідентифікація столу
QR-код на кожному столі містить URL з table_id або зашифрованим токеном сесії. При скануванні відкривається або веб-версія в браузері (без встановлення), або Universal Link у встановлений додаток. Для планшетного режиму — kiosk mode (Android Task Locking / iOS Guided Access), завжди відкритий на потрібному столі.
Інтеграція з касою
Готове замовлення потрапляє в касову систему через адаптер на Laravel: трансформація під формат каси → POST в API (зазвичай REST). Зворотний потік — статус «страва готова» з KDS → push на пристрій гостя через FCM.
Процес роботи
- Аналітика — вивчаємо процеси, кількість столів, тип пристроїв (планшети/особисті телефони), касову систему.
- Проєктування — архітектура real-time: WebSocket vs SSE, вибір стеку, схема даних.
- Розробка — реалізація клієнта (Flutter/PWA) та сервера (Laravel).
- Тестування — навантажувальне (500+ одночасних замовлень), сценарії розриву зв'язку.
- Деплой — App Store / Google Play, налаштування push, KDS, каси.
Порівняння клієнтських рішень
| Характеристика | PWA | Нативне (Flutter) |
|---|---|---|
| Встановлення | Не потрібне | Потрібне |
| Push-повідомлення | Обмежено (тільки Android) | Повна підтримка |
| Доступ до API пристрою | Обмежений | Повний |
| Швидкість розробки | Швидше | Довше |
| Рекомендується | Для швидкого старту | Для складних сценаріїв |
Що входить в роботу
- Вихідний код додатку (клієнт + сервер).
- Налаштування CI/CD, деплой у магазини.
- Інтеграція з касовою системою (до 2 адаптерів).
- Документація з архітектури та API.
- Навчання персоналу (2–3 години).
- Гарантія 6 місяців на критичні баги.
Строки та вартість
Базова версія (QR, меню, кошик, відправка на кухню) — від 12 тижнів. Повний комплект з мультипристроєвим кошиком та інтеграцією каси — до 18 тижнів. Вартість розраховується індивідуально — напишіть нам, і ми оцінимо проєкт за 2 дні. Зв'яжіться з нами для детального обговорення вашого проєкту — ми підготуємо пропозицію з урахуванням ваших особливостей.
Чому обирають нас?
На ринку 5+ років, реалізовано 10+ рішень для HoReCa. Гарантуємо дотримання App Store Review Guidelines (Section 4.2, 5.1) та вимог Google Play. Надаємо сертифікати code signing, налаштовуємо push-повідомлення (APNs / FCM). Наш досвід гарантує надійну роботу під навантаженням.







