Перейти к основному содержимому

Юнит-экономика товаров на маркетплейсе

Зачем это читать

Эта страница — самая важная в разделе стратегии. Здесь реальные цифры, реальная экономика, реальные решения. Прежде чем вложить рубль в контент для карточки — посчитайте, вернётся ли он. SalesFinder даёт данные, но интерпретировать их нужно через призму юнит-экономики.


1. Юнит-экономика товара на маркетплейсе

Каждый товар на Wildberries или Ozon — это микробизнес со своей структурой расходов. Селлеры, которые не считают юнит-экономику, работают вслепую и узнают о проблемах только по отрицательному балансу.

1.1. Полная структура себестоимости

Разберём все статьи расходов, которые «съедают» выручку от продажи одной единицы товара:

Статья расходовДоля от РРЦДиапазонКомментарий
Себестоимость товара (COGS)20-40%Закупка/производство + упаковка + маркировка
Комиссия маркетплейса5-25%Зависит от категории (см. таблицу ниже)
Логистика (FBO/FBS)3-15%50-300 руб./штFBO дешевле, FBS гибче
Хранение на складе1-5%5-20 руб./сутки/штЗависит от габаритов и сезона
Возвраты и брак2-30%Fashion 30-60%, товарка 5-15%
Реклама (внутренняя)5-15%Автокампании, аукцион, баннеры
Контент (фото/видео/SEO)1-8%Амортизируется на объём продаж
Налоги (УСН/ОСН)4-7%УСН 6% или 15% (доходы-расходы)
Прочее (эквайринг, софт)1-3%SalesFinder, CRM, бухгалтерия
Чистая прибыль5-25%Целевой показатель >15%

1.2. Комиссии маркетплейсов по категориям

Комиссия — один из главных «пожирателей» маржи. Разброс огромный:

КатегорияWBOzonПримечание
Электроника5-10%5-12%Самые низкие комиссии
Бытовая техника7-12%7-10%Средние
Товары для дома12-15%10-14%Зависит от подкатегории
Одежда14-18%12-17%Высокие + возвраты!
Обувь15-18%13-17%Высокие + возвраты!
Аксессуары15-20%12-18%Варьируется
Косметика/парфюмерия12-16%10-15%Средне-высокие
Детские товары12-17%10-15%Средне-высокие
Продукты питания8-12%7-10%Низко-средние
Спорт и отдых12-17%10-15%Средние
Украшения/бижутерия17-25%15-22%Максимальные
Скрытые комиссии

Помимо основной комиссии маркетплейс берёт:

  • Приёмка товара: 10-50 руб./шт (WB FBO)
  • Платная приёмка в пик: до 5x от базовой ставки
  • Штрафы за маркировку: 100-500 руб./шт
  • Утилизация возвратов: 30-100 руб./шт (если клиент вернул повреждённый)
  • Хранение сверхнорматива: повышенный тариф после 60 дней

1.3. Логистика: FBO vs FBS

ПараметрFBO (Fulfilment by Operator)FBS (Fulfilment by Seller)
Стоимость доставки50-150 руб./шт100-300 руб./шт
Хранение5-20 руб./сутки0 руб. (свой склад)
Скорость доставки1-3 дня2-7 дней
ВозвратыОбрабатывает МПОбрабатывает селлер
Контроль остатковОграниченныйПолный
Стоимость обратной логистики30-100 руб./шт50-150 руб./шт
РекомендацияДля стабильных товаров >50 продаж/месДля теста, крупногабарита, скоропорта

1.4. Waterfall-диаграмма: как распределяется 2000 руб.

Возьмём типовой товар из категории «Товары для дома» с РРЦ 2 000 руб.:

graph LR
A["РРЦ<br/>2 000 ₽<br/>100%"] --> B["Себестоимость<br/>600 ₽<br/>30%"]
A --> C["Комиссия МП<br/>280 ₽<br/>14%"]
A --> D["Логистика<br/>100 ₽<br/>5%"]
A --> E["Хранение<br/>40 ₽<br/>2%"]
A --> F["Возвраты/брак<br/>140 ₽<br/>7%"]
A --> G["Реклама<br/>200 ₽<br/>10%"]
A --> H["Контент<br/>60 ₽<br/>3%"]
A --> I["Налоги<br/>80 ₽<br/>4%"]
A --> J["Прочее<br/>40 ₽<br/>2%"]
A --> K["ПРИБЫЛЬ<br/>460 ₽<br/>23%"]

style K fill:#2ecc71,color:#fff
style B fill:#e74c3c,color:#fff
style C fill:#e67e22,color:#fff
style G fill:#f39c12,color:#fff
style F fill:#c0392b,color:#fff

Расшифровка по каждой статье:

СтатьяСумма% от РРЦКак считается
РРЦ (розничная цена)2 000 руб.100%Цена для покупателя
Себестоимость товара600 руб.30%Закупка 450 + упаковка 100 + маркировка 50
Комиссия WB (14%)280 руб.14%Категория «Товары для дома»
Логистика FBO100 руб.5%Доставка до ПВЗ + последняя миля
Хранение (8 дней)40 руб.2%5 руб./сутки x 8 дней среднее
Возвраты и брак (7%)140 руб.7%7% процент возврата x (логистика возврата + уценка)
Реклама (10%)200 руб.10%Автокампании WB + продвижение
Контент (3%)60 руб.3%Амортизация: 6 000 руб. контент / 100 продаж
Налоги УСН 6%80 руб.4%От выручки за вычетом возвратов
Прочее40 руб.2%SalesFinder, 1С, эквайринг
Чистая прибыль460 руб.23%Целевой показатель
Ключевой инсайт

Контент занимает всего 3% от РРЦ, но влияет на конверсию (CTR карточки +20-50%), а значит — на объём продаж. Увеличение продаж на 30% при тех же фиксированных расходах даёт рост прибыли на 60-80%.

1.5. Как возвраты убивают маржу

Возвраты — скрытый убийца юнит-экономики. Особенно в fashion-сегменте:

КатегорияСредний % возвратовСтоимость возвратаВлияние на маржу
Носки, нижнее бельё3-8%30-50 руб.Минимальное
Товары для дома5-12%50-100 руб.Умеренное
Электроника8-15%80-150 руб.Заметное
Обувь20-40%100-200 руб.Существенное
Одежда (женская)30-60%100-200 руб.Критическое
Платья, костюмы40-65%100-200 руб.Катастрофическое

Формула реальной маржи с учётом возвратов:

Реальная_маржа = Номинальная_маржа × (1 - Return_Rate) - Return_Rate × Return_Cost_Per_Unit

Пример для женского платья (РРЦ 3 000 руб.):

  • Номинальная маржа: 900 руб. (30%)
  • Return_Rate: 45%
  • Return_Cost: 150 руб./возврат (обратная логистика + переупаковка)
Реальная_маржа = 900 × (1 - 0.45) - 0.45 × 150 = 495 - 67.5 = 427.5 руб. (14.25%)

Номинальные 30% маржи превращаются в 14.25% — почти вдвое меньше. И это ещё без учёта невозвратного брака.


2. Когда контент окупается, а когда НЕТ

Это самый важный раздел. Честный анализ, без маркетинговой воды.

2.1. Контент НЕ окупается

Стоп-факторы: не вкладывайтесь в контент

Если хотя бы 2 из 6 пунктов совпадают — контент не окупится.

1. Товар с маржой менее 15%

Когда маржа ниже 15%, после вычета всех расходов на контент прибыль уходит в ноль или минус. Типичные примеры:

  • Перекуп брендовых товаров по РРЦ (Apple, Samsung, Bosch)
  • Commodity-товары с жёсткой ценовой конкуренцией
  • Товары с фиксированной МРЦ (минимальная розничная цена)

Расчёт: Контент на 1 SKU стоит минимум 2 000 руб. При марже 15% с продажи товара за 1 500 руб. = 225 руб. прибыли. Нужно 9+ продаж только чтобы отбить контент. А если продаж 10-15/мес — амортизация растянется на полгода.

2. Товар с продажами менее 10 штук в месяц

Контент амортизируется на объём продаж. При 10 продажах в месяц:

  • Контент за 5 000 руб. = 500 руб./продажу в первый месяц
  • Даже за 3 месяца: 167 руб./продажу — это 8-17% от маржи товара за 1 000-2 000 руб.
  • Срок окупаемости: 3-6 месяцев

Нет масштаба для амортизации. Деньги лучше вложить в рекламу для увеличения продаж.

3. Товар-однодневка (тренды)

Трендовые товары с жизненным циклом 1-3 месяца:

  • Сезонные товары с узким окном продаж (новогодний декор, пасхальные наборы)
  • Хайповые товары (поп-иты, слаймы, спиннеры)
  • Товары-реплики (юридические риски + короткий цикл)

Контент просто не успеет окупиться. Используйте минимальные фото от поставщика.

4. Товар с остатком менее 5 штук

Если на складе осталось 3-5 единиц и допоставки не планируется:

  • Нет экономического смысла вкладывать даже 1 000 руб.
  • Лучше снизить цену и распродать остатки
  • Исключение: если это тестовая партия и по результатам продаж будет заказ на 100+

