Разработка мобильного приложения для кэшбэк-сервиса
Кэшбэк-сервис — это посредник между пользователем, магазином и партнёрской сетью. Технически: приложение трекает переходы пользователя в магазины (через deeplink или трекинговые ссылки), партнёрская сеть подтверждает покупку, сервис начисляет вознаграждение. Главная техническая сложность — атрибуция: доказать, что пользователь совершил покупку именно через приложение, а не напрямую.
Трекинг партнёрских переходов
Для отслеживания переходов используются трекинговые ссылки партнёрских сетей (Admitad, CJ, Impact, собственные). Схема работы:
- Приложение открывает трекинговую ссылку:
https://trk.admitad.com/g/xxxxx?uid={userId} - Трекер редиректит в магазин, устанавливает cookie
- Пользователь делает покупку
- Магазин отправляет конверсию в сеть с
uid - Сеть присылает постбэк на сервер сервиса
- Сервер начисляет кэшбэк пользователю с данным
uid
Переход в магазин — через SFSafariViewController (iOS) или Custom Tabs (Android). Нельзя использовать встроенный WKWebView — cookie из него изолированы и не передаются в Safari. Именно это частая причина «потери» атрибуции.
import SafariServices
func openShopWithTracking(shop: Shop) {
guard let trackingUrl = buildTrackingUrl(shop: shop, userId: currentUser.id) else { return }
let safariVC = SFSafariViewController(url: trackingUrl)
safariVC.preferredControlTintColor = .systemBlue
present(safariVC, animated: true)
// Фиксируем переход локально для статистики
analyticsService.track(.shopOpened(shopId: shop.id))
}
// Android: Chrome Custom Tabs для трекинга
val customTabsIntent = CustomTabsIntent.Builder()
.setShowTitle(true)
.setColorScheme(CustomTabsIntent.COLOR_SCHEME_LIGHT)
.build()
customTabsIntent.launchUrl(this, trackingUri)
Начисление и вывод кэшбэка
Кэшбэк хранится как внутренний баланс пользователя. Статусы начисления:
| Статус | Описание |
|---|---|
PENDING |
Переход зафиксирован, покупка не подтверждена |
CONFIRMED |
Магазин подтвердил покупку (обычно 30–90 дней) |
AVAILABLE |
Доступен для вывода |
WITHDRAWN |
Выведен |
CANCELLED |
Покупка возвращена, кэшбэк отменён |
Вывод средств — через СБП, перевод на карту или конвертация в промокод. Интеграция с выплатными провайдерами: ЮKassa Payouts, Tinkoff Payouts API, МТС Pay.
Поиск и фильтрация магазинов
Список магазинов — основной экран приложения. Фильтры: категория, размер кэшбэка, тип (фиксированный % или фиксированная сумма), новые / популярные.
На бэкенде — полнотекстовый поиск по PostgreSQL с tsvector или Elasticsearch. Клиент дебаунсирует поисковые запросы:
// iOS: поиск с debounce через Combine
@Published var searchQuery = ""
init() {
$searchQuery
.debounce(for: .milliseconds(300), scheduler: RunLoop.main)
.removeDuplicates()
.filter { $0.count >= 2 }
.sink { [weak self] query in
self?.loadShops(query: query)
}
.store(in: &cancellables)
}
Уведомления об акциях
Повышенный кэшбэк на ограниченный период — главный инструмент удержания пользователей. Приложение показывает в ленте акции с таймером обратного отсчёта. Push-уведомления о начале акций — через FCM/APNs с сегментацией по категориям интересов пользователя.
Ориентиры по срокам
Базовая версия (каталог магазинов, трекинг, история начислений): 4–6 недель. Вывод средств через СБП/карту — ещё 1–2 недели. Стоимость рассчитывается индивидуально.







