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

Размерная матрица -- приоритизация фото по размерам

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

Проблема

Fashion-продавцы на Wildberries работают с десятками комбинаций размер/цвет. Но главное фото карточки показывает ОДИН конкретный вариант -- и именно он формирует первое впечатление покупателя.

Что происходит в 90% случаев:

  • Студия снимает на модели XS/S -- потому что так принято в модной индустрии
  • Продавец выбирает любимый цвет -- а не самый продаваемый
  • Главное фото = субъективный вкус -- а не data-driven решение

Проблема в том, что целевая аудитория Wildberries -- это не подиум. Реальные продажи часто сконцентрированы в размерах M, L, XL. Когда покупательница видит вещь на худенькой модели XS, она не может представить, как это будет выглядеть на ней. Результат -- низкий CTR, высокий процент возвратов, потерянные продажи.

При этом данные для правильного решения уже есть в MPStats: поля sales_by_size и balance_by_size показывают точную картину спроса по размерам.

Возможность для Fotofactor: предлагать клиентам размерную матрицу -- аналитический отчёт, который превращает данные о продажах по размерам в конкретное ТЗ для фотосъёмки. Какой размер на модели, какой цвет главный, какие размеры акцентировать в инфографике.

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

Источник: детальные данные товара MPStats

graph LR
A["MPStats API<br/>Детали товара"] --> B["sales_by_size<br/>balance_by_size<br/>color"]
B --> C["Ранжирование<br/>по продажам"]
C --> D{"Концентрация<br/>ТОП-3 размеров"}
D -->|"> 70%"| E["Фокус на 3 размера<br/>Главное фото = #1"]
D -->|"< 70%"| F["Равномерный спрос<br/>Универсальный кадр"]
E --> G["ТЗ на съёмку<br/>+ размерная инфографика"]
F --> G
Какие данные даёт MPStats по размерам

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

  • sales_by_size -- распределение продаж по размерам за выбранный период. Показывает, какие размеры реально покупают, а какие лежат мёртвым грузом.
  • balance_by_size -- текущие остатки по каждому размеру на складах WB. Позволяет сопоставить спрос с наличием.
  • color -- цветовой вариант товара. У одного артикула может быть несколько цветов, каждый со своей статистикой продаж.

Эти данные доступны через эндпоинт получения детальной информации по товару.

Таблица данных для анализа

ДанныеЧто показываетКак используем
sales_by_sizeКакие размеры продаются лучше всегоОпределяем размер для главного фото
balance_by_sizeКакие размеры есть в наличииВыявляем дисбаланс спрос/наличие
colorЦветовой вариант артикулаОпределяем приоритетный цвет карточки

Анализ

Алгоритм построения размерной матрицы

import httpx
from collections import OrderedDict

MPSTATS_TOKEN = "YOUR_TOKEN"
BASE_URL = "https://mpstats.io/api"
HEADERS = {
"X-Mpstats-TOKEN": MPSTATS_TOKEN,
"Content-Type": "application/json",
}


# Шаг 1: Получить размерные данные товара
def fetch_size_data(sku: int) -> dict:
"""Загружаем sales_by_size, balance_by_size и color для артикула."""
resp = httpx.post(
f"{BASE_URL}/wb/get/item",
headers=HEADERS,
json={"id": sku},
timeout=30,
)
resp.raise_for_status()
data = resp.json()
return {
"sales_by_size": data.get("sales_by_size", {}),
"balance_by_size": data.get("balance_by_size", {}),
"color": data.get("color", ""),
}


# Шаг 2: Ранжировать размеры по продажам
def rank_sizes(sales_by_size: dict) -> list:
"""
Ранжируем размеры от самого продаваемого к наименее продаваемому.
Возвращает список кортежей: [(size, sales, share), ...]
"""
total = sum(sales_by_size.values())
if total == 0:
return []

ranked = sorted(
sales_by_size.items(),
key=lambda x: x[1],
reverse=True,
)

return [
{
"size": size,
"sales": sales,
"share": round(sales / total * 100, 1),
}
for size, sales in ranked
]


# Шаг 3: Рассчитать концентрацию ТОП-3 размеров
def calculate_concentration(ranked_sizes: list, top_n: int = 3) -> dict:
"""
Какой % продаж приходится на ТОП-N размеров?
Если > 70% -- фокусируемся на этих размерах.
"""
total_sales = sum(s["sales"] for s in ranked_sizes)
top_sales = sum(s["sales"] for s in ranked_sizes[:top_n])