5. Категория с жёсткой ценовой конкуренцией

В некоторых категориях покупатель выбирает ТОЛЬКО по цене:

  • Расходные материалы (бумага, картриджи, батарейки)
  • Стандартизированные товары (кабели, переходники, крепёж)
  • Товары с идентичными характеристиками от 50+ продавцов

Контент не влияет на решение — покупатель сортирует по цене и берёт первый подходящий.

6. Commodity-товары (контент не влияет на выбор)

Товары, которые невозможно дифференцировать визуально:

  • Пакеты для мусора, салфетки, туалетная бумага
  • Соль, сахар, мука (без бренда)
  • Стандартный крепёж (болты, гайки, саморезы)
  • Канцелярские скрепки, файлы, папки

Покупатель не разглядывает фотографии пакетов для мусора. Это чистый price play.

2.2. Контент окупается

Зелёный свет: инвестируйте в контент

Если 3+ пункта совпадают — контент даст значительный ROI.

1. Маржа >25% и стабильные продажи (>50/мес)

Высокая маржа создаёт «подушку» для амортизации контента:

  • Контент за 10 000 руб. при 100 продажах/мес = 100 руб./продажу
  • При марже 500 руб./шт — контент занимает 20% маржи в первый месяц, 7% за квартал
  • Улучшение конверсии на 15% даёт +15 продаж = +7 500 руб. дополнительной прибыли/мес

2. Товар с длинным жизненным циклом (6+ месяцев)

Контент — это актив. Чем дольше живёт товар, тем больше продаж амортизируют вложения:

  • Товар живёт 12 месяцев = 1 200 продаж при 100/мес
  • Контент за 15 000 руб. = 12.5 руб./продажу
  • ROI контента за год: 500-2 000%

Примеры: базовая одежда (футболки, джинсы), инструменты, кухонная утварь, постельное бельё.

3. Конкуренция через визуал

В категориях, где покупатель выбирает «глазами», контент — главное оружие:

  • Одежда и аксессуары: Фото на модели vs предметная съёмка — разница в CTR до 300%
  • Декор для дома: Lifestyle-фото в интерьере vs белый фон — конверсия +40-80%
  • Подарки: Эмоциональные фото, unboxing-видео — конверсия +30-60%
  • Ювелирные изделия: Макро-съёмка, 360-видео — must have
  • Еда/напитки: Food-стилистика, рецепты — CTR +50-100%

4. Сложный товар, требующий объяснения

Когда покупателю нужно ПОНЯТЬ товар перед покупкой:

  • Электроника: Инфографика с характеристиками, сравнительные таблицы
  • Инструменты: Видео-демонстрация в работе, before/after
  • Спортивный инвентарь: Видео с техникой использования
  • Медицинские приборы: Анимация принципа работы, инфографика
  • Сложная техника: 3D-модели, взрыв-схемы

Контент снижает возвраты на 15-40% — покупатель получает то, что ожидал.

5. Собственный бренд (Private Label)

Контент для собственного бренда — инвестиция, а не расход:

  • Фирменный стиль работает на ВСЕ карточки бренда
  • Контент строит узнаваемость и лояльность
  • Бренд-книга снижает стоимость контента для следующих SKU на 30-50%
  • При продаже бренда контент-пакет — часть актива

2.3. Матрица принятия решений

graph TD
A["Новый товар"] --> B{"Маржа > 25%?"}
B -->|"Да"| C{"Продажи > 50/мес?"}
B -->|"Нет"| D{"Маржа > 15%?"}

C -->|"Да"| E["ИНВЕСТИРОВАТЬ<br/>Уровень 2-4"]
C -->|"Нет"| F{"Жизненный цикл<br/>> 6 мес?"}

D -->|"Да"| G["МИНИМУМ<br/>Уровень 0-1"]
D -->|"Нет"| H["НЕ ИНВЕСТИРОВАТЬ<br/>Контент поставщика"]

F -->|"Да"| I["ИНВЕСТИРОВАТЬ<br/>Уровень 1-2"]
F -->|"Нет"| G

style E fill:#27ae60,color:#fff
style I fill:#2ecc71,color:#fff
style G fill:#f39c12,color:#fff
style H fill:#e74c3c,color:#fff

3. Формула ROI контента

3.1. Базовая формула

ROI контента — это отношение дополнительной прибыли, полученной благодаря контенту, к стоимости этого контента:

Content_ROI = (Delta_Revenue * Net_Margin - Content_Cost) / Content_Cost * 100%

Где:

  • Delta_Revenue = Revenue_after - Revenue_before (изменение выручки после обновления контента)
  • Net_Margin = чистая маржа после ВСЕХ расходов маркетплейса (комиссия + логистика + хранение + возвраты + реклама + налоги)
  • Content_Cost = фото + видео + инфографика + копирайтинг + SEO-оптимизация

3.2. Расширенная формула (с учётом снижения возвратов)

Качественный контент не только увеличивает продажи, но и снижает возвраты. Расширенная формула:

Content_ROI_Extended = (Delta_Revenue * Net_Margin + Saved_Returns - Content_Cost) / Content_Cost * 100%

Saved_Returns = Sales_Volume * Delta_Return_Rate * Avg_Return_Cost
Delta_Return_Rate = Return_Rate_Before - Return_Rate_After
Avg_Return_Cost = Reverse_Logistics + Repackaging + Depreciation

3.3. Формула срока окупаемости

Payback_Days = Content_Cost / (Daily_Additional_Profit + Daily_Saved_Returns)

Daily_Additional_Profit = (Daily_Sales_After - Daily_Sales_Before) * Margin_Per_Unit
Daily_Saved_Returns = Daily_Sales_After * Delta_Return_Rate * Avg_Return_Cost

3.4. Пять развёрнутых примеров ROI

Пример 1: Мужская куртка (собственный бренд)

ПараметрЗначение
РРЦ8 500 руб.
Себестоимость2 800 руб. (33%)
Комиссия WB (16%)1 360 руб.
Логистика FBO150 руб.
Хранение (среднее)60 руб.
Реклама (8%)680 руб.
Возвраты (25% × 150 руб.)37.5 руб./продажу
Налоги УСН 6%510 руб.
Чистая маржа на единицу2 902.5 руб. (34.1%)

Инвестиция в контент:

СтатьяСтоимость
Фото на модели (5 образов)25 000 руб.
Предметная съёмка5 000 руб.
Инфографика (3 слайда)6 000 руб.
Видео-обзор (30 сек)15 000 руб.
Рич-контент (A+)8 000 руб.
SEO-оптимизация2 000 руб.
Итого61 000 руб.

Результат:

  • Продажи ДО обновления контента: 40 шт./мес
  • Продажи ПОСЛЕ: 65 шт./мес (+62.5%)
  • Возвраты ДО: 25% → ПОСЛЕ: 18% (-7 п.п.)
Delta_Revenue = (65 - 40) * 8 500 = 212 500 руб./мес
Additional_Profit = 25 * 2 902.5 = 72 562.5 руб./мес
Saved_Returns = 65 * 0.07 * 150 = 682.5 руб./мес
Monthly_Benefit = 72 562.5 + 682.5 = 73 245 руб./мес
Content_ROI (1 мес) = (73 245 - 61 000) / 61 000 * 100% = 20.1%
Content_ROI (3 мес) = (73 245 * 3 - 61 000) / 61 000 * 100% = 260.2%
Payback = 61 000 / (73 245 / 30) = 25 дней

Вердикт: ROI 260% за квартал, окупаемость 25 дней. Отличная инвестиция.


Пример 2: Чехол для телефона (перекуп)

ПараметрЗначение
РРЦ690 руб.
Себестоимость (закупка у поставщика)180 руб. (26%)
Комиссия WB (15%)103.5 руб.
Логистика FBO55 руб.
Хранение10 руб.
Реклама (12%)82.8 руб.
Возвраты (8% × 55 руб.)4.4 руб./продажу
Налоги41.4 руб.
Чистая маржа на единицу212.9 руб. (30.9%)

Инвестиция в контент:

СтатьяСтоимость
Предметная съёмка3 000 руб.
Инфографика (2 слайда)3 000 руб.
SEO-оптимизация1 500 руб.
Итого7 500 руб.

Результат:

  • Продажи ДО: 80 шт./мес
  • Продажи ПОСЛЕ: 95 шт./мес (+18.75%)
Additional_Profit = 15 * 212.9 = 3 193.5 руб./мес
Content_ROI (1 мес) = (3 193.5 - 7 500) / 7 500 * 100% = -57.4%
Content_ROI (3 мес) = (3 193.5 * 3 - 7 500) / 7 500 * 100% = 27.7%
Payback = 7 500 / (3 193.5 / 30) = 70 дней

Вердикт: ROI 27.7% за квартал, окупаемость 70 дней. Пограничная инвестиция. Рекомендуется минимальный уровень контента (AI-генерация за 1 500-2 000 руб.).


Пример 3: Набор кухонных ножей (товарка, собственная марка)

