← Назад к портфолио

WB Analytics Bot — аналитика Wildberries

Полная аналитика Wildberries в Telegram — от P&L до юнит-экономики

Селлер подключает WB-кабинет, загружает себестоимость — и каждый день получает P&L-отчёт в Telegram, развёрнутую аналитику в Google Sheets на 5 листах и полный контроль через Mini App. Без Excel, без ручного сбора данных, без бухгалтера.

⚡ Проблема

Селлеры Wildberries тратят часы на ручной сбор данных из 6+ разных разделов личного кабинета. P&L считают в Excel, себестоимость теряется, реклама не учитывается в разрезе артикулов. При масштабировании до 200+ SKU и нескольких кабинетов ручная аналитика становится невозможной.

✅ Решение

Telegram-бот автоматически собирает данные из 7 эндпоинтов WB API, рассчитывает полный P&L с учётом налогов, НДС, себестоимости и рекламы — и отправляет готовый отчёт в Telegram. Параллельно формирует 5 листов Google Sheets со 131 столбцом и слайсерами для интерактивной фильтрации. Mini App дублирует все функции бота в мобильном интерфейсе.

⚙️ Что реализовано

📊

P&L-отчёт в Telegram

Заказы, продажи, логистика, комиссии, реклама, себестоимость, налоги — всё в одном сообщении. Периоды: вчера, сегодня, 7/30 дней или произвольный диапазон до 90 дней. Мультивалютность: ₽, ֏, ₸, лей.

📋

Google Sheets — 5 листов аналитики

«По дням», «По неделям», «По артикулам» (131 столбец + 4 слайсера), «Номенклатура» (VLOOKUP + Data Validation), «Unit» (юнит-экономика, 78 столбцов). Автоформатирование, merge, цвета по разделам.

💰

Себестоимость с историчностью

Загрузка Excel (лимит 200 SKU), автогенерация шаблона с ценами WB. Историчность по дате — прошлые периоды не пересчитываются. Конвертация RUB → валюта кабинета по курсу ЦБ РФ.

📱

Telegram Mini App

SPA на чистом JS: онбординг, подключение кабинета, P&L-отчёт с выбором периода, себестоимость, Google Sheets — всё через REST API. Адаптация к теме Telegram, HapticFeedback, BackButton.

📈

Реклама по артикулам

Fullstats API: один запрос — два набора данных. Маппинг nmId → sa_name из reportDetailByPeriod. Группировка расходов по артикулам и дням. Advert UPD: баланс, счёт, бонус — раздельно.

🏪

Хранение по артикулам (Paid Storage)

Асинхронные задачи: create → poll → download. Чанки по 8 дней, пауза 60 сек. Двухуровневый retry (429 + 5xx). Параллельно с другими загрузчиками через asyncio.gather.

🔐

Безопасность и шифрование

WB-токены шифруются AES-256-GCM, хранятся зашифрованными в PostgreSQL. SHA-256 хеш для дедупликации. HMAC-SHA256 валидация initData в Mini App. JWT-авторизация админ-панели.

🖥️

Веб-админка с REST API

JWT-авторизация, список пользователей с пагинацией и поиском, блокировка/разблокировка, экспорт себестоимости в Excel. Заблокированный пользователь получает сообщение от бота.

🔄 Как формируется отчёт

