Заказчик - производство изделий из акрила и оргстекла на заказ (Москва). До бота заявки приходили вразнобой: звонки, почта, мессенджеры. Клиенты присылали чертежи как получится, менеджеры теряли файлы и переспрашивали контакты.
Нужен был единый вход: чат-бот в мессенджере MAX, который собирает всё нужное в одном диалоге и передаёт готовую заявку менеджерам. Отдельное требование заказчика: бот не консультирует по технике. Материалы, размеры, конструктив, цены - всегда «этот вопрос уточнит менеджер». Задача бота - дать первый ответ, собрать контакты и файлы и передать человеку, а не изображать эксперта.
Плюс рабочее место для менеджеров: видеть заявки, брать их в работу, менять статус, править тексты бота без разработчика. Срок: от заказа до работы в бою - полторы недели.
Сделал бота, чат менеджеров и админ-панель как один продукт на Node.js и TypeScript: сервер на NestJS с Prisma и SQLite, панель на React (Vite, Ant Design).
Бот: три сценария кнопками в меню.
- Заявка на расчёт: пять вопросов по одному (телефон, почта, город и адрес доставки, имя и компания, описание задачи), необязательные пропускаются кнопкой. Затем приём файлов: чертежи, 3D-модели, фото, документы - до 10 файлов по 20 МБ. Шаг согласия на обработку персональных данных, и только после него создаётся заявка с номером.
- Срочный вопрос: укороченный сценарий на три шага (суть, телефон, имя), чтобы быстрее свести человека с живым менеджером. Кнопка выключается из панели, когда менеджеры перегружены.
- Статус заказа: клиент вводит номер заявки или почту, бот находит обращение и уведомляет менеджера.
Бот знает рабочие часы (9:00-18:00, пн-пт, Москва) и в нерабочее время честно предупреждает, когда ответят.
Работа менеджеров. Готовая заявка уходит в групповой чат карточкой: контакты, задача, список файлов, кнопка «Взять в работу». Кто первый нажал, тот и ведёт клиента: карточка перерисовывается и показывает исполнителя, менеджер заводится в системе автоматически при первом нажатии. Файлы клиента приходят в тот же чат вложениями. Если заявку никто не взял, бот напоминает с нарастающим интервалом.
Админ-панель: список заявок с поиском по номеру, имени, телефону, почте и компании, фильтры по статусу и типу, пометка «пришла в нерабочее время»; карточка заявки с правкой контактов, историей изменений, примечаниями и скачиванием файлов; статусы (новая, взята в работу, идёт расчёт, закрыта, отменена); выгрузка в Excel; удаление с подтверждением и счётчик занятого места; переключатели «сегодня работаем» и «приём срочных вопросов». Редактор текстов бота: 19 фраз (приветствие, вопросы, подсказки, подтверждения, отказы) заказчик правит сам, бот говорит по-новому сразу, без перезапуска.
Технически интересное.
- MAX Bot API - новая платформа с сырой документацией, каждое утверждение проверял на живом API: токен без префикса Bearer, строковые идентификаторы сообщений, отрицательный ID группового чата, который узнаётся только из события, клавиатура вложением, ответ на кнопку без пустого тела.
- API мессенджера отдаёт сертификат российского удостоверяющего центра, которого нет в стандартных хранилищах доверия. Корневой сертификат добавлен в систему явно, проверка не отключалась: через это соединение идут токен и персональные данные.
- Загрузка файлов в мессенджер в два шага, вложение «дозревает» на их стороне, отправка повторяется с нарастающей задержкой.
- Два транспорта за одним интерфейсом: webhook и long polling переключаются одной строкой, остальной код о транспорте не знает. Перенос бота в другой мессенджер - новый транспортный слой, а не новый проект.
- Очередь событий по пользователям: сообщения одного человека обрабатываются строго по порядку, разные люди друг друга не ждут.
- Форма задаётся конфигом, а не кодом: заказчик менял состав полей пять раз за две недели, каждый раз это правка нескольких строк. Тест следит, чтобы новое поле нельзя было завести без отображения в карточке менеджера и в выгрузке.
- 152-ФЗ: явный шаг согласия, база на сервере в России, файлы под обезличенными именами, отдача только вложением с запретом угадывания типа, написана политика обработки персональных данных.
Инфраструктура: Ubuntu на VDS в Москве, systemd с автоперезапуском, nginx, Let's Encrypt, ufw; у технического домена бота наружу один путь приёма событий, остальное отдаёт 404. С сервера заказчика недоступны GitHub и стандартный реестр пакетов: выкладка синхронизацией с машины разработчика, зависимости с зеркала, сертификат по DNS-подтверждению.
Заявки идут одним потоком: клиент в MAX за пять вопросов оставляет контакты и чертежи, менеджеры получают готовую карточку в чат и забирают её одной кнопкой, ничего не теряется и не переспрашивается. Бот в бою у заказчика с 8 августа 2026, от заказа до запуска - полторы недели.
Цифры: 3 900 строк на сервере и 900 в панели без учёта тестов, 17 модулей, 8 таблиц в базе, 52 автоматических теста, которые проходят без доступа к мессенджеру, 19 фраз бота, редактируемых заказчиком без разработчика.
Что дальше: этот же бот переносится в Telegram. Код общий, база и панель одни, заявки из обоих мессенджеров лягут в один список.
Ссылка на бота публичная и согласована с заказчиком. Скриншоты в портфолио сделаны на тестовой базе с выдуманными данными.