ПараметрЗначение
РРЦ3 200 руб.
Себестоимость850 руб. (26.6%)
Комиссия WB (13%)416 руб.
Логистика FBO120 руб.
Хранение35 руб.
Реклама (10%)320 руб.
Возвраты (6% × 80 руб.)4.8 руб./продажу
Налоги192 руб.
Чистая маржа на единицу1 262.2 руб. (39.4%)

Инвестиция в контент:

СтатьяСтоимость
Предметная съёмка (lifestyle)7 000 руб.
Инфографика (4 слайда — составы, сравнение)5 000 руб.
Видео-обзор (нарезка продуктов)10 000 руб.
SEO-оптимизация2 000 руб.
Итого24 000 руб.

Результат:

  • Продажи ДО: 120 шт./мес
  • Продажи ПОСЛЕ: 170 шт./мес (+41.7%)
  • Возвраты ДО: 6% → ПОСЛЕ: 3% (-3 п.п.)
Additional_Profit = 50 * 1 262.2 = 63 110 руб./мес
Saved_Returns = 170 * 0.03 * 80 = 408 руб./мес
Monthly_Benefit = 63 518 руб./мес
Content_ROI (1 мес) = (63 518 - 24 000) / 24 000 * 100% = 164.7%
Content_ROI (3 мес) = (63 518 * 3 - 24 000) / 24 000 * 100% = 693.9%
Payback = 24 000 / (63 518 / 30) = 11 дней

Вердикт: ROI 693.9% за квартал, окупаемость 11 дней. Превосходная инвестиция. Рекомендуется полный контент-пакет.


Пример 4: Детская коляска (премиум-сегмент)

ПараметрЗначение
РРЦ32 000 руб.
Себестоимость12 000 руб. (37.5%)
Комиссия WB (12%)3 840 руб.
Логистика FBO350 руб.
Хранение200 руб.
Реклама (6%)1 920 руб.
Возвраты (10% × 350 руб.)35 руб./продажу
Налоги1 920 руб.
Чистая маржа на единицу11 735 руб. (36.7%)

Инвестиция в контент:

СтатьяСтоимость
Фото на модели (мама + ребёнок, 3 локации)35 000 руб.
Предметная съёмка (все ракурсы, детали)12 000 руб.
Инфографика (6 слайдов — размеры, функции, сравнение)8 000 руб.
Видео-обзор (3 мин — сборка, складывание, прогулка)25 000 руб.
Рич-контент (A+)10 000 руб.
SEO-оптимизация3 000 руб.
UGC (3 фото-отзыва)4 500 руб.
Итого97 500 руб.

Результат:

  • Продажи ДО: 12 шт./мес
  • Продажи ПОСЛЕ: 22 шт./мес (+83.3%)
  • Возвраты ДО: 10% → ПОСЛЕ: 4% (-6 п.п.)
Additional_Profit = 10 * 11 735 = 117 350 руб./мес
Saved_Returns = 22 * 0.06 * 350 = 462 руб./мес
Monthly_Benefit = 117 812 руб./мес
Content_ROI (1 мес) = (117 812 - 97 500) / 97 500 * 100% = 20.8%
Content_ROI (3 мес) = (117 812 * 3 - 97 500) / 97 500 * 100% = 262.6%
Payback = 97 500 / (117 812 / 30) = 25 дней

Вердикт: ROI 262.6% за квартал, окупаемость 25 дней. Превосходная инвестиция, даже при низком объёме продаж — высокая маржа компенсирует.


Пример 5: Мужские носки (commodity, упаковка 10 пар)

ПараметрЗначение
РРЦ590 руб.
Себестоимость200 руб. (33.9%)
Комиссия WB (17%)100.3 руб.
Логистика FBO55 руб.
Хранение10 руб.
Реклама (15%)88.5 руб.
Возвраты (5% × 40 руб.)2 руб./продажу
Налоги35.4 руб.
Чистая маржа на единицу98.8 руб. (16.7%)

Инвестиция в контент:

СтатьяСтоимость
Предметная съёмка3 000 руб.
Инфографика (состав, размерная сетка)2 000 руб.
SEO-оптимизация1 500 руб.
Итого6 500 руб.

Результат:

  • Продажи ДО: 200 шт./мес
  • Продажи ПОСЛЕ: 215 шт./мес (+7.5%)
Additional_Profit = 15 * 98.8 = 1 482 руб./мес
Content_ROI (1 мес) = (1 482 - 6 500) / 6 500 * 100% = -77.2%
Content_ROI (3 мес) = (1 482 * 3 - 6 500) / 6 500 * 100% = -31.6%
Content_ROI (6 мес) = (1 482 * 6 - 6 500) / 6 500 * 100% = 36.8%
Payback = 6 500 / (1 482 / 30) = 132 дня

Вердикт: ROI -31.6% за квартал, окупаемость 132 дня. Инвестиция НЕ оправдана. Используйте контент от поставщика + минимальную AI-инфографику (до 1 000 руб.).

3.5. Сводная таблица ROI по примерам

ТоварРРЦМаржаКонтентROI (1 мес)ROI (3 мес)PaybackВердикт
Куртка (бренд)8 50034.1%61 000+20.1%+260.2%25 дн.Инвестировать
Чехол (перекуп)69030.9%7 500-57.4%+27.7%70 дн.Минимум
Ножи (товарка)3 20039.4%24 000+164.7%+693.9%11 дн.Инвестировать
Коляска (премиум)32 00036.7%97 500+20.8%+262.6%25 дн.Инвестировать
Носки (commodity)59016.7%6 500-77.2%-31.6%132 дн.Не инвестировать
graph LR
subgraph "ROI за 3 месяца"
A["Ножи<br/>+694%"] --> B["Коляска<br/>+263%"]
B --> C["Куртка<br/>+260%"]
C --> D["Чехол<br/>+28%"]
D --> E["Носки<br/>-32%"]
end

style A fill:#27ae60,color:#fff
style B fill:#2ecc71,color:#fff
style C fill:#2ecc71,color:#fff
style D fill:#f39c12,color:#fff
style E fill:#e74c3c,color:#fff

4. Себестоимость контента по типам

4.1. Развёрнутая таблица стоимости

Тип контентаТоварка (за 1 SKU)Одежда (за 1 SKU)Что входит
Фото (предметная съёмка)3 000-8 000 руб.8 000-25 000 руб.Студия, свет, фотограф, ретушь, 5-10 ракурсов
Фото (на модели)N/A15 000-40 000 руб.Модель, визажист, стилист, локация, 3-5 образов
Фото (lifestyle)5 000-12 000 руб.10 000-30 000 руб.Интерьерная/уличная съёмка, реквизит, постановка
Инфографика2 000-5 000 руб.3 000-7 000 руб.3-6 слайдов с УТП, размерами, характеристиками
Видео (обзор 15-30 сек)5 000-15 000 руб.10 000-30 000 руб.Сценарий, съёмка, монтаж, цветокоррекция
Видео (reels/shorts)3 000-8 000 руб.5 000-15 000 руб.Динамичный монтаж, тренды, музыка
Рич-контент (A+/Enhanced)3 000-8 000 руб.5 000-12 000 руб.HTML-блоки, сравнительные таблицы, галерея
SEO-оптимизация1 500-3 000 руб.1 500-3 000 руб.Ключевые слова, заголовок, описание, характеристики
Копирайтинг (описание)1 000-3 000 руб.1 500-4 000 руб.Продающий текст, буллеты, УТП
UGC (отзывы с фото)500-2 000 руб./шт500-2 000 руб./штТекст + фото/видео от «покупателя»
3D-визуализация5 000-15 000 руб.N/A3D-модель, рендер, анимация
AI-генерация (наш подход)500-2 000 руб.1 000-5 000 руб.AI-фото, AI-инфографика, AI-текст

4.2. AI-генерация vs традиционный контент

AI-контент — наше ключевое конкурентное преимущество:

ПараметрТрадиционныйAI-генерацияЭкономия
Предметная фотография5 000 руб.800 руб.84%
Инфографика4 000 руб.1 200 руб.70%
Описание товара2 000 руб.300 руб.85%
Видео-обзор (15 сек)10 000 руб.2 500 руб.75%
SEO-оптимизация2 500 руб.500 руб.80%
Полный пакет (товарка)23 500 руб.5 300 руб.77%
Полный пакет (одежда)45 000 руб.12 000 руб.73%
Срок выполнения3-7 рабочих дней2-24 часа80-90%
Когда AI-контент НЕ подходит
  • Сложная форма товара (AI плохо генерирует необычные формы)
  • Обязательная демонстрация товара в действии (электроинструмент, спорттовары)
  • Premium-сегмент (>20 000 руб.) — покупатель ожидает «настоящие» фото
  • Категории с обязательной сертификацией фото (продукты питания, БАДы)
  • Одежда/обувь: AI пока слабо справляется с правдоподобностью посадки на модели

4.3. Структура стоимости по этапам

graph TD
A["Полный контент-пакет<br/>100%"] --> B["Подготовка<br/>10-15%"]
A --> C["Производство<br/>50-60%"]
A --> D["Пост-продакшн<br/>20-25%"]
A --> E["Публикация + SEO<br/>10-15%"]

B --> B1["Анализ конкурентов"]
B --> B2["ТЗ + мудборд"]
B --> B3["Закупка реквизита"]

