Рентген категории — бесплатный аудит ниши
Как превратить данные MPStats в лид-магнит, который приводит клиентов на контентные услуги Fotofactor с конверсией 15–20%.
Проблема
Селлеры на Wildberries оценивают свою нишу «на ощупь». Типичная картина:
- Не знают конкурентов — ориентируются на 3–5 знакомых карточек, а не на ТОП-100
- Не видят контентных дыр — думают, что 3 фото достаточно, хотя лидеры используют 10+
- Игнорируют сезонность — запускают рекламу в мёртвый сезон, упускают пик
- Не считают lost_profit — не понимают, сколько денег теряют из-за out-of-stock
Fotofactor предлагает бесплатный «Рентген категории» — PDF-отчёт на 10–15 страниц с полным анализом ниши. Селлер называет категорию — получает данные, которые раньше собирал бы неделю вручную.
Это лид-магнит с нулевой себестоимостью (только подписка 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/category | revenue, 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-stock | lost_profit, balance |
| Рекомендации | Персонализированные советы | агрегированные метрики |
Ключевые инсайты в отчёте
Fotofactor выделяет в отчёте контентные дыры — именно они конвертируют в платные услуги:
- «70% карточек в ТОП-100 имеют менее 5 фото» — при этом лидеры используют 8–12 фотографий. Профессиональные фото увеличивают конверсию на 25–40%.
- «83% карточек не имеют видео» — а у ТОП-3 по выручке видео есть. Rich-контент даёт +15% к конверсии.
- «Пик продаж — декабрь (x3.2 от среднего)» — обновите контент к ноябрю, чтобы карточки были проиндексированы к началу сезона.
- «ТОП-100 теряет 12.4 млн ₽ из-за out-of-stock» — контролируйте остатки перед пиковым сезоном.