Разработка системы рекомендаций товаров в мобильном приложении
Рекомендательная система — это не просто «с этим товаром часто покупают». Это инфраструктура, которая собирает поведенческие сигналы, обучает модель и доставляет персонализированный результат в нужный момент. Без правильно выстроенного трекинга событий модель будет рекомендовать популярные товары вместо релевантных — и разницы с «топ продаж» пользователь не почувствует.
Архитектура: из чего состоит система
Рекомендательная система состоит из трёх слоёв, и мобильное приложение участвует в каждом.
Сбор событий. Приложение генерирует поведенческие сигналы: просмотр товара, добавление в корзину, покупка, время на экране, свайп-скролл по ленте. Эти события отправляются в аналитическую систему (Amplitude, Mixpanel, Segment, собственный Kafka-топик). Качество данных критично: если view_product стреляет при каждом скролле мимо карточки — модель получает зашумленный сигнал.
Модель и оффлайн-обучение. Collaborative filtering (Matrix Factorization, ALS), content-based filtering по атрибутам товара, или гибридные подходы. Для e-commerce с холодным стартом (новые пользователи, новые товары) чистый CF не работает — нужны fallback-стратегии на основе атрибутов.
Доставка рекомендаций. Мобильное приложение запрашивает рекомендации через API, получает упорядоченный список товаров. Здесь важны: время ответа (< 200ms для inline-блоков), TTL кеша, деградация при недоступности сервиса.
Трекинг событий в мобильном приложении
Самое частое упущение — неправильное определение «просмотра» товара. viewDidAppear на экране товара стреляет раньше, чем пользователь реально увидел контент. Для impression-трекинга в списке используем UICollectionView.indexPathsForVisibleItems с таймером:
// iOS: считаем impression только если товар виден > 1 секунды
private var impressionTimers: [IndexPath: Timer] = [:]
func collectionView(_ collectionView: UICollectionView,
willDisplay cell: UICollectionViewCell,
forItemAt indexPath: IndexPath) {
let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { [weak self] _ in
guard let product = self?.products[indexPath.item] else { return }
Analytics.track(.productImpression(productId: product.id, source: .recommendations))
}
impressionTimers[indexPath] = timer
}
func collectionView(_ collectionView: UICollectionView,
didEndDisplaying cell: UICollectionViewCell,
forItemAt indexPath: IndexPath) {
impressionTimers[indexPath]?.invalidate()
impressionTimers.removeValue(forKey: indexPath)
}
На Android аналог — RecyclerView + кастомный OnScrollListener или ViewTreeObserver.OnGlobalLayoutListener с Intersection Observer логикой.
Интеграция API рекомендаций
Рекомендации бывают нескольких типов с разными точками интеграции:
| Тип | Место в UI | Контекст запроса |
|---|---|---|
| Homepage feed | Главный экран | user_id |
| Similar items | Экран товара | product_id, user_id |
| Cross-sell | Корзина | cart_items[], user_id |
| Post-purchase | Экран «Спасибо» | order_id, user_id |
Для каждого типа — отдельный endpoint или параметр placement. Не один универсальный запрос «дай мне рекомендации».
Кеширование: рекомендации главной страницы кешируются на 30–60 минут (NSCache на iOS, Room + WorkManager на Android для фоновой подгрузки). Рекомендации на экране товара — не кешируем или с TTL 5 минут, они должны учитывать текущую сессию.
Холодный старт и fallback
Новый пользователь — нет истории, нет вектора. Варианты:
- Онбординг с выбором категорий интересов → передаём как начальные сигналы
- Популярные товары в категории (editorial picks, не просто топ продаж)
- Geo-based recommendations (что покупают в этом регионе)
Fallback при недоступности рекомендательного сервиса: готовый статичный список «редакционная подборка» в конфиге или CDN.
A/B тестирование
Система рекомендаций без A/B теста — это вера в модель. Каждый новый алгоритм проверяем через Feature Flags (Firebase Remote Config, Unleash): 10% трафика на новую модель, метрика — CTR рекомендательного блока и конверсия в покупку с attribution_window 7 дней.
Процесс работы
Аудит текущего трекинга событий: что уже собирается, что нужно добавить.
Проектирование event schema: имена событий, обязательные параметры, контекст.
Интеграция рекомендательного API или разработка модели (если нет готового сервиса).
Реализация UI-компонентов: горизонтальный скролл, карусель, inline-блок, с корректным impression-трекингом.
Кеширование, fallback при ошибках, offline-режим.
Настройка A/B тестирования, определение метрик успеха.
Ориентиры по срокам
Интеграция готового рекомендательного API в существующее приложение — 1–2 недели. Разработка системы с нуля включая сбор данных, модель, API и мобильную часть — 2–3 месяца. Стоимость рассчитывается индивидуально после анализа текущего стека и объёма каталога.