C --> C1["Фотосъёмка"]
C --> C2["Видеосъёмка"]
C --> C3["Стилизация/модели"]

D --> D1["Ретушь"]
D --> D2["Монтаж видео"]
D --> D3["Дизайн инфографики"]

E --> E1["SEO-анализ SalesFinder"]
E --> E2["Оптимизация текстов"]
E --> E3["Загрузка на МП"]

5. Пороговые метрики для инвестиций в контент

Уровень 0: Не инвестировать (0 руб./SKU)

КритерийПорог
Маржа< 15%
Продажи< 10 шт./мес
Остаток на складе< 5 шт.
Жизненный цикл товара< 2 мес.
Тип конкуренцииТолько ценовая

Действия:

  • Берём контент от поставщика as-is
  • Заполняем характеристики и ключевые слова (бесплатно)
  • Не тратим ни рубля на профессиональный контент
  • Фокус на оптимизацию закупочной цены и логистики

Пример товаров: пакеты для мусора, салфетки, стандартный крепёж, расходные материалы.


Уровень 1: Минимальный (до 2 000 руб./SKU)

КритерийПорог
Маржа15-25%
Продажи10-50 шт./мес
Остаток на складе> 20 шт.
Жизненный цикл товара> 3 мес.
Тип конкуренцииСмешанная (цена + визуал)

Действия:

  • AI-инфографика (2-3 слайда): 800-1 200 руб.
  • SEO-оптимизация текста (AI): 300-500 руб.
  • Базовая обработка фото поставщика: 200-300 руб.

Ожидаемый эффект:

  • Рост CTR: +10-20%
  • Рост конверсии: +5-10%
  • Рост продаж: +5-15%
  • ROI за 3 месяца: 50-150%
  • Окупаемость: 30-60 дней

Пример товаров: базовая канцелярия, простая посуда, стандартная хозтовары.


Уровень 2: Базовый (2 000-8 000 руб./SKU)

КритерийПорог
Маржа25-40%
Продажи50-200 шт./мес
Остаток на складе> 50 шт.
Жизненный цикл товара> 6 мес.
Тип конкуренцииВизуальная

Действия:

  • Профессиональная предметная съёмка: 3 000-5 000 руб.
  • Инфографика (3-4 слайда): 2 000-3 000 руб.
  • SEO-оптимизация (полная): 1 500-2 000 руб.
  • Продающее описание: 1 000-1 500 руб.

Ожидаемый эффект:

  • Рост CTR: +20-40%
  • Рост конверсии: +15-25%
  • Рост продаж: +20-40%
  • Снижение возвратов: -3-8%
  • ROI за 3 месяца: 150-400%
  • Окупаемость: 14-30 дней

Пример товаров: кухонная утварь, инструменты, декор, спортинвентарь, постельное бельё.


Уровень 3: Продвинутый (8 000-25 000 руб./SKU)

КритерийПорог
Маржа> 30%
Продажи> 200 шт./мес
БрендСобственный (Private Label)
Жизненный цикл товара> 12 мес.
Тип конкуренцииБренд + визуал

Действия:

  • Полная предметная съёмка: 5 000-8 000 руб.
  • Инфографика (5-6 слайдов): 4 000-6 000 руб.
  • Видео-обзор (15-30 сек): 5 000-10 000 руб.
  • Рич-контент (A+): 3 000-6 000 руб.
  • SEO-оптимизация: 2 000-3 000 руб.
  • UGC (2-3 отзыва): 1 500-4 500 руб.

Ожидаемый эффект:

  • Рост CTR: +30-60%
  • Рост конверсии: +25-40%
  • Рост продаж: +30-60%
  • Снижение возвратов: -5-15%
  • ROI за 3 месяца: 200-700%
  • Окупаемость: 7-20 дней

Пример товаров: бытовая электроника, собственные бренды одежды (базовая), мебель, крупная бытовая техника.


Уровень 4: Максимальный (25 000-80 000 руб./SKU)

КритерийПорог
Маржа> 35%
Продажи> 100 шт./мес (для премиума >30 достаточно)
БрендСобственный, выходящий на рынок
Жизненный цикл товара> 12 мес.
Тип конкуренцииБренд + эмоция + визуал
ЦельЗахват доли рынка / запуск нового бренда

Действия:

  • Всё из уровня 3
  • Фото на модели (3-5 образов): 15 000-30 000 руб.
  • Lifestyle-съёмка (2-3 локации): 10 000-20 000 руб.
  • 3D-визуализация/анимация: 5 000-15 000 руб.
  • Полноценное видео (1-3 мин): 15 000-30 000 руб.
  • Расширенный UGC (5+ отзывов): 5 000-10 000 руб.
  • Бренд-книга (амортизируется на все SKU): 20 000-50 000 руб.

Ожидаемый эффект:

  • Рост CTR: +50-100%
  • Рост конверсии: +35-60%
  • Рост продаж: +50-100%
  • Снижение возвратов: -10-25%
  • ROI за 3 месяца: 150-500%
  • Окупаемость: 15-40 дней

Пример товаров: дизайнерская одежда, ювелирные изделия, премиальная косметика, детские коляски, мебель.

Сводная матрица уровней инвестиций

УровеньБюджет/SKUМаржаПродажи/месЦиклОкупаемостьROI (3 мес)
0 — Не инвестировать0 руб.< 15%< 10< 2 мес.N/AN/A
1 — Минимальныйдо 2 000 руб.15-25%10-50> 3 мес.30-60 дн.50-150%
2 — Базовый2 000-8 000 руб.25-40%50-200> 6 мес.14-30 дн.150-400%
3 — Продвинутый8 000-25 000 руб.> 30%> 200> 12 мес.7-20 дн.200-700%
4 — Максимальный25 000-80 000 руб.> 35%> 100> 12 мес.15-40 дн.150-500%

6. Экономика масштаба

6.1. Как количество SKU меняет стратегию

Чем больше артикулов в ассортименте, тем сильнее эффект масштаба снижает себестоимость контента на единицу:

graph LR
A["1-10 SKU<br/>Ручная проработка"] --> B["10-50 SKU<br/>Шаблонизация"]
B --> C["50-200 SKU<br/>Конвейер"]
C --> D["200-1000 SKU<br/>Автоматизация"]
D --> E["1000+ SKU<br/>ABC-анализ"]

style A fill:#e74c3c,color:#fff
style B fill:#e67e22,color:#fff
style C fill:#f39c12,color:#fff
style D fill:#27ae60,color:#fff
style E fill:#2ecc71,color:#fff

6.2. Детализация по масштабу

1-10 SKU: Ручная проработка

ПараметрЗначение
Стоимость контента/SKU8 000-25 000 руб.
ПодходИндивидуальный для каждого товара
Кто делаетФотограф + дизайнер + копирайтер (штат или фриланс)
Срок3-7 дней/SKU
Сильная сторонаМаксимальное качество каждой карточки
Слабая сторонаВысокая стоимость, не масштабируется

Стратегия: Вкладывайте максимум в каждый товар. При 5 SKU каждый — потенциальный бестселлер. Используйте уровень 3-4 инвестиций.

10-50 SKU: Шаблонизация

ПараметрЗначение
Стоимость контента/SKU5 000-15 000 руб.
Снижение vs ручной30-40%
ПодходШаблоны инфографики, единый стиль съёмки
Кто делаетМини-команда (1 фотограф + 1 дизайнер)
Срок1-3 дня/SKU
КлючевоеБренд-бук, шаблоны, процессы

Стратегия:

  • Разработайте бренд-книгу (стоимость 20 000-50 000 руб., амортизируется на все SKU)
  • Создайте 3-5 шаблонов инфографики (подставляйте данные товара)
  • Организуйте пакетные съёмки (5-10 товаров за одну сессию)
  • SEO-оптимизацию переведите на AI

50-200 SKU: Конвейерное производство

ПараметрЗначение
Стоимость контента/SKU2 000-8 000 руб.
Снижение vs ручной50-70%
ПодходКонвейер с чёткими ролями и SLA
Кто делаетКоманда из 3-5 человек
Срок0.5-1 день/SKU
КлючевоеПроцесс, автоматизация, шаблоны

Стратегия:

  • AI-генерация для 60% SKU (уровни 0-1)
  • Профессиональный контент для топ-40% (уровни 2-3)
  • Пакетные съёмки по 20-30 товаров/день
  • Конвейер: фото → ретушь → инфографика → SEO → загрузка
  • SalesFinder для приоритизации: какие карточки обновлять первыми

200-1 000 SKU: Полная автоматизация

ПараметрЗначение
Стоимость контента/SKU500-3 000 руб.
Снижение vs ручной70-90%
ПодходAI-first, ручная работа только для флагманов
Кто делает1-2 оператора + AI-инструменты
Срок10-30 мин/SKU (AI), 1-2 дня/SKU (флагманы)
КлючевоеAPI-интеграции, автоматическая генерация

Стратегия:

  • AI-контент для 80% SKU (автоматическая генерация)
  • Ручная проработка только для топ-20% по выручке
  • Автоматический SEO через SalesFinder API
  • A/B-тестирование вариантов контента
  • Автоматический мониторинг позиций и обновление

