Разрабатываем системы бизнес-аналитики (BI)

Объединяем данные из разных источников в целостную систему и превращаем её в сервисы, которые сокращают ручной труд и повышают эффективность управления бизнесом

С чего начинается система

Мы всегда начинаем с дерева метрик – модели, которая объединяет показатели бизнеса или отдельного направления причинно-следственными связями

Операционнаяприбыль18,3МВаловая прибыль65,2МОперационныерасходы46,9МВыручка184,2МСебестоимость119,0МКлиенты12 960чел.Средний чек14 212Трафик480 000визитовКонверсия2,7%Товаров в чеке3,4шт.Средняя цена4 180Закупочная цена2 700Объём продаж44 064шт.Маркетинг21,3МПлатные визиты250 200визитовСтоимость клика85Показы13,9МCTR1,8%Логистика14,2МПостоянные11,4М
Модельное дерево торговой компании – цифры вымышленные. Выберите показатель, чтобы увидеть формулу и владельца.

Фундамент системы

Дерево метрик – основа модели данных: она определяет, какие источники подключать и как разложить их по слоям хранилища, чтобы у каждого показателя было одно определение, а любую цифру можно было проследить до источника

Потребители
  • Дашбордыежедневные решения по метрикам
  • Self-serviceконструктор ad-hoc отчётов
  • ML-моделипрогноз продаж и закупок
  • AI-аналитикДанные, метрики и выводы – в одном диалоге
Семантический слой

Метрики и измерения на языке бизнеса: выручка, маржа, канал, категория. Дашборды и модели обращаются сюда, а не к таблицам источников, – поэтому определение метрики одно на всех.

Core слой

Ядро хранилища: данные приведены к общим справочникам, связаны между собой и хранят историю изменений. Здесь и появляется единая версия правды.

Staging слой

Сырые данные как есть из источников, без правок. Нужен, чтобы перезапустить расчёт и увидеть, что именно прислала система, когда цифры разошлись.

Источники данных
  • Учётная / ERP системапродажи, производство, склад, персонал, финансы
  • CRMклиенты, сделки, воронка продаж
  • Операционные системыMES, WMS, TMS, биллинг, заявки в сервис
  • Сайт и приложениетрафик, поведение, онлайн-заказы
  • Реклама и маркетингкабинеты площадок, расходы и охваты
  • Внешние каналы и партнёрымаркетплейсы, дистрибьюторы, сети, франчайзи
  • Обратная связьотзывы, опросы, обращения в поддержку
  • Планы и справочникибюджеты, нормативы, ручные таблицы
Набор источников у каждой компании свой – постоянны только слои и порядок, в котором они собираются.

Как устроена система

Разным вопросам нужна разная глубина: где-то хватает одного взгляда, где-то нужен разбор на полчаса, а где-то система должна дать сигнал. Отсюда четыре типа экранов.

  1. 01Обзоробзорные дашборды

    Ключевые метрики компании или направления на одном экране. Отвечают на вопрос «идём ли по плану» за несколько секунд, без погружения в детали. С них начинается любой разбор: видно отклонение – спускаемся уровнем ниже.

  2. 02Объекты управлениялонгриды с деталями

    Разбор по направлению, каналу, категории или клиенту – длинная страница, где показатели и разрезы идут в логике вопроса. Здесь видно, из чего сложилось отклонение с обзорного экрана.

  3. 03Алертысистема настраиваемых уведомлений

    Пороги задаёт сам пользователь, система следит за ними и присылает уведомление, когда метрика вышла за границы, – в почту, мессенджер или бота. Отклонение находит система, а не пользователь, вовремя открывший нужный экран.

  4. 04Self-serviceконструктор сводных таблиц

    Аналитик или руководитель собирает нужный отчёт сам: выбирает метрики, измерения и период. Готовый срез выгружается в Excel структурированной или плоской таблицей – с формулами расчёта.

Пример реализации

Четыре типа экранов на примере системы аналитики продаж омниканального FMCG-производителя

Ключевые метрики отдела продаж на одном экране: план-факт, алерты, динамики новинок, заказы и уровень сервиса и т.д.

Монитор

