Кейс: дашборд собственника
ENRU
Кейс - инструмент собственника

Дашборд юнит-экономики, который объясняет каждый рубль

Инструмент для собственника бизнеса автозапчастей на Ozon. Считает реальную прибыль с единицы по 9 статьям затрат, держит рекламный бюджет в жёстком лимите и подсказывает, сколько денег можно безопасно вывести. Собран быстро, за считанные дни. Первая стадия - только рекомендации: у каждой цифры есть обоснование, и ничего не применяется автоматически.

FastAPIPostgreSQLCelery + RedisChart.js Ozon Seller APIOzon Performance APIDocker
48
HTTP-маршрутов в API
29
таблиц БД под миграциями Alembic
10
аналитических модулей, ~3 000 строк бизнес-логики
9
статей затрат между ценой и прибылью с единицы
5 / 10
живых графиков / секций дашборда на одном экране
~2 700
реальных продаж обработано за 3 месяца эксплуатации
01 Контекст и боль

Реклама жгла кассу. Экономика жила по наитию.

Продавец стартеров, генераторов и щёток стеклоочистителя на Ozon. Десятки SKU, логистика FBO, сторонний склад хранения, живые рекламные кампании. Кабинет маркетплейса показывает выручку. Он никогда не показывает прибыль с единицы после всех комиссий.

Прибыль с единицы была неизвестна

Цена минус закупка - это не прибыль. Комиссия маркетплейса, два плеча логистики, хранение, реклама, брак, операционка и налог забирают своё. Ничего из этого не было видно по SKU.

Реклама без ограждения

Кампании продолжали тратить, но ДРР по SKU никто не отслеживал. ДРР - доля рекламных расходов в выручке, ключевая метрика эффективности рекламы на маркетплейсах. Кампания может много продавать и всё равно терять деньги.

Пополнение по интуиции

Поставка FBO занимает недели. Заказал поздно - бестселлер уходит в out-of-stock. Заказал рано - деньги замерзают на полке. Картины дней запаса по каждому SKU не было.

Сколько собственнику можно вывести?

Выведешь слишком много - следующая закупка голодает. Выведешь слишком мало - бизнес никому не платит. Ответ менялся с каждым взглядом на кабинет, потому что реальную чистую прибыль никто не знал.

02 Архитектура системы

От двух API Ozon до одного экрана собственника

Синк-джобы забирают товары, продажи, остатки, финансовые транзакции и рекламную статистику в PostgreSQL. Десять аналитических модулей превращают сырые строки в юнит-экономику, планы и рекомендации. Собственник работает в одном тёмном дашборде: 10 секций, 5 графиков, один экран.

ДАННЫЕ ЭКРАН СОБСТВЕННИКА Ozon Seller API товары · продажи · остатки финансовые транзакции возвраты · отмены Ozon Performance API кампании · дневная статистика OAuth client credentials Данные собственника CSV / XLSX из 1С Excel-шаблон на 7 листов Playwright-загрузчик отчётов из кабинета Слой синхронизации синк продаж и остатков синк финансов · рекламы ежедневный пересчёт Celery полный синк одной кнопкой mock-режим: полное демо без единого API-ключа PostgreSQL 29 таблиц · 6 миграций сырые финансовые строки как источник истины снапшоты по дням 10 аналитических модулей юнит-экономика · P&L ABC · план поставок рекламный бюджет · вывод ДС проблемы · очередь отзывов монитор изменения условий отчёты по конкурентам ~3 000 строк · у каждого результата обоснование Дашборд собственника 10 секций · 5 графиков 8 KPI-карточек · алерты прогноз выплат 7 / 30 дн применяет или отклоняет человек Страница отчётов сортируемая юнит-экономика цветовая шкала оборота рекомендации + почему Excel туда и обратно 11 CSV + мастер-шаблон 3 экспорта для поставок fact-first: сначала факт транзакций, потом тариф, потом среднее
Внешние источники Сервисы синка и аналитики Хранилище данных Экраны собственника
48HTTP-маршрутов в 7 роутерах
29таблиц, 6 миграций Alembic
~3 000строк аналитической логики
2 005строк: дашборд-SPA одним файлом
11 + 1CSV-шаблонов + Excel-мастер на 7 листов