1 000+ SKU: ABC-анализ

ПараметрЗначение
Стоимость контента/SKU (средняя)200-1 500 руб.
Снижение vs ручной85-95%
ПодходData-driven, только по метрикам
Кто делаетКоманда аналитиков + AI
КлючевоеSalesFinder данные определяют стратегию

ABC-распределение контент-бюджета:

ГруппаДоля SKUДоля выручкиБюджет на контентУровень инвестиций
A (бестселлеры)10-15%60-70%60% бюджетаУровень 3-4
B (стабильные)20-30%20-25%25% бюджетаУровень 1-2
C (хвост)55-70%5-15%15% бюджетаУровень 0-1

6.3. Эффект масштаба — кривая стоимости

Количество SKUСредняя стоимость/SKUОбщий бюджет на контент/месСтоимость контента / выручка
515 000 руб.75 000 руб.5-8%
2010 000 руб.200 000 руб.3-5%
506 000 руб.300 000 руб.2-4%
1003 500 руб.350 000 руб.1.5-3%
5001 500 руб.750 000 руб.0.8-1.5%
1 000800 руб.800 000 руб.0.5-1%
5 000400 руб.2 000 000 руб.0.3-0.7%
Вывод

При масштабе 100+ SKU стоимость контента падает ниже 2% от выручки — это «шум» в структуре расходов. Ключевое — правильная приоритизация: не «контент для всех», а «максимум контента для бестселлеров».


7. SalesFinder API для юнит-экономики

SalesFinder предоставляет данные, необходимые для расчёта юнит-экономики каждого товара и принятия решений об инвестициях в контент.

7.1. Ключевые эндпоинты для расчётов

ДанныеЭндпоинт SalesFinderЧто даёт для юнит-экономики
Объём продаж/api/products/salesRevenue estimation, тренд продаж
Цена и скидки/api/products/pricesТекущая РРЦ, история изменений
Категория и комиссия/api/categoriesКомиссия МП по категории (5-25%)
Конкуренты/api/products/competitorsПлотность конкуренции, ценовой диапазон
Позиции в поиске/api/monitoring/positionsЭффективность SEO-оптимизации
Отзывы и рейтинг/api/products/reviewsКонверсия, проблемы качества
Рекламная аналитика/api/ads/campaignsACOS, ROI рекламы
Данные магазина (API)/api/store/productsВнутренние данные: себестоимость, остатки

7.2. Данные для расчёта маржи

Из SalesFinder:

revenue = sales_volume * price                    # Выручка
commission = revenue * category_commission_rate # Комиссия МП
estimated_logistics = sales_volume * avg_logistics_cost # Логистика
ad_spend = ads_data.total_spend # Реклама

Из внутренних данных селлера (через API магазина):

cogs = purchase_price * sales_volume              # Себестоимость
storage = avg_stock * storage_rate * days # Хранение
returns = sales_volume * return_rate * return_cost # Возвраты

Расчёт маржи:

gross_profit = revenue - commission - cogs - estimated_logistics - storage - returns - ad_spend
net_margin = gross_profit / revenue * 100%

7.3. Данные для обоснования инвестиций

SalesFinder даёт три ключевых метрики для обоснования контент-инвестиций:

1. Плотность конкуренции (Competition Density)

# Высокая конкуренция = сильный контент критичен
competition_density = competitors_count / category_avg
if competition_density > 1.5:
content_priority = "HIGH" # Контент — конкурентное преимущество
elif competition_density > 0.8:
content_priority = "MEDIUM"
else:
content_priority = "LOW" # Мало конкурентов, контент вторичен

2. Ценовое позиционирование (Price Position)

# Премиум-позиционирование = контент обязателен
price_position = product_price / category_median_price
if price_position > 1.3:
# Дороже рынка на 30%+ → контент должен ОПРАВДЫВАТЬ цену
content_level = min(content_level + 1, 4)

3. Тренд продаж (Sales Trend)

# Растущий тренд = инвестиции умножатся
sales_trend = current_month_sales / prev_month_sales
if sales_trend > 1.2:
# Продажи растут → контент усилит рост
roi_multiplier = 1.3
elif sales_trend < 0.8:
# Продажи падают → контент может не помочь
roi_multiplier = 0.6

7.4. Пример комплексного запроса данных

import httpx

class SalesFinderUnitEconomics:
"""Получение данных SalesFinder для расчёта юнит-экономики."""

def __init__(self, api_key: str, base_url: str = "https://salesfinder.ru/api"):
self.api_key = api_key
self.base_url = base_url
self.headers = {"Authorization": f"Bearer {api_key}"}

async def get_product_economics(self, product_id: int) -> dict:
"""Собирает все данные для юнит-экономики одного товара."""
async with httpx.AsyncClient() as client:
# Параллельные запросы для скорости
sales_resp = await client.get(
f"{self.base_url}/products/{product_id}/sales",
headers=self.headers
)
price_resp = await client.get(
f"{self.base_url}/products/{product_id}/prices",
headers=self.headers
)
category_resp = await client.get(
f"{self.base_url}/products/{product_id}/category",
headers=self.headers
)
competitors_resp = await client.get(
f"{self.base_url}/products/{product_id}/competitors",
headers=self.headers
)

return {
"sales": sales_resp.json(),
"prices": price_resp.json(),
"category": category_resp.json(),
"competitors": competitors_resp.json(),
}

7.5. Мониторинг эффективности контента

После обновления контента SalesFinder отслеживает изменения:

МетрикаЭндпоинтЧто отслеживаем
CTR карточки/api/monitoring/positionsКлики / показы в категории
Конверсия в корзину/api/store/products (через API МП)Добавления в корзину / просмотры
Продажи (штуки)/api/products/salesДинамика до/после обновления
Выручка/api/products/salesRevenue до/после
Позиция в поиске/api/monitoring/positionsПоисковое ранжирование
Рейтинг и отзывы/api/products/reviewsВлияние контента на восприятие
Возвраты/api/store/returns (через API МП)Снижение после обновления

Формула оценки эффекта контента:

def measure_content_effect(
sales_before: list[int], # Продажи за 14 дней ДО обновления
sales_after: list[int], # Продажи за 14 дней ПОСЛЕ обновления
seasonality_factor: float = 1.0 # Поправка на сезонность
) -> dict:
"""Измеряет эффект обновления контента."""
avg_before = sum(sales_before) / len(sales_before) * seasonality_factor
avg_after = sum(sales_after) / len(sales_after)

delta = avg_after - avg_before
delta_pct = (delta / avg_before * 100) if avg_before > 0 else 0

# Статистическая значимость (упрощённо)
is_significant = len(sales_after) >= 14 and abs(delta_pct) > 10

return {
"avg_sales_before": round(avg_before, 1),
"avg_sales_after": round(avg_after, 1),
"delta_absolute": round(delta, 1),
"delta_percent": round(delta_pct, 1),
"is_significant": is_significant,
"verdict": "POSITIVE" if delta_pct > 10 else
"NEUTRAL" if delta_pct > -10 else "NEGATIVE"
}

8. Калькулятор окупаемости контента

8.1. Класс ContentROICalculator

Полноценный калькулятор, который принимает данные о товаре (в том числе из SalesFinder API) и рассчитывает: рекомендуемый уровень инвестиций, ожидаемый ROI, срок окупаемости, оценку рисков.

"""
ContentROICalculator — калькулятор окупаемости контента для товаров на маркетплейсах.

Использование:
calculator = ContentROICalculator()
result = calculator.calculate(product_data)
print(result.summary())

Данные могут поступать из:
- SalesFinder API (автоматически)
- Ручной ввод (для тестирования/планирования)
"""

from dataclasses import dataclass, field
from enum import Enum
from typing import Optional
import math


