Барбершоп на 4 мастера принимал записи вручную: звонки, личка в Telegram, тетрадь у администратора. Из-за этого 15–20% слотов пропадали (клиент забыл, администратор не перезвонил, двойная запись на одно время), а предоплату взять было негде — клиенты не приходили без последствий.
Задача: сделать бота, в котором клиент сам выбирает мастера, услугу и время, оплачивает и получает напоминание, а владелец видит расписание и выручку без администратора. Дополнительно — работа одновременно в Telegram и MAX, потому что часть клиентов уже переходила во второй мессенджер.
Ограничения: — один рабочий график на двух каналах, без двойных броней; — оплата: ЮKassa (карта/СБП) и Telegram Stars, с возвратом при отмене; — мастера меняют график сами, без программиста; — запуск на VPS заказчика за 500 ₽/мес, без облачных сервисов.
Архитектура: один backend на Node.js/TypeScript (Fastify), два тонких адаптера каналов — grammY для Telegram и @maxhub/max-bot-api для MAX. Вся бизнес-логика (слоты, брони, оплата) лежит в одном сервисном слое, адаптеры только переводят сообщения и кнопки. Добавление третьего канала — один адаптер, а не новый бот.
Что сделано:
Каталог услуг и мастеров с ценами и длительностью; фото и описание — из админки.
Календарь слотов: расчёт свободного времени из графика мастера, длительности услуги и существующих броней. Бронь держится 10 минут до оплаты (Redis TTL), потом слот освобождается — двойных записей нет даже при одновременном выборе из двух каналов.
Оплата: ЮKassa (карта, СБП) и Telegram Stars. Вебхуки идемпотентны, статус платежа виден клиенту в боте. Отмена за 3+ часа — автоматический возврат.
Напоминания: за 24 часа и за 2 часа, с кнопками «Подтвердить» / «Перенести» / «Отменить». Очередь на BullMQ, повторная отправка при сбое.
Панель администратора внутри бота: расписание на день/неделю, список записей, выручка, блокировка слотов (отпуск, обед), редактирование услуг и цен.
Личный кабинет клиента: мои записи, история, повторить прошлую запись в два клика.
Выгрузка записей и оплат в Google Sheets для бухгалтерии.
Хранение: PostgreSQL через Prisma — клиенты, мастера, услуги, брони, платежи; анкета не сбрасывается при перезапуске бота.
Развёртывание: Docker Compose (бот, PostgreSQL, Redis), один .env, README для владельца. Логи и алерты об ошибках владельцу в Telegram.
Стек: TypeScript, Node.js, Fastify, grammY, @maxhub/max-bot-api, PostgreSQL, Prisma, Redis, BullMQ, ЮKassa API, Telegram Stars, Google Sheets API, Docker.
Срок: 3 недели от ТЗ до запуска, промежуточные демо каждые 3–4 дня.
Запись работает 24/7 без администратора; ~70% записей клиенты делают сами через бота уже в первый месяц. — Неявки снизились с ~18% до ~5% за счёт предоплаты и напоминаний с подтверждением. — Двойные брони исчезли полностью — один источник расписания на оба канала. — Владелец видит загрузку мастеров и выручку за день в боте, а не собирает вручную. — Второй канал (MAX) запущен за 2 дня поверх готовой логики, без переписывания. — Заказчик получил исходный код, инструкцию и месяц поддержки; тексты, услуги и цены меняет сам.
Что поправить перед публикацией: число мастеров, реальные проценты неявок/самозаписи, срок разработки. Если проект пет-проект, а не заказной — в «Описании» замените «Барбершоп на 4 мастера принимал…» на «Типовая боль барбершопов: …» и уберите цифры результата, оставив функциональные пункты, иначе на созвоне это всплывёт.