Показателибез НДСс НДСМарт 2026vsМарт 2025
КатегорияБрендЛинейкаSKUМенеджер+1 ещё+2 ещё
Сбросить
26% периода (8/31 дн.)Актуальность данных:Sell-in: 30.03.2026Sell-through: 30.03.2026Sell-out: 16.03.2026, лаг – 14 днейПокрытие sell-in: 80%
Выручка (sell-in)
1 064М ₽/ 1 270М ₽
+4,5%
Объём продаж
3М ед./ 2М ед.
+5,8%
Коммерческая прибыль
548М ₽/ 640М ₽54,5% / 56,0%
+3,2%
Дебиторская задолженность
170М ₽
−3,2%
25% просрочено
SI/SO
1,35x
−1,5%
Активные ТТ
2 375ед.
+3,2%
Off-take/SKU
18,5ед./ТТ
+6,2%
Управленческий P&L
Учитывать заказыДаНетПоказывать рентаб.ДаНет
ПоказательПрошл.ПланФактΔ пр.Δ %Δ план.% вып.
Объём продаж2,76М ед.2,30М ед.2,76М ед. ед.0,0%+460к ед.120,0%
Выручка до промо980М ₽1 120М ₽1 064М ₽+84М ₽+8,6%−56М ₽95,0%
Промо и EDLP42М ₽48М ₽46М ₽+4М ₽+8,6%−2М ₽95,0%
Выручка938М ₽1 072М ₽1 018М ₽+80М ₽+8,6%−54М ₽95,0%
Торговые расходы84М ₽92М ₽88М ₽+4М ₽+5,0%−4М ₽95,9%
Net выручка854М ₽980М ₽930М ₽+76М ₽+8,9%−50М ₽94,9%
Себестоимость520М ₽580М ₽554М ₽+34М ₽+6,5%−26М ₽95,5%
Валовая прибыль334М ₽400М ₽376М ₽+42М ₽+12,6%−24М ₽94,0%
Коммерческая прибыль245М ₽310М ₽290М ₽+45М ₽+18,4%−20М ₽93,5%
Детализация по выручке
ПоказательПрошл.ПланФактΔ пр.Δ %Δ план.% вып.
Сети580М ₽700М ₽664М ₽+84М ₽+14,5%−36М ₽94,9%
Дистрибьюторы280М ₽340М ₽318М ₽+38М ₽+13,6%−22М ₽93,5%
Ecom128М ₽182М ₽163М ₽+35М ₽+27,3%−19М ₽89,6%
Прочие30М ₽32М ₽35М ₽+5М ₽+16,7%+3М ₽109,4%
Итого1 018М ₽1 254М ₽1 180М ₽+162М ₽+15,9%−74М ₽94,1%
Заказы и уровень сервиса
ЗаказыСервис
Получено132М ₽
Выполнено29,0М ₽
Отменено5,3М ₽
В пути23,8М ₽
В работеВ путиВыполненоОтменено
Заказ(10)Сумма
«ОптТорг» · #4850 · 18 SKUОтгружен · без нарушений4,5М ₽
ТД «Мегаполис» · #4855 · 9 SKUОтгружен · с нарушениями3,8М ₽
ТД «Градиент» · #4840 · 15 SKUНа исполнении3,2М ₽
ТД «Мегаполис» · #4821 · 12 SKUОтгружен · с нарушениями2,4М ₽
ТД «Градиент» · #4852 · 10 SKUВ пути2,1М ₽
«Уральский дом» · #4843 · 6 SKUОтгружен · с нарушениями1,8М ₽
«Континент» · #4858 · 7 SKUНа исполнении1,5М ₽
«Сибирский альянс» · #4835 · 8 SKUВ пути · без нарушений1,1М ₽
«Восток-Сервис» · #4860 · 5 SKUОтгружен · без нарушений0,9М ₽
«Регион-Трейд» · #4847 · 4 SKUГотов к отгрузке0,7М ₽
Промо
АктивныеВсе
Объём
20,5М
Скидка
25,0%
Ср. период
14дн.
ТМА(8)ОбъёмT %SO
ТД «Мегаполис» · Красное&БелоеСкидка25,0%Отгр. 12–26 мар · Промо 15–28 марТМА-1204 · 12 SKU4,2М ₽85%78%
ТД «Градиент» · МонеткаСкидка20,0%Отгр. 08–21 мар · Промо 10–23 марТМА-1198 · 8 SKU3,8М ₽100%82%
«Регион-Трейд»Скидка25,0%Отгр. 10–23 мар · Промо 12–25 марТМА-1201 · 7 SKU3,4М ₽92%68%
«Сибирский альянс» · Мария-РаСкидка15,0%Отгр. 20 мар–2 апр · Промо 22 мар–4 апрТМА-1218 · 6 SKU2,8М ₽38%70%
ТД «Мегаполис» · Светофор1+150,0%Отгр. 16–29 мар · Промо 18–31 марТМА-1210 · 5 SKU2,1М ₽69%55%
ТД «Мегаполис» · БристольЖёлтый ценник20,0%Отгр. 27 фев–12 мар · Промо 01–14 марТМА-1185 · 10 SKU1,9М ₽100%42%
«Уральский дом»планСкидка30,0%Отгр. 18–31 мар · Промо 20 мар–2 апрТМА-1215 · 3 SKU1,5М ₽46%
«Континент» · МетроСкидка20,0%Отгр. 16–29 мар · Промо 18–31 марТМА-1212 · 4 SKU0,8М ₽69%28%
Дебиторская задолженность
ДистрибьюторСуммаΔ прошл.1–15 дн.15–30 дн.30–40 дн.>40 дн.
ТД «Мегаполис»48М ₽↓ 5%14М ₽16М ₽11М ₽7М ₽
ТД «Градиент»38М ₽↑ 4%11М ₽12М ₽9М ₽6М ₽
«Сибирский альянс»30М ₽↓ 10%9М ₽10М ₽7М ₽4М ₽
«Уральский дом»22М ₽↑ 6%6М ₽7М ₽5М ₽4М ₽
«Регион-Трейд»16М ₽↓ 3%5М ₽5М ₽4М ₽2М ₽
«ОптТорг»12М ₽↑ 2%4М ₽4М ₽3М ₽1М ₽
«Континент»9М ₽↓ 1%3М ₽3М ₽2М ₽1М ₽
«Восток-Сервис»6М ₽↑ 8%2М ₽2М ₽1М ₽1М ₽
KZ «Алма-Трейд»5М ₽↓ 2%2М ₽1М ₽1М ₽1М ₽
BY «БелДистр»4М ₽↑ 1%1М ₽1М ₽1М ₽1М ₽
Итого190М ₽↑ 0%57М ₽61М ₽44М ₽28М ₽
Активные алерты
Критический5
Предупреждения5
Информационный4
АлертГруппаПосл.
Падение sell-out WBCoolJet Cola 1.5л · −22% WoW, без промоМаркетплейсы12.05
SO = 0 в сетиAqua Plus 0.5л б/газ · ТД «Градиент» · 5 днейДистрибьюторы12.05
Маржинальность ниже планаЭнергетики · −6,1% к плану MTDФинансовые12.05
Рост возвратов по дистрибьютору«ОптТорг» · +2,3σ за 14 днейДистрибьюторы11.05
Падение sell-out WBTea Time Лимон 0.5л · −18% WoWМаркетплейсы11.05
Падение SO в сетиBoost! Energy Tropic 0.5л · ТД «Мегаполис» · −34%Дистрибьюторы12.05
Рост возвратов по дистрибьютору«Регион-Трейд» · +1,8σ за 14 днейДистрибьюторы11.05
OOS в дарксторахТоп-50 SKU · доступность 78%Офлайн / DS11.05
Падение sell-out OzonEco Green Sparkling 0.5л · −15% WoWМаркетплейсы11.05
SKU без движения 14 днейVita Sun Апельсин 0.5л · «Континент»Офлайн / DS10.05
Остатки на РЦ выше нормыЛимонады · оборот 47 днейДистрибьюторы12.05
Аномальный всплеск заказов OzonVita Sun Гранат 0.5л · +3,1σ за 30 днейМаркетплейсы10.05
SKU без движения 14 днейTea Time Персик 1л · «Восток-Сервис»Офлайн / DS09.05
Аномальный всплеск заказов OzonBoost! Energy 0.5л · +2,7σ за 30 днейМаркетплейсы08.05
Новинки
Кол-во
10SKU
Off-take
↑ 5↓ 5
Ср. off-take
15,2ед./ТТ
+15,5%
DP
8 420ед.
+500 ед.
SKUDPOff-take
CoolJet Cola Zero 0.5л82 дн. · 3 дистрибьютора1 240ед.+500 ед.18,5ед./ТТ+12,3%
Vita Sun Мульти 0.5л65 дн. · 4 дистрибьютора1 850ед.+320 ед.22,1ед./ТТ+8,7%
Aqua Plus Mint 0.5л56 дн. · 3 дистрибьютора1 420ед.+210 ед.16,8ед./ТТ+6,2%
Eco Green Lime 0.5л52 дн. · 2 дистрибьютора1 180ед.+180 ед.14,2ед./ТТ+4,8%
Крем для рук Silk 75мл45 дн. · 2 дистрибьютора620ед.−40 ед.8,4ед./ТТ−2,1%
Vita Sun Гранат 0.5л38 дн. · 4 дистрибьютора1 640ед.+420 ед.19,4ед./ТТ+9,6%
Boost! Energy Sport 0.5л34 дн. · 3 дистрибьютора1 380ед.+290 ед.17,2ед./ТТ+7,4%
Boost! Energy Zero 0.5л30 дн. · 5 дистрибьюторов2 100ед.+870 ед.28,3ед./ТТ+15,5%
CoolJet Лайм 0.5л28 дн. · 3 дистрибьютора980ед.+310 ед.12,6ед./ТТ+5,8%
Vita Sun Виноград 0.5л24 дн. · 2 дистрибьютора740ед.+95 ед.9,8ед./ТТ+2,4%
Tea Time Холодный лимон 0.5л20 дн. · 2 дистрибьютора480ед.−15 ед.5,2ед./ТТ−0,8%
Aqua Plus 1.5л (б/газ)16 дн. · 4 дистрибьютора1 820ед.+540 ед.21,6ед./ТТ+11,4%
Tea Time Имбирь 0.5л12 дн. · 2 дистрибьютора540ед.+110 ед.7,4ед./ТТ+2,8%
Eco Green Premium 0.5л9 дн. · 3 дистрибьютора860ед.+230 ед.11,2ед./ТТ+4,6%
Операционные метрики ритейл и дарксторы
Sell-in / Sell-outВыручкаОбъёмПоказывать измененияДаНет
Тип ТТSell-inSell-outSI/SOАктив. ТТГлубинаOff-take/SKUСр. цена
Магазины у дома380М ₽280М ₽1,361 250ед.9,2ед./ТТ28ед./ТТ398 ₽
Супермаркеты290М ₽220М ₽1,32420ед.8,7ед./ТТ22ед./ТТ412 ₽
Гипермаркеты180М ₽142М ₽1,2785ед.7,8ед./ТТ18ед./ТТ445 ₽
Специалисты68М ₽50М ₽1,36190ед.8,1ед./ТТ15ед./ТТ362 ₽
Дарксторы52М ₽45М ₽1,1665ед.5,4ед./ТТ10ед./ТТ385 ₽
Традиц. розница45М ₽35М ₽1,29320ед.6,8ед./ТТ14ед./ТТ348 ₽
Мини-маркеты35М ₽24М ₽1,46210ед.7,5ед./ТТ16ед./ТТ356 ₽
Итого1 050М ₽796М ₽1,322 540ед.7,6ед./ТТ18ед./ТТ387 ₽
Голос покупателя
CCI
25,2
+3,1%
Средний рейтинг
4,5
+0,2%
Отзывов
1 248шт.
+12,5%
Структура оценок за период
5★58%4★24%3★9%2★5%1★4%
ЛидерАутсайдер
CCIИзм
CoolJet Cola Zero 0.5л62,8+8,4%
Tea Time Лимон 0.5л54,1+5,2%
Boost! Energy Tropic 0.5л48,3+3,1%

