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

Кейс 9: Региональный прицел -- контент под слабые регионы

Пайплайн анализа региональных данных WB для выявления проблемных регионов и создания локализованного контента, который повышает продажи там, где товар уже лежит на складе, но не покупается.

Проблема

Wildberries -- федеральный маркетплейс, но продажи распределены крайне неравномерно. Типичная картина:

  • Москва и Подмосковье -- 40-50% всех продаж, даже если товар подходит всем регионам
  • Санкт-Петербург -- 10-15%, часто с переизбытком остатков
  • Сибирь, Урал, Юг -- 5-10% каждый, при этом остатки на региональных складах есть
  • Дальний Восток -- 1-3%, часто нулевые продажи при наличии стока

Причина не в отсутствии спроса. Покупатели в Новосибирске хотят те же товары, что и москвичи. Проблемы три:

  1. Контент не резонирует -- инфографика показывает «доставка 1-2 дня» (актуально для Москвы), покупатель в Красноярске видит 5-7 дней и уходит
  2. SEO пропущен -- карточка не содержит региональных запросов («купить в Екатеринбурге», «доставка в Сибирь»)
  3. Сезонность не учтена -- зимнюю коллекцию продвигают одинаково для Сочи (+5) и Якутска (-40)

Продавцы в 90% случаев не анализируют региональную эффективность. Они видят общую выручку и не понимают, что 30% стока стоит мёртвым грузом в региональных складах, генерируя затраты на хранение.

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

graph LR
A["MPStats API<br/>Данные по товару"] --> B["balance_by_region<br/>sales_by_region"]
B --> C["Расчёт<br/>доля продаж vs доля остатков"]
C --> D{"Классификация<br/>регионов"}
D -->|"Продажи > Остатки"| E["Высокий спрос<br/>Увеличить остатки"]
D -->|"Остатки > Продажи"| F["Проблема контента<br/>Локализовать"]
D -->|"Баланс"| G["Норма<br/>Поддержать"]
F --> H["Региональный<br/>контент-пакет"]
Откуда берутся региональные данные

MPStats предоставляет региональную разбивку через детальные данные по товару. Ключевые поля:

  • balance_by_region -- распределение остатков по складам WB (Москва, СПб, Казань, Краснодар, Новосибирск, Екатеринбург, Хабаровск и др.)
  • sales_by_region -- распределение продаж по регионам за выбранный период
  • balance vs sales -- общее соотношение, показывающее эффективность стока
  • lost_profit -- упущенная выручка, которая часто вызвана именно региональным out-of-stock

Эти данные доступны через эндпоинт получения детальной информации по товару (POST /wb/get/item).

Ключевые поля для анализа

ДанныеИсточникЧто показывает
sales_by_regionMPStats, данные по товаруГде товар продаётся хорошо, а где плохо
balance_by_regionMPStats, данные по товаруГде остатки лежат на складах
lost_profitMPStats, данные по категорииУпущенная прибыль (часто из-за регионального OOS)
revenueMPStats, данные по категорииОбщая выручка для оценки масштаба
final_priceMPStats, данные по категорииЦена товара (контекст для региональной стратегии)

Анализ

Региональная матрица эффективности

Для каждого региона рассчитываем соотношение доли продаж и доли остатков. Это даёт четыре статуса:

import httpx

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


def fetch_item_regional_data(item_id: int) -> dict:
"""Загружает региональные данные по товару."""
resp = httpx.post(
f"{BASE_URL}/wb/get/item",
headers={
"X-Mpstats-TOKEN": MPSTATS_TOKEN,
"Content-Type": "application/json",
},
json={"id": item_id},
timeout=30,
)
resp.raise_for_status()
return resp.json()


def build_regional_matrix(item_data: dict) -> list[dict]:
"""
Строит матрицу эффективности по регионам.

Для каждого региона:
- sales_share = доля продаж региона / все продажи
- stock_share = доля остатков региона / все остатки
- ratio = sales_share / stock_share (>1 = спрос, <1 = переизбыток)
"""
sales = item_data.get("sales_by_region", {})
balance = item_data.get("balance_by_region", {})

total_sales = sum(sales.values()) or 1
total_balance = sum(balance.values()) or 1

regions = set(list(sales.keys()) + list(balance.keys()))
matrix = []

for region in regions:
region_sales = sales.get(region, 0)
region_balance = balance.get(region, 0)

sales_share = region_sales / total_sales * 100
stock_share = region_balance / total_balance * 100

# Классификация
if stock_share < 1 and sales_share < 1:
status = "ignore" # Нет ни стока, ни продаж
recommendation = "Не приоритет"
elif sales_share > stock_share * 1.5:
status = "high_demand" # Спрос превышает запасы
recommendation = "Увеличить остатки"
elif stock_share > sales_share * 2:
if sales_share < 2:
status = "content_problem" # Сток есть, продаж почти нет
recommendation = "Региональная инфографика"
else:
status = "overstock" # Переизбыток при средних продажах
recommendation = "Локализовать контент"
else:
status = "balanced"
recommendation = "Поддержать"

