Админка, которая ведёт автошколу без таблиц
Обучающую платформу с тысячами пользователей, двуязычным контентом, AI-разговорами, платежами и промокампаниями нельзя поддерживать через SQL-запросы и сообщения разработчикам в Telegram. Клиенту нужна была настоящая админ-панель — не обобщённый CRUD-интерфейс, а операционный центр, где команда управляет контентом, мониторит пользователей, анализирует выручку и запускает маркетинговые кампании, не касаясь кода. Мы построили полноценную CMS и админ-дашборд, покрывающие каждую операционную поверхность платформы.
профили пользователей и наблюдаемость AI
Раздел управления пользователями глубже большинства админок. Поиск по имени, телефону или Telegram ID открывает подробный профиль: учебная статистика (отвеченные вопросы, точность по темам, история симуляций экзамена), полная история платежей с таймлайном статуса подписки, логи AI-чата (что спрашивали, что отвечал ассистент, какие инструменты были вызваны), и полный журнал активности. Просмотрщик AI-чатов попросили специально после того, как клиент заметил, что пользователи периодически жалуются на неверные AI-ответы — наличие полного разговора с трассировкой вызовов инструментов позволяет команде проверить, что именно произошло и где была проблема: в промпте, в ответе инструмента или в интерпретации модели. По сути, это observability-дашборд по пути каждого отдельного пользователя через платформу.
контент на трёх поверхностях
Управление контентом покрывает три крупные области: банк вопросов, каталог ПДД и базу дорожных знаков. Редактирование вопросов поддерживает полный CRUD с загрузкой медиа — некоторые вопросы включают изображения дорожных ситуаций, иногда короткие видеоклипы. Пайплайн загрузки валидирует размер и формат файла на клиенте, затем выполняет серверную обработку: изображения ресайзятся к стандартным размерам, видео проверяется на совместимость кодеков. Редактор ПДД работает с иерархической структурой глав и пунктов, сохраняя перекрёстные ссылки и обрабатывая двуязычный контент через workflow статусов перевода. Управление дорожными знаками включает загрузку изображений с автоматической генерацией превью и присвоением категорий. Все три области поддерживают черновики и опубликованные состояния, чтобы редакторы могли готовить обновления, не выкатывая их пользователям сразу.
аналитика, на которой принимаются решения
Аналитический дашборд построен на Recharts и тянет данные из предагрегированных таблиц, обновляющихся по расписанию, а не из тяжёлых запросов на каждую загрузку страницы. Он покрывает метрики, на которых клиент реально принимает решения: дневные активные пользователи, конверсия в подписку, выручка по периодам, чаще всего проваливаемые вопросы (это указывает либо на плохие вопросы, либо на плохо объяснённые правила), использование и стоимость AI-консультанта, когортное удержание пользователей. Раздел статистики платежей показывает отдельные транзакции с фильтрами по статусу, диапазону дат и тиру подписки — необходимо для разбора жалоб пользователей «я заплатил, но доступа не получил», которые неизбежно возникают в любой платёжной системе.
рассылки, промокоды и rate limits
Рассылки и система промокодов закрывают маркетинговую сторону. Рассылки позволяют команде слать сообщения всем пользователям или отфильтрованным сегментам (активные подписчики, истёкшие, не открывавшие приложение 7 дней) через Telegram-бот. Критическое ограничение — это rate limiting Telegram: отправка сообщений 10 000+ пользователям залпом приведёт к временной блокировке бота. Мы реализовали систему очереди рассылок: сообщения отправляются батчами с настраиваемыми задержками между ними, с отслеживанием прогресса в реальном времени в админке — сколько отправлено, доставлено, не дошло. Система промокодов поддерживает процентные и фиксированные скидки, лимиты использования (общие и на пользователя) и сроки действия. Каждый промокод отслеживает погашения с атрибуцией к пользователю, чтобы маркетинг мог измерить, какие каналы реально дают конверсию.
стек, скорость и уроки
Фронтенд построен на Next.js 16 с React 19, использует Radix UI для доступных и компонуемых компонентов, и Tailwind 4 для стилей. Аутентификация — через JWT-токены с паролями, захешированными bcrypt — админ-панель отдельная от пользовательского Telegram-приложения система, со своим auth-флоу и ролевыми правами. Загрузка файлов — через python-multipart на бэкенде со стримингом, чтобы не упереться в память на крупных медиа. Самым сложным с точки зрения производительности оказалась агрегация учебной статистики: показ таблицы всех пользователей, отсортированных по активности или точности, требует джойнов по нескольким большим таблицам. Мы решили это материализованными summary-строками, обновляемыми асинхронно, поэтому админ-панель всегда грузится быстро, даже когда база пользователей растёт.
Вывод из этой панели: админ-интерфейс полезен ровно настолько, насколько решения, которые он позволяет принимать. Ранние версии содержали каждый показатель, который мы могли вывести, и команда клиента игнорировала большую часть. Дашборд стал по-настоящему ценным только после того, как мы сели с операционной командой и спросили: «На что вы реально смотрите каждое утро?» — и затем выстроили вокруг этих пяти-шести метрик. Рассылки, просмотрщик AI-чатов и отчёт по проваливаемым вопросам используются ежедневно. Половина остальных экранов — раз в месяц. Понимание разницы до постройки сэкономило бы целый спринт.