Реалізація AI-динамічного ціноутворення в мобільному додатку
Динамічне ціноутворення — це не «підняти ціну коли попит високий». Це алгоритм, який у реальному часі балансує між максимізацією виручки та збереженням конверсії. Занадто агресивна стратегія руйнує довіру; занадто консервативна — залишає гроші на столі.
У мобільних додатках це завдання має додатковий вимір: ціна, показана користувачу, повинна бути консистентною в межах сеансу. Користувач не повинен бачити, як ціна змінилася між переглядом карточки товару та екраном оплати.
Де та як застосовується
E-commerce та маркетплейси
Класичні сценарії: ціни авіаквитків, готелів, доставки, ride-sharing. Фактори, які впливають на ціну: поточний попит (кількість активних сеансів на цей товар), залишок на складі, час до закінчення пропозиції, поведінка конкурентів (парсинг публічних цін), сегмент користувача.
Моделі ціноутворення
Три основних підходи у порядку зростання складності:
Правила: «якщо залишок < 5 одиниць — +15% до базової ціни». Швидко реалізується, легко пояснити бізнесу, погано адаптується до складних паттернів попиту.
Регресія/ML: модель передбачає оптимальну ціну за вектором ознак. XGBoost з ознаками попиту, часу та конкурентного середовища дає хорошу baseline-точність.
Reinforcement Learning: агент навчається в середовищі, отримуючи награду за конверсію та/або виручку. Складніше в реалізації та відладці, але краще у довгостроковій оптимізації. Підходить для зрілих продуктів з великим трафіком.
Ключові технічні моменти
Консистентність ціни в сеансі
Ціна фіксується при першому перегляді товару та не змінюється до кінця сеансу (або визначеного 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 (низька до високої вартості)
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: "USD")))
.strikethrough()
.foregroundColor(.secondary)
.font(.subheadline)
}
Text(pricedItem.currentPrice.formatted(.currency(code: "USD")))
.font(.headline)
.foregroundColor(pricedItem.isDiscounted ? .red : .primary)
if pricedItem.priceExpiresIn < 600 { // <10 хвилин
Text("⏱ \(pricedItem.priceExpiresIn / 60) хв")
.font(.caption)
.foregroundColor(.orange)
}
}
}
}
Таймер до закінчення ціни створює терміновість без маніпуляції — користувач бачить реальне обмеження, а не фіктивний countdown.
Процес роботи
Аудит даних: історія продажів, поточні сигнали попиту, доступність конкурентних цін.
Побудова baseline правилової стратегії та збір даних для ML-моделі.
Навчання та валідація моделі на офлайн-даних.
Розробка pricing API + client-side кеш сеансу.
Online-тестування з гео-розділенням та моніторингом виручки + конверсії.
Орієнтири за часом
Правилова динамічна ціна з API — 1 тиждень. ML-модель з feature engineering та offline-валідацією — 3–4 тижні. Повна система з online A/B тестуванням та моніторингом — 6–8 тижнів.