matrix.append({
"region": region,
"sales_share": round(sales_share, 1),
"stock_share": round(stock_share, 1),
"status": status,
"recommendation": recommendation,
"abs_sales": region_sales,
"abs_balance": region_balance,
})

# Сортировка: проблемные регионы сверху
priority = {"content_problem": 0, "overstock": 1, "high_demand": 2, "balanced": 3, "ignore": 4}
matrix.sort(key=lambda x: (priority.get(x["status"], 5), -x["stock_share"]))

return matrix

Дерево решений по региону

graph TD
A["Регион с остатками"] --> B{"Доля продаж vs<br/>Доля остатков"}
B -->|"Продажи >> Остатки<br/>(sales_share > stock * 1.5)"| C["Высокий спрос"]
B -->|"Остатки >> Продажи<br/>(stock_share > sales * 2)"| D{"Доля продаж<br/>< 2%?"}
B -->|"Примерно равны"| E["Норма"]
D -->|"Да"| F["Контент-проблема"]
D -->|"Нет"| G["Переизбыток"]
C --> C1["Рекомендация:<br/>Увеличить поставки"]
F --> F1["Рекомендация:<br/>Региональная инфографика<br/>+ SEO-оптимизация"]
G --> G1["Рекомендация:<br/>Локализовать контент<br/>+ скорректировать цену"]
E --> E1["Рекомендация:<br/>Поддержать текущую<br/>стратегию"]

Пример региональной матрицы

Типичный товар (женская сумка, выручка 3.5M рублей/мес):

РегионДоля продажДоля остатковСтатусРекомендация
Сибирь (Новосибирск)5%15%Контент-проблемаРегиональная инфографика
Санкт-Петербург12%20%ПереизбытокЛокализовать контент
Урал (Екатеринбург)4%10%Контент-проблемаРегиональная инфографика
Москва45%35%НормаПоддержать
Юг (Краснодар)8%5%Высокий спросУвеличить остатки
Поволжье (Казань)7%6%НормаПоддержать
Дальний Восток2%8%Контент-проблемаРегиональная инфографика

Интерпретация: три региона (Сибирь, Урал, Дальний Восток) имеют в сумме 33% остатков, но дают всего 11% продаж. Это 22% стока, который генерирует затраты на хранение, но не приносит выручку. При выручке 3.5M рублей потенциал раскрытия этих регионов -- +700K-1M рублей/мес.

Агрегация по портфелю клиента

def analyze_seller_portfolio(item_ids: list[int]) -> dict:
"""
Агрегирует региональную матрицу по всем SKU продавца.
Выявляет системные проблемы с регионами.
"""
region_stats = {}

for item_id in item_ids:
data = fetch_item_regional_data(item_id)
matrix = build_regional_matrix(data)

for row in matrix:
region = row["region"]
if region not in region_stats:
region_stats[region] = {
"total_items": 0,
"content_problems": 0,
"overstocked": 0,
"high_demand": 0,
"total_dead_stock_share": 0,
}

stats = region_stats[region]
stats["total_items"] += 1

if row["status"] == "content_problem":
stats["content_problems"] += 1
stats["total_dead_stock_share"] += row["stock_share"]
elif row["status"] == "overstock":
stats["overstocked"] += 1
elif row["status"] == "high_demand":
stats["high_demand"] += 1

# Выявляем системно проблемные регионы
problem_regions = []
for region, stats in region_stats.items():
if stats["total_items"] == 0:
continue
problem_rate = (stats["content_problems"] + stats["overstocked"]) / stats["total_items"]
if problem_rate > 0.5: # >50% товаров имеют проблемы в этом регионе
problem_regions.append({
"region": region,
"problem_rate": round(problem_rate * 100),
"items_affected": stats["content_problems"] + stats["overstocked"],
"total_items": stats["total_items"],
})

problem_regions.sort(key=lambda x: x["problem_rate"], reverse=True)
return {
"region_stats": region_stats,
"problem_regions": problem_regions,
}

Действие Fotofactor

Региональный контент-пакет

На основе данных матрицы формируется конкретный план действий для каждого проблемного региона.

Стратегия 1: Региональная инфографика

Для регионов со статусом «Контент-проблема» (сток есть, продаж нет):

  • Слайд с доставкой: «Доставка в Новосибирск за 3 дня» / «На складе в Екатеринбурге -- доставка 1-2 дня»
  • Слайд с локальными отзывами: «98% покупателей из Сибири довольны качеством»
  • Слайд с ценой: показать выгоду относительно региональных офлайн-магазинов
  • Rich-контент: видеообзор с упоминанием климатических особенностей региона

Это устраняет главный барьер -- покупатель видит, что товар уже рядом и доставка будет быстрой.

