🚀 Быстрый старт
3 минуты в день — всё, что нужно для контроля бизнеса
Ключевая метрика
L2
Прибыль до налогов — главный показатель здоровья бизнеса
Главный сигнал тревоги
Стокаут
Нулевой остаток = потерянные продажи прямо сейчас
Ежедневная проверка
3 шага
Алерты → Заказы сегодня → Топ-проблемы AI
Как читать монитор за 3 минуты:
1. Открыть вкладку Алерты — проверить красные и оранжевые сигналы.
2. Посмотреть KPI-панель — заказы и выручка относительно вчера/недели.
3. Спросить AI-чат: «Что важного сегодня?»
1. Открыть вкладку Алерты — проверить красные и оранжевые сигналы.
2. Посмотреть KPI-панель — заказы и выручка относительно вчера/недели.
3. Спросить AI-чат: «Что важного сегодня?»
Как устроен монитор
Данные
Подтягиваются с Wildberries каждые ~10 минут автоматически. Никаких ручных выгрузок.
Что показывает
Продажи, финансы, склады, логистику — всё в одном окне в реальном времени.
Главный принцип
Только реальные данные из WB. Никаких примерных или демонстрационных цифр.
💰 Финансовое ядро
Все формулы простым языком — что считается и что это значит для вашего бизнеса
Пример-эталон на весь раздел: Продаёте носки по 1 000 ₽. Себестоимость (закупка + доставка до WB) = 300 ₽/пара. Комиссия WB 15%, эквайринг 1,5%. Продажи 50 пар/день. Реклама = 10% от выручки. Налог УСН «Доходы» 6%.
1. Выручка к перечислению
Что WB реально переводит вам за каждую продажу
Что это
Сумма, которую Wildberries зачисляет на ваш счёт за каждую проданную единицу — уже после вычета своей комиссии и банковского эквайринга. Это ещё не прибыль: из неё нужно вычесть себестоимость, логистику и хранение.
Выручка к перечислению = Цена продажи − Комиссия WB − Эквайринг
Пример
Носки 1 000 ₽ → комиссия 15% = 150 ₽, эквайринг 1,5% = 15 ₽ → WB переводит 835 ₽
Как читать
Растёт — хорошо
Падает при тех же продажах — комиссия WB могла вырасти
2. Себестоимость товара
Ваши расходы до того, как товар попал на склад WB
Что включать
Да: цена у поставщика + доставка от поставщика + упаковка + маркировка + таможня.
Нет: доставку WB до покупателя — это расход маркетплейса, считается отдельно.
Нет: доставку WB до покупателя — это расход маркетплейса, считается отдельно.
Себестоимость = Закупочная цена + Доставка до WB + Упаковка
Пример
Купили 250 ₽, доставка до склада 30 ₽, упаковка 20 ₽ → себестоимость = 300 ₽/пара
⚠️ Пока себестоимость не введена — прибыль и маржа считаются по заглушке 90 ₽ и недостоверны. Введите в Юнит-экономике.
3. Валовая прибыль
Что осталось после вычета закупочной цены — до расходов WB
Что это
Первичный «заработок» с продажи: выручка к перечислению минус себестоимость. Если валовая прибыль маленькая — проблема в закупке или комиссии, а не в доставке.
Валовая прибыль = Выручка к перечислению − Себестоимость
Пример
835 − 300 = 535 ₽ с пары
Нормы маржи
> 30% — хороший запас
15–30% — норма
< 15% — мало запаса на расходы WB
4. Операционная прибыль
Прибыль после всех расходов — осталось только вычесть налог
Что это
Реальный доход с продажи с учётом логистики WB (доставка покупателю), хранения, рекламы и штрафов.
Операционная прибыль = Выручка к перечислению − Себестоимость − Доставка WB − Хранение − Реклама − Штрафы
Пример
835 − 300 − 80 (доставка WB) − 5 (хранение) − 100 (реклама 10%) = 350 ₽ на пару
Нормы
> 15% маржи — устойчивый бизнес
5–15% — работает, но мало запаса
< 0% — каждая продажа уводит в минус
5. Чистая прибыль
То, что реально остаётся у вас после всего, включая налог
Что это
Итоговый заработок — операционная прибыль минус налог. Именно это вы «кладёте в карман» с каждой продажи.
Чистая прибыль = Операционная прибыль − Налог
Пример
Операционная прибыль 350 ₽. Налог УСН 6% от суммы покупателя: 1 000 × 6% = 60 ₽. Чистая прибыль = 350 − 60 = 290 ₽ с пары носков.
Важно: налог берётся с того, что заплатил покупатель (1 000 ₽), а не с того, что перечислил WB (835 ₽). Это стандарт УСН «Доходы».
6. Маржинальность (Маржа %)
Какой процент от выручки остаётся прибылью — главный KPI
Что это
Сколько копеек прибыли вы зарабатываете с каждого рубля продаж. Позволяет сравнивать эффективность разных товаров и периодов.
Маржа % = Чистая прибыль / (Цена × Кол-во продаж) × 100%
Пример
290 ₽ / 1 000 ₽ × 100% = 29% — с каждой 1 000 ₽ продаж зарабатываем 290 ₽
Нормы
> 20% — отличная маржинальность
10–20% — нормально
< 5% — опасная зона
⚠️ Маржа может немного отличаться на разных вкладках монитора — потому что вкладки используют разные источники данных. Для итогового анализа используйте вкладку Финансы.
7. ROI — отдача на вложения в товар
Сколько прибыли даёт каждый вложенный в закупку рубль
Что это
Показывает эффективность вложений в закупку. Позволяет сравнивать товары с разными ценами: дешёвый товар с ROI 200% выгоднее дорогого с ROI 50%, даже при одинаковой марже.
ROI = Валовая прибыль / Себестоимость × 100%
Пример
535 ₽ / 300 ₽ × 100% = 178% — на каждые вложенные 100 ₽ зарабатываем 178 ₽ прибыли
Нормы
> 80% — отличный товар
30–80% — норма для WB
< 20% — деньги работают плохо
8. Оборачиваемость
За сколько дней распродаётся текущий запас товара
Что это
Как быстро «крутятся» деньги. Чем меньше дней — тем быстрее вы возвращаете вложения и можете снова их пустить в оборот.
Оборачиваемость = Остаток на складе / Среднее продаж в день
Пример
На складе 1 000 пар, продаётся 50 пар/день → 1 000 / 50 = 20 дней
Нормы
< 20 дней — деньги крутятся быстро
20–45 дней — норма для WB
> 60 дней — деньги «заморожены» в складе
9. Оборачиваемость активов
Сколько раз в год весь вложенный капитал превращается в выручку
Что это
Показывает, сколько рублей выручки генерируется на каждый рубль активов (деньги в товаре + дебиторка WB). Используется в формуле Дюпона.
Оборачиваемость активов = Годовая выручка / Средние активы
Пример
Годовая выручка 18,25 млн ₽ (50 пар × 1 000 ₽ × 365 дней), активы в среднем 5 млн ₽ (товар + дебиторка WB) → 3,65× в год
Смысл
Чем выше — тем эффективнее работают активы. Высокооборотный товар (носки, расходники) даёт высокое значение. Сезонный — низкое.
10. ROA и формула Дюпона
Сколько приносит каждый рубль всех ваших активов — и где узкое место
Что это
ROA — отдача на все активы. Формула Дюпона раскладывает его на два рычага: маржу и скорость оборота. Если ROA низкий — сразу видно, что исправлять: цену или скорость продаж.
ROA = Маржа % × Оборачиваемость активов
Пример
Маржа 29% × оборачиваемость 3,65× = ROA = 106% годовых — деньги работают отлично
Нормы
ROA > 50% — отличная отдача
20–50% — хороший бизнес
< 10% — слабее депозита, пересмотреть товар
Как использовать: ROA низкий → смотрите что слабее. Маржа? (→ поднять цену/снизить расходы). Оборачиваемость? (→ продавать быстрее / держать меньше товара).
11. GMROI — отдача на товарный запас
Сколько прибыли генерирует каждый рубль, лежащий в товаре
Что это
Главный KPI для ассортиментного управления. Показывает, насколько эффективны деньги, «замороженные» в товарном запасе. Идеален для сравнения SKU между собой.
GMROI = Годовая валовая прибыль / Средний товарный запас в ₽ × 100%
Пример
Валовая прибыль за год: 535 × 50 × 365 = 9,76 млн ₽. Средний запас: 1 000 пар × 300 ₽ = 300 000 ₽. GMROI = 9 760 000 / 300 000 = 3 253% — носки крутятся очень быстро
Нормы
> 200% — отличный товар
100–200% — норма
< 100% — товар крутится медленно
12. DROI — отдача на весь вложенный капитал
Учитывает не только товар, но и деньги в пути и дебиторку WB
Что это
Более полная версия ROI: считает все деньги в обороте — товар на складе, предоплаты поставщикам и выплату WB, которую ещё не получили.
DROI = Годовая чистая прибыль / (Товарный запас + Предоплаты + Дебиторка WB) × 100%
Пример
Чистая прибыль за год: 290 × 50 × 365 = 5,3 млн ₽. Капитал: товар 300 000 + предоплата 200 000 + ждём от WB 150 000 = 650 000 ₽. DROI = 815%
Смысл
Если DROI ниже ROI — значит деньги «в пути» работают неэффективно. Проверьте, не задерживает ли WB выплаты.
13. Срок окупаемости партии
За сколько дней вернутся деньги, вложенные в закупку
Что это
Показывает, через сколько дней чистая прибыль от продаж покроет начальные вложения в партию товара.
Срок окупаемости = Стоимость закупленной партии / Ежедневная чистая прибыль
Пример
Купили 1 000 пар × 300 ₽ = 300 000 ₽. Прибыль: 290 ₽/пара × 50 пар/день = 14 500 ₽/день. Окупаемость = 300 000 / 14 500 = 21 день
Нормы
< 30 дней — отлично
30–90 дней — нормально
> 180 дней — долго, пересмотреть экономику
14. Налог УСН — важный нюанс
База налога — это сумма покупателя, а не то, что перечислил WB
УСН «Доходы» 6%
Налог = Сумма, уплаченная покупателями × 6%.
Покупатель заплатил 1 000 ₽ → налог 60 ₽. WB перевёл 835 ₽ → налог всё равно 60 ₽, не 835 × 6%.
Покупатель заплатил 1 000 ₽ → налог 60 ₽. WB перевёл 835 ₽ → налог всё равно 60 ₽, не 835 × 6%.
Налог = Сумма продаж покупателям × Ставка УСН (%)
УСН «Д−Р» 15%
Налог = (Доходы − Подтверждённые расходы) × 15%. Выгоден, если расходы > 60% от доходов.
Как задать
⚙️ Настройки → «Налоговая ставка». Монитор автоматически применит её ко всем расчётам чистой прибыли.
⚠️ При ОСНО, патенте или НПД укажите ставку 0% и учитывайте налог вручную.
📦 Заказы и возвраты
Основные метрики продаж
Заказы
Что показывает
Сколько человек добавило ваш товар в корзину и оформило заказ сегодня/за период.
Важный нюанс
Заказ ≠ продажа. Часть заказов будет отменена или возвращена. Реальные деньги — это продажи (выкупы).
Как читать
Сравнивайте с вчерашним днём и средним за 7 дней. Резкое падение = сигнал проверить позиции в поиске.
Продажи (выкупы)
Что показывает
Сколько товаров покупатели реально получили и оплатили — уже после возможных отмен.
Почему важно
Именно продажи формируют выручку и рейтинг карточки в поиске WB.
Как читать
Продажи обычно ниже заказов на 10–30% (отмены + возвраты). Если процент выкупа падает — что-то не так с качеством или описанием.
Выручка
Что показывает
Сумма всех продаж по цене покупателя (до комиссии WB) за период.
Как читать
Растёт — хорошо
Стоит на месте — смотреть причину
Падает >20% — проверить остатки и позиции
Процент выкупа
Выкуп %
Что показывает
Какой процент заказов превратился в реальные продажи.
Выкуп = Продажи / Заказы × 100%
Как читать
> 80% — отлично
60–80% — норма
< 50% — что-то не то с товаром или описанием
Что делать
Если выкуп падает — проверить отзывы, фото, размерную сетку.
📈 Инвестор-метрики
Все инвестор-метрики перенесены в раздел Финансовое ядро — там ROI, GMROI, DROI, Дюпон, Payback, Оборачиваемость расписаны с примерами в рублях и нормальными диапазонами.
📱 Monitor 24
Главный экран — пульс бизнеса в реальном времени
Главный экран — открывать каждое утро. Monitor 24 показывает заказы, выкупы, возвраты и оперативную маржу в реальном времени (обновление каждые ~10 минут из Statistics API WB). Прибыль и маржа здесь — оперативная оценка; для итогового финансового анализа используйте вкладку Финансы. Все формулы прибыли и маржи — в разделе Финансовое ядро.
💼 Финансы
Еженедельные отчёты WB — главный источник точных финансовых данных
Вкладка Финансы строится на еженедельных отчётах WB (Finance API) — это самые точные данные: чистая прибыль, маржа и налог по каждой финансовой неделе (пн–вс). Текущая неделя неполная до воскресенья — сравнивайте только закрытые периоды. Данные Finance API точнее Monitor 24: знаменатель маржи здесь — выручка покупателя, а не выплата WB. Все формулы — в разделе Финансовое ядро.
🚚 Логистика
Как местоположение склада влияет на деньги
Вкладка Логистика показывает, как товар распределён по складам WB и во что это обходится: ИЛ (доля локальных доставок, норма > 70%), ИРП (надбавка за плохое покрытие, норма ≈ 0%) и КПС (хватает ли товара на каждом складе, норма 0.65–1.8). Правило простое: равномерное распределение = меньше расходы на логистику и лучше позиции в поиске.
📦 Юнит-экономика
Считаем прибыль на единицу товара — сколько реально зарабатываете с каждой продажи
Юнит-экономика считает прибыль на каждую единицу товара с учётом плановой логистики, хранения и рекламы WB. Главное действие: введите реальную себестоимость (закупка + доставка до WB + упаковка) — без неё все расчёты идут по заглушке 90 ₽ и недостоверны. Формулы прибыли, ROI и маржи — в разделе Финансовое ядро.
🔤 ABC/XYZ-анализ
Классификация товаров по ценности и предсказуемости спроса
ABC/XYZ-анализ классифицирует товары по двум осям: ABC — вклад в выручку (A: топ-20% артикулов → 80% выручки; B: следующие 30%; C: остальные 50%), XYZ — стабильность спроса (X — стабильный, Y — умеренный, Z — хаотичный). Матрица AX/CZ подсказывает, куда вложить рекламный бюджет (AX-товары) и что пора выводить (CZ — маленькая выручка и непредсказуемый спрос). D-категория — нулевые продажи за период: разобраться причина стокаут, скрытая карточка или реальный нуль спроса.
🔄 Перераспределение
Умное перемещение товара между складами WB без новых закупок
Перераспределение предлагает план межскладских перемещений без новых закупок: находит склады с избытком (КПС > 1.8) и дефицитом (КПС < 0.65) и считает, сколько единиц куда переместить. Цель — улучшить ИЛ, снизить ИРП-надбавку и избежать стокаутов в нужных регионах. Монитор даёт расчёт-ориентир; реальное перемещение оформляется в ЛК WB (нужны открытые слоты приёмки).
📬 Telegram-уведомления
Настройте алерты прямо в Telegram — важное придёт само, без открытия монитора
Telegram-уведомления отправляют срочные алерты прямо в чат без открытия монитора: 🔴 стокауты, убытки, масс-выкуп; 🟠 дефицит КПС, ИРП-надбавка, низкий выкуп; 🟣 рост нелокальных заказов. Жёлтые/зелёные/синие — только в интерфейсе, в Telegram не идут. Монитор поддерживает до 11 тематических тредов (Стокауты, Финансы, Логистика…); настройка: ⚙️ Настройки → Telegram, потребуется токен бота от @BotFather.
⭐ Отзывы
Анализ отзывов покупателей — автоматически, без ручного чтения каждого
Вкладка Отзывы показывает тайм-бар: когда и сколько появилось плохих отзывов (1–3 звезды) — резкий всплеск красных меток = смена партии, упаковки или описания. AI-анализ автоматически группирует жалобы по темам (размер, качество, упаковка) и выводит топ-3 проблемы, без чтения каждого отзыва вручную. Рейтинг ниже 4.0 — красная зона: WB снижает показы карточки в поиске.
📥 Пополнение склада
Как читать рекомендации поставок
Принцип расчёта: Монитор смотрит на средний темп продаж за последние 7/30/45 дней (берёт максимум) и считает, сколько нужно привезти, чтобы держать 30-дневный запас с учётом текущего остатка.
Рекомендация поставки
Что показывает
Сколько единиц конкретного товара нужно привезти на каждый склад, чтобы не уйти в стокаут в ближайшие 30 дней.
Нужно = Средний_день × 30 − Текущий_остаток
Приоритет
Учитывает улучшение ИРП — если поставка на этот склад снизит надбавку к логистике, рекомендация помечается как высокоприоритетная.
Что делать
Начинать с красных позиций (стокаут или менее 7 дней), затем оранжевых (7–14 дней).
⚠️ Рекомендация — это ориентир, не жёсткое требование. Учитывайте сезонность, акции и свои производственные возможности.
🔔 Алерты
Какие ситуации монитор отслеживает автоматически
Стокаут — товар кончился
На одном или нескольких складах не осталось товара. Прямо сейчас вы теряете продажи.
→ Немедленно: проверить остатки, планировать срочную поставку. Каждый день стокаута = потерянные заказы и падение позиций в поиске.
Менее 3 дней запаса
Товар заканчивается через 1–3 дня. Поставка уже опаздывает.
→ Если везти самовывозом — отправлять сегодня. Если через логиста — уже срочно.
ИРП вырос — логистика подорожала
Индекс регионального покрытия вырос на 0.2+ пункта. WB начал брать надбавку за плохое покрытие регионов.
→ Посмотреть карту КПС на вкладке Логистика. Найти склады с дефицитом и запланировать поставку туда.
КПС дефицит на складе
КПС (ИРР) склада упал ниже 0.65 — склад получает значимую долю спроса (>3% запасов),
но недозаполнен относительно неё. Алерт показывает: дефицит в штуках (сколько добавить
до баланса), топ-2 артикула по срочности (дни до стокаута) и склад-донор с профицитом
для перераспределения.
Пример: «Екатеринбург ИРР=0.51 (есть 651 шт., нужно ещё +627 шт.). Срочно: Куртка А-233 (23 шт., 4.0 шт./д, 5 дн.). Донор: Краснодар (ИРР=2.1, профицит ~340 шт.).»
Пример: «Екатеринбург ИРР=0.51 (есть 651 шт., нужно ещё +627 шт.). Срочно: Куртка А-233 (23 шт., 4.0 шт./д, 5 дн.). Донор: Краснодар (ИРР=2.1, профицит ~340 шт.).»
→ Проверить топ SKU из алерта — они первые уйдут в стокаут. Переместить товар со склада-донора или оформить поставку. Результат: рост ИЛ, снижение ИРП.
Падение выкупа
Процент выкупа заметно снизился относительно среднего. Больше людей отказываются от товара после получения.
→ Проверить отзывы последних 7 дней. Возможно, изменилось качество партии или описание не соответствует товару.
Убыточный артикул
Один или несколько товаров продаются с отрицательной маржой — каждая продажа приносит убыток.
→ Проверить себестоимость и цену. Поднять цену или остановить продажи до пересмотра экономики.
Нелокальные заказы выросли
Доля межрегиональных заказов выросла на 10+ пп. ИЛ ухудшается — растут расходы на логистику.
→ Понять, откуда пошли нелокальные заказы (новый регион спроса?) и рассмотреть поставку туда.
Падение спроса
Продажи за последние 3 дня упали ниже 50% от среднего за 7 дней. Спрос резко просел.
→ Проверить позиции в поиске (вкладка SEO). Возможно, сменился сезон или появился сильный конкурент. Рассмотреть участие в акции.
Скачок спроса
Продажи резко выросли (в 3–5× выше нормы — оранжевый; в 5× и более — красный). Может быть органика, акция или масс-выкуп.
→ Срочно проверить остатки. Если рост органический — немедленно запланировать поставку. Если масс-выкуп — мониторить следующие 24–48 часов.
Низкий процент выкупа
Покупатели выкупают товар реже обычного. Порог: ниже 80% — предупреждение 🟠, ниже 65% — критично 🔴.
→ Изучить последние отзывы. Проверить, не изменилось ли качество партии или упаковка. Сравнить с конкурентами.
Медленная оборачиваемость
Товар распродаётся слишком медленно: 30–60 дней запаса — предупреждение, более 60 дней — критично. Деньги «заморожены» в складе WB.
→ Рассмотреть снижение цены или участие в акции. Проверить, актуален ли товар в текущем сезоне.
Финансовая аномалия недели
Один из финансовых показателей (выручка, маржа, возвраты) в текущей неделе отклонился более чем на 2σ от среднего по последним 4–8 неделям.
→ Открыть вкладку Финансы, проверить динамику текущей недели. Может быть плановой акцией или неожиданным падением.
🤖 AI-помощник
Что умеет AI-чат и как его использовать
Что умеет AI-чат
Анализ данных
Отвечает на вопросы о вашей аналитике на основе реальных данных монитора (заказы, склады, финансы).
Рекомендации
Объясняет алерты, предлагает конкретные действия по поставкам и ценообразованию.
Что не умеет
Не меняет цены, не делает заказы поставщикам, не отвечает на общие вопросы не про ваш магазин.
Как спрашивать эффективно
Хорошие вопросы
«Что важного сегодня?» / «Какой у меня ИРП и что с ним делать?» / «Какие товары в стокауте?» / «Сколько я заработал за неделю?»
По артикулу
«Покажи состояние артикула 123456» — покажет остатки, маржу, динамику конкретного товара.
Разбор дня
Кнопка «Разбор дня» в разделе AI — полный автоматический анализ ситуации и топ-3 рекомендации.
❓ Часто задаваемые вопросы
Почему заказы в мониторе отличаются от кабинета WB?
Небольшое расхождение (1–5%) нормально — данные обновляются с задержкой. Если расхождение большое — нажмите «Обновить данные» или проверьте дату синхронизации.
Почему forPay меньше, чем я ожидал?
forPay уже после комиссии WB и эквайринга. Итоговая выплата ещё меньше — из неё WB вычтет логистику, хранение и другие расходы. Смотрите L2 для реальной прибыли.
Что делать если AI не знает мои данные?
AI использует данные из последнего обновления монитора. Нажмите «Запустить агента» в разделе AI, подождите 1–2 минуты и повторите вопрос.
Почему рекомендуемая поставка кажется завышенной?
Монитор считает на 30-дневный запас от пикового спроса (максимум за 7/30/45 дней). Если был всплеск продаж — расчёт будет консервативным. Ориентируйтесь на своё понимание сезонности.
Как часто обновляются данные?
Заказы и остатки — примерно каждые 10 минут. Финансовые данные (Finance API WB) — раз в час (rate limit WB: 1 запрос в минуту). Разбор дня агента — по запросу.
Что значит «расчётный» vs «тарифный» ИЛ?
«Расчётный» — монитор считает из ваших реальных заказов за 91 день. «Тарифный» — введённый вручную коэффициент из личного кабинета WB. Если вы не вводили тарифный — используется расчётный.
Почему маржа на странице Финансы отличается от маржи в Monitor 24?
Они считают на разных данных. Monitor 24 использует Statistics API (быстрые оперативные данные), Финансы — Finance API WB (медленнее, но точнее). Кроме того, знаменатель маржи может отличаться: на Финансах — выручка (price_with_disc × кол-во), в оперативном мониторе — иногда forPay. Для итогового анализа доверяйте вкладке Финансы.
Что значит "оценка по неполной неделе"?
WB закрывает финансовые недели в воскресенье вечером. Если вы смотрите на текущую (незакрытую) неделю, данные неполные — цифры ещё будут расти. Монитор помечает такие данные как «неполная неделя» или выделяет их серым. Для сравнения используйте закрытые недели.
Откуда берётся рекомендация перераспределения?
Алгоритм смотрит на ИРР (коэффициент покрытия) по каждому складу: находит склады с избытком (ИРР > 1.8) и дефицитом (ИРР < 0.65). Затем считает, сколько единиц каждого SKU нужно переместить с донора на получателя, чтобы выровнять покрытие. В основе — реальный спрос по складам за 30 дней.
Почему прибыль в мониторе отличается от выплаты в ЛК WB?
Это разные вещи. В мониторе показывается L2 (операционная прибыль = forPay − себестоимость − расходы WB). Выплата в ЛК WB — это forPay (до вычета вашей себестоимости), агрегированная за 2 недели. Ещё разница: выплата включает несколько недель сразу, а монитор показывает по периодам.
Что делать, если в ABC/XYZ товар попал в "D" (нулевые продажи)?
D-категория означает нулевые или почти нулевые продажи за выбранный период. Причины: (1) стокаут — товара нет на складе; (2) карточка скрыта WB; (3) реальный нуль спроса — никто не ищет этот товар. Проверьте остатки, видимость карточки в поиске, и если спроса нет — рассмотрите вывод товара из ассортимента.
Почему ROI у одного товара 200%, а у другого 40% — при похожей марже?
Маржа % считается от выручки, ROI — от себестоимости. Дешёвый товар с высокой маржой даёт огромный ROI: купили за 50 ₽, продали за 800 ₽ → маржа 50%, ROI 700%. Дорогой товар с той же маржой: купили за 2000 ₽, продали за 4000 ₽ → маржа 50%, ROI 100%. ROI — лучший инструмент для сравнения товаров с разными ценовыми диапазонами.
Как настроить Telegram так, чтобы не спамил ночью?
В Telegram-группе можно включить «Не беспокоить» на ночные часы — это стандартная функция Telegram, не монитора. Для фильтрации по типу алертов создайте отдельные темы (топики) в группе: критические (🔴🟠) в общую тему, менее срочные — в отдельную. Красные и оранжевые алерты всегда идут в Telegram — отключить их можно только полностью.
📁 Источники данных — Source of Truth
| Метрика | Source of Truth | Файл | Примечание |
|---|---|---|---|
| forPay | wb_reports_cache → net_payout | wb_reports_cache.py | Finance API rows агрегация |
| L1 (Gross profit) | metrics_layer.compute_gross_profit() | metrics_layer.py | forPay − COGS |
| L2 (Operating profit) | metrics_layer.compute_net_profit_l2() | metrics_layer.py | forPay − COGS − WB expenses |
| L3 (Net profit) | metrics_layer.compute_net_profit_l3() | metrics_layer.py | L2 − налог |
| Маржа % | metrics_layer.compute_margin_pct() | metrics_layer.py | profit/revenue×100 |
| PPU | metrics_layer.compute_ppu() | metrics_layer.py | ≈38% overestimate без per-unit логистики |
| ИЛ расчётный | localization_engine.calc_global_localization() | localization_engine.py | 91 день, weighted avg КТР per-SKU |
| ИЛ тарифный | user_prefs.json → wb_localization_index | config / user_prefs.json | Ручной ввод из ЛК WB |
| ИРП расчётный | localization_engine.calc_global_localization() | localization_engine.py | Weighted avg КРП per-SKU |
| ИРП тарифный | user_prefs.json → wb_irp_pct | user_prefs.json | Ручной ввод из ЛК WB |
| КПС / ИРР | stock_demand_engine.calc_irr_by_wh() | stock_demand_engine.py | остаток/спрос per-склад |
| Рекомендация поставки | restock_engine.parse_restock() | restock_engine.py | avg×30 − stock; единственная формула |
| Остатки | wb.sqlite → stocks | wb_db.py | Статистика API |
| Заказы/Продажи | wb.sqlite → orders/sales | wb_db.py | Статистика API |
| Финансы по неделям | fin_report_rows → wb_reports_cache | wb_reports_cache.py | Finance API (rate limit 1/мин) |
📐 Канонические формулы
Всегда использовать metrics_layer.py и FORMULAS.py. Не дублировать inline в JS или других Python-модулях.
| Формула | Python (metrics_layer) | Константы (FORMULAS.py) |
|---|---|---|
| Gross Profit | compute_gross_profit(for_pay, cogs) | — |
| Net Profit L2 | compute_net_profit_l2(for_pay, cogs, logistics, storage, penalties, promotion, acquiring, deductions) | — |
| Margin % | compute_margin_pct(profit, revenue) | — |
| PPU | compute_ppu(for_pay_unit, cogs) | — |
| WB Logistics Planned | calc_wb_logistics_planned(weight, volume, il_coeff, wh_coeff) | WB_LOGI_INDEX_FALLBACK=1.33 |
| Fallback ИЛ | — | WB_LOGI_INDEX_FALLBACK = 1.33 |
| Fallback ИРП | — | WB_IRP_PCT_FALLBACK = 0.0 |
| Neutral WH Coeff | — | WB_WH_COEFF_NEUTRAL = 1.0 |
ИЛ расчётный (WB-корректный)
ИЛ = Σ(КТР_nm × orders_nm) / Σ(orders_nm) # per-SKU weighted avg
Данные: последние 91 день (13 недель WB)
КТР_TABLE: localization_engine.py → irp_engine.py (апроксимация)
ИРП расчётный (WB-корректный)
ИРП = Σ(КРП_nm × orders_nm) / Σ(orders_nm) # per-SKU weighted avg
КРП_TABLE: irp_engine.py → единственный source of truth
КПС / ИРР per-склад
КПС = stock_wh / demand_wh
Дефицит: КПС < 0.65 при stock_share >= 3%
Избыток: КПС > 1.80 при stock_share >= 3%
⚙️ Движки расчёта
| Движок | Файл | Что считает | Коммит |
|---|---|---|---|
| restock_engine | restock_engine.py | Рекомендации поставок (склад × артикул × units) | 3ed3c22 |
| localization_engine | localization_engine.py | ИЛ/ДЛ WB-корректный (weighted avg КТР per-SKU) | 7d522e3, c0ee554 |
| irp_engine | irp_engine.py | ИРП/КРП per-SKU lookup + simulate_irp_after_restock() | df38bbf |
| stock_demand_engine | stock_demand_engine.py | КПС/ИРР per-склад | 0f4d2dc |
| geo_constants | geo_constants.py | WH→регион→макрорегион маппинги | 94a0237 |
| metrics_layer | metrics_layer.py | L1/L2/L3, margin, PPU — канонические функции | — |
| ai_brain | ai_brain.py | Коллектор + приоритизатор (без GPT) | — |
🔌 API-эндпоинты
| Endpoint | Метод | Что возвращает | Файл роута |
|---|---|---|---|
| /api/tariffs/wb-indexes | GET | ИЛ, ИРП, il_source, irp_source, is_configured | api_tariffs.py |
| /api/localization/summary | GET | Сводка локализации: ил%, дл%, per-SKU | api_localization.py |
| /api/localization/sku | GET | ИЛ/ДЛ per-SKU | api_localization.py |
| /api/geo/wh-map | GET | WH→регион→макрорегион карта | api_geo.py |
| /api/fin-weeks | GET | Список недель из кэша | api_finance.py |
| /api/wb-finance/summary | GET | Агрегаты за период | api_finance.py |
| /api/wb-finance/daily-week | GET | Данные текущей недели | api_finance.py |
| /api/wb-finance/daily-status | GET | fin_load_ts, last_loaded_period | api_finance.py |
| /api/agent/chat | POST | AI ответ (поток D) | api_agent.py |
| /api/agent/run | POST | Запуск разбора дня (поток A) | api_agent.py |
| /api/agent/chat-debug | POST | Контекст чата без вызова OpenAI | api_agent.py |
| /api/agent/debug-prompt | GET | Последний промпт advise() (поток A) | api_agent.py |
| /api/ai-brain/state | GET | Полный brain state JSON | api_agent.py |
| /api/ai-brain/priorities | GET | 4 списка приоритетов | api_agent.py |
| /api/advice | GET | AI совет для вкладки (поток C) | api_misc.py |
🗺 Карта JS-модулей
Редактировать только static/js/XX_*.js. После правки: python build_dashboard.py. Коммитить оба файла.
| Модуль | Метрики | Функции (grep) |
|---|---|---|
| 04_kpi.js | ИЛ расчётный (badge) | renderKpiPanel(), renderKpiBadges() |
| 11_logistics.js | ИРП расчётный, КПС/ИРР matrix | renderLogisticsTab(), renderIrrTable() |
| 13_finance_tab.js | ИЛ тариф, ИРП тариф, все финансы | _wbfRenderSummary(), renderFinanceTab() |
| 20_geography.js | ИРР/КПС сводка, KPI-панель | renderLogKpiPanel(), initIrrTable() |
| 28_unit_econ.js | ИЛ/ИРП badge (source fallback) | renderUnitEconTab() |
| 24_fin_params.js | ИЛ/ИРП ручной ввод (тарифный) | renderFinParams() |
| 03_formulas.js | L1/L2/L3, margin, PPU — JS-формулы | computeGrossProfit(), computeMarginPct() |
| 22_ai_chat.js | AI чат | agentChatSend(), initAiChat() |
| 17_ai_advice.js | AI советы на вкладках | requestAIAdvice(), _buildAICtx() |
⚠️ JS-модули 02, 11, 12, 13, 14, 23 — большие (120+ KB). Редактировать только нужный фрагмент через atomic-replace. static/dashboard.js — generated bundle, НИКОГДА не редактировать напрямую.
⚠️ Legacy и deprecated
| Поле / константа | Статус | Заменено на | Где встречается |
|---|---|---|---|
| wb_warehouse_coeff | ⚠️ Legacy | WB_WH_COEFF_NEUTRAL = 1.0 | 13_finance_tab.js, unit_econ |
| wb_localization_coeff | ⚠️ Legacy | wb_localization_index + il_calc_coeff | Finance params, unit_econ |
| hardcoded ||1.33 | ✅ Исправлено | WB_LOGI_INDEX_FALLBACK | 13_finance_tab.js (коммит 9d32fad) |
| hardcoded ||1.7 | ✅ Исправлено | _FIN_WB_WH_COEFF_LEGACY | 13_finance_tab.js (коммит 9d32fad) |
| ИЛ = non_hub/total | ✅ Исправлено | Weighted avg КТР per-SKU | localization_engine.py (коммит c0ee554) |
| ИРП = global lookup | ✅ Исправлено | Weighted avg КРП per-SKU | localization_engine.py (коммит c0ee554) |
| _chat_history (module-level) | ⚠️ Non-persistent | ai_chat_memory.json (Этап 3, не реализован) | ai_pipeline.py |
🐛 Открытые баги и техдолг
| ID | Описание | Статус | Файлы |
|---|---|---|---|
| BUG-01 | PPU ≈ 38% завышен: логистика/хранение не per-unit | ⚠️ Known limitation — задокументировано в note к карточке PPU | metrics_layer.py |
| BUG-02 | Inline margin в agent_core.py:419-420, daily_metrics.py:~1199 — не через metrics_layer | 🔲 Открыт (техдолг группа A) | agent_core.py, daily_metrics.py, prompts.py |
| BUG-03 | Inline JS margin в 09/10/11/17/02_*.js — не через computeGrossProfit() | 🔲 Открыт (техдолг группа B) | static/js/09,10,11,17,02 |
| BUG-04 | _chat_history не персистируется — теряется при рестарте | 🔲 Открыт (Этап 3) | ai_pipeline.py |
| BUG-05 | wb_warehouse_coeff/wb_localization_coeff — legacy поля остались в коде | ⚠️ Задокументировано, не ломает | 13_finance_tab.js, unit_econ |
Критерий готовности техдолга (Фаза 4): На одном артикуле с известной себестоимостью: Монитор (KPI) = SKU tab = Финансовый таб = Telegram = AI чат = Excel. Допуск ±1 ₽ или явно помечено «📐 аппроксимация».
🚨 Архитектура алертов
Полный справочник: функции, пороги, маршрутизация
Layer 0 — Общие алерты (alerts.py → build_alerts())
| Функция | Что проверяет | Порог warn | Порог crit | Уровни |
|---|---|---|---|---|
| _revenue_alert | Падение выручки | −15% | −30% | yellow / orange / red |
| _orders_alert | Падение заказов | −15% | −30% | yellow / orange / red |
| _returns_alert | Рост возвратов | >15% | — | yellow |
| _cancels_alert | Рост отмен | ≥30% | ≥50% | yellow / red |
| _localization_alert | Нелокальные заказы | LOC_CHANGE_WARN=10pp | LOC_CHANGE_RED=20pp | yellow / red |
| _anomaly_alert | Статистические аномалии (σ) | 2σ | — | yellow |
| _buyout_alert | Выкуп покупателями | <80% | <65% | orange / red |
| _margin_alert | Маржа артикула | FIN_MARGIN_WARN=10% | FIN_MARGIN_CRIT=5% | yellow / red |
| _spp_alert | СПП покупателя | >50% | — | blue |
| _activity_alert | Активность (нет заказов) | — | 0 заказов | gray / red |
| _turnover_alert | Оборачиваемость | TURNOVER_WARN=30d | TURNOVER_CRIT=60d | yellow / orange |
| _stock_alert | Остаток дней | STOCK_WARN=14d | STOCK_CRIT=7d | yellow / red |
| _restock_alert | Рекомендации поставки | needed>0 | — | blue |
| _transfer_alert | Перемещение товара | — | — | blue |
| _reviews_alert | Новые плохие отзывы | rating≤3 | — | orange |
| _growth_alert | Рост продаж | 3–5× | ≥5× | green / orange |
| _demand_drop_alert | Падение спроса (3д vs 7д) | <50% | — | yellow |
| _fin_anomaly_alert | Финансовая аномалия недели | 2σ | — | yellow |
| _new_report_alert | Новый финотчёт WB | — | — | green |
| _mass_buyout_alert | Масс-выкуп | MASS_BUYOUT=2.5× | MASS_BUYOUT_CRIT=6.0× | orange / red |
Layer A — Логистические алерты (alerts.py)
| Функция | Что проверяет | Порог | Уровни |
|---|---|---|---|
| _irp_calc_alert | ИРП вырос | ≥0.20 пп (КРП-порог) | orange / red |
| _interregional_growth_alert | Нелокальных заказов +10 пп | LOC_CHANGE_WARN=10pp | yellow / orange |
| _irr_deficit_alert | ИРР < 0.65 на складе ≥3% запаса | IRR_DEFICIT=0.65 | orange / red |
| _irr_excess_alert | ИРР > 1.80 на складе ≥3% запаса | IRR_EXCESS=1.80 | yellow |
| _sku_dl_degradation_alert | ДЛ < 15% по артикулу | SKU_DL_LOW=15.0% | yellow |
Маршрутизация в Telegram
| Уровень | В Telegram? | Цвет в UI |
|---|---|---|
| 🔴 red | ✅ Да | #DC2626 |
| 🟠 orange | ✅ Да | #D97706 |
| 🟣 purple | ✅ Да | #a78bfa |
| 🟡 yellow | ❌ Только UI | #CA8A04 |
| 🟢 green | ❌ Только UI | #16A34A |
| 🔵 blue | ❌ Только UI | #2563EB |
| ⚪ gray | ❌ Только UI | #6B7280 |
Канонические пороги (source of truth — alerts.py)
| Метрика | Порог warn | Порог critical | Canonical source |
|---|---|---|---|
| ИРР дефицит | — | < 0.65 | alerts.py IRR_DEFICIT_THRESHOLD |
| ИРР избыток | > 1.80 | — | alerts.py IRR_EXCESS_THRESHOLD |
| Сток критично | ≤ 14 дней | ≤ 7 дней | alerts.py STOCK_WARN_DAYS / STOCK_CRITICAL_DAYS |
| Отмены | ≥ 25% | ≥ 50% | alerts.py + agent_core RULES (unified) |
| Оборачиваемость | > 30 дней | > 60 дней | alerts.py TURNOVER_WARN_DAYS / TURNOVER_CRITICAL_DAYS |
| Выкуп покупателей | < 80% | < 65% | alerts.py + agent_core RULES |
| Маржа артикула | < 10% | < 5% | alerts.py FIN_MARGIN_WARN / FIN_MARGIN_CRITICAL |
| Падение спроса | 3д < 50% от 7д | 3д < 25% от 7д | alerts.py DEMAND_DROP_RATIO / DEMAND_DROP_CRITICAL |
ai_brain — правила классификации
| Условие | Бакет приоритетов |
|---|---|
| alert.level == "red" | critical |
| alert.level == "orange" | important |
| alert.level == "yellow" | attention |
| alert.level in (green, blue, purple) | opportunities |
| Локализация нелокальных ≥35% | important (Layer A) |
| Локализация нелокальных ≥25% | attention (Layer A) |
| ИРП дельта >0.10 пп | important (Layer A) |
| ИРР дефицит <0.65 | important (Layer A) |
| ИРР избыток >1.80 | attention (Layer A) |
| Restock boost ≥2.0× | important (Layer A) |
| Выручка упала ≥30% (fallback) | critical |
| Stockout (fallback) | critical |
| Дней остатка <7 (fallback) | critical |
| Маржа <0 (fallback) | critical |