← Все проекты
Кейс № 04 Client · Analytics · Live data

MP Dashboard.
Аналитика WB и Ozon —
38 листов Excel
в один экран.

Заказная аналитика маркетплейсов для двух ИП, торгующих под одной маркой. Раз в час сама ходит в API Wildberries, Ozon и МойСклад, складывает живые цифры в собственное хранилище и показывает KPI, ABC-анализ, ленту остатков и таблицу SKU. Раньше 2 человека вручную переписывали данные между 38 листами Excel — теперь это происходит без них.

38
листов Excel заменили
Ручная сводка по двум кабинетам WB и Ozon занимала у двух человек ежедневно по часу-два — теперь обновление автоматическое
1ч
интервал обновления
systemd timer ходит в API маркетплейсов раз в час, складывает сырые ответы в storage, собирает агрегат на дашборд
6
источников данных
Два кабинета WB · два кабинета Ozon · два аккаунта МойСклад. Все живут в одном агрегате, дашборд показывает что подключено
100%
данные на нашей инфре
Свой VPS, свои секреты, своя БД. Никаких сторонних BI-сервисов, никакой передачи данных третьим сторонам
§ 01 — Задача

Заказчик не хочет видеть API.
Хочет видеть деньги.

Два ИП торговали солнцезащитными очками под одной маркой на Wildberries и Ozon, около тысячи SKU суммарно. Раз в день один из партнёров заходил в личные кабинеты обоих маркетплейсов, выгружал отчёты в Excel и вручную сводил их в один файл из 38 листов. На это уходило 1-2 часа в день у двух человек.

Готовых BI-сервисов под их сценарий не нашли: маркетплейс-агрегаторы либо не покрывают одновременно WB и Ozon, либо требуют отдать ключи во внешний сервис. Заказчику было важно держать данные у себя — обороты больше десятка миллионов в месяц, ключи к API дают доступ к ассортиментной и финансовой информации.

ключевое требование
Дашборд должен показывать только то, что реально подключено. Если ключа от Ozon ещё нет — карточка Ozon не должна светиться нулями. Если есть только один кабинет WB из двух — на странице это видно явным образом, а не «магически усреднено».
§ 02 — Что внутри

Шесть слоёв от API до карточки SKU.

/ 01

Шесть источников в одном агрегате — каждый со своим статусом

Архитектура заложена под полный набор: два кабинета WB, два кабинета Ozon, два аккаунта МойСклад. На каждый источник свой коннектор, свой набор секретов, свой набор сырых JSON-ответов в хранилище. Дашборд отдельной строкой показывает что подключено сейчас, что в работе, чего ещё ждём.

Когда прилетает новый ключ — добавляется в сборщик и появляется на странице как ещё один источник. Без переписывания фронта, без миграций, без даунтайма.

/ 02

Hourly pull — раз в час сами ходим в API

Расписанием управляет systemd timer, без cron'а и без ручного вмешательства. В час ноль каждого часа коннектор последовательно собирает все эндпоинты доступного источника: заказы, продажи, остатки по складам, информацию о SKU. Сырые ответы складываются на диск с timestamp'ом — это аудит и страховка.

Если pull упал — systemd рестартит сервис, в логи пишется ошибка, в дашборде на чипе сверху меняется цвет «WB подключён · обновлено N мин назад» с зелёного на оранжевый. Заказчик видит проблему до того, как звонит за новыми цифрами.

/ 03

KPI за 30 дней — то, на что смотрят утром в понедельник

Сверху страницы — четыре главных числа: заказы, продажи, выручка к перечислению, остатки. Под каждым — мелкий показатель «как двигается за неделю». Это первый экран и в 90% случаев единственный, на который смотрит заказчик ежедневно.

Цифры собираются из API за окно 30 дней, без xlsx-историй и подмен. Если цифра не считается из имеющихся данных — она не показывается. Лучше пусто, чем плохо.

/ 04

ABC-анализ по факту, а не по плану

