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

Рентген категории — бесплатный аудит ниши

Как превратить данные MPStats в лид-магнит, который приводит клиентов на контентные услуги Fotofactor с конверсией 15–20%.

Проблема

Селлеры на Wildberries оценивают свою нишу «на ощупь». Типичная картина:

  • Не знают конкурентов — ориентируются на 3–5 знакомых карточек, а не на ТОП-100
  • Не видят контентных дыр — думают, что 3 фото достаточно, хотя лидеры используют 10+
  • Игнорируют сезонность — запускают рекламу в мёртвый сезон, упускают пик
  • Не считают lost_profit — не понимают, сколько денег теряют из-за out-of-stock

Fotofactor предлагает бесплатный «Рентген категории» — PDF-отчёт на 10–15 страниц с полным анализом ниши. Селлер называет категорию — получает данные, которые раньше собирал бы неделю вручную.

Зачем это Fotofactor?

Это лид-магнит с нулевой себестоимостью (только подписка MPStats). Селлер получает ценность бесплатно, видит конкретные проблемы с контентом и в 15–20% случаев заказывает платные услуги.

Пайплайн данных

flowchart LR
A["Селлер называет категорию\n(Автотовары/Ароматизаторы)"] --> B["POST /wb/get/category\nТОП-100 товаров"]
A --> C["GET /wb/get/category/trends\n72 месяца истории"]
B --> D["Агрегация:\nвыручка, цены,\nконтент-метрики"]
C --> E["Анализ сезонности\nи трендов"]
D --> F["Генерация\nPDF-отчёта"]
E --> F
F --> G["Брендированный PDF\n10–15 страниц"]

Используемые эндпоинты

ЭндпоинтКлючевые поляДля чего
POST /wb/get/categoryrevenue, sales, final_price, picscount, hasvideo, comments, rating, lost_profit, balance, category_positionТОП-100 товаров категории с метриками продаж и контента
GET /wb/get/category/trendsпомесячные данные за 72 месяцаСезонность, динамика рынка, тренды роста/падения
Почему именно эти два эндпоинта?

Связка category + category/trends покрывает 80% вопросов селлера: кто лидеры, какие цены работают, когда сезон, где дыры в контенте. Всего 2 API-вызова — а на выходе полноценный аудит.

Анализ

Шаг 1. Получение данных из MPStats

import httpx
import statistics

MPSTATS_TOKEN = "your_token"
BASE_URL = "https://mpstats.io/api"

# ТОП-100 товаров категории
resp = httpx.post(
f"{BASE_URL}/wb/get/category",
headers={"X-Mpstats-TOKEN": MPSTATS_TOKEN},
json={
"path": "Автотовары/Ароматизаторы",
"limit": 100,
"offset": 0,
},
)
products = resp.json() # list[dict] — ТОП-100

# Тренды за 72 месяца
resp_trends = httpx.get(
f"{BASE_URL}/wb/get/category/trends",
headers={"X-Mpstats-TOKEN": MPSTATS_TOKEN},
params={"path": "Автотовары/Ароматизаторы"},
)
trends = resp_trends.json() # помесячная статистика

Шаг 2. Агрегация ключевых метрик

# --- Выручка и цены ---
revenues = [p["revenue"] for p in products]
prices = [p["final_price"] for p in products]

avg_revenue = statistics.mean(revenues)
median_price = statistics.median(prices)
total_revenue = sum(revenues)

print(f"Средняя выручка ТОП-100: {avg_revenue:,.0f} ₽")
print(f"Медианная цена: {median_price:,.0f} ₽")
print(f"Общая выручка ТОП-100: {total_revenue:,.0f} ₽")

Шаг 3. Контентные дыры (главное для Fotofactor!)

# --- Качество контента ---
low_photos = [p for p in products if p["picscount"] < 5]
no_video = [p for p in products if p["hasvideo"] == 0]
low_comments = [p for p in products if p["comments"] < 10]

pct_low_photos = len(low_photos) / len(products) * 100
pct_no_video = len(no_video) / len(products) * 100
pct_low_comments = len(low_comments) / len(products) * 100