Стратегия 2: Сезонная локализация

Для товаров с сезонным спросом (одежда, обувь, спорт):

  • Сибирь/Урал: зимнюю коллекцию начинать продвигать на 4-6 недель раньше Москвы
  • Юг/Краснодар: летнюю коллекцию продвигать на 2-3 недели раньше
  • Дальний Восток: учитывать обратную сезонность Приморья (влажное лето, сухая зима)

Контент-план:

  • Отдельные инфографики с сезонным контекстом для каждой климатической зоны
  • Lifestyle-фото в релевантных условиях: зимний пуховик на фоне сибирского пейзажа, а не московского ГУМа
  • Текстовые описания с упоминанием региональных погодных условий
Стратегия 3: Региональное SEO

Добавление в карточку ключевых слов с географической привязкой:

  • В заголовок/описание: «Доставка по всей России», «На складе в вашем регионе»
  • В ключевые слова: «купить в Краснодаре», «доставка Екатеринбург», «склад Новосибирск»
  • В вопросы покупателей (FAQ): «Сколько дней доставка в Сибирь?» -- «1-3 дня, товар на складе в Новосибирске»

Региональные запросы составляют 15-25% всех поисковых запросов на WB, но 90% карточек их не используют.

Формирование предложения клиенту

def generate_regional_proposal(matrix: list[dict], revenue: float) -> dict:
"""
Формирует коммерческое предложение на основе региональной матрицы.
"""
problem_regions = [r for r in matrix if r["status"] in ("content_problem", "overstock")]
total_dead_stock = sum(r["stock_share"] for r in problem_regions)

# Потенциал разблокировки: доля мёртвого стока × текущая выручка × коэффициент
unlock_potential = revenue * (total_dead_stock / 100) * 0.5 # 50% конверсия стока

proposal = {
"problem_regions": len(problem_regions),
"dead_stock_share": round(total_dead_stock, 1),
"current_revenue": revenue,
"unlock_potential_monthly": round(unlock_potential),
"recommended_package": [],
}

for region in problem_regions:
package_item = {
"region": region["region"],
"status": region["status"],
"deliverables": [],
}

if region["status"] == "content_problem":
package_item["deliverables"] = [
"Региональная инфографика (2-3 слайда)",
"SEO-оптимизация под региональные запросы",
"Текст описания с региональной привязкой",
]
elif region["status"] == "overstock":
package_item["deliverables"] = [
"Локализованный Rich-контент",
"A/B тест заглавной для региона",
"Региональные ключевые слова",
]

proposal["recommended_package"].append(package_item)

return proposal

Шаблон outreach для продавца

Добрый день! Провели региональный анализ ваших карточек на WB.

📊 Ключевые находки:
- 33% ваших остатков лежат в регионах, где продажи минимальны
- Новосибирск: 15% стока → 5% продаж (контент не адаптирован)
- Екатеринбург: 10% стока → 4% продаж (нет региональной привязки)
- Дальний Восток: 8% стока → 2% продаж (покупатели не видят быструю доставку)

💰 Потенциал: +700 000-1 000 000 ₽/мес при раскрытии этих регионов.

Мы делаем локализованный контент для маркетплейсов:
— Инфографика с региональными сроками доставки
— SEO под географические запросы
— Сезонная адаптация под климатические зоны

Подготовили детальный региональный отчёт — отправить?

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

Эффект от региональной оптимизации

МетрикаДо оптимизацииПосле оптимизацииИзменение
Продажи в проблемных регионах11% от общих22-28% от общих+100-150%
Мёртвый сток (хранение без продаж)33% остатков10-15% остатков-55%
Затраты на хранение WBБазовый уровень-20-35%Экономия
Общая выручкаБазовый уровень+15-30%Рост
Конверсия карточки (регионы)2-3%5-7%+150%

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

УслугаСтоимостьПериодичностьМаржинальность
Региональный аудит (анализ + отчёт)15 000 рублейРазовый90% (автоматизировано)
Региональный контент-пакет (3 региона)40 000-60 000 рублейРазовый60-70%
Сезонная адаптация (4 климатические зоны)30 000-50 000 рублейЕжесезонно (4 раза/год)65%
Квартальный региональный ревью20 000-30 000 рублейЕжеквартально85%
Годовая ценность клиента215 000-350 000 рублей

Позиционирование

Региональный анализ -- это уникальное предложение, которого нет у 99% контент-агентств для маркетплейсов. Типичная фотостудия говорит: «Мы сделаем красивые фото». Fotofactor говорит:

«Мы не просто фотографы -- мы помогаем продавать в каждом регионе. У вас 33% стока лежит мёртвым грузом в Сибири, и мы знаем, как это исправить контентом».

Это превращает разовую услугу (фотосъёмка) в постоянное партнёрство с ежеквартальными ревью и сезонными обновлениями.

Что дальше