Деталь, важная для доверия: финансовые цифры идут по каскаду fact-first. Если есть фактическое значение из финансовых транзакций Ozon, берётся оно; фолбэк - опубликованный тариф; крайний случай - средняя историческая ставка. Дашборд никогда молча не выдумывает цифру. Без API-ключей вся система работает на mock-данных, поэтому полному демо не нужен реальный кабинет.

Сводка дашборда: KPI-карточки выручки, чистой прибыли, капитала, склада и ДРР, плюс прогноз выплат
Секция Сводка: 8 KPI-карточек (выручка, чистая прибыль, капитал в стоке, ДРР) и бар прогноза выплат Ozon.
03 Флагманский модуль

Юнит-экономика: 9 статей затрат между ценой и прибылью

Для каждого SKU расчёт начинается с фактической цены продажи из финансовых транзакций Ozon, а не с цены в карточке. Дальше вычитается каждый рубль на пути к чистой прибыли после налога. Каждая строка говорит, откуда взялась её цифра.

+
Фактическая цена продажиначисления за продажу из финансовых транзакций, делённые на проданное количество
Себестоимость (COGS)импортируется из Excel собственника, по партиям
Комиссия Ozonфакт из финансовых строк; фолбэк: тариф категории; крайний случай: средняя историческая ставка
Логистика доставки FBOфактическая стоимость доставки по продаже; при отсутствии факта - фиксированная ставка
Обратная логистикаплечо возврата по невыкупам, из фактических начислений за возвратную доставку
Хранение на стороннем складесреднедневная ставка склада, умноженная на период и делённая на штуки
Реклама на единицурасход кампаний, отнесённый на SKU, делённый на проданные штуки
Резерв на брак5% себестоимости резервируется под бракованные единицы
Разнесённая операционкаоперационные расходы, распределённые на штуки
Налогупрощённый режим, 15% с базы прибыли
=
Чистая прибыль с единицы, после налогаплюс маржа %, флаги по каждому нарушенному правилу политики и текстовое обоснование

Три полиси-фильтра на каждом SKU

Минимальные стандарты собственника - часть конфигурации, а не чьей-то памяти. Каждый SKU проверяется по всем трём при каждом пересчёте.

Маржа≥ 15%
Прибыль со шт≥ 100 ₽
ДРР (доля рекламы)≤ 20%

SKU, нарушивший правило, подсвечивается на дашборде, и в объяснении названа конкретная статья затрат, которая убила маржу.

P&L после налога, любой период

День, неделя, месяц или произвольный диапазон дат. Полная постатейная раскладка за период, чистая прибыль после налога и рост к прошлому периоду. Панель алертов следит за out-of-stock, остатком меньше 14 дней, отсутствием COGS и высоким ДРР, с боковой панелью детализации по SKU.

Объяснимость по дизайну

Только рекомендации. Причины всегда.

Первая стадия ничего не меняет сама. Каждый расчёт заканчивается строкой обоснования: какой источник данных использован, какой фолбэк сработал, какое правило политики нарушено. Собственник всегда может ответить на вопрос, почему дашборд так говорит, не читая код. Прозрачные правила вместо чёрного ящика.

Секция P&L: табы периодов, карточки постатейной раскладки, график выручки и прибыли, панель алертов
P&L: табы периодов, постатейная раскладка, график выручки / прибыли / рекламы за 30 дней и панель алертов.
Страница отчётов: сортируемая таблица юнит-экономики с ценой, затратами, прибылью с единицы, маржой, ДРР и оборачиваемостью
Страница отчётов: сортируемая юнит-экономика по SKU, с маржой, ДРР и цветовой колонкой оборачиваемости.
04 Модуль рекламы

Реклама: ДРР, ROAS и бюджет, который следует правилам

