Реализация AI-динамического ценообразования в мобильном приложении
Динамическое ценообразование — это не «поднять цену когда спрос высокий». Это алгоритм, который в реальном времени балансирует между максимизацией выручки и сохранением конверсии. Слишком агрессивная стратегия убивает доверие; слишком консервативная — оставляет деньги на столе.
В мобильных приложениях эта задача имеет дополнительное измерение: цена, показанная пользователю, должна быть консистентна в рамках сессии. Пользователь не должен видеть, как цена изменилась между просмотром карточки товара и экраном оплаты.
Где и как применяется
E-commerce и маркетплейсы
Классический сценарий: цена билетов, гостиниц, доставки, ride-sharing. Факторы, влияющие на цену: текущий спрос (количество активных сессий на этот товар), остаток на складе, время до истечения предложения, поведение конкурентов (парсинг публичных цен), сегмент пользователя.
Модели ценообразования
Три основных подхода по возрастанию сложности:
Rule-based: «если остаток < 5 единиц — +15% к базовой цене». Быстро реализуется, легко объяснить бизнесу, плохо адаптируется к сложным паттернам спроса.
Regression/ML: модель предсказывает оптимальную цену по вектору признаков. XGBoost с признаками спроса, времени и конкурентной среды даёт хорошую baseline-точность.
Reinforcement Learning: агент обучается в среде, получая reward за конверсию и/или выручку. Сложнее в реализации и отладке, но лучше в долгосрочной оптимизации. Подходит для зрелых продуктов с большим трафиком.
Ключевые технические моменты
Консистентность цены в сессии
Цена фиксируется при первом просмотре товара и не меняется до конца сессии (или определённого TTL). Реализуется через кэш цен на сервере с ключом {user_id}_{item_id}_{session_id}.
// Android: получение цены с кэшированием в рамках сессии
class PricingRepository(
private val pricingApi: PricingApi,
private val sessionId: String
) {
private val priceCache = HashMap<String, PricedItem>()
suspend fun getPrice(itemId: String, userId: String): PricedItem {
// сначала проверяем локальный кэш сессии
priceCache[itemId]?.let { return it }
val priced = pricingApi.getPrice(
PriceRequest(
itemId = itemId,
userId = userId,
sessionId = sessionId,
timestamp = System.currentTimeMillis()
)
)
priceCache[itemId] = priced
return priced
}
}
Признаки для модели ценообразования
@dataclass
class PricingFeatures:
# Demand signals
views_last_1h: int
add_to_cart_rate_1h: float
active_sessions_on_item: int
# Supply
stock_level: int
days_until_expiry: Optional[int] # для скоропортящихся
# User segment
user_ltv_bucket: int # 0-4 (low to high value)
user_price_sensitivity: float # эластичность из истории
# Time context
hour_of_day: int
day_of_week: int
is_payday_week: bool # 1-7 и 25-31 числа месяца
# Competitive
competitor_price_delta: Optional[float] # % разница с конкурентом
user_price_sensitivity — важный признак, который часто упускают. Он вычисляется по истории: насколько часто пользователь покупал после снижения цены vs при полной цене. Пользователи с высокой эластичностью получают персонализированные скидки; нечувствительные к цене — нет.
A/B тестирование стратегий ценообразования
Тестировать ценовые стратегии сложнее, чем UI-изменения. Cannibalization bias: пользователь в контрольной группе видит одну цену, в тестовой — другую, но они конкурируют за один и тот же инвентарь. Правильный подход — гео-разделение или временнóе разделение (holdout weeks).
// iOS: отображение цены с badge если она динамическая
struct ProductPriceView: View {
let pricedItem: PricedItem
var body: some View {
HStack(spacing: 6) {
if let original = pricedItem.originalPrice, original > pricedItem.currentPrice {
Text(original.formatted(.currency(code: "RUB")))
.strikethrough()
.foregroundColor(.secondary)
.font(.subheadline)
}
Text(pricedItem.currentPrice.formatted(.currency(code: "RUB")))
.font(.headline)
.foregroundColor(pricedItem.isDiscounted ? .red : .primary)
if pricedItem.priceExpiresIn < 600 { // <10 минут
Text("⏱ \(pricedItem.priceExpiresIn / 60) мин")
.font(.caption)
.foregroundColor(.orange)
}
}
}
}
Таймер до истечения цены создаёт urgency без манипуляции — пользователь видит реальное ограничение, а не фиктивный countdown.
Процесс работы
Аудит данных: история продаж, текущие признаки спроса, доступность конкурентных цен.
Построение baseline rule-based стратегии и сбор данных для ML-модели.
Обучение и валидация модели на офлайн-данных.
Разработка pricing API + client-side кэш сессии.
Online-тестирование с гео-разделением и мониторингом выручки + конверсии.
Ориентиры по срокам
Rule-based динамическое ценообразование с API — 1 неделя. ML-модель с feature engineering и offline-валидацией — 3–4 недели. Полная система с online A/B тестированием и мониторингом — 6–8 недель.







