Направление 1: Продакшн на основе данных (ROI-контент)
Роман Басов (Fotofactor): «Планирую интегрировать ваше API в CRM нашего продакшена, чтобы наглядно показывать клиентам корреляцию между нашими съёмками и ростом их продаж/позиций. Это сделает ваши данные стандартом качества для наших крупных заказчиков.»
1. Суть направления
ROI-контент -- это модель, при которой каждая единица визуального контента (фото, видео, инфографика), произведённая Fotofactor, получает измеримую привязку к бизнес-результату клиента на маркетплейсе.
Сегодня контент-студия сдаёт клиенту фотографии. Клиент загружает их в карточку. Через какое-то время он либо видит рост, либо нет -- но никто не может доказать причинно-следственную связь между конкретными визуальными решениями и динамикой продаж.
Что мы строим:
┌───────────────────────────────────────────────────────────────────────────┐
│ ROI-CONTENT FRAMEWORK │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ ЗАМЕР ДО │───>│ КОНТЕНТ │───>│ ЗАМЕР ПОСЛЕ │ │
│ │ │ │ ОБНОВЛЕНИЕ │ │ │ │
│ │ • Позиции │ │ │ │ • Позиции (через 7/14/ │ │
│ │ • Продажи │ │ • Фото │ │ 30 дней) │ │
│ │ • Конверсия │ │ • Видео │ │ • Продажи (сравнение) │ │
│ │ • CTR │ │ • Инфографика│ │ • Конверсия (дельта) │ │
│ │ • Ключевики │ │ • Описание │ │ • CTR (прирост) │ │
│ └──────────────┘ └──────────────┘ └──────────────────────────┘ │
│ │ │ │
│ └──────────────────┬───────────────────────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ CONTENT SCORE │ │
│ │ (0–100) │ │
│ │ │ │
│ │ ROI-отчёт │ │
│ │ для клиента │ │
│ └────────────────┘ │
└───────────────────────────────────────────────────────────────────────────┘
Ключевая идея: данные SalesFinder становятся «линейкой качества» -- объективным инструментом, которым Fotofactor измеряет эффективность собственной работы и демонстрирует её клиенту в цифрах.
2. Текущая проблема рынка
Рынок контент-продакшна для маркетплейсов
| Проблема | Последствие для студии | Последствие для клиента |
|---|---|---|
| Контент воспринимается как commodity | Давление на цену, демпинг конкурентов | Выбирает «дешевле» -- получает низкое качество |
| Невозможно доказать ROI от съёмки | Клиент не видит ценности, торгуется | Не понимает, зачем платить 25 000 вместо 5 000 |
| Нет данных о позициях и продажах | Студия не знает, что именно работает | Клиент сам разбирается, «работает ли фото» |
| Разовые проекты, нет recurring revenue | Постоянный поиск новых клиентов, высокий CAC | Нет долгосрочных отношений, нет итеративного улучшения |
| Субъективная оценка качества | «Мне нравится» / «Мне не нравится» -- споры | Нет объективных критериев для приёмки |
Масштаб проблемы в цифрах
| Метрика | Значение |
|---|---|
| Количество продавцов на WB (2025) | ~500 000 активных |
| Количество продавцов на Ozon (2025) | ~350 000 активных |
| Средняя продолжительность работы с контент-студией | 1--2 проекта (нет retention) |
| % студий, отслеживающих ROI контента | < 1% |
| % клиентов, которые хотят видеть ROI | > 80% (опрос Fotofactor) |
| Средняя маржа «голого» контента | 25--35% |
Контент-студия не может ответить на вопрос клиента: «Сколько денег мне принесли ваши фотографии?» Это убивает retention, сдерживает рост чеков и превращает фотографию в commodity.
Последствия для бизнеса
Нет данных о ROI Текущая ситуация
│ │
▼ ▼
Клиент не видит Средний чек: 15-25K руб.
ценности Retention: 1-2 проекта
│ Маржа: 25-35%
▼ CAC: высокий
Торгуется, LTV: 30-50K руб.
уходит к дешёвым
конкурентам
│
▼
Нет recurring revenue
Постоянный поиск
новых клиентов
3. Решение: ROI-Content Framework
3.1. Before/After трекинг по каждому SKU
Для каждого артикула, по которому Fotofactor создаёт контент, фиксируются ключевые метрики до и после обновления карточки.
Временные точки замера:
| Точка | Когда | Что фиксируем |
|---|---|---|
| T0 (Baseline) | За 1 день до обновления карточки | Все метрики «как есть» |
| T1 (Week 1) | Через 7 дней после обновления | Первичный эффект, индексация |
| T2 (Week 2) | Через 14 дней | Стабилизация позиций |
| T3 (Month) | Через 30 дней | Устойчивый результат |
| T4 (Quarter) | Через 90 дней | Долгосрочный ROI |
Метрики, отслеживаемые для каждого SKU:
| Метрика | Источник SF API | Описание |
|---|---|---|
| Позиция в категории | /product/categories | Позиция товара в каждой привязанной категории |
| Позиция по ключевым запросам | /product/keywords | Позиции по топ-20 поисковых запросов |
| Оценка продаж (шт/мес) | /product/overview | Расчётный объём продаж |
| Оценка выручки (руб/мес) | /product/overview | Расчётная выручка |
| Количество отзывов | /product/info | Динамика отзывов |
| Рейтинг | /product/info | Средний рейтинг товара |
| Цена / скидка | /product/days | Динамика цены по дням |
Пример отчёта Before/After:
| Метрика | T0 (до) | T1 (+7 дн.) | T2 (+14 дн.) | T3 (+30 дн.) | Дельта |
|---|---|---|---|---|---|
| Позиция «шуруповёрт makita» | #18 | #12 | #8 | #5 | +13 позиций |
| Позиция «шуруповёрт аккумуляторный» | #45 | #30 | #22 | #15 | +30 позиций |
| Продажи (шт/мес) | 120 | 145 | 180 | 210 | +75% рост |
| Выручка (руб/мес) | 960 000 | 1 160 000 | 1 440 000 | 1 680 000 | +75% рост |
| Рейтинг | 4.3 | 4.3 | 4.5 | 4.6 | +0.3 |
Клиент видит: «Fotofactor обновил мне карточку, и через месяц я поднялся с 18-й на 5-ю позицию, а продажи выросли на 75%. Это окупило стоимость съёмки за 3 дня.»
3.2. ContentScore -- метрика качества карточки (0--100)
ContentScore -- агрегированная метрика, отражающая «здоровье» товарной карточки на маркетплейсе. Рассчитывается на основе данных SalesFinder.
Формула расчёта:
ContentScore = w1 * PositionScore
+ w2 * SalesScore
+ w3 * KeywordCoverage
+ w4 * VisualCompleteness
+ w5 * CompetitivePosition
Компоненты и веса:
| Компонент | Вес | Что измеряет | Источник данных SF |
|---|---|---|---|
| PositionScore | 0.25 | Средняя позиция по ключевым запросам | /product/keywords |
| SalesScore | 0.25 | Уровень продаж относительно категории | /product/overview + /ext-analitic/category_overview_all |
| KeywordCoverage | 0.20 | % покрытия релевантных поисковых запросов | /product/keywords |
| VisualCompleteness | 0.15 | Кол-во фото, наличие видео, инфографики | /product/info |
| CompetitivePosition | 0.15 | Позиция относительно конкурентов | /ext-analitic/get_category_brand |
Шкала ContentScore:
| Балл | Оценка | Цвет | Рекомендация |
|---|---|---|---|
| 90--100 | Отлично | Зелёный | Поддерживать текущее качество |
| 70--89 | Хорошо | Жёлтый | Точечные улучшения (видео, инфографика) |
| 50--69 | Средне | Оранжевый | Требуется обновление контента |
| 30--49 | Плохо | Красный | Срочное обновление контента |
| 0--29 | Критически | Чёрный | Полная переработка карточки |
- Для продажи: «Ваша карточка набрала 42/100 -- конкуренты в среднем 71. Мы доведём до 80+.»
- Для retention: «После нашей съёмки ContentScore вырос с 42 до 78 -- это топ-20% в категории.»
- Для upsell: «Добавьте видеообзор -- прогноз роста ContentScore до 88.»
3.3. Автоматические ROI-отчёты
Система генерирует еженедельные/ежемесячные отчёты для каждого клиента автоматически.
Структура отчёта:
- Сводка: общий ContentScore портфеля, изменение за период
- Топ-5 растущих SKU: какие карточки показали лучший рост
- Топ-5 проблемных SKU: где нужно внимание
- Before/After: детальное сравнение по обновлённым карточкам
- Рекомендации: что обновить следующим, прогноз эффекта
- ROI-расчёт: «Инвестиции в контент: X руб. → Прирост выручки: Y руб. → ROI: Z%»
Форматы доставки:
| Формат | Периодичность | Аудитория |
|---|---|---|
| Email (PDF) | Еже недельно | Менеджер клиента |
| Telegram-бот | Ежедневно (алерты) | Оперативный контроль |
| Streamlit-дашборд | В реальном времени | Стратегическое планирование |
| CSV/Excel | Ежемесячно | Аналитика, финансовый учёт |
3.4. Real-time дашборд для клиентов
Персональный веб-дашборд (Streamlit), доступный клиенту 24/7.
Основные виджеты:
┌─────────────────────────────────────────────────────────────┐
│ FOTOFACTOR x SALESFINDER — Дашборд клиента «BrandX» │
├──────────────────────────────── ─────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ ContentScore │ │ Продажи │ │ ROI от контента │ │
│ │ │ │ │ │ │ │
│ │ ██ 74 │ │ +23% ▲ │ │ 847% │ │
│ │ ████████ │ │ за 30 дней │ │ окупаемость │ │
│ │ ████████ │ │ │ │ за 4 дня │ │
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
│ │
│ ┌───────────────────────────── ─────────────────────────┐ │
│ │ Before/After по обновлённым карточкам │ │
│ │ ┌─────────┬────────┬─────────┬──────────┬───────┐ │ │
│ │ │ SKU │ До │ После │ Дельта │ ROI │ │ │
│ │ ├─────────┼────────┼─────────┼──────────┼───────┤ │ │
│ │ │ A-1001 │ #18 │ #5 │ +13 поз. │ 520% │ │ │
│ │ │ A-1002 │ #45 │ #12 │ +33 поз. │ 890% │ │ │
│ │ │ A-1003 │ #7 │ #3 │ +4 поз. │ 340% │ │ │
│ │ └─────────┴────────┴─────────┴──────────┴───────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Динамика позиций (график за 90 дней) │ │
│ │ │ │
│ │ Позиция │ │
│ │ 1 │ ····· │ │
│ │ 5 │ ····· │ │
│ │ 10 │ ····· │ │
│ │ 15 │ ····· │ │
│ │ 20 │ ····· ↑ Обновление контента │ │
│ │ └──────────────────────────────────────────── t │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
4. Техническая архитектура интеграции
4.1. Используемые эндпоинты SalesFinder API
| Эндпоинт | Назначение в ROI-Framework | Частота вызовов |
|---|---|---|
POST /api/2025_09/product/info | Статические данные товара (бренд, фото, рейтинг) | При первичной привязке SKU |
POST /api/2025_09/product/overview | Агрегированные продажи и выручка за период | Ежедневно для активных SKU |
POST /api/2025_09/product/days | Детализация по дням (цены, продажи, остатки) | Ежедневно для трекинга |
POST /api/2025_09/product/keywords | Позиции по поисковым запросам | 2 раза в неделю |
POST /api/2025_09/product/categories | Позиции в категориях | 2 раза в неделю |
POST /api/2025_09/ext-analitic/show_category | Список категорий для анализа ниши | Еженедельно |
POST /api/2025_09/ext-analitic/category_overview_all | Общие показатели категории (для сравнения) | Еженедельно |
POST /api/2025_09/ext-analitic/get_category_brand | Бренды в категории (конкурентный анализ) | Еженедельно |
POST /api/2025_09/ext-analitic/get_category_product | Товары в категории (бенчмарк) | Еженедельно |
POST /api/2025_09/product/stores | Данные по складам (география) | Ежемесячно |
4.2. Поток данных
┌─────────────────────────────────────────────────────────────────────────┐
│ DATA FLOW │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ SalesFinder │ │ Platrum │ │ Analytics │ │
│ │ API │────>│ Spider DB │────>│ Engine │ │
│ │ │ │ (SQLite) │ │ │ │
│ │ rate limit: │ │ │ │ • ContentScore calc │ │
│ │ 1 req/5sec │ │ sf_products │ │ • Before/After diff │ │
│ │ │ │ sf_keywords │ │ • ROI calculation │ │
│ │ auth: JWT │ │ sf_metrics │ │ • Trend detection │ │
│ │ token 3h │ │ sf_snapshots │ │ • Anomaly alerts │ │
│ └──────────────┘ └──────┬───────┘ └──────────┬───────────┘ │
│ │ │ │
│ │ │ │
│ ┌──────▼────────────────────────▼───────────┐ │
│ │ OUTPUT LAYER │ │
│ │ │ │
│ │ ┌───────────┐ ┌──────────┐ ┌────── ──┐ │ │
│ │ │ Streamlit │ │ PDF/ │ │Telegram│ │ │
│ │ │ Dashboard │ │ Email │ │ Bot │ │ │
│ │ │ (клиент) │ │ (отчёты) │ │(алерты)│ │ │
│ │ └───────────┘ └──────────┘ └────────┘ │ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
4.3. Ключевые отслеживаемые метрики
| Группа | Метрика | API-источник | Частота обновления |
|---|---|---|---|
| Позиции | Позиция по ключевому запросу | product/keywords | 2 раза/неделю |
| Позиции | Позиция в категории | product/categories | 2 раза/неделю |
| Продажи | Оценка продаж (шт) | product/overview | Ежедневно |
| Продажи | Оценка выручки (руб) | product/overview | Ежедневно |
| Конверсия | CTR карточки (косвенно) | product/days (показы→корзина) | Ежедневно |
| Конкуренты | Доля бренда в категории | ext-analitic/get_category_brand | Еженедельно |
| SEO | Покрытие ключевых слов | product/keywords | 2 раза/неделю |
| Контент | Количество фото/видео | product/info | При обновлении |
4.4. Стратегия кеширования
SalesFinder API допускает не более 1 запроса в 5 секунд на аккаунт. Это фундаментальное ограничение, которое определяет всю архитектуру кеширования.
Многоуровневое кеширование:
| Уровень | TTL | Что кешируем | Объём |
|---|---|---|---|
| L1: In-memory | 5 минут | Последние ответы API (для дедупликации) | ~50 MB |
| L2: SQLite | 24 часа | Все метрики, позиции, продажи | ~500 MB |
| L3: Snapshots | Бессрочно | Исторические срезы для Before/After | ~2 GB/год |
Расчёт запросов для 50 клиентских SKU:
| Операция | Запросов/день | Запросов/неделю |
|---|---|---|
product/overview (50 SKU) | 50 | 350 |
product/days (50 SKU) | 50 | 350 |
product/keywords (50 SKU, 2x/нед) | -- | 100 |
product/categories (50 SKU, 2x/нед) | -- | 100 |
ext-analitic/* (10 категорий, 1x/нед) | -- | 30 |
| ИТОГО | ~100 | ~930 |
При 1 req/5sec = 12 req/min = 720 req/hour:
- 930 запросов/неделю = ~1.3 часа синхронизации в неделю
- Оптимально: ночной batch-процесс (3:00 AM, ~20 мин/день)
Архитектура синхронизации:
# Расписание синхронизации (APScheduler)
SYNC_SCHEDULE = {
"product_overview": {"trigger": "cron", "hour": 3, "minute": 0}, # Ежедневно
"product_days": {"trigger": "cron", "hour": 3, "minute": 30}, # Ежедневно
"product_keywords": {"trigger": "cron", "day_of_week": "mon,thu", "hour": 4}, # 2x/нед
"product_categories":{"trigger": "cron", "day_of_week": "mon,thu", "hour": 4, "minute": 30},
"category_analytics":{"trigger": "cron", "day_of_week": "mon", "hour": 5}, # 1x/нед
}
4.5. Новые таблицы БД для ROI-трекинга
-- Снапшоты метрик для Before/After
CREATE TABLE sf_metric_snapshots (
id INTEGER PRIMARY KEY AUTOINCREMENT,
product_external_id VARCHAR(50) NOT NULL,
marketplace VARCHAR(20) NOT NULL,
snapshot_type VARCHAR(20) NOT NULL, -- 'baseline', 'week1', 'week2', 'month', 'quarter'
content_update_id INTEGER, -- Привязка к проекту съёмки
position_avg FLOAT, -- Средняя позиция по ключевикам
position_best INTEGER, -- Лучшая позиция
sales_estimate INTEGER, -- Оценка продаж
revenue_estimate FLOAT, -- Оценка выручки
keyword_coverage FLOAT, -- % покрытия ключевых слов
content_score INTEGER, -- Рассчитанный ContentScore
raw_data JSON, -- Полные данные для глубокого анализа
captured_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE(product_external_id, marketplace, snapshot_type, content_update_id)
);
-- Проекты обновления контента (привязка к съёмкам)
CREATE TABLE content_updates (
id INTEGER PRIMARY KEY AUTOINCREMENT,
client_id VARCHAR(50) NOT NULL, -- ID клиента Fotofactor
product_external_id VARCHAR(50) NOT NULL, -- SKU на маркетплейсе
marketplace VARCHAR(20) NOT NULL,
update_type VARCHAR(50), -- 'photo', 'video', 'infographic', 'full'
content_items_count INTEGER, -- Количество единиц контента
cost FLOAT, -- Стоимость для клиента
updated_at DATETIME NOT NULL, -- Дата обновления карточки
baseline_score INTEGER, -- ContentScore ДО
current_score INTEGER, -- ContentScore ПОСЛЕ (обновляется)
roi_percent FLOAT, -- ROI в процентах (обновляется)
status VARCHAR(20) DEFAULT 'tracking', -- 'tracking', 'completed', 'inconclusive'
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Индексы
CREATE INDEX idx_snapshots_product ON sf_metric_snapshots(product_external_id, marketplace);
CREATE INDEX idx_snapshots_update ON sf_metric_snapshots(content_update_id);
CREATE INDEX idx_content_updates_client ON content_updates(client_id);
CREATE INDEX idx_content_updates_status ON content_updates(status);