На чём это работает

Ядро одно во всех проектах – аналитическое хранилище в ClickHouse, Python на загрузке данных, Cube в семантическом слое, React в интерфейсе

Интерфейсто, с чем работает пользователь
React

Всё, с чем взаимодействует пользователь: таблицы, графики, фильтры, формы ввода. Состав экрана определяет задача, которую на нём решают: от набора показателей до глубины разбора.

ECharts

Сложные визуализации: waterfall-диаграммы, комбинированные оси, карты.

Семантический слойпоказатели и доступ к ним
Cube

Определение показателя записано один раз, и одно и то же число получают дашборд, конструктор отчётов и выгрузка в Excel. Это техническая форма дерева метрик: у выручки одна формула на всю систему, а не своя в каждом отчёте.

FastAPI

Интерфейс обращается к данным только через неё: авторизация, права на строки – кто какие подразделения и регионы видит, – журнал запросов. Здесь же выполняются задачи по расписанию: расчёт прогноза, проверка правил, рассылка алертов.

Хранилище данныхгде хранятся данные
ClickHouse

Считает агрегаты по десяткам миллионов строк меньше чем за секунду – от этого зависит, открывается экран сразу или с ожиданием. Все слои хранилища лежат в нём же, поэтому любое число на дашборде прослеживается до строки источника.

