Мобільний застосунок для купонів та скидок
Застосунок для купонів та скидок виглядає несложним до моменту, коли потрібно інтегрувати геолокацію («скидки рядом зі мною»), push-сповіщення («ти в торговому центрі — ось скидка»), партнерські API торговельних мереж та систему погашення купонів без шахрайства. Кожен з цих блоків має нетривіальні технічні деталі.
Геолокаційні пропозиції
«Скидки рядом» — це або простий запит до API з поточними координатами, або proximity marketing через геофенсинг.
Простий варіант: користувач відкриває застосунок → поточні координати → GET /offers?lat=55.75&lng=37.61&radius=1000. Працює тільки при відкритому застосунку.
Геофенсинг: застосунок реєструє геофенси навколо точок-партнерів. При вході — push-сповіщення з актуальними скидками цього магазину. На iOS — CLCircularRegion, лімітура 20 регіонів одночасно. Якщо партнерів 500 — потрібна динамічна реєстрація найближчих 20 при зміні місцезнаходження.
Алгоритм: при значимій зміні місцезнаходження (startMonitoringSignificantLocationChanges()) — запит 20 найближчих магазинів, перереєстрація геофенсів. На Android — аналогічно, але через GeofencingClient з лімітом 100 геофенсів.
BLE-beacon proximity (Eddystone, iBeacon): застосунок виявляє маяки в магазині — push з персоналізованою пропозицією. CoreBluetooth / Android BluetoothLeScanner. Потребує від партнера установки маяків, що ускладнює B2B-продаж. Зато точність — метри, не сотні метрів.
Відображення та фільтрація купонів
Список купонів — RecyclerView (Android) / LazyVStack (SwiftUI). Карточка купону: зображення, назва магазину, розмір скидки, термін дії, відстань. Skeleton loading поки завантажується.
Фільтри: категорія, відстань, відсоток скидки, онлайн/офлайн. Сортування: за відстанню, за розміром скидки, за терміном закінчення. Все на сервері — клієнт тільки передає параметри фільтрації.
Карточка flip-анімація для розкриття умов купону — CATransform3DMakeRotation (UIKit) / .rotation3DEffect (SwiftUI). Не обов'язкова, але виглядає живо.
Активація та погашення купонів без мошенництва
Це ключева технічна задача. Купон не можна зробити статичним QR-кодом — його можна сфотографувати та використовувати багато разів.
Одноразовий токен: при натиску «використати» — запит до сервера, сервер генерує JWT з exp: now + 300sec та used: false. QR-код з токеном показується 5 хвилин. Касир сканує → сервер помічає used: true. Повторне сканування — помилка «купон вже використаний».
Динамічний QR: QR змінюється кожні 30 секунд (TOTP-підхід). Сервер знає поточне значення, касир бачить актуальний код. Складніше в реалізації, захист від скриншота.
Штрих-код магазину: користувач показує номер карти лояльності, скидка застосовується на касі автоматично. Потребує інтеграції з касовим ПО партнера.
Для більшості кейсів — одноразовий токен з 5-хвилинним lifetime достатньо.
Персоналізація та категорії
Історія купонів користувача → ML-рекомендації (опціонально). Простий варіант без ML: категорії інтересів в профілі, push тільки по цікавих категоріях. Користувач вибрав «кафе» та «спорт» — не отримує купони на одяг.
Улюблені магазини: підписка на скидки конкретного партнера. При появі нового купону — push-сповіщення з deep link на карточку купону.
Інтеграція з партнерами
Партнерський кабінет (веб) — окрема тема. Мобільна частина тільки споживає API. Але API повинна підтримувати різні моделі купонів: процентна скидка, фіксована сума, «купи N отримай M», бонусні бали.
Кешбек — якщо користувач показав купон, касир підтвердив через партнерський термінал → застосунок починає нараховувати бали. Баланс балів в застосунку, історія нарахувань, вивід або обмін на купони.
Стек: Flutter або React Native, Google Maps SDK для карти з магазинами, Firebase Cloud Messaging для push, Mapbox для геофенсингу (або нативні API), CoreBluetooth / BLE для beacon.
Термін: від 8 до 14 тижнів. Вартість розраховується індивідуально.







