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

Сезонный контент-календарь — план обновлений на год

Как построить годовой контент-план для клиента на маркетплейсе, используя 72-месячную историю трендов MPStats. Обновлять карточки до пика, а не после падения продаж.

Проблема

Большинство селлеров обновляют контент реактивно — когда продажи уже упали и карточка потеряла позиции. Типичный сценарий:

  • Декабрь: продажи на пике, всё хорошо, никто не думает о контенте
  • Январь: продажи рухнули на 40%, селлер паникует
  • Февраль: «Срочно нужны новые фото!!!» — но уже поздно, карточка потеряла позиции, а конкуренты подготовились заранее
  • Март: новый контент загружен, но WB нужно 2-4 недели на переиндексацию — пик 8 марта пропущен

Умные селлеры обновляют контент проактивно — за 4-6 недель до сезонного пика. Но когда именно? Интуиция не работает — сезонность сильно отличается по категориям. Зимние шапки и солнцезащитные очки имеют разные пики. Даже внутри одной категории подкатегории могут пиковать в разные месяцы.

У MPStats есть 72 месяца (6 лет!) данных по трендам категорий. Это достаточно, чтобы выявить точные сезонные паттерны и рассчитать оптимальное время обновления контента для каждого клиента.

Зачем это Fotofactor?

Сезонный контент-календарь решает главную проблему контент-агентства — непредсказуемость загрузки. Вместо хаотичных «срочных заказов» Fotofactor получает годовой план с предсказуемым потоком работы. Клиент подписывается на 4 сезонных обновления заранее, а не звонит в панике после падения продаж. Это модель подписки, а не разовых проектов.

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

graph LR
A["MPStats API\n72 месяца трендов"] --> B["Сезонный индекс\nдля каждого месяца"]
B --> C["Пики и спады\nindex > 1.3 / < 0.7"]
C --> D["Дата обновления\nпик − 6 недель"]
D --> E["Годовой\nконтент-календарь"]
E --> F["Бронирование\nфотосъёмок"]

Источники данных

ЭндпоинтМетодДанныеЗачем
/wb/get/category/trendsGET72 точки: помесячная выручка категории за 6 летОснова сезонного анализа — выявление паттернов
/wb/get/subjects/selectGETСписок 7509 ниш WBНавигация — найти нишу клиента
/wb/get/subjectPOSTТовары в нише (текущие данные)Контекст — какие товары сейчас в топе
Как читать 72-месячные тренды

MPStats возвращает массив из 72 значений — помесячная выручка категории за последние 6 лет. Каждый элемент — это одна точка: revenue за конкретный месяц конкретного года. Из этих 72 точек мы получаем 6 значений для каждого месяца (январь 2020, январь 2021, ..., январь 2025), что позволяет рассчитать устойчивый сезонный паттерн, отфильтровав аномалии отдельных лет.

Ключевое преимущество: 6 лет данных включают и ковидный 2020, и восстановление 2021-2022, и стабилизацию 2023-2025. Медиана по годам даёт надёжный сезонный индекс, а не случайное отклонение одного года.

Анализ

Расчёт сезонного индекса

import httpx
import statistics

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


def fetch_category_trends(category_path: str) -> list[float]:
"""
Загрузить 72-месячный тренд категории.
Возвращает список из 72 значений выручки (помесячно, от старых к новым).
"""
resp = httpx.get(
f"{BASE_URL}/wb/get/category/trends",
headers={
"X-Mpstats-TOKEN": MPSTATS_TOKEN,
"Content-Type": "application/json",
},
params={"path": category_path},
timeout=30,
)
resp.raise_for_status()
return resp.json() # [revenue_month_1, revenue_month_2, ..., revenue_month_72]


def calculate_seasonal_index(trends_72: list[float]) -> list[dict]:
"""
Рассчитать сезонный индекс для каждого месяца.

Алгоритм:
1. Разбить 72 точки на 6 лет по 12 месяцев
2. Для каждого года нормализовать: month_value / avg_year_value
3. Для каждого месяца взять медиану по 6 годам (устойчивее среднего)
4. Индекс > 1.0 = месяц выше среднего, < 1.0 = ниже среднего
"""
months_names = [
"Январь", "Февраль", "Март", "Апрель",
"Май", "Июнь", "Июль", "Август",
"Сентябрь", "Октябрь", "Ноябрь", "Декабрь",
]

# Разбиваем на годы (каждый год = 12 месяцев)
years = []
for year_idx in range(6):
year_data = trends_72[year_idx * 12 : (year_idx + 1) * 12]
if sum(year_data) > 0: # Пропускаем пустые годы
years.append(year_data)