print(f"Карточек с <5 фото: {pct_low_photos:.0f}%")
print(f"Карточек без видео: {pct_no_video:.0f}%")
print(f"Карточек с <10 отзывов: {pct_low_comments:.0f}%")

# --- Бенчмарк лидеров ---
top10 = sorted(products, key=lambda p: p["revenue"], reverse=True)[:10]
avg_photos_top10 = statistics.mean([p["picscount"] for p in top10])
pct_video_top10 = sum(1 for p in top10 if p["hasvideo"] == 1) / 10 * 100

print(f"\nБенчмарк ТОП-10:")
print(f" Среднее кол-во фото: {avg_photos_top10:.1f}")
print(f" Процент с видео: {pct_video_top10:.0f}%")

Шаг 4. Концентрация рынка

# --- Доля ТОП-10 в общей выручке ---
top10_revenue = sum(p["revenue"] for p in top10)
concentration = top10_revenue / total_revenue * 100

print(f"Доля ТОП-10 в выручке: {concentration:.1f}%")

if concentration > 70:
verdict = "Монополизированный рынок — ТОП-10 забирает >70% выручки"
elif concentration > 40:
verdict = "Умеренная конкуренция — есть место для новых игроков"
else:
verdict = "Фрагментированный рынок — шансы высокие"

print(f"Вердикт: {verdict}")

Шаг 5. Ценовая сегментация

# --- Ценовые сегменты ---
budget = [p for p in products if p["final_price"] < median_price * 0.6]
mid = [p for p in products if median_price * 0.6 <= p["final_price"] <= median_price * 1.5]
premium = [p for p in products if p["final_price"] > median_price * 1.5]

segments = {
"Бюджетный": {
"count": len(budget),
"avg_revenue": statistics.mean([p["revenue"] for p in budget]) if budget else 0,
},
"Средний": {
"count": len(mid),
"avg_revenue": statistics.mean([p["revenue"] for p in mid]) if mid else 0,
},
"Премиум": {
"count": len(premium),
"avg_revenue": statistics.mean([p["revenue"] for p in premium]) if premium else 0,
},
}

for name, data in segments.items():
print(f"{name}: {data['count']} товаров, ср. выручка {data['avg_revenue']:,.0f} ₽")

Шаг 6. Сезонность (72 месяца)

# --- Пики сезонности из trends ---
from collections import defaultdict

monthly_totals = defaultdict(list)
for record in trends:
month = record["date"][:7] # "2024-12"
month_num = int(record["date"][5:7])
monthly_totals[month_num].append(record["revenue"])

# Средняя выручка по месяцам за все годы
avg_by_month = {
m: statistics.mean(values) for m, values in monthly_totals.items()
}

peak_month = max(avg_by_month, key=avg_by_month.get)
low_month = min(avg_by_month, key=avg_by_month.get)

MONTH_NAMES = {
1: "Январь", 2: "Февраль", 3: "Март", 4: "Апрель",
5: "Май", 6: "Июнь", 7: "Июль", 8: "Август",
9: "Сентябрь", 10: "Октябрь", 11: "Ноябрь", 12: "Декабрь",
}

print(f"Пик продаж: {MONTH_NAMES[peak_month]}")
print(f"Низкий сезон: {MONTH_NAMES[low_month]}")
print(f"Сезонный коэффициент: x{avg_by_month[peak_month] / avg_by_month[low_month]:.1f}")

Шаг 7. Потерянная прибыль

# --- Lost profit (упущенная выручка из-за out-of-stock) ---
total_lost = sum(p.get("lost_profit", 0) for p in products)
avg_lost = statistics.mean([p.get("lost_profit", 0) for p in products])

high_lost = [
p for p in products
if p.get("lost_profit", 0) > p["revenue"] * 0.2
]

print(f"Общий lost_profit ТОП-100: {total_lost:,.0f} ₽")
print(f"Средний lost_profit: {avg_lost:,.0f} ₽")
print(f"Товаров с lost_profit >20% от выручки: {len(high_lost)}")

Действие Fotofactor