class RiskLevel(Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
CRITICAL = "critical"


class InvestmentLevel(Enum):
NONE = 0 # Не инвестировать
MINIMAL = 1 # До 2 000 руб.
BASIC = 2 # 2 000 - 8 000 руб.
ADVANCED = 3 # 8 000 - 25 000 руб.
MAXIMUM = 4 # 25 000 - 80 000 руб.


@dataclass
class ProductData:
"""Входные данные о товаре."""
# Обязательные поля
name: str
price: float # РРЦ (розничная цена)
cogs: float # Себестоимость (закупка + упаковка)
monthly_sales: int # Продажи в месяц (штук)

# Комиссия и логистика
commission_rate: float = 0.15 # Комиссия МП (0.05-0.25)
logistics_cost: float = 100.0 # Логистика за единицу (руб.)
storage_cost_daily: float = 10.0 # Хранение за сутки за единицу
avg_storage_days: float = 10.0 # Среднее время хранения

# Возвраты
return_rate: float = 0.10 # Процент возвратов (0.03-0.60)
return_cost: float = 80.0 # Стоимость обработки возврата

# Реклама
ad_spend_rate: float = 0.10 # Расходы на рекламу (% от выручки)

# Налоги
tax_rate: float = 0.06 # Ставка налога (УСН 6%)

# Метаданные
is_own_brand: bool = False # Собственный бренд?
lifecycle_months: int = 6 # Ожидаемый жизненный цикл (месяцев)
stock_quantity: int = 100 # Текущий остаток на складе
category: str = "" # Категория товара
competition_density: float = 1.0 # Плотность конкуренции (0.5-2.0)
visual_importance: float = 0.5 # Важность визуала (0-1)

# Данные из SalesFinder (опциональные)
sf_sales_trend: Optional[float] = None # Тренд продаж (>1 = рост)
sf_price_position: Optional[float] = None # Позиция цены vs медиана
sf_category_commission: Optional[float] = None # Комиссия из SF


@dataclass
class ContentCostEstimate:
"""Оценка стоимости контента по уровням."""
level: InvestmentLevel
min_cost: float
max_cost: float
recommended_cost: float
includes: list[str] = field(default_factory=list)


@dataclass
class ROIResult:
"""Результат расчёта ROI."""
# Рекомендации
investment_level: InvestmentLevel
recommended_budget: float
content_items: list[str]

# ROI
roi_1_month: float # ROI за 1 месяц (%)
roi_3_months: float # ROI за 3 месяца (%)
roi_6_months: float # ROI за 6 месяцев (%)

# Окупаемость
payback_days: float # Срок окупаемости (дней)

# Риски
risk_level: RiskLevel
risk_factors: list[str]

# Дополнительная прибыль
monthly_additional_profit: float
monthly_saved_returns: float

# Исходные данные
current_margin_per_unit: float
current_margin_rate: float
expected_sales_uplift: float
expected_return_reduction: float

def summary(self) -> str:
"""Форматированная сводка результатов."""
level_names = {
InvestmentLevel.NONE: "Не инвестировать (Уровень 0)",
InvestmentLevel.MINIMAL: "Минимальный (Уровень 1)",
InvestmentLevel.BASIC: "Базовый (Уровень 2)",
InvestmentLevel.ADVANCED: "Продвинутый (Уровень 3)",
InvestmentLevel.MAXIMUM: "Максимальный (Уровень 4)",
}

risk_emoji = {
RiskLevel.LOW: "LOW",
RiskLevel.MEDIUM: "MEDIUM",
RiskLevel.HIGH: "HIGH",
RiskLevel.CRITICAL: "CRITICAL",
}

lines = [
"=" * 60,
"КАЛЬКУЛЯТОР ОКУПАЕМОСТИ КОНТЕНТА",
"=" * 60,
"",
f"Рекомендация: {level_names[self.investment_level]}",
f"Бюджет: {self.recommended_budget:,.0f} руб.",
"",
"--- Юнит-экономика ---",
f"Маржа на единицу: {self.current_margin_per_unit:,.1f} руб. "
f"({self.current_margin_rate:.1f}%)",
"",
"--- Прогноз эффекта ---",
f"Ожидаемый рост продаж: +{self.expected_sales_uplift:.1f}%",
f"Ожидаемое снижение возвратов: "
f"-{self.expected_return_reduction:.1f} п.п.",
f"Доп. прибыль/мес: {self.monthly_additional_profit:,.0f} руб.",
f"Экономия на возвратах/мес: "
f"{self.monthly_saved_returns:,.0f} руб.",
"",
"--- ROI ---",
f"ROI (1 мес): {self.roi_1_month:+.1f}%",
f"ROI (3 мес): {self.roi_3_months:+.1f}%",
f"ROI (6 мес): {self.roi_6_months:+.1f}%",
f"Окупаемость: {self.payback_days:.0f} дней",
"",
f"--- Риски: {risk_emoji[self.risk_level]} ---",
]

for rf in self.risk_factors:
lines.append(f" - {rf}")

if self.content_items:
lines.append("")
lines.append("--- Что делать ---")
for item in self.content_items:
lines.append(f" + {item}")

lines.append("")
lines.append("=" * 60)
return "\n".join(lines)


class ContentROICalculator:
"""
Калькулятор окупаемости контента для товаров на маркетплейсах.

Алгоритм:
1. Рассчитывает текущую юнит-экономику товара
2. Определяет рекомендуемый уровень инвестиций (0-4)
3. Оценивает ожидаемый эффект от контента (рост продаж, снижение возвратов)
4. Рассчитывает ROI и срок окупаемости
5. Оценивает риски
"""

# Коэффициенты влияния контента на продажи по уровням
SALES_UPLIFT = {
InvestmentLevel.NONE: 0.0,
InvestmentLevel.MINIMAL: 0.10, # +10% к продажам
InvestmentLevel.BASIC: 0.25, # +25%
InvestmentLevel.ADVANCED: 0.45, # +45%
InvestmentLevel.MAXIMUM: 0.70, # +70%
}

# Снижение возвратов по уровням (в процентных пунктах)
RETURN_REDUCTION = {
InvestmentLevel.NONE: 0.0,
InvestmentLevel.MINIMAL: 0.02, # -2 п.п.
InvestmentLevel.BASIC: 0.05, # -5 п.п.
InvestmentLevel.ADVANCED: 0.10, # -10 п.п.
InvestmentLevel.MAXIMUM: 0.15, # -15 п.п.
}

# Бюджет контента по уровням (min, max, recommended)
BUDGET_RANGES = {
InvestmentLevel.NONE: (0, 0, 0),
InvestmentLevel.MINIMAL: (500, 2_000, 1_500),
InvestmentLevel.BASIC: (2_000, 8_000, 5_000),
InvestmentLevel.ADVANCED: (8_000, 25_000, 15_000),
InvestmentLevel.MAXIMUM: (25_000, 80_000, 45_000),
}

# Состав контента по уровням
CONTENT_ITEMS = {
InvestmentLevel.NONE: [
"Контент от поставщика (as-is)",
"Заполнение характеристик (бесплатно)",
],
InvestmentLevel.MINIMAL: [
"AI-инфографика (2-3 слайда)",
"SEO-оптимизация текста (AI)",
"Базовая обработка фото поставщика",
],
InvestmentLevel.BASIC: [
"Профессиональная предметная съёмка",
"Инфографика (3-4 слайда)",
"SEO-оптимизация (полная)",
"Продающее описание",
],
InvestmentLevel.ADVANCED: [
"Полная предметная съёмка",
"Инфографика (5-6 слайдов)",
"Видео-обзор (15-30 сек)",
"Рич-контент (A+)",
"SEO-оптимизация",
"UGC (2-3 отзыва)",
],
InvestmentLevel.MAXIMUM: [
"Всё из продвинутого уровня",
"Фото на модели (3-5 образов)",
"Lifestyle-съёмка (2-3 локации)",
"3D-визуализация/анимация",
"Полноценное видео (1-3 мин)",
"Расширенный UGC (5+ отзывов)",
"Бренд-книга (при необходимости)",
],
}

def calculate(self, product: ProductData) -> ROIResult:
"""Основной метод расчёта."""

# 1. Юнит-экономика
margin_per_unit = self._calc_margin(product)
margin_rate = (margin_per_unit / product.price * 100
if product.price > 0 else 0)

# 2. Определение уровня инвестиций
level = self._determine_level(product, margin_rate)

# 3. Бюджет
budget = self._calc_budget(level, product)

# 4. Ожидаемый эффект
sales_uplift = self._calc_sales_uplift(level, product)
return_reduction = self._calc_return_reduction(level, product)

# 5. Дополнительная прибыль
additional_sales = product.monthly_sales * sales_uplift
monthly_profit = additional_sales * margin_per_unit

new_sales = product.monthly_sales * (1 + sales_uplift)
saved_returns = (
new_sales * return_reduction * product.return_cost
)

monthly_benefit = monthly_profit + saved_returns

# 6. ROI
if budget > 0:
roi_1m = (monthly_benefit - budget) / budget * 100
roi_3m = (monthly_benefit * 3 - budget) / budget * 100
roi_6m = (monthly_benefit * 6 - budget) / budget * 100
else:
roi_1m = roi_3m = roi_6m = 0.0

# 7. Окупаемость
daily_benefit = monthly_benefit / 30 if monthly_benefit > 0 else 0
payback = budget / daily_benefit if daily_benefit > 0 else float('inf')
if payback == float('inf'):
payback = 999

# 8. Риски
risk_level, risk_factors = self._assess_risks(
product, margin_rate, level, payback
)

return ROIResult(
investment_level=level,
recommended_budget=budget,
content_items=self.CONTENT_ITEMS.get(level, []),
roi_1_month=roi_1m,
roi_3_months=roi_3m,
roi_6_months=roi_6m,
payback_days=payback,
risk_level=risk_level,
risk_factors=risk_factors,
monthly_additional_profit=monthly_profit,
monthly_saved_returns=saved_returns,
current_margin_per_unit=margin_per_unit,
current_margin_rate=margin_rate,
expected_sales_uplift=sales_uplift * 100,
expected_return_reduction=return_reduction * 100,
)

def _calc_margin(self, p: ProductData) -> float:
"""Рассчитывает чистую маржу на единицу товара."""
revenue = p.price
commission = revenue * p.commission_rate
storage = p.storage_cost_daily * p.avg_storage_days
returns_cost = p.return_rate * p.return_cost
ad_cost = revenue * p.ad_spend_rate
tax = revenue * p.tax_rate

margin = (
revenue
- p.cogs
- commission
- p.logistics_cost
- storage
- returns_cost
- ad_cost
- tax
)
return max(margin, 0)

def _determine_level(
self, p: ProductData, margin_rate: float
) -> InvestmentLevel:
"""Определяет рекомендуемый уровень инвестиций."""

# Стоп-факторы → Уровень 0
if margin_rate < 15:
return InvestmentLevel.NONE
if p.monthly_sales < 10:
return InvestmentLevel.NONE
if p.stock_quantity < 5:
return InvestmentLevel.NONE
if p.lifecycle_months < 2:
return InvestmentLevel.NONE

# Базовый скоринг
score = 0

# Маржинальность (0-4 балла)
if margin_rate >= 40:
score += 4
elif margin_rate >= 30:
score += 3
elif margin_rate >= 25:
score += 2
elif margin_rate >= 15:
score += 1

# Объём продаж (0-4 балла)
if p.monthly_sales >= 200:
score += 4
elif p.monthly_sales >= 100:
score += 3
elif p.monthly_sales >= 50:
score += 2
elif p.monthly_sales >= 10:
score += 1

# Жизненный цикл (0-2 балла)
if p.lifecycle_months >= 12:
score += 2
elif p.lifecycle_months >= 6:
score += 1

# Собственный бренд (+2 балла)
if p.is_own_brand:
score += 2

# Важность визуала (0-2 балла)
if p.visual_importance >= 0.8:
score += 2
elif p.visual_importance >= 0.5:
score += 1

# Конкуренция (0-2 балла)
if p.competition_density >= 1.5:
score += 2
elif p.competition_density >= 1.0:
score += 1

# SalesFinder бонусы
if p.sf_sales_trend and p.sf_sales_trend > 1.2:
score += 1 # Растущий тренд
if p.sf_price_position and p.sf_price_position > 1.3:
score += 1 # Премиум-позиционирование

# Маппинг score → level
if score >= 12:
return InvestmentLevel.MAXIMUM
elif score >= 8:
return InvestmentLevel.ADVANCED
elif score >= 5:
return InvestmentLevel.BASIC
elif score >= 2:
return InvestmentLevel.MINIMAL
else:
return InvestmentLevel.NONE

def _calc_budget(
self, level: InvestmentLevel, p: ProductData
) -> float:
"""Рассчитывает рекомендуемый бюджет."""
min_b, max_b, rec_b = self.BUDGET_RANGES[level]

# Корректировка для высокомаржинальных / высокообъёмных товаров
if p.monthly_sales > 300 and level.value >= 3:
rec_b = min(rec_b * 1.3, max_b)
if p.is_own_brand and level.value >= 2:
rec_b = min(rec_b * 1.2, max_b)

return rec_b

def _calc_sales_uplift(
self, level: InvestmentLevel, p: ProductData
) -> float:
"""Рассчитывает ожидаемый рост продаж."""
base_uplift = self.SALES_UPLIFT[level]

# Модификаторы
multiplier = 1.0

# Высокая важность визуала → больший эффект
if p.visual_importance >= 0.8:
multiplier *= 1.3
elif p.visual_importance <= 0.2:
multiplier *= 0.5

# Высокая конкуренция → контент важнее
if p.competition_density >= 1.5:
multiplier *= 1.2

# Тренд продаж из SalesFinder
if p.sf_sales_trend:
if p.sf_sales_trend > 1.2:
multiplier *= 1.15 # Растущий рынок
elif p.sf_sales_trend < 0.8:
multiplier *= 0.7 # Падающий рынок

return base_uplift * multiplier

def _calc_return_reduction(
self, level: InvestmentLevel, p: ProductData
) -> float:
"""Рассчитывает ожидаемое снижение возвратов."""
base_reduction = self.RETURN_REDUCTION[level]

# Высокий % возвратов → больше потенциала для снижения
if p.return_rate > 0.30:
return base_reduction * 1.5
elif p.return_rate < 0.05:
return base_reduction * 0.3 # Мало возвратов — мало снижать

return base_reduction

def _assess_risks(
self,
p: ProductData,
margin_rate: float,
level: InvestmentLevel,
payback: float
) -> tuple[RiskLevel, list[str]]:
"""Оценивает риски инвестиции."""
risks = []

# Факторы риска
if margin_rate < 20:
risks.append(
f"Низкая маржа ({margin_rate:.1f}%) — "
f"мало запаса для ошибки"
)
if p.monthly_sales < 30:
risks.append(
f"Малый объём ({p.monthly_sales} шт/мес) — "
f"долгая амортизация"
)
if p.lifecycle_months < 4:
risks.append(
f"Короткий цикл ({p.lifecycle_months} мес) — "
f"контент может не успеть окупиться"
)
if p.return_rate > 0.30:
risks.append(
f"Высокие возвраты ({p.return_rate*100:.0f}%) — "
f"риск убытков"
)
if p.stock_quantity < 20:
risks.append(
f"Малый остаток ({p.stock_quantity} шт) — "
f"риск out-of-stock до окупаемости"
)
if payback > 60:
risks.append(
f"Долгая окупаемость ({payback:.0f} дней) — "
f"высокий риск изменений рынка"
)
if p.competition_density > 2.0:
risks.append(
"Сверхвысокая конкуренция — "
"контент может быть скопирован"
)
if p.sf_sales_trend and p.sf_sales_trend < 0.8:
risks.append(
f"Падающий тренд продаж ({p.sf_sales_trend:.2f}x) — "
f"рынок сжимается"
)

# Определение уровня риска
if len(risks) >= 4:
risk_level = RiskLevel.CRITICAL
elif len(risks) >= 3:
risk_level = RiskLevel.HIGH
elif len(risks) >= 1:
risk_level = RiskLevel.MEDIUM
else:
risk_level = RiskLevel.LOW

if not risks:
risks.append("Факторы риска не выявлены")

return risk_level, risks


# =============================================================
# Примеры использования
# =============================================================

def example_jacket():
"""Пример: мужская куртка (собственный бренд)."""
product = ProductData(
name="Мужская куртка (собственный бренд)",
price=8_500,
cogs=2_800,
monthly_sales=40,
commission_rate=0.16,
logistics_cost=150,
storage_cost_daily=8,
avg_storage_days=8,
return_rate=0.25,
return_cost=150,
ad_spend_rate=0.08,
tax_rate=0.06,
is_own_brand=True,
lifecycle_months=12,
stock_quantity=200,
category="Одежда",
competition_density=1.4,
visual_importance=0.9,
)
calc = ContentROICalculator()
result = calc.calculate(product)
print(result.summary())
return result


def example_phone_case():
"""Пример: чехол для телефона (перекуп)."""
product = ProductData(
name="Чехол для телефона (перекуп)",
price=690,
cogs=180,
monthly_sales=80,
commission_rate=0.15,
logistics_cost=55,
storage_cost_daily=3,
avg_storage_days=5,
return_rate=0.08,
return_cost=55,
ad_spend_rate=0.12,
tax_rate=0.06,
is_own_brand=False,
lifecycle_months=4,
stock_quantity=300,
category="Аксессуары",
competition_density=1.8,
visual_importance=0.6,
)
calc = ContentROICalculator()
result = calc.calculate(product)
print(result.summary())
return result


def example_knives():
"""Пример: набор кухонных ножей (товарка)."""
product = ProductData(
name="Набор кухонных ножей (товарка, своя марка)",
price=3_200,
cogs=850,
monthly_sales=120,
commission_rate=0.13,
logistics_cost=120,
storage_cost_daily=5,
avg_storage_days=7,
return_rate=0.06,
return_cost=80,
ad_spend_rate=0.10,
tax_rate=0.06,
is_own_brand=True,
lifecycle_months=18,
stock_quantity=500,
category="Товары для дома",
competition_density=1.2,
visual_importance=0.7,
)
calc = ContentROICalculator()
result = calc.calculate(product)
print(result.summary())
return result


def example_stroller():
"""Пример: детская коляска (премиум)."""
product = ProductData(
name="Детская коляска (премиум)",
price=32_000,
cogs=12_000,
monthly_sales=12,
commission_rate=0.12,
logistics_cost=350,
storage_cost_daily=25,
avg_storage_days=12,
return_rate=0.10,
return_cost=350,
ad_spend_rate=0.06,
tax_rate=0.06,
is_own_brand=True,
lifecycle_months=24,
stock_quantity=40,
category="Детские товары",
competition_density=0.9,
visual_importance=0.85,
sf_price_position=1.4,
)
calc = ContentROICalculator()
result = calc.calculate(product)
print(result.summary())
return result


def example_socks():
"""Пример: носки (commodity)."""
product = ProductData(
name="Мужские носки 10 пар (commodity)",
price=590,
cogs=200,
monthly_sales=200,
commission_rate=0.17,
logistics_cost=55,
storage_cost_daily=3,
avg_storage_days=5,
return_rate=0.05,
return_cost=40,
ad_spend_rate=0.15,
tax_rate=0.06,
is_own_brand=False,
lifecycle_months=6,
stock_quantity=1000,
category="Носки",
competition_density=2.2,
visual_importance=0.15,
)
calc = ContentROICalculator()
result = calc.calculate(product)
print(result.summary())
return result


if __name__ == "__main__":
print("\n" + "=" * 60)
print("ПРИМЕР 1: Мужская куртка")
print("=" * 60)
example_jacket()

print("\n" + "=" * 60)
print("ПРИМЕР 2: Чехол для телефона")
print("=" * 60)
example_phone_case()

print("\n" + "=" * 60)
print("ПРИМЕР 3: Набор кухонных ножей")
print("=" * 60)
example_knives()

print("\n" + "=" * 60)
print("ПРИМЕР 4: Детская коляска")
print("=" * 60)
example_stroller()

print("\n" + "=" * 60)
print("ПРИМЕР 5: Носки")
print("=" * 60)
example_socks()

8.2. Интеграция с SalesFinder API

Калькулятор можно обогатить данными из SalesFinder автоматически:

async def create_product_from_salesfinder(
sf_client: SalesFinderUnitEconomics,
product_id: int,
seller_data: dict, # Данные селлера (себестоимость, остатки)
) -> ProductData:
"""
Создаёт ProductData из данных SalesFinder + данных селлера.

Args:
sf_client: Клиент SalesFinder API
product_id: ID товара в SalesFinder
seller_data: dict с ключами:
- cogs: себестоимость
- stock_quantity: остаток на складе
- is_own_brand: собственный бренд?
- lifecycle_months: ожидаемый цикл жизни
"""
# Получаем данные из SalesFinder
sf_data = await sf_client.get_product_economics(product_id)

# Извлекаем метрики
sales = sf_data["sales"]
prices = sf_data["prices"]
category = sf_data["category"]
competitors = sf_data["competitors"]

# Рассчитываем тренд продаж
if len(sales.get("monthly", [])) >= 2:
current = sales["monthly"][-1]["quantity"]
previous = sales["monthly"][-2]["quantity"]
trend = current / previous if previous > 0 else 1.0
else:
trend = 1.0

# Ценовое позиционирование
median_price = category.get("median_price", prices["current"])
price_position = prices["current"] / median_price if median_price > 0 else 1.0

return ProductData(
name=sales.get("product_name", f"Product #{product_id}"),
price=prices["current"],
cogs=seller_data["cogs"],
monthly_sales=sales.get("monthly", [{}])[-1].get("quantity", 0),
commission_rate=category.get("commission_rate", 0.15),
logistics_cost=sales.get("avg_logistics_cost", 100),
return_rate=sales.get("return_rate", 0.10),
is_own_brand=seller_data.get("is_own_brand", False),
lifecycle_months=seller_data.get("lifecycle_months", 6),
stock_quantity=seller_data.get("stock_quantity", 100),
category=category.get("name", ""),
competition_density=len(competitors.get("items", [])) / 50,
visual_importance=_estimate_visual_importance(category.get("name", "")),
sf_sales_trend=trend,
sf_price_position=price_position,
sf_category_commission=category.get("commission_rate"),
)


def _estimate_visual_importance(category_name: str) -> float:
"""Оценка важности визуала по категории."""
high_visual = [
"одежда", "обувь", "украшения", "бижутерия",
"декор", "мебель", "подарки", "косметика",
"аксессуары", "сумки", "ювелирные",
]
medium_visual = [
"электроника", "бытовая техника", "инструменты",
"спорт", "детские", "игрушки", "посуда",
]
low_visual = [
"расходные", "канцелярия", "крепёж",
"хозтовары", "бытовая химия",
]

category_lower = category_name.lower()
for kw in high_visual:
if kw in category_lower:
return 0.9
for kw in medium_visual:
if kw in category_lower:
return 0.6
for kw in low_visual:
if kw in category_lower:
return 0.2
return 0.5 # default

8.3. Пример вывода калькулятора

============================================================
КАЛЬКУЛЯТОР ОКУПАЕМОСТИ КОНТЕНТА
============================================================

Рекомендация: Продвинутый (Уровень 3)
Бюджет: 18,000 руб.

--- Юнит-экономика ---
Маржа на единицу: 1,262 руб. (39.4%)

--- Прогноз эффекта ---
Ожидаемый рост продаж: +45.0%
Ожидаемое снижение возвратов: -10.0 п.п.
Доп. прибыль/мес: 68,159 руб.
Экономия на возвратах/мес: 1,392 руб.

--- ROI ---
ROI (1 мес): +286.4%
ROI (3 мес): +1,059.2%
ROI (6 мес): +2,218.4%
Окупаемость: 8 дней

--- Риски: LOW ---
- Факторы риска не выявлены

--- Что делать ---
+ Полная предметная съёмка
+ Инфографика (5-6 слайдов)
+ Видео-обзор (15-30 сек)
+ Рич-контент (A+)
+ SEO-оптимизация
+ UGC (2-3 отзыва)

============================================================

9. Чек-лист: принятие решения об инвестиции в контент

Используйте этот чек-лист перед каждым решением о вложении в контент карточки:

Шаг 1: Проверьте стоп-факторы

  • Маржа товара > 15%?
  • Продажи > 10 штук/месяц?
  • Остаток на складе > 5 штук?
  • Жизненный цикл > 2 месяцев?
  • Товар не является чистым commodity?
  • Конкуренция не только ценовая?

Если хотя бы 2 ответа «нет» — не инвестируйте.

Шаг 2: Определите уровень инвестиций

  • Рассчитайте маржу через калькулятор
  • Оцените важность визуала для вашей категории
  • Проверьте тренд продаж через SalesFinder
  • Определите уровень (0-4) по матрице

Шаг 3: Рассчитайте ROI

  • Запустите ContentROICalculator с данными товара
  • Убедитесь, что ROI за 3 месяца > 100%
  • Проверьте срок окупаемости (< 60 дней)
  • Оцените риски (LOW или MEDIUM приемлемо)

Шаг 4: Выберите тип контента

  • Определите приоритетные элементы (фото > инфографика > видео > SEO)
  • Оцените, подходит ли AI-генерация (снижает стоимость на 70-85%)
  • Составьте ТЗ для исполнителя

Шаг 5: Измерьте результат

  • Зафиксируйте продажи ДО обновления (14 дней)
  • Обновите контент
  • Через 14 дней замерьте продажи ПОСЛЕ
  • Рассчитайте фактический ROI
  • Скорректируйте стратегию

10. Частые ошибки при расчёте юнит-экономики

Ошибка 1: Не учитывать возвраты

Селлер считает маржу 35%, а реальная — 18% из-за 30% возвратов в fashion. Всегда закладывайте стоимость возвратов И обратной логистики.

Ошибка 2: Забыть про хранение

На WB хранение кажется «копейками» — 5 руб./сутки. Но 100 единиц x 30 дней = 15 000 руб./мес. При 50 продажах — 300 руб./единицу. Это 15% от товара за 2 000 руб.

Ошибка 3: Не амортизировать контент

Контент за 20 000 руб. — это не расход одного месяца. Если товар живёт 12 месяцев и продаётся 100 шт./мес, стоимость контента на единицу = 16.7 руб. (менее 1%).

Ошибка 4: Считать ROI рекламы без учёта контента

Реклама приводит трафик на карточку. Если карточка «слабая» — реклама сливает деньги. Формула: Effective_ROAS = ROAS * Content_Quality_Factor. Плохой контент снижает ROAS на 30-50%.

Ошибка 5: Одинаковый подход ко всем SKU

ABC-анализ обязателен при 50+ SKU. 10% товаров дают 70% выручки — именно в них нужно вкладывать максимум контента. Остальным — AI-генерация или контент поставщика.

Ошибка 6: Игнорировать сезонность

Вкладывать 50 000 руб. в контент для новогодних украшений в ноябре — уже поздно. Контент нужно готовить за 2-3 месяца до пика. SalesFinder показывает сезонные тренды.

Ошибка 7: Не учитывать конкурентное окружение

Если все конкуренты уже имеют профессиональный контент — ваш контент должен быть ЛУЧШЕ, а не просто «хороший». Бенчмаркинг через SalesFinder обязателен.


11. Итоговые формулы — шпаргалка

Маржа на единицу

Margin = Price - COGS - Commission - Logistics - Storage -
Returns_Cost - Ad_Cost - Tax - Other

Процент маржи

Margin_Rate = Margin / Price * 100%

ROI контента

Content_ROI = (Monthly_Benefit * Months - Content_Cost) / Content_Cost * 100%
Monthly_Benefit = Additional_Profit + Saved_Returns
Additional_Profit = Additional_Sales * Margin_Per_Unit
Saved_Returns = New_Sales * Return_Reduction * Return_Cost

Срок окупаемости

Payback_Days = Content_Cost / (Monthly_Benefit / 30)

Стоимость контента на единицу продажи

Content_Per_Unit = Content_Cost / (Monthly_Sales * Lifecycle_Months)

Точка безубыточности контента

Breakeven_Sales = Content_Cost / Margin_Per_Unit
Все формулы реализованы в классе ContentROICalculator

Просто передайте данные товара — калькулятор посчитает всё автоматически. Для получения данных из SalesFinder используйте метод create_product_from_salesfinder().


Что дальше