Мой Ozon — прибыль по моделям, 07.05.2026 → 06.06.2026
Магазин: Мой Ozon (shop_id=2)
Источник истины: Ozon Seller, «Отчёт по начислениям» (6 895 строк).
Источник рекламы: Ozon Performance API (ozon_ad_metrics_daily) — атрибуция per offer_id.
Скрипт расчёта: scripts/ozon_report_profit.py.
Итог
| Метрика | Значение |
|---|---|
| Продаж (шт) | 351 |
| Возвратов (шт) | 58 |
| Net (шт) | 293 |
| Gross retail | 1 155 501 ₽ |
| − Комиссия Ozon (46%) | 531 530 ₽ |
| − Логистика + услуги (24%) | 277 880 ₽ |
| − Реклама (7%) | 76 782 ₽ |
| = К выплате нетто | 269 219 ₽ |
| − Себестоимость | 290 130 ₽ |
| = Прибыль (убыток) | −20 911 ₽ |
| Маржа от gross retail | −1.8% |
| ROI | −7.2% |
«К выплате нетто 269 219 ₽» ≈ Ozon кошелёк (269 607,81 ₽, расхождение 390 ₽ — округление в копейках).
По моделям — с реальным распределением рекламы
Реклама per модель взята из Performance API (ozon_ad_metrics_daily.money), а не разнесена пропорционально. Это даёт точную картину: в Performance API всё атрибутировано к offer_id, в «Отчёте по начислениям» вся реклама без offer_id и раньше распределялась пропорционально gross — это сильно искажало результат по моделям.
Сверка сумм: Performance API 76 782 ₽ vs Отчёт по начислениям 76 873 ₽ → расхождение 0.1%.
| Модель | Прод | Возв | Net | Gross retail | Комиссия | Логист+усл | Реклама | Payout net | − Себес | Прибыль | Маржа | ROI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LT8306 | 80 | 9 | 71 | 287 884 | 132 427 | 57 403 | 3 564 | 94 468 | 74 550 | +19 918 | 6.9% | 26.7% |
| HZ020 | 62 | 8 | 54 | 227 194 | 104 509 | 47 042 | 9 617 | 66 008 | 57 240 | +8 768 | 3.9% | 15.3% |
| LT8307 | 20 | 3 | 17 | 76 227 | 35 064 | 22 443 | 10 487 | 8 227 | 17 000 | −8 773 | −11.5% | −51.6% |
| LTQ001 | 131 | 27 | 104 | 359 922 | 165 564 | 104 057 | 14 549 | 75 724 | 91 520 | −15 796 | −4.4% | −17.3% |
| HZ030 | 58 | 11 | 47 | 204 274 | 93 966 | 46 935 | 38 565 | 24 792 | 49 820 | −25 028 | −12.3% | −50.2% |
| ИТОГО | 351 | 58 | 293 | 1 155 501 | 531 530 | 277 880 | 76 782 | 269 219 | 290 130 | −20 911 | −1.8% | −7.2% |
Себестоимости (marketplace='ozon' в БД costs):
LT8306-black 1050 ₽, LT8307-black 1000 ₽, LTQ001 880 ₽, HZ020/HZ030 1060 ₽.
Реклама per offer_id (Performance API)
Источник: ozon_ad_metrics_daily, период 07.05-06.06.
| offer_id | CPC | CPO | Итого | Заказов | Выручка |
|---|---|---|---|---|---|
| HZ030-Brown-S | 12 698 | 7 167 | 19 864 | 8 | 36 302 |
| HZ030-Blue-S | 12 834 | 0 | 12 834 | 10 | 40 313 |
| LTQ001-Black-S | 4 333 | 7 508 | 11 841 | 23 | 81 056 |
| LT8307-Black-M | 10 487 | 0 | 10 487 | 6 | 27 088 |
| HZ020-Black-M | 5 369 | 945 | 6 314 | 5 | 24 000 |
| HZ030-Brown-M | 2 100 | 3 767 | 5 867 | 3 | 13 962 |
| LT8306-Black-M | 3 564 | 0 | 3 564 | 9 | 39 660 |
| HZ020-Black-S | 3 303 | 0 | 3 303 | 2 | 9 600 |
| LTQ001-White-S | 2 708 | 0 | 2 708 | 3 | 10 719 |
| ИТОГО | 57 396 | 19 387 | 76 783 | 69 | 282 700 |
CPO/заказ — стоимость одного заказа с рекламы:
| Модель | CPO/заказ |
|---|---|
| LT8306 | 396 ₽ ✓ |
| LTQ001 | 560 ₽ |
| HZ020 | 1 374 ₽ |
| LT8307 | 1 748 ₽ |
| HZ030 | 1 836 ₽ ✗ |
Главные находки
1. Магазин в убытке −21к за 30 дней.
Из 5 моделей только две прибыльные: LT8306 (+20к) и HZ020 (+9к).
2. HZ030 — главный сжигатель денег.
- Рекламы 38 565 ₽ — 50% всего бюджета магазина (при доле 18% в обороте)
- Принесла 21 заказ → CPO 1 836 ₽/заказ
- При retail ~3 500 ₽ и payout ~1 200 ₽ прибыль до рекламы ~140 ₽/шт
- На каждый заказ от рекламы тратим в 13 раз больше чем зарабатываем
- ROI модели −50%
Действия: - Срочно отключить или сильно урезать (-90%) расходы на рекламу HZ030 - Если без рекламы продажи упадут — это значит модель и так не самодостаточна, надо думать о её судьбе в линейке
3. LT8306 — звезда.
- ROI +27% (best in shop)
- CPO 396 ₽/заказ — в 4-5 раз эффективнее остальных
- Реклама минимальная (3.6к), эффективная
- Действия: масштабировать рекламный бюджет (увеличить х2-х3 если ROI сохранится)
4. HZ020 — стабильно прибыльная.
- ROI 15%, CPO 1 374 ₽ (приемлемо)
- Можно немного увеличить рекламу
5. LTQ001 — большой объём, маленькая маржа.
- 131 продажа (37% магазина), но прибыль −16к при ROI −17%
- При retail 2 747 ₽/шт payout 729 ₽/шт, себес 880 ₽ → −151 ₽/шт убытка
- Реклама умеренная (14.5к, CPO 560 ₽), на ней почти не теряем
- Корень — низкая цена. Либо поднимать retail, либо снижать себестоимость
6. LT8307 — критический убыток.
- 20 продаж, −9к, ROI −52%
- CPO 1 748 ₽ при малом объёме
- Либо рекламу выключить, либо переосмысливать всю модель
Структура расходов (% от gross retail)
| Статья | ₽ | % |
|---|---|---|
| Gross retail | 1 155 501 | 100% |
| Комиссия Ozon | 531 530 | 46.0% |
| Логистика + услуги | 277 880 | 24.0% |
| Реклама | 76 782 | 6.6% |
| Себестоимость | 290 130 | 25.1% |
| Прибыль (убыток) | −20 911 | −1.8% |
Ozon-комиссия 46% — структурный потолок, не меняется.
Как читать «Отчёт по начислениям»
Механика цены на Ozon:
- Продавец ставит retail цену, например 4500 ₽.
- Ozon применяет свою скидку и продаёт покупателю за 2300 ₽.
- В отчёте строки по этому posting:
-
Выручка= 2300 (что заплатил покупатель) -Программы партнёров= небольшая компенсация -Баллы за скидки= остаток до retail (~2200) - Сумма всех трёх = 4500 ₽ = retail - Ozon берёт комиссию ~46% от retail (от 4500, не от 2300).
- Плюс логистика, эквайринг, упаковка, реклама, услуги FBO — отрицательные строки.
- «К выплате» =
Сумма итогопо всем строкам отчёта.
gross_retail = Выручка + Программы партнёров + Баллы за скидки (с учётом возвратов).
План действий (приоритет)
- HZ030 — отключить/урезать рекламу (-90% бюджета). Ожидаемый эффект: +25к/месяц.
- LT8307 — отключить рекламу, переосмыслить позиционирование. +9к/месяц.
- LT8306 — увеличить рекламный бюджет х2 (до 7-8к). Если ROI сохранится — это +20к/месяц дополнительно.
- LTQ001 — поднять retail на 15-20% на одной партии (тест), сравнить выручку за 2 недели.
- HZ020 — не трогать, оставить как стабильный +9к/месяц.
Потенциал: с −21к выйти в +40-50к/месяц только за счёт перераспределения рекламы.
Воспроизведение
# 1. Положить файл из Ozon Seller (Финансы → Отчёт по начислениям) в data/ozon_stats/
# 2. На проде освежить Performance-данные:
ssh wbbot 'cd /root/mp-system && .venv/bin/python -c "
from app.ozon.ingest import ingest_ad_stats
ingest_ad_stats(\"2026-05-07\", \"2026-06-06\", shop_id=2, max_wait_sec=900)
"'
# 3. Обновить AD_SPEND_PER_OFFER в scripts/ozon_report_profit.py из:
ssh wbbot 'cd /root/mp-system && .venv/bin/python /tmp/ozon_ads.py' # см. scripts/ozon_ads_per_offer.py
# 4. Запустить:
python scripts/ozon_report_profit.py
Что я делал не так раньше
| Источник ошибки | Эффект |
|---|---|
Статусы delivering, awaiting_* как продажи |
+Раздул qty в 1.7× |
posting_items.payout без «Баллов за скидки» |
Сильно занижал выручку |
finance_operations по operation_date ≠ окна заказов |
Сдвигало ~30к |
| Реклама дважды (ad_metrics + finance_ops) | +95к раздувания |
| Реклама без offer_id (77к) распределялась пропорц. gross | Ошибочно нагрузила LT8306, LTQ001; недогрузила HZ030 |
Правильный подход: «Отчёт по начислениям» как источник истины + Performance API для атрибуции рекламы per offer_id.