# Нормализуем каждый год и собираем индексы по месяцам
month_indices = {m: [] for m in range(12)}

for year_data in years:
year_avg = statistics.mean(year_data) or 1
for month_idx, value in enumerate(year_data):
normalized = value / year_avg
month_indices[month_idx].append(normalized)

# Медиана по годам для каждого месяца
seasonal = []
for month_idx in range(12):
values = month_indices[month_idx]
if values:
index = round(statistics.median(values), 2)
else:
index = 1.0

# Классификация
if index >= 1.5:
status = "superpeak"
emoji = "🔥🔥"
elif index >= 1.3:
status = "peak"
emoji = "🔥"
elif index >= 1.1:
status = "growth"
emoji = "📈"
elif index >= 0.9:
status = "normal"
emoji = "➡️"
elif index >= 0.7:
status = "decline"
emoji = "📉"
else:
status = "valley"
emoji = "❄️"

seasonal.append({
"month": month_idx + 1,
"month_name": months_names[month_idx],
"index": index,
"status": status,
"emoji": emoji,
})

return seasonal


def generate_content_calendar(seasonal: list[dict]) -> list[dict]:
"""
Генерирует годовой контент-календарь.

Правило: обновлять контент за 6 недель до пикового месяца.
WB нужно 2-4 недели на переиндексацию + 2 недели на подготовку.

Для каждого пика (index >= 1.3) создаём запись:
- Когда обновлять контент
- Какой тип контента нужен (сезонная инфографика, праздничные визуалы)
- Приоритет (superpeak = critical, peak = high)
"""
calendar = []

for item in seasonal:
if item["status"] in ("peak", "superpeak"):
# 6 недель до пика = примерно 1.5 месяца назад
update_month = (item["month"] - 2) % 12 or 12 # -1.5 мес, округляем до -2
prep_month = (item["month"] - 3) % 12 or 12 # Бронирование фотосъёмки

priority = "CRITICAL" if item["status"] == "superpeak" else "HIGH"

calendar.append({
"peak_month": item["month"],
"peak_name": item["month_name"],
"peak_index": item["index"],
"update_month": update_month,
"prep_month": prep_month,
"priority": priority,
"actions": [
f"Месяц {prep_month}: Бронировать фотосъёмку",
f"Месяц {update_month}: Загрузить обновлённый контент",
f"Месяц {item['month']}: Мониторинг позиций и конверсии",
],
})

# Добавляем праздничные пики (независимо от индекса)
holidays = [
{"month": 2, "name": "23 февраля", "theme": "Подарок мужчине"},
{"month": 3, "name": "8 марта", "theme": "Подарок женщине"},
{"month": 9, "name": "1 сентября", "theme": "Школьный сезон"},
{"month": 11, "name": "Чёрная пятница", "theme": "Скидки и промо"},
{"month": 12, "name": "Новый год", "theme": "Подарочная упаковка, наборы"},
]

for holiday in holidays:
# Проверяем, не дублируется ли с уже найденными пиками
existing = [c for c in calendar if c["peak_month"] == holiday["month"]]
if not existing:
update_m = (holiday["month"] - 2) % 12 or 12
calendar.append({
"peak_month": holiday["month"],
"peak_name": holiday["name"],
"peak_index": None, # Праздничный, не из тренда
"update_month": update_m,
"prep_month": (holiday["month"] - 3) % 12 or 12,
"priority": "MEDIUM",
"actions": [
f"Подготовить тематическую инфографику: «{holiday['theme']}»",
f"Обновить заголовки и описания под праздничные запросы",
],
})

calendar.sort(key=lambda x: x["peak_month"])
return calendar


# --- Пример использования ---

trends = fetch_category_trends("Одежда/Женская одежда/Платья")
seasonal = calculate_seasonal_index(trends)
calendar = generate_content_calendar(seasonal)

print("=== СЕЗОННЫЙ ИНДЕКС ===")
for s in seasonal:
bar = "█" * int(s["index"] * 10)
print(f"{s['month_name']:>10} | {s['index']:.2f} | {s['emoji']} | {bar}")

print("\n=== КОНТЕНТ-КАЛЕНДАРЬ ===")
for c in calendar:
print(f"\n{c['priority']:>8} | Пик: {c['peak_name']} (месяц {c['peak_month']})")
for action in c["actions"]:
print(f" → {action}")

Пример сезонного анализа

Категория: Одежда / Женская одежда / Платья (типичная для клиентов Fotofactor).

