Плейбук: отчёты «Прибыль Неделя» и «Продажи День»
Срабатывает, когда пользователь просит:
- «дай прибыль за неделю»;
- «Прибыль Неделя»;
- «по артикулам за неделю»;
- «разложи рекламу/прибыль по артикулам»;
- «последняя закрытая неделя»;
- «Продажи День»;
- «дай продажи за день»;
- «покажи данные за вчера»;
- «сравнение»;
- «сравни данные»;
- «сравни отчёты».
Базовый формат отчёта:
Артикул | Продажи net | Выручка | Себес | Лог/шт | Реклама | ДРР | Прибыль | Приб/шт | ROI
По умолчанию отчёт Прибыль Неделя формируется за последнюю закрытую календарную неделю Пн–Вс.
Отчёт Продажи День использует тот же формат и ту же методику, но период = один календарный день.
Если в команде есть сравнение, сравни данные, сравни отчёты — включать сравнение с предыдущим периодом по умолчанию:
- для
Прибыль Неделя: текущая закрытая неделя vs предыдущая календарная неделя такой же длины; - для
Продажи День: выбранный день vs среднее за предыдущие 7 календарных дней.
Пример: если сегодня понедельник 2026-06-29, последняя закрытая неделя = 2026-06-22 … 2026-06-28.
Для какого магазина
Если пользователь не уточнил магазин, брать из контекста последнего обсуждения. Для текущего сценария это:
| Магазин | shop_id | MP |
|---|---|---|
| Siluetta Ozon | 4 | ozon |
Перед расчётом проверять:
SELECT id, name, marketplace FROM shops ORDER BY id;
Гранулярность
Размеры объединяются в один артикул:
ELS04-black-S / ELS04-black-M / ELS04-black-L -> ELS04-black
skirt-milk-s / skirt-milk-m / skirt-milk-l -> skirt-milk
Для Ozon технически:
- Берём
offer_id. - Отрезаем размерный суффикс:
-(XXXL|XXL|XL|L|M|S|XS|XXS|\d{2,3})$
- Применяем aliases себеса/артикулов:
{
"els04-black": "els004-black",
"els04-brown": "els004-brown",
"els04-grafit": "els004-graphit",
"els04-graphite": "els004-graphit",
}
В отчёте показывать человекочитаемый артикул:
els004-black -> ELS04-black
els004-brown -> ELS04-brown
els004-graphit -> ELS04-grafit
Источники данных Ozon
| Метрика | Источник |
|---|---|
| Продажи net | ozon_finance_operations + ozon_posting_items |
| Выручка | accruals_for_sale по delivered/return операциям |
| Себес | costs, marketplace='ozon', ключ = base article без размера |
| Логистика | raw_json.services + FBO operation types |
| Реклама | ozon_ad_metrics_daily.money |
| Прибыль | net_no_ads - ads - cogs |
Период
Продажи День
Отчёт Продажи День строится за один календарный день.
Если пользователь пишет:
- «за вчера» — брать вчерашнюю дату относительно текущей даты в
Europe/Moscow; - «за сегодня» — брать текущую дату, но явно предупредить, что день ещё не закрыт;
- конкретную дату — брать её как
SINCE = TO = YYYY-MM-DD.
Пример: если сегодня 2026-06-29, то «за вчера»:
SINCE = 2026-06-28
TO = 2026-06-28
В ответе всегда писать абсолютную дату: 28.06.2026, не только «вчера».
Последняя закрытая неделя
Берём последнюю полную неделю Пн–Вс, которая закончилась до текущей даты.
Если сегодня 2026-06-29, то:
SINCE = 2026-06-22
TO = 2026-06-28
Вчера без слова «Продажи День»
Если пользователь просит «за вчера», текущая дата 2026-06-29, то:
SINCE = 2026-06-28
TO = 2026-06-28
Всегда в ответе писать абсолютные даты.
Формулы
Продажи net = delivered_qty - returned_qty
Выручка = SUM(accruals_for_sale по OperationAgentDeliveredToCustomer)
+ SUM(accruals_for_sale по ClientReturnAgentOperation)
Себес = Продажи net × cost
Логистика = Услуги доставки + Услуги партнёров + Услуги FBO
Лог/шт = Логистика / Продажи net
Реклама = SUM(ozon_ad_metrics_daily.money)
ДРР = Реклама / Выручка × 100
Прибыль = net_no_ads - Реклама - Себес
Приб/шт = Прибыль / Продажи net
ROI = Прибыль / Себес × 100
net_no_ads — сумма ozon_finance_operations.amount за период без рекламных operation types:
OperationMarketplaceCostPerClick
OperationPromotionWithCostPerOrder
Важно: прибыль по Ozon включает комиссию и прочие удержания Ozon через amount. В отчёте они не выводятся отдельной колонкой, но уже сидят внутри прибыли.
Сравнение
Срабатывает, если пользователь пишет:
сравнение
сравни данные
сравни отчёты
Прибыль Неделя
Текущий период = последняя закрытая неделя Пн–Вс.
Предыдущий период = календарная неделя перед ней.
Пример для текущей даты 2026-06-29:
текущий период: 2026-06-22 … 2026-06-28
предыдущий: 2026-06-15 … 2026-06-21
Формат ячеек:
текущее значение (предыдущее значение)
Для процентов:
7.1% (8.4%)
Если в предыдущем периоде артикула не было — писать — в скобках.
Продажи День
Текущий период = выбранный день.
Предыдущий период для сравнения = среднее за предыдущие 7 календарных дней, не включая выбранный день.
Пример:
день: 2026-06-28
сравнение: среднее за 2026-06-21 … 2026-06-27
Формат ячеек:
значение дня (среднее за 7 дней)
Округление:
- деньги и штуки — до целых;
- проценты — до 1 знака;
Лог/шт,Приб/шт— до целых.
Сортировка при сравнении
Сортировать по текущему периоду:
- если запрос про рекламу — по текущей рекламе убыванию;
- иначе по текущей прибыли убыванию;
- строка
ИТОГОвсегда внизу.
Классификация логистики Ozon
Логистика в этом отчёте должна совпадать с логистическими блоками кабинета:
Услуги доставки
Услуги партнёров
Услуги FBO
Услуги доставки
Из raw_json.services[].name:
MarketplaceServiceItemDirectFlowLogistic
MarketplaceServiceItemReturnFlowLogistic
MarketplaceServiceItemDeliveryToHandoverPlaceOzon
Услуги партнёров
Из raw_json.services[].name:
MarketplaceRedistributionOfAcquiringOperation
MarketplaceServiceItemRedistributionReturnsPVZ
MarketplaceServiceItemRedistributionLastMileCourier
MarketplaceServiceItemPackageRedistribution
Услуги FBO
По operation_type:
OperationMarketplaceSupplyAdditional
MarketplaceServiceItemCrossdocking
Не включать в колонку «Логистика» комиссию Ozon и прочие удержания. Если надо показать полную раскладку, добавлять отдельную колонку «Комиссия/прочее», но в базовом отчёте её нет.
Распределение операций по артикулам
У Ozon одна финансовая операция может относиться к posting’у с несколькими товарами. Чтобы не задвоить суммы:
- Если в
raw_json.itemsесть SKU — фильтроватьozon_posting_itemsтолько по этим SKU. - Если в операции несколько товаров — распределять сумму пропорционально
price × quantity. - Если цена пустая — распределять пропорционально quantity.
- Операции без однозначной привязки к товару распределять пропорционально выручке артикула.
Контроль:
SUM(прибыль + реклама + себес по артикулам) == SUM(amount без рекламных operation types)
SUM(реклама по артикулам) == SUM(ozon_ad_metrics_daily.money)
SUM(логистика по артикулам) == логистика кабинета по трём группам
Реклама
Реклама берётся за тот же период из ozon_ad_metrics_daily.
Важно для интерпретации: расходы рекламы отчётной недели часто дают заказы в следующую неделю. Поэтому:
- в таблице показываем факт расхода рекламы за период;
- не делаем жёсткий вывод «эта реклама принесла эти продажи» без лаг-анализа;
- если пользователь спрашивает эффективность рекламы, отдельно сравнивать лаги
+1…+7 дней.
Формат ответа
Для Прибыль Неделя и Продажи День выводить одну и ту же компактную таблицу:
Артикул | Продажи net | Выручка | Себес | Лог/шт | Реклама | ДРР | Прибыль | Приб/шт | ROI
Сортировка по умолчанию:
- По рекламе убыванию, если запрос про рекламу.
- По прибыли убыванию, если запрос про прибыль.
- Сохранить строку
ИТОГОвнизу.
В конце кратко указать:
- период;
- магазин;
- что размеры объединены;
- если есть SKU без себеса.
Для Продажи День дополнительно указать, что дневные метрики могут быть шумными: реклама списалась сегодня, а заказы могут доехать в следующие дни.
Чек-лист
- Период указан абсолютными датами.
shop_idпроверен.- Размеры объединены до артикула.
- Себес найден для всех base-артикулов.
- Логистика считается только по трём кабинетным группам.
- Реклама сходится с
ozon_ad_metrics_daily.money. - Прибыль сходится с
ozon_finance_operations.amountбез рекламных operation types. - В ответе есть строка
ИТОГО.