01
Подключение кабинета и онбординг
FSM-диалог: ввод WB-токена → валидация через API → выбор системы налогообложения (УСН/ОСНО/АУСН) → ставка налога → НДС → автоопределение валюты. Токен шифруется AES-256-GCM. 7-дневный триал активируется автоматически.
aiogram FSM
02
Параллельная загрузка из 7 эндпоинтов WB API
reportDetailByPeriod + Advert fullstats + Advert UPD + Paid Storage + Sales API + Analytics API + Content API — параллельно через asyncio.gather. 24 мин вместо 43 мин последовательно. Двухуровневый retry на каждом.
asyncio.gather
03
Парсинг, агрегация и расчёт P&L
Группировка строк по rr_dt (дата реализации). Классификация удержаний по bonus_type_name. Расчёт: валовая прибыль, налог по системе, НДС с возмещением от услуг, операционная и чистая прибыль. Конвертация себестоимости из RUB по курсу ЦБ.
Calculator
04
Формирование Google Sheets — 5 листов
«По дням» (126 столбцов) → «По неделям» (средневзвешенные %) → «По артикулам» (131 столбец + 4 слайсера, артикул × день = строка) → «Номенклатура» (VLOOKUP + Data Validation, 200 строк) → «Unit» (78 столбцов, шапка). Пауза 15 сек между листами.
Sheets API
05
Отправка P&L в Telegram
HTML-форматирование по блокам: заказы (Analytics API), продажи, расходы WB, реклама (fullstats + UPD), себестоимость, прибыль, налоги. Динамический символ валюты. Graceful degradation при недоступности любого источника.
Telegram
06
Mini App и REST API
SPA дублирует все функции бота: онбординг, подключение кабинета, P&L, себестоимость, Google Sheets. HMAC-SHA256 авторизация через initData. Проксирование через nginx. Адаптация к теме Telegram.
FastAPI

Параллельная загрузка экономит 44% времени. Пять источников данных (Advert fullstats, Advert UPD, Paid Storage, Sales API, Analytics API) загружаются одновременно через asyncio.gather. Общее время ~24 минуты вместо ~43 минут последовательно. Analytics API — самый медленный (подённые запросы с паузой 16 сек).

🔗 Ключевые интеграции

🔵 Wildberries API

7 эндпоинтов, 4 домена

  • Statistics API: reportDetailByPeriod (пагинация по rrdid)
  • Advert API: fullstats (кампании + nmId) + /adv/v1/upd (баланс/счёт/бонус)
  • Analytics API: sales-funnel/products (подённо, retry 6×)
  • Paid Storage API: create → poll → download (чанки 8 дней)
  • Content API + Prices API (каталог товаров, курсорная пагинация)
🟣 Google Sheets API

5 листов, 131 столбец, слайсеры

  • gspread + google-api-python-client (service account)
  • Merge, format, column widths за минимум API-вызовов
  • AddSlicerRequest: 4 интерактивных фильтра
  • SetDataValidationRequest + VLOOKUP-формулы
  • Пересоздание листов при каждом обновлении
🟢 PostgreSQL + Alembic

Async SQLAlchemy 2.0

  • 6 ORM-моделей: User, WbAccount, Subscription, CogsRecord, AdminUser
  • 9 миграций Alembic (автогенерация)
  • AES-256-GCM шифрование токенов + SHA-256 для дедупликации
  • Абстрактные репозитории (CRUD) + конкретные реализации
  • Unit of Work через middleware (автокоммит / ролбэк)
🟡 Mini App + REST API

SPA + FastAPI + JWT

  • 7 страниц Mini App (hash-роутинг, Observer store)
  • HMAC-SHA256 валидация initData (constant-time)
  • 17 REST-эндпоинтов (user, accounts, reports, cogs, sheets, admin)
  • JWT-авторизация админ-панели (bcrypt, блокировка)
  • Sentry мониторинг + CORS + Nginx проксирование
🔗

Один запрос к fullstats — два набора данных. Агрегированные расходы по кампаниям (для листов «По дням» и «По неделям») и детализированные по nmId (для листа «По артикулам») извлекаются из одного HTTP-ответа. Маппинг nmId → sa_name строится из reportDetailByPeriod — без дополнительных запросов.

📊 Ключевые показатели

131
Столбец на листе «По артикулам» с 4 слайсерами
7
Эндпоинтов WB API загружаются параллельно
5 листов
Google Sheets: дни, недели, артикулы, номенклатура, Unit
90 дней
Максимальная глубина отчёта и данных в таблице
17
REST-эндпоинтов: Mini App + админ-панель
SOLID
Архитектура: Repository, Service, Strategy, Facade, UoW

🏗️ Архитектурные особенности

