Всё, с чем взаимодействует пользователь: таблицы, графики, фильтры, формы ввода. Состав экрана определяет задача, которую на нём решают: от набора показателей до глубины разбора.
Разрабатываем системы бизнес-аналитики (BI)
Объединяем данные из разных источников в целостную систему и превращаем её в сервисы, которые сокращают ручной труд и повышают эффективность управления бизнесом
С чего начинается система
Мы всегда начинаем с дерева метрик – модели, которая объединяет показатели бизнеса или отдельного направления причинно-следственными связями
Фундамент системы
Дерево метрик – основа модели данных: она определяет, какие источники подключать и как разложить их по слоям хранилища, чтобы у каждого показателя было одно определение, а любую цифру можно было проследить до источника
- Дашбордыежедневные решения по метрикам
- Self-serviceконструктор ad-hoc отчётов
- ML-моделипрогноз продаж и закупок
- AI-аналитикДанные, метрики и выводы – в одном диалоге
Метрики и измерения на языке бизнеса: выручка, маржа, канал, категория. Дашборды и модели обращаются сюда, а не к таблицам источников, – поэтому определение метрики одно на всех.
Ядро хранилища: данные приведены к общим справочникам, связаны между собой и хранят историю изменений. Здесь и появляется единая версия правды.
Сырые данные как есть из источников, без правок. Нужен, чтобы перезапустить расчёт и увидеть, что именно прислала система, когда цифры разошлись.
- Учётная / ERP системапродажи, производство, склад, персонал, финансы
- CRMклиенты, сделки, воронка продаж
- Операционные системыMES, WMS, TMS, биллинг, заявки в сервис
- Сайт и приложениетрафик, поведение, онлайн-заказы
- Реклама и маркетингкабинеты площадок, расходы и охваты
- Внешние каналы и партнёрымаркетплейсы, дистрибьюторы, сети, франчайзи
- Обратная связьотзывы, опросы, обращения в поддержку
- Планы и справочникибюджеты, нормативы, ручные таблицы
Как устроена система
Разным вопросам нужна разная глубина: где-то хватает одного взгляда, где-то нужен разбор на полчаса, а где-то система должна дать сигнал. Отсюда четыре типа экранов.
- 01Обзоробзорные дашборды
Ключевые метрики компании или направления на одном экране. Отвечают на вопрос «идём ли по плану» за несколько секунд, без погружения в детали. С них начинается любой разбор: видно отклонение – спускаемся уровнем ниже.
- 02Объекты управлениялонгриды с деталями
Разбор по направлению, каналу, категории или клиенту – длинная страница, где показатели и разрезы идут в логике вопроса. Здесь видно, из чего сложилось отклонение с обзорного экрана.
- 03Алертысистема настраиваемых уведомлений
Пороги задаёт сам пользователь, система следит за ними и присылает уведомление, когда метрика вышла за границы, – в почту, мессенджер или бота. Отклонение находит система, а не пользователь, вовремя открывший нужный экран.
- 04Self-serviceконструктор сводных таблиц
Аналитик или руководитель собирает нужный отчёт сам: выбирает метрики, измерения и период. Готовый срез выгружается в Excel структурированной или плоской таблицей – с формулами расчёта.
Пример реализации
Четыре типа экранов на примере системы аналитики продаж омниканального FMCG-производителя
Ключевые метрики отдела продаж на одном экране: план-факт, алерты, динамики новинок, заказы и уровень сервиса и т.д.
Управленческий P&L
Учитывать заказыДаНетПоказывать рентаб.ДаНет| Показатель | Прошл. | План | Факт | Δ пр. | Δ % | Δ план. | % вып. |
|---|---|---|---|---|---|---|---|
| Объём продаж | 2,76М ед. | 2,30М ед. | 2,76М ед. | 0к ед. | 0,0% | +460к ед. | 120,0% |
| Выручка до промо | 980М ₽ | 1 120М ₽ | 1 064М ₽ | +84М ₽ | +8,6% | −56М ₽ | 95,0% |
| Промо и EDLP | 42М ₽ | 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% |
| Ecom | 128М ₽ | 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% |
Заказы и уровень сервиса
ЗаказыСервисПромо
АктивныеВсе| ТМА(8) | Объём | T % | SO |
|---|---|---|---|
| ТД «Мегаполис» · Красное&БелоеСкидка25,0%Отгр. 12–26 мар · Промо 15–28 марТМА-1204 · 12 SKU | 4,2М ₽ | 85% | 78% |
| ТД «Градиент» · МонеткаСкидка20,0%Отгр. 08–21 мар · Промо 10–23 марТМА-1198 · 8 SKU | 3,8М ₽ | 100% | 82% |
| «Регион-Трейд»Скидка25,0%Отгр. 10–23 мар · Промо 12–25 марТМА-1201 · 7 SKU | 3,4М ₽ | 92% | 68% |
| «Сибирский альянс» · Мария-РаСкидка15,0%Отгр. 20 мар–2 апр · Промо 22 мар–4 апрТМА-1218 · 6 SKU | 2,8М ₽ | 38% | 70% |
| ТД «Мегаполис» · Светофор1+150,0%Отгр. 16–29 мар · Промо 18–31 марТМА-1210 · 5 SKU | 2,1М ₽ | 69% | 55% |
| ТД «Мегаполис» · БристольЖёлтый ценник20,0%Отгр. 27 фев–12 мар · Промо 01–14 марТМА-1185 · 10 SKU | 1,9М ₽ | 100% | 42% |
| «Уральский дом»планСкидка30,0%Отгр. 18–31 мар · Промо 20 мар–2 апрТМА-1215 · 3 SKU | 1,5М ₽ | 46% | – |
| «Континент» · МетроСкидка20,0%Отгр. 16–29 мар · Промо 18–31 марТМА-1212 · 4 SKU | 0,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М ₽ |
Активные алерты
| Алерт | Группа | Посл. |
|---|---|---|
| Падение 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% | Офлайн / DS | 11.05 |
| Падение sell-out OzonEco Green Sparkling 0.5л · −15% WoW | Маркетплейсы | 11.05 |
| SKU без движения 14 днейVita Sun Апельсин 0.5л · «Континент» | Офлайн / DS | 10.05 |
| Остатки на РЦ выше нормыЛимонады · оборот 47 дней | Дистрибьюторы | 12.05 |
| Аномальный всплеск заказов OzonVita Sun Гранат 0.5л · +3,1σ за 30 дней | Маркетплейсы | 10.05 |
| SKU без движения 14 днейTea Time Персик 1л · «Восток-Сервис» | Офлайн / DS | 09.05 |
| Аномальный всплеск заказов OzonBoost! Energy 0.5л · +2,7σ за 30 дней | Маркетплейсы | 08.05 |
Новинки
| SKU | DP | Off-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-in | Sell-out | SI/SO | Актив. ТТ | Глубина | Off-take/SKU | Ср. цена |
|---|---|---|---|---|---|---|---|
| Магазины у дома | 380М ₽ | 280М ₽ | 1,36 | 1 250ед. | 9,2ед./ТТ | 28ед./ТТ | 398 ₽ |
| Супермаркеты | 290М ₽ | 220М ₽ | 1,32 | 420ед. | 8,7ед./ТТ | 22ед./ТТ | 412 ₽ |
| Гипермаркеты | 180М ₽ | 142М ₽ | 1,27 | 85ед. | 7,8ед./ТТ | 18ед./ТТ | 445 ₽ |
| Специалисты | 68М ₽ | 50М ₽ | 1,36 | 190ед. | 8,1ед./ТТ | 15ед./ТТ | 362 ₽ |
| Дарксторы | 52М ₽ | 45М ₽ | 1,16 | 65ед. | 5,4ед./ТТ | 10ед./ТТ | 385 ₽ |
| Традиц. розница | 45М ₽ | 35М ₽ | 1,29 | 320ед. | 6,8ед./ТТ | 14ед./ТТ | 348 ₽ |
| Мини-маркеты | 35М ₽ | 24М ₽ | 1,46 | 210ед. | 7,5ед./ТТ | 16ед./ТТ | 356 ₽ |
| Итого | 1 050М ₽ | 796М ₽ | 1,32 | 2 540ед. | 7,6ед./ТТ | 18ед./ТТ | 387 ₽ |
Голос покупателя
| 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 в интерфейсе
- Интерфейсто, с чем работает пользователь
- ReactECharts
Сложные визуализации: waterfall-диаграммы, комбинированные оси, карты.
- Семантический слойпоказатели и доступ к ним
- Cube
Определение показателя записано один раз, и одно и то же число получают дашборд, конструктор отчётов и выгрузка в Excel. Это техническая форма дерева метрик: у выручки одна формула на всю систему, а не своя в каждом отчёте.
FastAPIИнтерфейс обращается к данным только через неё: авторизация, права на строки – кто какие подразделения и регионы видит, – журнал запросов. Здесь же выполняются задачи по расписанию: расчёт прогноза, проверка правил, рассылка алертов.
- Хранилище данныхгде хранятся данные
- ClickHouse
Считает агрегаты по десяткам миллионов строк меньше чем за секунду – от этого зависит, открывается экран сразу или с ожиданием. Все слои хранилища лежат в нём же, поэтому любое число на дашборде прослеживается до строки источника.
PostgreSQLДанные самой системы: пользователи и права, настройки алертов, планы и комментарии, которые вводят руками. Аналитическая база для частых точечных изменений не подходит, поэтому баз две и у каждой своя задача.
- Загрузка данныхкак данные попадают в хранилище
- Python
Интеграции с источниками: учётная система, CRM, маркетплейсы, внешние сервисы. У каждого свой формат, своя авторизация и свои причины отказа – готовым коннектором такое не закрывается, поэтому загрузка пишется кодом.
Dagster / AirflowУправляет загрузкой: в каком порядке идут шаги, когда они запускаются и что делать, если источник не ответил. Сбой при этом виден сразу, а не обнаруживается по неверному числу на дашборде. Инструмент берём по контуру заказчика: где Airflow уже работает, переводить на него регламенты незачем.
Почему мы не используем BI-конструкторы
- 01Экран должен собираться под задачу, а не из готовых блоков конструктора
Настройка алерта с проверкой правила на истории, сборка среза самим пользователем, разбор одного объекта управления длинной страницей сверху вниз – такие экраны в конструкторе либо дописываются кодом внутри чужой оболочки, где отладка дороже собственной разработки, либо не собираются вовсе.
- 02Система должна не только показывать данные, но и принимать их
Планы и бюджеты, комментарии к отклонениям, разметка проблемных позиций, пороги алертов – всё это записывается обратно в базу. Конструктор работает только на чтение, и ввод приходится добавлять отдельной системой.
- 03Платформа остаётся чужой, а лицензия растёт с числом пользователей
Поставщик может уйти с рынка или изменить условия. Лицензии при этом считаются по числу пользователей, и решение «дать доступ ещё пятнадцати менеджерам» увеличивает ежемесячные затраты. У инструментов с открытым исходным кодом на серверах клиента таких ограничений нет: пользователей может быть сколько угодно, а система остаётся у клиента вместе с кодом.
Как мы работаем
От первой встречи до работающей системы
- 01Экспресс-диагностика
Уточняем задачи, фиксируем ключевые метрики и приоритеты, обсуждаем ограничения. Формируем рамочный план проекта и ориентировочную смету – готовое ТЗ не требуется.
- 02Методология и бизнес-логика
Проектируем дерево метрик и определяем, какие управленческие решения должна поддерживать система.
- 03Проектирование
Определяем источники данных, архитектуру хранилища, продумываем сценарии работы сервиса, согласуем макеты дашбордов и интерфейсов.
- 04Разработка
Настраиваем интеграции, собираем хранилище, дашборды и сам сервис, проверяем качество и полноту данных.
- 05Внедрение и развитие
Обучаем команду, сопровождаем систему и развиваем её вместе с бизнесом.