Классическое правило 80/20 в живой версии. Считаем долю выручки каждого SKU за 30 дней, сортируем, режем на сегменты A/B/C. На странице это три плашки: где деньги (A), где середина (B), где хвост (C).

Полезно перед закупкой и перед урезанием ассортимента — видно, какие 10 артикулов делают половину выручки и какие 30 артикулов забирают полку при минимальном вкладе.

/ 05

Таблица SKU с поиском и цветом остатков

Под графиками — полная таблица всех артикулов: название, заказы и продажи за 30 дней, остаток на складе. Поиск по названию, сортировка по любой колонке, переключение WB / Ozon. Цвет остатка — три состояния: зелёный (хватит), оранжевый (меньше 30 дней), красный (ноль или критично мало).

Не ради красоты — это инструмент для решения «что закупить сейчас, что вывести из ассортимента». Без открытия пяти кабинетов.

/ 06

Защита периметра: cookie-доступ и изолированные ключи

Дашборд защищён двухуровневым доступом. На входе — персональная ссылка с ключом, который выдаёт cookie на 90 дней. Без cookie страница показывает заглушку «доступ по персональной ссылке». Без cookie все API-эндпоинты возвращают 401, кроме healthcheck'а.

API-токены маркетплейсов лежат на сервере с правами 600, доступны только сервисному пользователю, не входят в git, не передаются на фронт. На каждый кабинет — отдельный файл-секрет, скомпрометирован один — остальные продолжают работу.

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

Шесть кабинетов. Один экран.

Wildberriesкабинет 1
Заказы, продажи, возвраты, остатки, цены, информация о SKU. Используем основной аналитический API за окно до 90 дней.
JWT ES256 · ReadOnly
Wildberriesкабинет 2
Второй ИП, та же марка. Когда прилетит ключ — добавляется отдельным источником, отдельной картой в KPI и таблице.
схема готова
Ozonкабинет 1
FBO-заказы, доставленные/отменённые, остатки, информация о товарах. POST API с client-id и api-key.
схема готова
Ozonкабинет 2
Второй ИП на Ozon, симметрично с WB-вторым кабинетом. Подключение по принципу drop-in.
схема готова
МойСкладучёт ИП 1
Себестоимость и закупки. Даёт настоящую маржу и прибыль на штуку — это уже не «выручка», а «деньги в карман».
REST API
МойСкладучёт ИП 2
Второй учётный аккаунт. После подключения дашборд считает раздельную и суммарную маржинальность по двум юрлицам.
REST API
§ 04 — Стек

Свой агрегатор. Свой VPS. Свой контроль.

фронт
HTML / CSS / JS (vanilla)
бэкенд
Python 3.12 · FastAPI · uvicorn
коннекторы
WB · Ozon · МойСклад
расписание
systemd timer · 1 час
хранение
Сырые JSON + SQLite
прокси
nginx + Let's Encrypt
доступ
Cookie auth · 90 дней
секреты
Файлы 600 · отдельный юзер
репо
Приватный GitHub
§ 05 — Итог

Аналитика, которая
не врёт и не
сидит на чужом сервере.

Заказчик платит только за пилот и за поддержку — никаких подписок на агрегаторы, никаких ежемесячных лицензий за «доступ к своим же данным». Каждый новый источник подключается коннектором и появляется на странице в течение нескольких часов.

Если завтра нужно добавить блок «Прибыль на штуку» — он добавляется. Если нужно убрать пункт — убирается. Это не SaaS-витрина с фиксированным набором виджетов, это собственный софт.

38
листов Excel сняли
1ч
обновление цифр
6
источников в одном экране
0
внешних BI-сервисов
§ 06 — Аналитика

Свой дашборд
под свои данные?

Нужна аналитика маркетплейсов, своего магазина, или внутренней системы — без отдачи ключей наружу? Напишите, обсудим. Срок до пилота — 1-2 недели, в зависимости от количества источников. Перед звонком можно потыкать публичное демо — данные выдуманные, интерфейс настоящий.

Открыть демо Telegram wladdiman@gmail.com