concentration = round(top_sales / total_sales * 100, 1) if total_sales else 0

return {
"top_n": top_n,
"concentration_pct": concentration,
"top_sizes": [s["size"] for s in ranked_sizes[:top_n]],
"strategy": "focused" if concentration > 70 else "universal",
}


# Шаг 4: Сопоставить продажи с остатками (выявить проблемы)
def cross_reference_balance(
ranked_sizes: list,
balance_by_size: dict,
) -> list:
"""
Для каждого размера определяем: есть ли проблема с остатками?
- ТОП по продажам, но мало остатков → срочно пополнить
- Мало продаж, но много остатков → переизбыток, не акцентировать
"""
results = []

for item in ranked_sizes:
size = item["size"]
balance = balance_by_size.get(size, 0)
sales = item["sales"]

# Определяем статус
if sales > 0 and balance < sales * 0.3:
status = "low_stock"
recommendation = "Пополнить остатки! Топ-продажи, мало стока"
elif sales == 0 and balance > 100:
status = "overstock"
recommendation = "Переизбыток. Не акцентировать в контенте"
elif item["share"] >= 25:
status = "hero"
recommendation = "Главное фото / первый слайд"
elif item["share"] >= 15:
status = "strong"
recommendation = "Второе-третье фото"
else:
status = "minor"
recommendation = "Указать в размерной сетке"

results.append({
**item,
"balance": balance,
"status": status,
"recommendation": recommendation,
})

return results


# Шаг 5: Сформировать итоговую матрицу
def build_size_matrix(sku: int) -> dict:
"""Полный пайплайн: от SKU до готовой размерной матрицы."""
data = fetch_size_data(sku)
ranked = rank_sizes(data["sales_by_size"])
concentration = calculate_concentration(ranked)
matrix = cross_reference_balance(ranked, data["balance_by_size"])

return {
"sku": sku,
"color": data["color"],
"concentration": concentration,
"matrix": matrix,
"main_photo_size": ranked[0]["size"] if ranked else None,
"main_photo_share": ranked[0]["share"] if ranked else 0,
}

Пример выходных данных

Категория «Платья женские», артикул с 5 размерами:

РазмерПродажиДоляОстатокСтатусРекомендация
M45032%120heroГлавное фото
L38027%85heroВторое фото
S29021%200strongИнфографика
XL18013%45low_stockПополнить остатки!
XS1007%300overstockПереизбыток

Концентрация ТОП-3: 80% продаж приходится на M + L + S. Стратегия: focused -- весь контент строим вокруг этих трёх размеров.

Типичная ошибка: модель XS для аудитории M/L

Абсолютное большинство fashion-студий по умолчанию снимают на моделях размера XS-S (40-42 RU). Это стандарт модной индустрии, перенесённый с подиума.

Но данные MPStats показывают другую реальность:

  • В 70%+ fashion-категорий на WB самый продаваемый размер -- M или L (44-48 RU)
  • Покупательница размера L видит вещь на модели XS и не может представить посадку на себе
  • Результат: низкий CTR на главном фото + высокий % возвратов с комментарием «не соответствует фото»
  • Возвраты по причине "не подошёл размер" -- это до 40% всех возвратов в fashion на WB

Если sales_by_size показывает, что M+L = 59% продаж, а XS = 7% -- снимать на модели XS это прямая потеря денег.

Анализ по цветам

Тот же принцип работает для цветовых вариантов. Если у артикула 5 цветов:

ЦветПродажиДоляРекомендация
Чёрный82038%Главная карточка
Бежевый54025%Второй по приоритету
Синий39018%Третий вариант
Красный25012%Фоновый
Белый1507%Минимальный приоритет

Вывод: главное фото карточки должно быть чёрного цвета, не красного (который часто выбирают «для яркости»).

Действие Fotofactor

От данных к ТЗ на фотосъёмку

graph TD
A["MPStats API<br/>sales_by_size, balance_by_size"] --> B["Размерная матрица<br/>ранжирование + концентрация"]
B --> C["Выбор модели<br/>размер = ТОП по продажам"]
B --> D["Приоритет цвета<br/>главная карточка = ТОП цвет"]
C --> E["ТЗ на фотосъёмку<br/>+ размерная инфографика"]
D --> E
E --> F["Фотосъёмка<br/>Fotofactor"]
F --> G["A/B тест<br/>старое фото vs новое"]
Стратегия выбора модели: снимайте на самом продаваемом размере

