Фото-формула ТОПа — бенчмарк контента ТОП-20
Data-driven creative brief для фотосъёмки: анализируем контент ТОП-20 товаров в категории и строим формулу успеха, которую клиент должен повторить или превзойти.
Проблема
Фотостудии снимают «как видят» или по типовым брифам. Но в каждой категории Wildberries существует своя «выигрышная формула» — у ТОП-20 товаров есть общие паттерны контента:
- Количество фото — в одних категориях хватает 6, в других нужно 15+
- Наличие видео — где-то видео даёт +40% конверсии, где-то не влияет
- Типы кадров — lifestyle, на белом фоне, инфографика, детали, размерная сетка
- 3D-модели — в некоторых нишах это уже стандарт
Без анализа этих паттернов контент создаётся вслепую. Клиент платит за съёмку, но получает набор фото, который не соответствует стандарту категории. В результате карточка проигрывает конкурентам по визуалу, несмотря на потраченный бюджет.
Возможность для Fotofactor: перейти от субъективных брифов к data-driven ТЗ на фотосъёмку. Каждый бриф подкреплён цифрами: «ТОП-20 в вашей категории используют в среднем 12.3 фото и 85% из них имеют видео — вам нужно минимум столько же».
Пайплайн данных
Два ключевых эндпоинта MPStats
graph LR
A["POST /wb/get/category<br/>ТОП-20 по выручке"] --> B["Контент-метрики:<br/>picscount, hasvideo,<br/>has3d, rating"]
B --> C["Расчёт бенчмарков<br/>avg, %, gap"]
A --> D["GET /wb/get/item/{sku}/by_keywords<br/>Ключевые слова"]
D --> E["Общие ключи<br/>(50%+ ТОПа)"]
C --> F["Фото-формула<br/>= Creative Brief"]
E --> F
| Эндпоинт | Данные | Зачем |
|---|---|---|
POST /wb/get/category | ТОП-20 товаров по выру чке | Контент-метрики лидеров категории |
GET /wb/get/item/{sku}/by_keywords | Ключевые слова для каждого товара | SEO-ядро для инфографики и описаний |
Поля для контент-бенчмаркинга
Все данные приходят из одного запроса POST /wb/get/category:
| Поле | Что анализируем | Как используем |
|---|---|---|
picscount | Среднее количество фото у ТОП-20 | Минимальное кол-во фото для клиента |
hasvideo | % товаров с видео | Нужно ли видео (да/нет) |
has3d | % товаров с 3D | Нужна ли 3D-модель (да/нет/опционально) |
comments | Количество отзывов (social proof) | Уровень конкуренции за доверие |
rating | Средний рейтинг | Порог качества в категории |
revenue | Выручка (для весов) | Вес каждого товара в бенчмарке |
category_position | Позиция в категории | Подтверждение принадлежности к ТОПу |
Анализ
Алгоритм построения фото-формулы
import httpx
from urllib.parse import quote
from collections import Counter
MPSTATS_TOKEN = "YOUR_TOKEN"
BASE_URL = "https://mpstats.io/api"
HEADERS = {
"X-Mpstats-TOKEN": MPSTATS_TOKEN,
"Content-Type": "application/json",
}
# Шаг 1: Загрузить ТОП-20 товаров категории по выручке
def fetch_top20(category: str, d1: str, d2: str) -> list:
"""ТОП-20 товаров категории, отсортированных по revenue."""
resp = httpx.post(
f"{BASE_URL}/wb/get/category",
headers=HEADERS,
json={
"path": quote(category, safe=""),
"d1": d1,
"d2": d2,
"startRow": 0,
"endRow": 20,
"sortModel": [{"colId": "revenue", "sort": "desc"}],
},
timeout=30,
)
resp.raise_for_status()
return resp.json().get("data", [])
# Шаг 2: Рассчитать контент-бенчмарки
def calculate_benchmarks(products: list) -> dict:
"""
Бенчмарки контента ТОП-20:
- avg_photos: среднее количество фото
- video_rate: доля товаров с видео (0.0 - 1.0)
- has3d_rate: доля товаров с 3D (0.0 - 1.0)
- avg_rating: средний рейтинг
- avg_comments: среднее кол-во отзывов
"""
n = len(products)
if n == 0:
return {}
avg_photos = sum(p.get("picscount", 0) for p in products) / n
video_rate = sum(1 for p in products if p.get("hasvideo")) / n
has3d_rate = sum(1 for p in products if p.get("has3d")) / n
avg_rating = sum(p.get("rating", 0) for p in products) / n
avg_comments = sum(p.get("comments", 0) for p in products) / n
return {
"avg_photos": round(avg_photos, 1),
"video_rate": round(video_rate * 100), # в процентах
"has3d_rate": round(has3d_rate * 100),
"avg_rating": round(avg_rating, 1),
"avg_comments": round(avg_comments),
"total_products": n,
}
# Шаг 3: Собрать общие ключевые слова ТОП-20
def fetch_common_keywords(products: list, min_overlap: float = 0.5) -> list:
"""
Ключевые слова, которые встречаются у 50%+ товаров ТОП-20.
Это MUST-HAVE ключи для SEO и инфографики.
"""
keyword_counter = Counter()
n = len(products)
for product in products:
sku = product.get("id")
if not sku:
continue
resp = httpx.get(
f"{BASE_URL}/wb/get/item/{sku}/by_keywords",
headers=HEADERS,
timeout=30,
)
if resp.status_code != 200:
continue
keywords = resp.json()
unique_keys = set()
for kw in keywords:
word = kw.get("keyword", "").lower().strip()
if word:
unique_keys.add(word)
for word in unique_keys:
keyword_counter[word] += 1
# Фильтруем: оставляем только те, что у 50%+ товаров
threshold = int(n * min_overlap)
common = [
{"keyword": kw, "overlap": count, "overlap_pct": round(count / n * 100)}
for kw, count in keyword_counter.most_common()
if count >= threshold
]
return common
# Шаг 4: Сгенерировать фото-формулу (gap-анализ)
def generate_content_formula(
benchmarks: dict,
client_photos: int,
client_has_video: bool,
client_has_3d: bool,
client_rating: float,
) -> list:
"""
Сравнение бенчмарка ТОП-20 с текущим контентом клиента.
Возвращает список gap-ов с рекомендациями.
"""
gaps = []
# Фото
photo_gap = benchmarks["avg_photos"] - client_photos
gaps.append({
"metric": "Количество фото",
"benchmark": benchmarks["avg_photos"],
"client": client_photos,
"gap": round(photo_gap, 1),
"action": f"Добавить минимум {max(0, int(photo_gap))} фото"
if photo_gap > 0 else "Соответствует ТОПу",
})
# Видео
video_needed = benchmarks["video_rate"] >= 50
gaps.append({
"metric": "Видео",
"benchmark": f"{benchmarks['video_rate']}%",
"client": "Есть" if client_has_video else "Нет",
"gap": "Нужно" if video_needed and not client_has_video else "Ок",
"action": "Снять видеообзор 30-60 сек"
if video_needed and not client_has_video else "Опционально",
})
# 3D
three_d_needed = benchmarks["has3d_rate"] >= 30
gaps.append({
"metric": "3D-модель",
"benchmark": f"{benchmarks['has3d_rate']}%",
"client": "Есть" if client_has_3d else "Нет",
"gap": "Нужно" if three_d_needed and not client_has_3d else "Опционально",
"action": "Создать 3D-модель"
if three_d_needed and not client_has_3d else "Низкий приоритет",
})
# Рейтинг
rating_gap = benchmarks["avg_rating"] - client_rating
gaps.append({
"metric": "Рейтинг",
"benchmark": benchmarks["avg_rating"],
"client": client_rating,
"gap": round(rating_gap, 1),
"action": "Улучшить контент для снижения возвратов"
if rating_gap > 0.3 else "В пределах нормы",
})
return gaps
Пример выходных данных
Категория «Автомобильные ароматизаторы» — бенчмарк ТОП-20:
| Метрика | ТОП-20 бенчмарк | Клиент сейчас | Gap | Действие |
|---|---|---|---|---|
| Количество фото | 12.3 | 5 | -7.3 | Добавить минимум 8 фото |
| Видео | 85% | Нет | Нужно | Снять видеообзор 30-60 сек |
| 3D | 15% | Нет | Опционально | Низкий приоритет |
| Рейтинг | 4.7 | 4.2 | -0.5 | Улучшить контент (снизить возвраты) |
Эндпоинт GET /wb/get/item/{sku}/by_keywords возвращает ключевые слова, по которым ранжируется каждый товар. Мы собираем ключи со всех 20 товаров и оставляем только те, что встречаются у 50%+ лидеров.
Эти ключевые слова становятся MUST-HAVE для SEO-оптимизации:
- Их нужно включить в заголовок карточки
- Они должны быть визуально отражены на инфографике (если ключ = характеристика товара)
- Их нужно использовать в описании и rich-контенте
Пример для «Автомобильные ароматизаторы»:
| Ключевое слово | У скольких из ТОП-20 | % перекрытия |
|---|---|---|
| ароматизатор в машину | 18 из 20 | 90% |
| автомобильный ароматизатор | 16 из 20 | 80% |
| освежитель воздуха авто | 14 из 20 | 70% |
| запах в машину | 12 из 20 | 60% |
| ароматизатор подвесной | 11 из 20 | 55% |
Эти ключи должны быть в каждой карточке конкурентной ниши. Если клиент не использует хотя бы 3 из 5 — он теряет органиче ский трафик.
Детализация фото-формулы
На основе визуального анализа ТОП-20 (выполняется аналитиком вручную после получения списка лидеров) строим типовую раскладку:
| Тип кадра | Среднее кол-во у ТОП-20 | Описание |
|---|---|---|
| На белом фоне | 4 | Чистые packshot-ы товара с разных ракурсов |
| Lifestyle | 3 | Товар в контексте использования (интерьер авто) |
| Инфографика | 3 | Характеристики, преимущества, сравнения |
| Детали/крупный план | 2 | Текстура, механизм, упаковка |
| Размерная сетка / сравнение | 1 | Габариты, комплектация |
Итого: ~13 кадров — это и есть «фото-формула ТОПа» для данной категории.
Действие Fotofactor
От данных к ТЗ на фотосъёмку
graph TD
A["MPStats API<br/>ТОП-20 по выручке"] --> B["Контент-бенчмарк<br/>фото, видео, 3D, рейтинг"]
B --> C["Gap-анализ<br/>клиент vs бенчмарк"]
A --> D["Ключевые слова<br/>by_keywords × 20 SKU"]
D --> E["MUST-HAVE ключи<br/>(50%+ overlap)"]
C --> F["Creative Brief<br/>= ТЗ на фотосъёмку"]
E --> F
F --> G["Фотосъёмка<br/>Fotofactor"]
G --> H["Загрузка на WB<br/>+ мониторинг"]
Клиент: {название бренда / продавца}
Категория: {название категории WB}
Дата анализа: {дата}
1. Бенчмарк контента ТОП-20
| Метрика | Бенчмарк | Клиент | Gap |
|---|---|---|---|
| Фото | {avg_photos} шт. | {client_photos} шт. | {gap} |
| Видео | {video_rate}% имеют | да/нет | нужно/ок |
| 3D | {has3d_rate}% имеют | да/нет | нужно/опционально |
2. Раскладка по типам кадров
- На белом фоне:
{N}кадров (фронт, бок, зад, сверху) - Lifestyle:
{N}кадров (в контексте использования) - Инфографика:
{N}кадров (ключевые характеристики, USP) - Детали:
{N}кадров (текстура, механизм, комплектация) - Видеообзор: 30-60 сек (распаковка + демонстрация)
3. MUST-HAVE ключевые слова (для инфографики и SEO)
{keyword_1}—{overlap}% ТОПа{keyword_2}—{overlap}% ТОПа{keyword_3}—{overlap}% ТОПа- ...
4. Рекомендации
- ТОП-20 используют в среднем
{N}lifestyle фото,{N}на белом фоне,{N}инфографик,{N}фото деталей - Клиенту необходимо довести количество фото до
{target}для соответствия стандарту категории - Видео
{обязательно/опционально}—{video_rate}% лидеров имеют видеообзор - Ключевые слова
{kw_1},{kw_2},{kw_3}должны быть визуально отражены на инфографике
Ценообразование на основе gap-а
Размер gap-а напрямую определяет объём работы и стоимость проекта:
| Gap (фото) | Объём работы | Примерная стоимость |
|---|---|---|
| 1-3 фото | Досъёмка | 25 000-40 000 рублей |
| 4-7 фото | Частичный рестайлинг | 50 000-80 000 рублей |
| 8-12 фото + видео | Полный рестайлинг | 80 000-120 000 рублей |
| 12+ фото + видео + 3D | Премиум-пакет | 120 000-180 000 рублей |
Ключевой принцип: клиент платит не за «красивые фото», а за закрытие конкретного gap-а до уровня ТОП-20 в его категории. Это делает ценник обоснованным и снимает возражение «а почему так дорого».
Upsell: ежемесячный мониторинг
После выполнения съёмки Fotofactor предлагает подписку на мониторинг:
- Еженедельно — проверяем, как изменились позиции карточки после обновления контента
- Ежемесячно — пересчитываем бенчмарк ТОП-20 (формула может меняться: конкуренты тоже обновляют контент)
- Ежеквартально — полный ре-аудит с рекомендациями по обновлению
Стоимость мониторинга: 15 000-25 000 рублей/мес — рекуррентный доход для Fotofactor.
Результат
Для клиента (продавца на WB)
- Evidence-based бриф вместо гадания — каждая рекомендация подкреплена данными ТОП-20
- Понятный ROI: «доведите контент до стандарта ТОП-20 → ожидайте рост позиций и конверсии»
- Конкретика: не «сделайте красиво», а «нужно 12 фото: 4 packshot, 3 lifestyle, 3 инфографики, 2 детали»
- SEO-бонус: ключевые слова из анализа ТОП-20 встроены в инфографику и описание
Для Fotofactor
| Метрика | Значение |
|---|---|
| Средний чек проекта | 80 000-120 000 рублей |
| Конверсия аудита в заказ | 40-60% (бриф убедителен) |
| Время на анализ | ~30 мин (автоматизировано) |
| Стоимость MPStats-запросов | 21 запрос на категорию (1 category + 20 by_keywords) |
| Upsell в мониторинг | 30% клиентов подключают подписку |
| Рекуррент от мониторинга | 15 000-25 000 рублей/мес на клиента |
Почему это работает
- Объективность — клиент видит не мнение фотографа, а стандарт категории в цифрах
- Urgency — gap-таблица показывает, насколько клиент отстаёт от конкурентов прямо сейчас
- Комплексность — бриф покрывает фото + видео + SEO + инфографику, средний чек выше
- Обоснованная цена — стоимость привязана к объёму работы (gap), а не к «ощущениям»
- Повторные продажи — бенчмарк меняется каждый месяц, клиент возвращается за обновлением
Unit-экономика
Вход: 1 категория клиента (21 API-запрос)
↓
Анализ: Бенчмарк ТОП-20 + gap-таблица + MUST-HAVE ключи (~30 мин)
↓
Бриф: Data-driven ТЗ на фотосъёмку
↓
Сделка: 80 000-120 000 рублей (съёмка)
+ 15 000-25 000 рублей/мес (мониторинг)
↓
LTV: 200 000-420 000 рублей/год на клиента
Что дальше
- Детектор убитых карточек — найти клиентов, которым нужна фото-формула
- Ниша-скаут — обнаружить растущие ниши для проактивного анализа
- До/После — доказать ROI после применения фото-формулы
- Контент-усталость — когда пора пересчитать формулу и обновить контент