Где не хватило товара — и сколько на этом потеряли
Акция работала, но товар кончился на полке → продажи упустили. Это потери закупки/логистики, а не провал акции.
📅 за весь период акций📂 источник: продажи ОРП + остатки (1С)
Справка: как считается дефицит и откуда данные
Что: где товара не хватило на полке в период акции → упустили продажи (потери закупки/логистики, не провал акции).
Источник: остатки ТоварыНаСкладах (end-of-day) + продажи ОРП (1С), подённо.
Формулы: OOS% = 1 − покрытие (дни-в-наличии / дни акции); Упущено шт = дни-стокаута × базовая скорость; Недозаработали ₽ = упущ.шт × маржа. Только при ≥3 дней-в-наличии (иначе оценка ненадёжна). Нижняя оценка.
Обновление: остатки/продажи — ночью 03:00 + пересчёт.
Топ потерь — где не хватило товара на акцию 📅 за весь период акций «Жёлтый ценник»
Недозаработали ₽ = упущенные продажи × маржа. Считается по дням, когда товара не было в период акции.
Рекомендации: что ставить в акцию и что выводить
Кандидаты в следующую акцию по ориентировочно сработавшим, с рекомендованной ценой и наличием. + кандидаты на вывод из ассортимента (продаются ниже себестоимости).
⚠ ориентировочно (до→во время) — оживёт с YoY📂 promo_effectiveness + остатки + ЧекСЛ
Справка: как формируются рекомендации
Что: что ставить в следующую акцию (+ реком.цена), что вывести из ассортимента, что слить (излишки).
Источник: результаты движка (promo_effectiveness) + текущие остатки + себестоимость + ЧекСЛ.
Отбор в акцию: по ориентировочно сработавшим (raw эффект > 0) + маржа > 0 + наличие; реком.цена = ½×(обычная−себест) глубина, 3–40%, не ниже себест+5%. Вывод: продаётся ниже себестоимости. Слив: запас дней >60 / неликвид → глубина уценки по DoS.
⚠ Отбор ориентировочный (без вычета фона) — станет доказанным с накоплением YoY/контроля. Обновление: ночью 03:00.
🎯 Кандидаты в следующую акцию
«Реком. цена» = ½×(обычная−себест) глубина, 3–40%, не ниже себест+5%. «Дней хватит» = остаток ÷ темп продаж. ⚠ отбор ориентировочный (не доказано без контрфакта).
🚫 Кандидаты на вывод из ассортимента
Продаются НИЖЕ себестоимости (подённая факт.). Решение о выводе — за маркетингом; закупки чистят остаток (слив).
💸 Слив — уценка излишков
⚠ приблизительно (скорость по окнам акций). Дней запаса = остаток÷темп. Глубина: ≥180 дн→40%, ≥90→30%, иначе 20%. Точно — после непрерывной выгрузки.
Анализ в разрезе клиентов
Поведение держателей карт лояльности: частота, средний чек, скидко-зависимость, RFM-сегменты, топ-клиенты. Источник — чеки ЧекСЛ (карта). Имён/телефонов нет — клиент анонимный id.
📅 загрузка…📂 ЧекСЛ (карты)
Справка: клиентская аналитика и детект аномалий
Что: поведение держателей карт — RFM-сегменты, частота, средний чек, скидко-зависимость, топ-клиенты, аномальные аккаунты.
Источник: чеки ЧекСЛ по card_hash (GUID клиента) + справочник ФИО/телефон из 1С.
Клиент = card_hash; визит = уникальный чек (дата+магазин+касса+чек+смена). RFM = ntile-5 по давности/частоте/тратам.
Аномалии (семья ≠ фрод): до 3 человек на 1 номер — НОРМА (отфильтровано). Флагуем: 🔴 опт (>3 маг/день или ≥7 маг), 🟠 сплит чеков (≥5 чеков/маг/день — фарм бонуса/порога акции), 🟡 подозрение.
Обновление: ЧекСЛ — 22:30/08:00; клиенты (ФИО/тел) — ночью 03:00.
RFM-сегменты клиентов
Чемпионы/Лояльные — ядро. Спящие / В зоне риска — кандидаты на реактивацию. RFM за период.
Частота визитов
Визит = уникальный чек (карта + дата + касса + № + смена). Разовые — кандидаты в удержание.
Топ клиентов по тратам
ФИО/телефон — после загрузки справочника клиентов из 1С; иначе анонимный id. Топ-50 по тратам.
🔍 Аномальные аккаунты (семья до 3 чел. на номер — НОРМА)
Семья (до 3 чел. на 1 номер) — это норма, фильтруется. Здесь — за пределами семьи: 🔴 опт (>3 маг/день, ≥7 маг), 🟠 сплит чеков (≥5/маг/день), 🟡 подозрение. Сорт по тяжести.
🎯 Гейминг «Разнообразного питания»
Механика «N разных SKU → скидка» фармится: берут 400+ разных товаров по 1-2 шт. Акция в целом прибыльна (+22.9% маржа) → это тяжёлые юзеры, но топ-карты с сотнями визитов стоит проверить (≥30 разных SKU).
Сравнение цен с конкурентами
Наша обычная цена (последний срез из 1С) против цены конкурента. Где мы ДОРОЖЕ — теряем покупателя; где ДЕШЕВЛЕ — можем поднять цену (если выше себестоимости).
📥 источник: загруженные цены конкурентов
Справка: сравнение цен и откуда данные
Что: наша обычная цена против цены конкурента — где мы дороже (теряем покупателя) / дешевле (можно поднять).
Источник: наша цена = последний срез regular_price из 1С; цены конкурентов — загружаются вручную (CSV / парсинг / выгрузка прайса) через POST /marketing/competitor-prices или load_competitors.ps1.
Формулы: Разница ₽ = наша − конкурент; Разница % = (наша − конкурент)/конкурент. Сигнал: ↓ снизить (мы дороже, есть запас над себестоимостью) · ↑ поднять (мы дешевле).
Обновление: вручную (как обновишь CSV конкурентов). Наша цена — ночью 03:00.
Топ расхождений
Цены конкурентов грузятся в БД (CSV/ручной ввод/парсинг) через POST /marketing/competitor-prices. Пока таблица пуста — загрузите цены.
📋 Что мониторить у конкурентов
Спека агентов (маркетинг+закупки): ~200 позиций — ядро KVI (социалка, частые в чеках) + хвост-возможности. По этому списку собирать цены Магнита/Пятёрочки/Ленты (Черкесск). Матч по бренд+вес+категория (EAN не нужен — у федералов свои коды). Подробности — справка вкладки.