Секция рекламы соединяет статистику Ozon Performance с реальными продажами. Расход, клики, CTR, заказы и выручка с рекламы, ДРР и ROAS в скользящем окне 30 дней. Поверх цифр лежит недельный план бюджета с тремя прозрачными правилами.

ДРР под жёстким лимитом

ДРР - расход на рекламу как доля выручки. Дашборд показывает его чипом: выше лимита или в норме, видно с одного взгляда. Сам лимит - те же 20%, что и в полиси-фильтре юнит-экономики.

ROAS с целевым уровнем

Выручка с рекламы, делённая на рекламный расход. Дашборд считает здоровым уровень от 3 и выше. Вместе с ДРР это отвечает на единственный важный вопрос: кампания зарабатывает или теряет деньги?

Органика против рекламы

Продажи делятся на органические и рекламные, и собственник видит, сколько продалось бы и без рекламы. График структуры бюджета показывает, куда уходит каждый рекламный рубль по SKU.

Недельный план бюджета

  1. Базовый бюджет. 3 000 ₽ на SKU в неделю как стартовая точка, разбитая в дневной план по дням недели.
  2. ДРР выше лимита: срезать. Бюджет SKU снижается, и рекомендация говорит, на сколько и почему.
  3. ДРР ниже 5%: масштабировать. Дешёвый спрос не остаётся на столе; система предлагает поднять бюджет.
  4. Out-of-stock: пауза. Рекламировать SKU с нулевым остатком - жечь деньги дважды. План ставит его на паузу и говорит об этом.

Это те же ходы, которые сделал бы внимательный рекламный менеджер. Разница в том, что система делает их последовательно, для каждого SKU, каждую неделю, и всегда показывает обоснование.

Секция рекламы: расход, клики с CTR, заказы с рекламы, выручка рекламы, чип ДРР и ROAS, график структуры бюджета
Секция рекламы: KPI-полоса с расходом, CTR, чипом ДРР и ROAS, плюс график структуры бюджета.
05 Оборачиваемость и поставки

Дни запаса, скорость продаж и план поставок с дедлайнами

Каждый SKU показывает свою оборачиваемость: сколько дней запаса осталось и скорость продаж, посчитанные по реальным продажам за последние 30 дней. Цветовая шкала делает риск читаемым с одного взгляда: 14 дней и меньше - красный, 30 и меньше - янтарный. Поверх этого план пополнения превращает риск в заказ поставщику.

Плечо поставки учтено

План закладывает плечо поставки 12 недель и цель распродать заказанную партию за 8 недель. От остатка и скорости он идёт назад к явному дедлайну заказа по каждому SKU.

Срочность, а не шум

Позиции ранжируются как critical или high, рекомендованный объём заказа округляется до кратности упаковки, рядом оценка COGS партии. Собственник видит короткий список, а не стену цифр.

Excel для цепочки поставок

Два экспорта в один клик: план поставок и лист распределения по складам. План покидает дашборд в том формате, с которым реально работают поставщики и склад.

12 недплечо поставки в плане
8 недцелевой срок распродажи заказа
≤ 14 днзапаса - строка горит красным
3Excel-экспорта для операционки
Секция поставок: срочные позиции с остатком, неделями запаса, рекомендованным заказом, стоимостью партии и дедлайном заказа
Секция поставок: срочные позиции с неделями запаса, рекомендованным заказом, COGS партии и дедлайном заказа.
06 Финансы собственника

Вывод средств собственника, записанный кодом

Самый личный модуль системы. Политика вывода - не привычка, а конфигурация, которую дашборд применяет каждый месяц.

База150 000 ₽ / мес
Бонус роста+ до 20% чистой прибыли

Бонус применяется, только если чистая прибыль выросла к прошлому периоду. Слабый месяц автоматически защищает оборотный капитал: дашборд предлагает базу и объясняет, почему не больше. Та же секция прогнозирует ближайшие выплаты Ozon на 7 и 30 дней с детализацией, из чего складывается сумма.

Почему это важно