PostgreSQL

Данные самой системы: пользователи и права, настройки алертов, планы и комментарии, которые вводят руками. Аналитическая база для частых точечных изменений не подходит, поэтому баз две и у каждой своя задача.

Загрузка данныхкак данные попадают в хранилище
Python

Интеграции с источниками: учётная система, CRM, маркетплейсы, внешние сервисы. У каждого свой формат, своя авторизация и свои причины отказа – готовым коннектором такое не закрывается, поэтому загрузка пишется кодом.

Dagster / Airflow

Управляет загрузкой: в каком порядке идут шаги, когда они запускаются и что делать, если источник не ответил. Сбой при этом виден сразу, а не обнаруживается по неверному числу на дашборде. Инструмент берём по контуру заказчика: где Airflow уже работает, переводить на него регламенты незачем.

Почему мы не используем BI-конструкторы

  1. 01
    Экран должен собираться под задачу, а не из готовых блоков конструктора

    Настройка алерта с проверкой правила на истории, сборка среза самим пользователем, разбор одного объекта управления длинной страницей сверху вниз – такие экраны в конструкторе либо дописываются кодом внутри чужой оболочки, где отладка дороже собственной разработки, либо не собираются вовсе.

  2. 02
    Система должна не только показывать данные, но и принимать их

    Планы и бюджеты, комментарии к отклонениям, разметка проблемных позиций, пороги алертов – всё это записывается обратно в базу. Конструктор работает только на чтение, и ввод приходится добавлять отдельной системой.

  3. 03
    Платформа остаётся чужой, а лицензия растёт с числом пользователей

    Поставщик может уйти с рынка или изменить условия. Лицензии при этом считаются по числу пользователей, и решение «дать доступ ещё пятнадцати менеджерам» увеличивает ежемесячные затраты. У инструментов с открытым исходным кодом на серверах клиента таких ограничений нет: пользователей может быть сколько угодно, а система остаётся у клиента вместе с кодом.

Как мы работаем

От первой встречи до работающей системы

  1. 01
    Экспресс-диагностика

    Уточняем задачи, фиксируем ключевые метрики и приоритеты, обсуждаем ограничения. Формируем рамочный план проекта и ориентировочную смету – готовое ТЗ не требуется.

  2. 02
    Методология и бизнес-логика

    Проектируем дерево метрик и определяем, какие управленческие решения должна поддерживать система.

  3. 03
    Проектирование

    Определяем источники данных, архитектуру хранилища, продумываем сценарии работы сервиса, согласуем макеты дашбордов и интерфейсов.

  4. 04
    Разработка

    Настраиваем интеграции, собираем хранилище, дашборды и сам сервис, проверяем качество и полноту данных.

  5. 05
    Внедрение и развитие

    Обучаем команду, сопровождаем систему и развиваем её вместе с бизнесом.