? Привет, Хабр. Я продукт-менеджер в achiewin com — мы развиваем платформу для спортивных ставок, и одна из ключевых фич, которую мы проектировали в прошлом квартале, — дашборд анализа коэффициентов.
Выглядело просто: взять наши данные, обернуть в фильтры, показать графики — и вот тебе аналитика. На деле — всё пошло не так. Рассказываю, как мы завалили первую версию, что пришлось переписывать, и почему «простой интерфейс» сложнее, чем кажется.
Что мы хотели сделать
Наша гипотеза: пользователи хотят анализировать движение коэффициентов по разным исходам и видеть, где происходит что-то аномальное — перекосы линии, резкие падения, всплески объема.
Бэк у нас уже был: данные агрегируются с более чем 15 букмекеров и пишутся в ClickHouse с шагом в 15 секунд.
Основные требования:
выбрать событие (матч, лига, турнир),
отфильтровать по типу ставки (тоталы, форы, победа),
увидеть, как менялся коэффициент по времени,
найти всплески/сдвиги в линии по группам БК,
желательно — удобно, быстро, и чтобы не лагало.
Первая версия: BI-ада
Собрали прототип на Vue 3 + Ant Design. С бэка через GraphQL прилетали агрегаты по коэффициентам, плюс метаданные с Redis (чтобы быстрее грузилось). Фильтров было 17. Таблицы — с построчной детализацией. Можно было выбрать таймфрейм, шаг агрегации, БК и вид спорта. Вот кусок схемы запроса к ClickHouse через GraphQL:
SELECT
match_id,
bookmaker,
market,
odds,
timestamp
FROM odds_history
WHERE sport = 'football'
AND market = 'totals'
AND timestamp BETWEEN {start} AND {end}
ORDER BY timestamp
Интерфейс работал... но пользователи не понимали, что с этим делать.
Из фидбека:
"Слишком много всего"
"Где тут посмотреть движение?"
"Почему это график, а не список?"
"А почему на мобиле ничего не видно?"
Метрики:
Среднее время на странице: 23 сек
CTR на графики: <8%
Возвраты — почти ноль
Вывод: мы сделали интерфейс для себя, а не для пользователя. Типичная ошибка «через боль».
Где была ошибка
Перегрузка интерфейса. Фильтры друг друга исключали, логика была неочевидной.
Нет явного сценария. UX-поток не вел к цели — нельзя было быстро понять, «где сейчас что-то происходит».
Форма победила функцию. Визуально всё выглядело «сложно» — как дешёвый BI.
После серии юзабилити-интервью (6 респондентов, в том числе профи с опытом ставок) мы пришли к выводу: большинство не хочет строить срезы — им нужно уведомление о событиях. Пример: «коэффициент на ТМ 2.5 упал с 2.20 до 1.85 за 7 минут».
Вторая версия: от аналитики к сигналам
Что сделали:
Убрали большую часть фильтров
Добавили карточки-сигналы, которые формируются в real-time
Графики оставили только при клике
Десктоп и мобайл — разные подходы: для мобилки сделали упрощенный фид
Архитектура:
ClickHouse — основное хранилище истории коэффициентов (около 5 млн строк в сутки).
Redis — слой агрегации и предвычисления для быстрой отдачи "сигналов".
-
Kafka — события движения коэффициента проходят через парсер и попадают в топики:
odds_update
signal_candidate
Worker (Go) — подписан на Kafka, ищет шаблоны движения (например, падение >10% за <5 минут).
GraphQL API — отдает только сигналы, по фильтрам: спорт, тип ставки, дата.
{
"signal": {
"type": "drop",
"market": "total_under_2.5",
"from": 2.20,
"to": 1.85,
"interval": "7m",
"bookmakers": ["Bk1", "Bk2", "Bk3"]
}
}
Фронт:
Vue 3 + Vite
Lazy load компонентов карточек
Рендер графика только по клику (ECharts)
Caching сигнальных данных в браузере (localStorage) для мобилок
Что вышло
Время на странице: 2 мин 46 сек
Конверсия на просмотр графика: +215%
Переходы на событие с сигнала: +300%
Фидбек от саппорта: «Появилось ощущение, что нас понимают»
Что не успели
Пока не реализовали группировку сигналов по турнирам
Нет алертов — только ручной просмотр
Нет возможности «собрать свою стратегию» по сигналам (это в бэклоге)
Выводы
Интерфейс — не аналитика. Пользователь приходит не за данными, а за инсайтом.
Сигналы > фильтры. Быстрое принятие решения требует простого UX.
Прототипы — обязательны. Мы бы сэкономили месяцы, если бы раньше протестировали идеи с реальными пользователями.
Real-time архитектура рулит. Kafka + ClickHouse + Redis — наша тройка победы для такого сценария.
Если интересны детали по вычислению сигналов или схема парсера линии — могу сделать отдельный пост. Пишите в комменты или в личку, рад буду пообщаться.