🧱
Четырёхслойная архитектура
Handlers/Routes → Services → Repositories → Infrastructure. Три точки входа (Telegram Bot, Mini App, REST API) работают через один сервисный слой. Все зависимости инжектируются: конструкторы + FastAPI Depends.
🎭
Facade — SheetsService как упрощённый интерфейс
SheetsService координирует 4 подсистемы: SheetsDataFetcher (откуда данные), SheetsWriter (куда писать), SheetsConfig (что за структура), SheetsCalculator (как считать). Хэндлеры вызывают два метода — fetch_daily_reports() и update_table().
🔄
Strategy — взаимозаменяемые калькуляторы
ReportCalculator рассчитывает P&L по формулам, SheetsCalculator строит строку таблицы (прямые маппинги + вычисляемые столбцы). Новый столбец — одна строка в _DIRECT_FIELD_MAP или один блок в _build_computed_values().
📦
Пакет report_aggregator — 6 модулей без IO
Чистые функции парсинга, агрегации, группировки по дням/артикулам/неделям, рекламных данных и конвертации типов. Переиспользуются в Telegram-отчёте, Google Sheets и REST API. Обратная совместимость через __init__.py.
🛡️
Graceful Degradation на всех уровнях
Analytics API сбоит — столбцы «Заказы» пустые, отчёт формируется. Paid Storage недоступен — хранение из reportDetailByPeriod. Реклама не загрузилась — нули. Слайсеры не создались — лист с данными сохраняется. Пользователь всегда получает результат.
🔐
Три уровня авторизации
Telegram Bot: middleware проверки блокировки (BlockCheckMiddleware). Mini App: HMAC-SHA256 валидация initData (TelegramAuthMiddleware, constant-time). Админ-панель: JWT + bcrypt (AdminAuthMiddleware). Каждый уровень — отдельный middleware.
📦

Расширяемость без переписывания. Новый столбец в Google Sheets — одна строка в конфиге. Новая валюта — одна запись в маппинге. Новый тип удержания WB — одна ветка в классификаторе. Новый лист — новый билдер в sheets_config.py + вызов _create_worksheet(). Все формулы P&L идентичны в Telegram и Google Sheets.

🛡️

Мультивалютность из коробки. При подключении кабинета валюта определяется автоматически через WB API. Себестоимость вводится в рублях, при нерублёвом кабинете конвертируется по курсу ЦБ РФ на дату отчёта. Поддерживаются 10 валют: KZT, BYN, AMD, KGS, UZS, GEL, AZN, TJS, AED, MDL.

🛠️ Технологии

Python 3.11+ aiogram 3 FastAPI PostgreSQL SQLAlchemy 2.0 Alembic httpx gspread Google Sheets API openpyxl cryptography structlog asyncio PyJWT bcrypt Sentry Nginx systemd ruff mypy strict pytest

✅ Подойдёт вам, если

  • Вы продаёте на Wildberries и устали вручную сводить данные из 6 разделов личного кабинета в Excel — бот формирует полный P&L автоматически, включая рекламу, хранение и себестоимость по каждому артикулу
  • Вам нужна аналитика в Google Sheets с разбивкой по дням, неделям и артикулам — 131 столбец, слайсеры, VLOOKUP, автоформатирование. Данные обновляются одной кнопкой
  • Вы управляете несколькими WB-кабинетами (в том числе в разных валютах) и хотите видеть P&L каждого из одного интерфейса — бот поддерживает мультикабинетность и автоконвертацию валют
  • Вы хотите монетизировать аналитику как SaaS-продукт — в проекте реализованы подписки с триалом, реферальная программа, админ-панель для управления пользователями и готовая инфраструктура для платежей
  • Важна надёжность при работе с нестабильными API Wildberries — двухуровневый retry на каждом эндпоинте, Graceful Degradation, параллельная загрузка, Sentry-мониторинг

Раньше мой финансист тратил 3 дня в неделю на сведение данных из WB в таблицу. Сейчас я нажимаю одну кнопку — и через 24 минуты получаю Google Sheets с полной аналитикой: P&L по дням, по неделям, по каждому из 180 артикулов. Реклама разбита по товарам, хранение посчитано по складам, себестоимость подтягивается автоматически. Финансиста перевёл на стратегические задачи.

— Селлер Wildberries, 180 SKU, Санкт-Петербург

Нужен Telegram-бот для аналитики маркетплейса?

Разработаю бот с P&L-отчётами, Google Sheets, подписками и Mini App — под Wildberries, Ozon или вашу площадку

Обсудить проект →