Telegram-бот с записью на услуги: пошаговое руководство

Запись клиентов — одна из самых востребованных функций для Telegram-ботов. Салоны красоты, медицинские клиники, автосервисы, студии йоги, барбершопы, мастера на дому — всем нужна автоматизация записи. В этой статье подробно разбираем, как устроен бот с записью на услуги: от архитектуры до конкретных технических решений.

Базовая архитектура бота для записи

Схема работы бота

Клиент → Telegram-бот → База данных (расписание) ↔ CRM (опционально)

Уведомления администратору + клиенту

Основные компоненты системы:

Шаг 1. Проектирование базы данных

База данных — сердце бота. Нужно хранить:

Таблица "Клиенты"

id | telegram_id | name | phone | email | created_at 1 | 123456789 | Иван | +79991234567 | ivan@mail.ru | 2026-01-10

Таблица "Мастера/Сотрудники"

id | name | specialization | photo_url | working_days | working_hours 1 | Анна | Маникюр | photo.jpg | 1,2,3,4,5 | 10:00-19:00

Таблица "Услуги"

id | name | duration_minutes | price | description 1 | Стрижка женская | 60 | 2500 | Стрижка + укладка

Таблица "Записи"

id | client_id | master_id | service_id | date | time | status | created_at 1 | 5 | 1 | 3 | 2026-01-15 | 14:00 | confirmed | 2026-01-10 12:30

Статусы записи: pending (ожидает), confirmed (подтверждена), completed (выполнена), cancelled (отменена)

Шаг 2. Построение диалога с клиентом

Сценарий записи через бота:

  1. Клиент нажимает «Записаться на услугу»
  2. Бот показывает список услуг (стрижка, маникюр, окрашивание...)
  3. Клиент выбирает услугу
  4. Бот показывает список мастеров, которые делают эту услугу
  5. Клиент выбирает мастера (или «Любой свободный»)
  6. Бот показывает календарь со свободными датами
  7. Клиент выбирает дату
  8. Бот показывает свободные временные слоты на эту дату
  9. Клиент выбирает время
  10. Бот запрашивает контактные данные (если клиент новый)
  11. Бот создаёт запись и отправляет подтверждение клиенту и администратору

Пример кода (упрощённо):

// Обработка выбора услуги bot.on('callback_query', async (ctx) => { const data = ctx.callbackQuery.data; if (data.startsWith('service_')) { const serviceId = data.split('_')[1]; const masters = await getMastersByService(serviceId); await ctx.reply('Выберите мастера:', { reply_markup: { inline_keyboard: masters.map(m => [{ text: m.name, callback_data: `master_${m.id}` }]) } }); } if (data.startsWith('master_')) { const masterId = data.split('_')[1]; const freeDates = await getFreeDates(masterId); await ctx.reply('Выберите дату:', { reply_markup: createCalendar(freeDates) }); } // ... и так далее });

Шаг 3. Логика календаря и свободных слотов

Самая сложная часть — определение свободных временных слотов. Нужно учитывать:

Алгоритм расчёта свободных слотов:

  1. Получить рабочие часы мастера на выбранную дату
  2. Разбить рабочий день на слоты по 30 минут (или другой интервал)
  3. Получить все существующие записи мастера на эту дату
  4. Исключить занятые слоты и перерывы
  5. Вернуть список свободных слотов
async function getFreeSlots(masterId, date, serviceDuration) { const workingHours = await getMasterWorkingHours(masterId, date); const bookings = await getBookings(masterId, date); const breaks = await getMasterBreaks(masterId, date); // Генерируем все возможные слоты const allSlots = generateTimeSlots( workingHours.start, workingHours.end, 30 // интервал 30 минут ); // Фильтруем занятые const freeSlots = allSlots.filter(slot => { return !isSlotOccupied(slot, bookings, breaks, serviceDuration); }); return freeSlots; }

Шаг 4. Система напоминаний

Напоминания критичны для снижения «не пришли». Стандартная схема: уведомление за 24 часа и за 2 часа до визита.

Реализация через cron-задачи:

// Запускается каждый час cron.schedule('0 * * * *', async () => { const now = new Date(); const in24Hours = new Date(now.getTime() + 24 * 60 * 60 * 1000); const in2Hours = new Date(now.getTime() + 2 * 60 * 60 * 1000); // Напоминания за 24 часа const bookings24h = await getBookingsForTime(in24Hours); for (const booking of bookings24h) { await sendReminder(booking, '24 hours'); } // Напоминания за 2 часа const bookings2h = await getBookingsForTime(in2Hours); for (const booking of bookings2h) { await sendReminder(booking, '2 hours'); } }); async function sendReminder(booking, type) { const message = type === '24 hours' ? `Напоминаем: завтра в ${booking.time} у вас запись на ${booking.service.name}` : `Через 2 часа у вас запись на ${booking.service.name}. Ждём вас!`; await bot.telegram.sendMessage(booking.client.telegram_id, message, { reply_markup: { inline_keyboard: [[ { text: '✅ Подтверждаю', callback_data: `confirm_${booking.id}` }, { text: '❌ Отменить', callback_data: `cancel_${booking.id}` } ]] } }); }

Шаг 5. Админ-панель для управления

Администратору нужен удобный интерфейс для управления записями. Два подхода:

1. Админ-панель в Telegram (команды бота)

2. Веб-админка (более удобно)

Отдельный веб-интерфейс, где администратор видит расписание в виде таблицы, может перетаскивать записи, редактировать, добавлять вручную. Технологии: React/Vue + API бота.

Шаг 6. Интеграция с CRM

Если у вас уже есть CRM (Yclients, amoCRM, Битрикс24), бот должен синхронизироваться с ней. Обычно через API интеграцию:

Пример интеграции с Yclients:

async function createBookingInYclients(booking) { const response = await fetch('https://api.yclients.com/v1/bookings', { method: 'POST', headers: { 'Authorization': `Bearer ${YCLIENTS_TOKEN}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ client_id: booking.client.yclients_id, staff_id: booking.master.yclients_id, service_id: booking.service.yclients_id, datetime: `${booking.date}T${booking.time}:00`, notify_by_sms: 0 // уведомления идут через бота }) }); return await response.json(); }

Шаг 7. Безопасность и 152-ФЗ

Бот собирает персональные данные (имена, телефоны, даты визитов). Обязательные меры:

Важно: Если вы обрабатываете более 1000 клиентов, формально нужно уведомить Роскомнадзор. На практике большинство компаний ограничиваются публикацией политики конфиденциальности и сбором согласий.

Сколько стоит разработка такого бота

Оценка по времени (для опытного разработчика):

Итого: 80-125 часов работы.

При средней ставке разработчика 2000-3000₽/час в Санкт-Петербурге получается 160 000 — 375 000₽. Студии обычно берут 100 000 — 180 000₽ за готовое решение, потому что используют наработки и шаблоны.

Нужен бот для записи клиентов?

Разработаем бот с календарём, напоминаниями и интеграцией с CRM. Гарантия 6 месяцев, договор, поэтапная оплата.

Заказать разработку

Заключение

Telegram-бот для записи на услуги — это сложная, но решаемая задача. Ключевые моменты: правильная база данных, логика расчёта свободных слотов, система напоминаний и удобная админ-панель. Если делать качественно, с учётом всех нюансов — бот окупится за 2-3 месяца за счёт снижения нагрузки на администраторов и уменьшения количества «не пришли».

Если вы разработчик — используйте эту статью как техническое ТЗ. Если вы заказчик — закажите разработку у профессионалов, которые уже делали подобные проекты.