Разбираю по исходникам товарной вертикали goods (ya/extsearch/goods). Сразу дисклеймер, чтобы потом не было вопросов: это реконструкция по реестру факторов и тегам, а не официальная формула Маркета. Ранжирует CatBoost-подобная модель (деревья решений), у факторов там НЕТ фиксированных процентных весов. Поэтому ниже я нигде не пишу "цена это N% выдачи" - такого числа не существует в природе. Говорю только качественно: где сигнал сильный, где слабый, и что вообще может крутить магазин.
Главное, что надо понять про цену в товарной выдаче: голая цифра в рублях сама по себе почти бесполезна. iPhone за 70k и чехол за 300 рублей - это не "дорогой" и "дешёвый" товар в одном смысле. Поэтому в реестре сырая цена есть, но рядом с ней живёт целый куст нормированных факторов - отношение цены оффера к медиане по модели и к средней по категории. Вот это и есть настоящая ценовая конкурентность, а не абсолютное число.
Сырые ценовые факторы (база)
Это то, что приходит прямо из фида и из агрегатов по модели/категории. Самый первый фактор реестра, Index 0 - это буквально цена оффера.
Код: Выделить всё
Index Name Tags (места выдачи)
0 OFFER_PRICE TG_BASE TG_OFFER TG_BLENDER_PLACE
TG_MODEL_OFFER_PLACE TG_TEXT_PLACE
- OFFER_OLD_PRICE TG_BASE TG_MODEL_OFFER_PLACE
419 OVERALL_AVG_CATEGORY_PRICE TG_BASE TG_DOCUMENT_STATIC
TG_BLENDER_PLACE TG_TEXT_PLACE
420 OVERALL_MEDIAN_MODEL_PRICE TG_BASE TG_DOCUMENT_STATIC
TG_BLENDER_PLACE TG_MODEL_OFFER_PLACE TG_TEXT_PLACE
- AVG_MODEL_PRICE / MIN_MODEL_PRICE TG_BASE TG_MODEL TG_BLENDER_PLACE
MAX_MODEL_PRICE TG_MODEL_OFFER_PLACE TG_TEXT_PLACE
- DELIVERY_PRICE TG_BASE TG_DELIVERY TG_TEXT_PLACE
- OFFER_PRICE - цена конкретного предложения. Базовый кирпич, но модель его почти всегда смотрит не сам по себе, а в паре с нормировками ниже.
- OFFER_OLD_PRICE - старая (зачёркнутая) цена. Существует именно для того, чтобы можно было посчитать величину скидки. Живёт только на карточке товара (TG_MODEL_OFFER_PLACE).
- OVERALL_MEDIAN_MODEL_PRICE - медианная цена по всем офферам этой модели. То есть "сколько вообще стоит вот эта конкретная железка у всех продавцов".
- OVERALL_AVG_CATEGORY_PRICE - средняя цена по категории целиком. Это уже про ценовой сегмент: дешёвый/средний/премиум товар внутри своего класса.
- MIN/MAX/AVG_MODEL_PRICE - разброс цен внутри модели.
Нормировки - вот где живёт реальная конкурентностьЧто доказано кодом: OFFER_PRICE имеет Index 0 и теги TG_OFFER + все три места выдачи (текстовая, карточка с офферами, блендер). Цена считается на каждом уровне, где Маркет вообще ранжирует. Что реконструкция: то, что модель "не любит" голую цену и опирается на нормировки - вывод из того, что отдельных нормированных факторов в реестре в разы больше, чем сырых.
Это ядро темы. Цена оффера делится на ориентир - медиану модели или среднюю по категории. Получается безразмерное отношение, которое одинаково осмысленно и для чехла, и для iPhone.
Код: Выделить всё
Index Name Смысл (price / orientir)
421 OFFER_PRICE_DIV_OVERALL_MEDIAN_MODEL_PRICE цена / медиана по модели
- OFFER_PRICE_DIV_OVERALL_MEDIAN_MODEL_PRICE то же, но + доставка
_WITH_DELIVERY
- OFFER_PRICE_DIV_OVERALL_AVG_CATEGORY_PRICE цена / средняя по категории
1659 DIFF_TO_MIN_PRICE отрыв от минимума (TG_OFFER)
252 MODEL_MAX_PRICE_TO_MIN_PRICE разброс цен внутри модели
- MODEL_AVG_PRICE_TO_MIN_PRICE средняя к минимуму
- MODEL_MAX_PRICE_TO_AVG_PRICE макс к средней
- PRICE_DIV_PERC1_PRICE_IN_CATEGORY_FOR_PRISM цена / 1й перцентиль категории
- PRICE_DIV_PERC50_PRICE_IN_CATEGORY_FOR_PRISM цена / медиана категории (prism)
- PRICE_DIV_AVG_PRICE_IN_CATEGORY_FOR_PRISM цена / средняя категории (prism)
- OFFER_PRICE_DIV_OVERALL_MEDIAN_MODEL_PRICE = 1.0 означает "ты ровно по медиане за эту модель". Меньше 1 - ты дешевле большинства, больше 1 - дороже. Версия _WITH_DELIVERY важна отдельно: Маркет умеет сравнивать с учётом доставки, и тут можно проиграть конкуренту, у которого товар на рубль дороже, но доставка бесплатная.
- DIFF_TO_MIN_PRICE (TG_OFFER) - насколько ты отстаёшь от самого дешёвого оффера в модели. Это прямой сигнал "ты не самый дешёвый и вот настолько". Тег TG_FORMULA_CHECK_PARROT у него и у MIN_MODEL_PRICE намекает, что эти величины ещё и контролируются на вменяемость на уровне формулы.
- PRICE_DIV_PERC1 / PERC50 / AVG ..._FOR_PRISM - семейство prism. Сравнивает цену не с моделью, а с распределением по категории: с первым перцентилем (по сути самые дешёвые предложения), с медианой и со средней. Это и есть "ценовой сегмент внутри категории".
- MODEL_MAX_PRICE_TO_MIN_PRICE и соседи - характеризуют не тебя, а саму карточку: насколько в ней растащены цены. Если разброс огромный, медиана как ориентир работает хуже, и модель это видит.
Скидки, промо, юнит-экономикаГраница: OFFER_PRICE_DIV_OVERALL_MEDIAN_MODEL_PRICE (Index 421) и пара _WITH_DELIVERY стоят на TG_BLENDER_PLACE и TG_MODEL_OFFER_PLACE - это доказанные кодом места, где цена-относительно-медианы реально участвует в подмешивании и в карточке. А вот трактовка "дешевле медианы = выше" - реконструкция: дерево решений может вести себя нелинейно, слишком низкая цена иногда читается как подозрительная (не тот товар, серый, битый).
Код: Выделить всё
Name Tags Смысл
DISCOUNT_IN_RUB TG_DOCUMENT TG_BASE размер скидки в рублях
MODEL_DISCOUNT TG_DOCUMENT TG_BASE скидка на уровне модели
PROMO_PRICE_IN_RUB TG_DOCUMENT TG_BASE промо-цена
HAS_ACTIVE_PROMO TG_DOCUMENT TG_BASE есть активное промо (флаг)
MODEL_HAS_PROMO TG_DOCUMENT TG_BASE промо на модели (флаг)
UE_TO_PRICE TG_OFFER TG_MODEL_OFFER_PLACE юнит-экономика к цене
TG_TEXT_PLACE
PRICE_SEGMENT_IN_CART TG_OFFER TG_MODEL_OFFER_PLACE ценовой сегмент в корзине
UE_TO_PRICE стоит особняком - это юнит-экономика относительно цены. Стоит на TG_OFFER и попадает в текстовую выдачу и карточку. По названию это маркетплейсовый, "синий" сигнал про маржинальность/ставку относительно цены, а не чисто пользовательский. Помним свежую практику 2025-2026: в Бусте продаж часть ставки можно пустить на снижение цены, чтобы стать главным оффером в карточке - вот такие вещи и цепляются за этот пласт факторов.
Что из этого реально контролирует магазин
- OFFER_PRICE - очевидно, цена в фиде. Но оптимизировать надо не абсолют, а отношение к медиане модели и к перцентилям категории. Цель - попасть в зону "не хуже медианы", в идеале ближе к минимуму, но без явного демпинга в подвал (это ловит и Маркет, и собственные репрайсеры).
- DIFF_TO_MIN_PRICE - смотрите отчёты "Конкурентность цен" и "Цены конкурентов" в кабинете. Они фактически показывают вам ту же дельту до минимума, что видит индекс.
- Доставка - версия _WITH_DELIVERY означает, что бесплатная/дешёвая доставка напрямую улучшает вашу относительную цену. Платная доставка может убить выгодную цену в сравнении.
- Промо - HAS_ACTIVE_PROMO и DISCOUNT_IN_RUB живые. Но скидка должна быть честной (через OFFER_OLD_PRICE), а не нарисованной завышением старой цены.
- Стабильность - индекс раскатывается шардами раз в ~12 часов, так что моментального отклика на смену цены не ждите, ценовые агрегаты по модели и категории тоже не мгновенные.
Практический вывод одной строкой: оптимизируйте не рубли, а свою позицию относительно медианы модели и перцентилей категории с учётом доставки - именно это закодировано в куче DIV-факторов, и именно это вам показывают отчёты конкурентности в кабинете.Доказано кодом: в реестре есть живые (не deprecated) факторы OFFER_PRICE (0), OVERALL_MEDIAN_MODEL_PRICE (420), OVERALL_AVG_CATEGORY_PRICE (419), OFFER_PRICE_DIV_OVERALL_MEDIAN_MODEL_PRICE (421) и его _WITH_DELIVERY, DIFF_TO_MIN_PRICE (1659), семейство ..._FOR_PRISM, MODEL_*_PRICE_TO_*_PRICE (252 и соседи), DISCOUNT_IN_RUB, HAS_ACTIVE_PROMO, UE_TO_PRICE. Их теги показывают места выдачи: блендер, карточка с офферами, текстовая выдача.
Реконструкция (НЕ доказано): направление влияния ("дешевле = выше"), нелинейность, любые проценты. CatBoost не даёт факторам статических весов - всё зависит от контекста запроса и категории. Среди разобранных ключевых ценовых факторов мёртвых (TG_DEPRECATED/TG_UNUSED) не обнаружено.