Обоз — конкурентная разведка на маркетплейсах
Платформа аналитики на WB/Ozon: 1 848 листингов, 20 245 отзывов, кластеризация через embeddings, авто-SWOT и план 30/60/90 через GigaChat.
Задача клиента
Мультитенант-платформа: RLS + JWT + суперадмин
Один инстанс, изолированные клиенты, переключение из админки
Каждый клиент логинится под своим аккаунтом и видит только свои данные — изоляция на уровне PostgreSQL RLS (app.current_tenant выставляется из JWT). Бренд-агностичная модель: «свой бренд» тенанта помечен флагом is_own (вместо хардкода). Суперадмин получает сводный дашборд по всем клиентам и переключается в любого тенанта прямо из сайдбара (impersonate — временный JWT). Роли superadmin / owner / viewer. Запросы скоупятся автоматически — ручных WHERE tenant_id в аналитике нет.
17 воркеров: discovery → snapshot → enrich → cluster → SWOT
Полный цикл сбора + analytics + LLM в фоновых задачах, per-tenant
discovery (по tracked-брендам каждого тенанта через iter_seller_catalog + wb_search + Ozon-агент), snapshot (4×/сутки card.wb.ru/v4/detail батчами по 100), reviews (daily через feedbacks*.wb.ru), serp (2×/сутки), enrich_listings (regex CATEGORY_RULES), enrich_wb_basket (basket-CDN), fix_sold_total, review_cluster (KMeans+TF-IDF), auto_swot, alert_detector (5 детекторов), tasks_sync (6 источников), daily_digest, collect_all (оркестратор). Все воркеры циклят активных тенантов и скоупятся по tenant_id + is_own.
Auto-SWOT через GigaChat (3 промпта на бренд тенанта)
7 SQL-фактов → SWOT, План 90д, Exec Summary — по своему бренду каждого клиента
7 SQL-фактов в JSON (листинги WB/Ozon, бренды, top-категории, weak-категории CTE, health_score рынок vs свой бренд, top-6 review-кластеров, серые реселлеры, GMV WB) → 3 prompt: SWOT (5-7 пунктов в категории, max_tokens 3500), Plan-90d (горизонты 30/60/90 с kpi/action/owner/expected), Exec Summary (180 слов). Системные промпты параметрические по бренду тенанта. Cross-project Redis-lock TTL 360s, atomic Lua-release.
Revenue calculator (₽-формулы)
Прозрачные формулы: всё в рубли в месяц
core/revenue_calc.py — content_loss / map_violation_loss / stock_out_loss / serp_loss / grey_market_loss. Константы: DEFAULT_MARGIN=0.30, PHOTO_UPLIFT_PCT=0.05 (+5% CR/фото до 8), DESC_UPLIFT_PER_250=0.03, VIDEO_UPLIFT_PCT=0.08, DEFAULT_CR=0.025, DAYS=30. SERP_CTR: pos1=0.20, pos2=0.12, pos3=0.08, pos5=0.05, pos10=0.022, pos20=0.005.
Pulse-главная: воронка продаж 7 этапов
Видимость → Показы → Клики → CR → Продано → AOV → GMV
api/pulse.py — funnel из 7 этапов с цифрами на каждом, 5 KPI с trend 7 дней, top-3 problems / top-3 opportunities (deep-link /sku/{id}), changes_7d. Главная — структурированный нарратив вместо плоских фактов. Пример (один тенант): 160 слотов TOP-20 → 960k показов/мес → 48k кликов/мес → CR 15.88% → 7 623 ед → AOV 2 257 ₽ → GMV 17.2M ₽.
Pulse-воронка продаж: 7 этапов до GMV
Полный путь от видимости в TOP-20 до выручки за месяц. SERP_CTR таблица для каждой позиции, AOV из последних 30 дней. Подсветка узких мест — этап с худшей конверсией.
Воронка продаж
Wildberries5 детекторов alerts с rev-uplift в ₽
map_violation, stock_low, competitor_new, price_drop, serp_drop. Дедуп через UPSERT ON CONFLICT (kind, COALESCE(listing_id::text, title)), owner назначается по отделу.
Auto-SWOT по бренду через GigaChat
7 SQL-фактов → 3 prompt (SWOT / Plan-90д / Exec Summary). GigaChat-2-Max через cross-project Redis-lock, temperature=0.3, 3 retry с backoff [10, 30, 60].
- Доминирует в категории «фасадная краска» — 28% видимости в TOP-3
- Полный медиа-набор (фото 8+ / видео / 360°) на 71% карточек
- Среднее количество отзывов 47 / SKU — выше средней по категории в 2.3×
- 23 SKU с остатком < 30 шт — теряется до 480k ₽/мес
- В описаниях нет упоминания tinting-системы для 41% позиций
- Нет видео в карточке у 29% TOP-просмотренных SKU
- Добавить ABC-теги «для влажных помещений» — +180k ₽/мес по 12 SKU
- Заполнить опции «база A/C/D» — даст +12% к CR (по бенчмаркам категории)
- Запустить 4 SKU в Я.Маркет — несовпадение цен с WB только в 2%
- 9 серых продавцов с MAP-violation на ключевых SKU — конкурируют по цене
- Сезонный спад зимой −31% к выручке, нужна стратегия диверсификации
- Конкурент «Стройсервис» поднял медиа-бюджет, поз 4 → 9 за 14 дней
Источники данных и AI-фичи
WB + Ozon + GigaChat + Qwen3 ONNX
Архитектура
FastAPI Backend
Docker oboz-api :8102, 8 911 LOC
Next.js 15 Frontend
Docker oboz-frontend :3050, App Router + auth
PostgreSQL 16 + RLS
Tenant-изоляция через app.current_tenant
Redis 7
Кэш + in-process lock + cross-project GigaChat lock
JWT + RLS auth
HS256 stdlib, роли superadmin/owner/viewer
HOME_EXIT_PROXY
socks5h://127.0.0.1:1080 — резидентный reverse-SSH