МесяцИндексСтатусДействие
Январь0.6❄️ СпадПодготовка контента к весне
Февраль0.7📉 СпадОбновить к 23 февраля (подарочная тема)
Март1.1📈 РостОбновить к 8 марта
Апрель0.9➡️ НормаАнализ результатов весенних обновлений
Май1.2📈 РостЗагрузить летнюю коллекцию
Июнь1.3🔥 ПикЛетний пик — контент должен быть готов!
Июль1.1📈 РостПоддержать летние продажи
Август0.9➡️ НормаПодготовка осенней коллекции
Сентябрь1.4🔥 ПикОсенний пик — «Обратно в офис»
Октябрь1.2📈 РостПодготовка к Чёрной пятнице
Ноябрь1.5🔥🔥 СуперпикЧёрная пятница — пиковые продажи
Декабрь1.8🔥🔥 СуперпикНовогодний пик (контент обновить в октябре!)

Ключевой инсайт: декабрьский контент нужно готовить в октябре (за 6-8 недель). Если селлер звонит в декабре — он опоздал на 2 месяца.

Дерево решений

graph TD
A["72-месячные тренды\nкатегории клиента"] --> B["Рассчитать сезонный\nиндекс по месяцам"]
B --> C{"Индекс месяца?"}
C -->|">= 1.5 Суперпик"| D["CRITICAL\nОбновить за 8 недель\nПолная пересъёмка"]
C -->|">= 1.3 Пик"| E["HIGH\nОбновить за 6 недель\nОбновить инфографику"]
C -->|">= 1.1 Рост"| F["MEDIUM\nОбновить SEO\nМинимальные изменения"]
C -->|"< 0.7 Спад"| G["LOW\nПодготовка к следующему\nсезону"]
D --> H["Годовой контент-календарь\n4 окна обновлений"]
E --> H
F --> H
G --> H

Годовой контент-календарь (Gantt)

gantt
title Годовой контент-календарь: Женские платья
dateFormat YYYY-MM-DD
axisFormat %b

section Подготовка
Зимняя съёмка (к 8 марта) :prep1, 2026-01-15, 2026-02-15
Летняя съёмка (к июню) :prep2, 2026-04-01, 2026-05-01
Осенняя съёмка (к сентябрю) :prep3, 2026-07-15, 2026-08-15
НГ съёмка (к декабрю) :prep4, 2026-10-01, 2026-11-01

section Загрузка контента
Весенний контент :upload1, 2026-02-15, 2026-03-01
Летний контент :upload2, 2026-05-01, 2026-05-15
Осенний контент :upload3, 2026-08-15, 2026-09-01
Новогодний контент :upload4, 2026-11-01, 2026-11-15

section Пики продаж
8 марта :milestone, m1, 2026-03-08, 0d
Летний сезон :peak1, 2026-06-01, 2026-07-31
Осенний сезон :peak2, 2026-09-01, 2026-10-15
Чёрная пятница :milestone, m2, 2026-11-27, 0d
Новогодний пик :peak3, 2026-12-01, 2026-12-31

section Мониторинг
Анализ весенних результатов :mon1, 2026-04-01, 2026-04-15
Анализ летних результатов :mon2, 2026-08-01, 2026-08-15
Анализ осенних результатов :mon3, 2026-10-15, 2026-11-01
Годовой отчёт :mon4, 2026-12-15, 2026-12-31

Действие Fotofactor

Формирование годовой подписки

На основе сезонного анализа Fotofactor предлагает клиенту годовой контент-план с 4 обязательными обновлениями:

  1. Весеннее обновление (январь-февраль) — подготовка к 23 февраля + 8 марта
  2. Летнее обновление (апрель-май) — летний контент, lifestyle-съёмка
  3. Осеннее обновление (июль-август) — «обратно в офис/школу», осенняя коллекция
  4. Новогоднее обновление (октябрь-ноябрь) — подарочная тема, Чёрная пятница, Новый год

Для каждого обновления:

  • Фотосъёмка: забронировать за 6-8 недель до пика
  • Сезонная инфографика: «Подарок на 8 марта», «Осенняя коллекция», «Новогодний набор»
  • SEO-обновление: сезонные ключевые слова («подарок на 8 марта», «летнее платье», «новогодний образ»)
  • A/B тест: главное фото под сезонный контекст
Структура годовой подписки