Финансовая дисциплина обычно живёт как обещание собственника самому себе. Здесь это формула: рост кормит и собственника, и следующую закупку, а плохой месяц не усиливается слишком большим выводом. Модуль маленький, но это самый ясный пример того, чем является весь инструмент: бизнес-правила, ставшие исполняемыми и объяснимыми.

07 Как это построено

Собрано быстро, за считанные дни, с честным масштабом

Это не трёхмесячная ERP. Это сфокусированный инструмент собственника: код собран быстро, а бизнес-правила и цифры остались под контролем человека.

шаг 1 Вся рабочая система одним шагом, сделано в Cursor. FastAPI, 29 таблиц, слой синхронизации, аналитика, дашборд. Порядка 15 800 строк, заложенных как чистовая база.
шаг 2 Крупный шаг: 22 файла, +3 259 / −291 строк. Колонка оборачиваемости из реальных продаж за 30 дней, endpoint прогноза выплат, синк финансов на 359 строк, сортируемая юнит-экономика, скользящие окна 7 и 30 дней, две миграции.
  1. Деплой спроектирован под эксплуатацию. Runbook деплоя на VPS описывает установку и сопровождение системы прямо на боевом сервере, а регион хостинга выбран под требования эксплуатации. Сопровождение заложено в план, а не оставлено на потом.
  2. Демо без секретов. Встроенный mock-режим запускает всю систему без API-ключей, с вымышленными SKU из сида. Полезно для демо, полезно для разработки.
  3. Честный масштаб. Публичный репозиторий - чистовой снапшот. Тестов нет, фронт - один файл на 2 005 строк. В этом и суть кейса: рабочий инструмент собственника за дни, а не витрина продакшн-инженерии.
  4. Проверено реальной эксплуатацией. Инструмент работал с живым кабинетом селлера: 57-64 SKU, около 2 700 продаж за 3 месяца, 363 финансовые операции синхронизированы и сверены.

Стек

PythonFastAPIPydantic v2SQLAlchemy 2.0 AlembicPostgreSQLCelery + Redis Jinja2 + ванильный JSChart.jspandas + openpyxl PlaywrightDocker Compose

Интеграции

Ozon Seller APIOzon Performance APIимпорт CSV / XLSX из 1С

Разработка и деплой

CursorGitVPS-runbook деплоя

Боевая эксплуатация

57-64 SKU~2 700 продаж / 3 мес363 финансовые операции
08 Результат

Было и стало

ОбластьБылоСтало
Прибыль с единицы Цена минус закупка, по наитию. Комиссии, хранение, реклама и налог невидимы. 9 статей затрат на единицу, fact-first из финансовых транзакций Ozon, чистая прибыль после налога по SKU.
Реклама Кампании тратили без ограждения по SKU. Реклама жгла кассу. Лимит ДРР 20%, целевой ROAS, недельный план бюджета с 3 прозрачными правилами: срезать, масштабировать, пауза.
Пополнение Заказы по интуиции, out-of-stock замечали слишком поздно. План поставок с дедлайнами заказа, рангами срочности и кратностью упаковки. Остаток раскрашен по дням запаса.
Вывод собственника Вывод по ощущениям, оборотный капитал под риском в слабые месяцы. Политика кодом: база 150 000 ₽ + до 20% чистой прибыли, только при росте. Прогноз выплат на 7 / 30 дней.
Доверие к цифрам Скриншоты кабинета маркетплейса и таблицы, собранные руками. У каждого расчёта есть обоснование. Только рекомендации, применяет человек.
Инструменты Кабинет маркетплейса плюс разрозненные файлы. Один тёмный дашборд: 10 секций, 48 маршрутов, 29 таблиц, Excel-шаблоны на вход и экспорты на выход.

Кирилл Седов

Бизнес-аналитик и разработчик систем. Начинаю с бизнес-процесса и цифр, которые им управляют, потом автоматизирую. Этот инструмент собственника был описан и собран быстро, за считанные дни, и работал с живым кабинетом маркетплейса, где каждая цифра объяснима.

Связаться в LinkedIn