На основе собранных данных Fotofactor генерирует брендированный PDF-отчёт.

Структура отчёта (10–15 страниц)

РазделСодержимоеДанные
ОбложкаНазвание категории, дата, логотип Fotofactor
Обзор рынкаОбщая выручка, количество активных SKU, медианная ценаrevenue, final_price, sales
ТОП-10 лидеровТаблица с выручкой, ценой, рейтингомrevenue, final_price, rating, comments
Контентный аудитРаспределение по качеству фото/видеоpicscount, hasvideo
Ценовые сегментыБюджет / Средний / Премиум — выручка и конкуренцияfinal_price, revenue
СезонностьГрафик по месяцам за 6 летtrends — 72 месяца
Упущенная прибыльСколько рынок теряет из-за out-of-stocklost_profit, balance
РекомендацииПерсонализированные советыагрегированные метрики

Ключевые инсайты в отчёте

Fotofactor выделяет в отчёте контентные дыры — именно они конвертируют в платные услуги:

Пример формулировок в отчёте
  • «70% карточек в ТОП-100 имеют менее 5 фото» — при этом лидеры используют 8–12 фотографий. Профессиональные фото увеличивают конверсию на 25–40%.
  • «83% карточек не имеют видео» — а у ТОП-3 по выручке видео есть. Rich-контент даёт +15% к конверсии.
  • «Пик продаж — декабрь (x3.2 от среднего)» — обновите контент к ноябрю, чтобы карточки были проиндексированы к началу сезона.
  • «ТОП-100 теряет 12.4 млн ₽ из-за out-of-stock» — контролируйте остатки перед пиковым сезоном.

Персонализация

Если селлер даёт свой артикул — отчёт включает сравнение с бенчмарком:

# Позиция клиента в категории
client_product = next(
(p for p in products if p["id"] == client_sku), None
)

if client_product:
position = client_product["category_position"]
photos_gap = avg_photos_top10 - client_product["picscount"]
has_video = client_product["hasvideo"]

print(f"Ваша позиция в категории: #{position}")
print(f"До бенчмарка ТОП-10 не хватает: {photos_gap:.0f} фото")
print(f"Видео: {'есть' if has_video else 'НЕТ (а у 80% лидеров — есть)'}")

Результат для клиента

Что получает селлер (бесплатно)

  • Полный обзор рынка — не 3 конкурента «на глаз», а аналитика по ТОП-100
  • Контентные бенчмарки — сколько фото, видео, отзывов у лидеров
  • Сезонная карта — когда вкладываться в рекламу, когда обновлять контент
  • Ценовое позиционирование — в каком сегменте больше денег и меньше конкуренции
  • Конкретный план действий — не абстрактные советы, а цифры

Экономика для Fotofactor

МетрикаЗначение
Себестоимость одного аудита0 ₽ (только подписка MPStats)
Время на генерацию5–10 минут (автоматизировано)
Конверсия в платные услуги15–20%
Средний чек контракта80 000 ₽
Аудитов в месяц30–50
Ожидаемая выручка360 000 – 800 000 ₽/мес
Формула юнит-экономики

При 40 аудитах в месяц и конверсии 17%:

  • 40 × 0.17 = ~7 клиентов
  • 7 × 80 000 ₽ = 560 000 ₽/мес
  • CAC = 0 ₽ (лид-магнит бесплатный, трафик из Telegram/партнёров)
  • ROI подписки MPStats: ~100x

Воронка

flowchart TD
A["Селлер видит пост в Telegram\nили получает рекомендацию"] --> B["Оставляет заявку:\nкатегория + артикул (опц.)"]
B --> C["Автоматическая генерация\nPDF-отчёта за 5 минут"]
C --> D["Получает отчёт\nв Telegram/email"]
D --> E{"Видит контентные дыры\nв своей карточке?"}
E -->|"Да (15–20%)"| F["Заказывает фото/видео\nу Fotofactor"]
E -->|"Нет"| G["Остаётся в базе\nдля ретаргетинга"]
F --> H["Контракт ~80 000 ₽"]
G --> I["Получает ежемесячный\nдайджест по категории"]