Пакет «Сезон-4» — годовая подписка для селлера:

  • 4 фотосъёмки в год (по одной на сезон): 4 x 80 000 рублей = 320 000 рублей
  • Ежемесячный мониторинг MPStats: 12 x 10 000 рублей = 120 000 рублей
  • Сезонная инфографика (4 комплекта): 4 x 20 000 рублей = 80 000 рублей
  • SEO-оптимизация (4 обновления): 4 x 15 000 рублей = 60 000 рублей

Итого: 580 000 рублей/год (48 000 рублей/мес)

Для сравнения: разовый проект = 80 000-120 000 рублей. Годовая подписка = 4.8-7.2x от разового чека.

Скидка при годовой оплате: 10-15% (520 000-495 000 рублей).

Предпродажная коммуникация

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

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

📊 Ключевые находки:
- Ваша категория имеет 3 выраженных пика: март (+40%), сентябрь (+50%), декабрь (+80%)
- Оптимальное время обновления контента: за 6 недель до пика
- Ближайшее окно обновления: через 3 недели (подготовка к осеннему сезону)

⏰ Проблема: 73% селлеров обновляют контент ПОСЛЕ падения продаж.
Вы теряете 2-4 недели на переиндексацию WB и входите в пик с устаревшим контентом.

💡 Предлагаем: годовой контент-план с 4 сезонными обновлениями.
Каждое обновление привязано к конкретному пику и включает:
— Тематическую фотосъёмку (сезонный контекст)
— Обновление инфографики
— SEO под сезонные запросы
— Мониторинг результатов

📅 Подготовили персональный контент-календарь на 2026 год — отправить?

Сезонная инфографика

Для каждого сезонного обновления — уникальный визуальный стиль:

СезонТема инфографикиЦветовая палитраSEO-запросы
Весна (к 8 марта)«Идеальный подарок», букеты, весеннее настроениеРозовый, лавандовый, мятный«подарок на 8 марта», «весенний образ»
ЛетоLifestyle, отпуск, лёгкостьБирюзовый, коралловый, белый«летнее платье», «пляжный образ»
Осень (к сентябрю)«Обратно в офис», уют, стильТерракот, бордо, горчица«осенняя коллекция», «деловой стиль»
Зима (к НГ)Праздник, подарки, наборыКрасный, золотой, изумрудный«новогодний подарок», «праздничный набор»

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

Эффект от проактивного обновления

МетрикаРеактивный подход (как обычно)Проактивный подход (с календарём)Разница
Время обновления контентаПосле падения продажЗа 6 недель до пика+6-8 недель в запасе
Пропущенные пики за год2-3 из 40 из 4Ни одного пропуска
Сезонная конверсия карточки3-5% (устаревший контент)6-10% (актуальный контент)+80-100%
Бюджет на контентНепредсказуемый (авралы)Плановый (годовая подписка)Экономия 15-20%
Позиции в поиске WBПадают перед пикомРастут перед пиком+20-40 позиций

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

МодельСредний чекЧастотаГодовая выручка с клиентаLTV
Разовый проект80 000-120 000 рублей1-2 раза/год80 000-240 000 рублейНизкий
Годовая подписка48 000 рублей/месЕжемесячно580 000 рублей/год3-4x выше

Ключевые бизнес-метрики годовой подписки:

  • Предсказуемая выручка: 48 000 рублей/мес с клиента (вместо непредсказуемых всплесков)
  • LTV увеличивается в 3-4 раза: 580 000 рублей/год vs 80 000-240 000 рублей разового чека
  • Маржинальность мониторинга: 85-90% (автоматизировано через MPStats API)
  • Загрузка студии: предсказуемая, без авралов (съёмки забронированы на год вперёд)
  • Retention: клиент не уходит к конкурентам — привязан годовым планом с данными
Почему подписка -- самая ценная бизнес-модель

Разовый проект = обмен времени на деньги. Каждый месяц начинается с нуля.

Годовая подписка = recurring revenue. 10 клиентов на подписке = 580 000 рублей/мес гарантированной выручки. 20 клиентов = 1.16M рублей/мес. Это позволяет Fotofactor:

  • Нанимать штатных фотографов (не фрилансеров)
  • Инвестировать в оборудование и студию
  • Планировать развитие на год вперёд
  • Повышать стоимость компании (recurring revenue = мультипликатор x3-5 при оценке бизнеса)

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

Сезонный контент-календарь превращает Fotofactor из «фотостудии» в стратегического партнёра по управлению контентом. Ключевое отличие от конкурентов:

«Мы не ждём, когда ваши продажи упадут. Мы анализируем 6 лет данных и обновляем контент ДО сезонного пика. Ваш контент всегда актуален, а позиции в поиске растут именно тогда, когда покупатели ищут ваш товар».

Что дальше