Данные sales_by_size дают однозначный ответ, на какой модели снимать:

  1. Главное фото -- модель в размере #1 по продажам (обычно M или L)
  2. Второе фото -- тот же товар, но показан на модели другого телосложения (для S или XL)
  3. Инфографика -- размерная сетка с акцентом на ТОП-3 размера
  4. Лукбук -- если концентрация ТОП-3 менее 70%, показать товар на разных фигурах

Правило: модель на главном фото = размер, который генерирует максимум продаж. Не XS «потому что так красивее», а M/L «потому что так покупают».

Для клиента это означает: вместо стандартной модели 42-го размера студия подбирает модель размера M-L (44-48), что может потребовать расширения модельной базы. Но инвестиция окупается через рост конверсии.

Конкретные действия для каждого элемента контента

1. Главное фото карточки:

  • Модель в размере #1 по sales_by_size (не в стандартном S!)
  • Цвет = самый продаваемый по данным MPStats
  • Ракурс, максимально показывающий посадку на реальной фигуре

2. Размерная инфографика:

  • Размерная сетка с выделением ТОП-3 продаваемых размеров
  • Реальные замеры (обхват груди, талии, бёдер) для каждого размера
  • Фото на моделях разного телосложения с указанием размеров
  • Акцент: «Самый популярный размер -- M» (social proof)

3. Приоритет цвета:

  • Если товар представлен в нескольких цветах -- главная карточка = бестселлер по цвету
  • Остальные цвета идут вторичными карточками
  • Инфографика показывает все доступные цвета с пометкой «ХИТ» на самом продаваемом

4. Размер-fit гайд (снижение возвратов):

  • Сравнительные фото: одна модель в S, другая в L -- показать разницу посадки
  • Рекомендации: «Если ваш обычный размер 46 -- берите M»
  • Таблица соответствия: RU / EU / US размеры

5. Сезонная ротация:

  • Пересчитывать размерную матрицу каждый сезон
  • Летом может расти S (открытая одежда), зимой -- L/XL (верхняя одежда)
  • Обновлять главное фото при смене лидера продаж

Результат

Для клиента (fashion-продавца на WB)

  • Главное фото показывает то, что реально продаётся -- рост CTR на 15-25%
  • Размерный гайд на основе данных -- снижение возвратов на 10-20%
  • Правильный цвет на главной карточке -- рост конверсии в корзину
  • Лучшее соответствие остатков и контента -- нет ситуации «рекламируем то, чего нет на складе»
  • Сезонная адаптация -- контент актуален круглый год

Для Fotofactor

МетрикаЗначение
Стоимость анализа60 000-100 000 рублей (матрица + съёмка)
Время на анализ~20 мин (автоматизировано)
Конверсия аудита в заказ50-65% (данные убедительны)
Средний чекВыше на 30% vs обычная съёмка (аналитика + работа)
Сезонное обновление40 000-60 000 рублей/сезон (ресъёмка главного фото)
Рекуррент4 раза в год (по смене сезона)

Почему это работает

  1. Данные вместо вкуса -- продавец видит цифры, а не субъективное мнение фотографа
  2. Прямое влияние на метрики -- CTR и конверсия растут, возвраты падают
  3. Низкий порог входа -- анализ занимает 20 минут, данные уже есть в MPStats
  4. Повторяемость -- размерная матрица меняется каждый сезон, клиент возвращается
  5. Конкурентное преимущество -- 95% студий снимают «по стандарту», а не по данным

Unit-экономика

Вход:  1 артикул клиента (1 API-запрос на SKU)

Анализ: Размерная матрица + цветовой приоритет (~20 мин)

ТЗ: Data-driven бриф на фотосъёмку

Сделка: 60 000-100 000 рублей (анализ + съёмка)

Ресъёмка: 40 000-60 000 рублей × 4 сезона/год

LTV: 220 000-340 000 рублей/год на клиента
Критическая проверка: остатки vs продажи

Перед формированием ТЗ на съёмку обязательно сопоставьте sales_by_size с balance_by_size:

  • Если ТОП-размер M с долей 32%, но остаток всего 45 шт. -- это проблема. Нет смысла ставить M на главное фото, если он закончится через неделю.
  • Сначала клиент должен пополнить остатки по ТОП-размерам, и только потом менять контент.
  • Иначе: новое главное фото увеличит спрос на M → M быстро закончится → карточка потеряет позиции → деньги на съёмку потрачены зря.

Правило: рекомендуйте съёмку только когда balance / monthly_sales >= 1.5 для ТОП-размера. Иначе -- сначала закупка, потом контент.

Что дальше