Онлайн запись на сайт разработчики часто сводят к красивой форме с выбором даты, но по факту это три отдельные задачи: календарь с расписанием мастеров или ресурсов, защита конкретного слота от двойного бронирования и напоминание, которое реально доходит до клиента, а не теряется в спаме. Я собирал такие модули и для лендингов на Tilda, и для интернет-магазинов на WooCommerce, и разница почти всегда не в дизайне формы записи, а в том, где хранится расписание и кто отправляет уведомление за сутки до визита.
Из чего состоит онлайн-запись на сайте: форма, календарь и база данных
Форма записи и календарь бронирования это разные вещи, хотя их часто путают между собой. Форма просто присылает заявку менеджеру, а тот согласовывает время по телефону вручную. Календарь резервирует конкретный слот сразу, без участия человека, и не даёт двум клиентам занять одно и то же время одновременно.
Для сайта на Tilda или WordPress я не поднимаю отдельный сервер под запись, задача решается штатным хостингом, который клиент уже оплатил вместе с сайтом. Обработчик формы на PHP и таблицы в MySQL справляются с расписанием, слотами, статусами брони и историей клиентов без дополнительной инфраструктуры. Обычно в базе три таблицы: услуги с названием, длительностью и ценой, мастера или ресурсы, если их несколько, и сама запись, appointments, с полями времени начала, времени конца, статуса и ссылки на клиента.
Отдельный сервер на Python или Node.js для такой задачи не нужен. Эти инструменты я беру, когда работа реально требует фоновых очередей, парсинга большого объёма данных или телеграм-бота с логикой на aiogram, а не для приёма формы и хранения расписания на сайте.
Слоты и календарь: как не допустить двойную бронь
Слоты обычно нарезаю фиксированным шагом, например по 30 минут, из рабочих часов мастера или ресурса на неделю вперёд. Клиент видит только свободные ячейки, занятые скрываются или помечаются серым прямо в интерфейсе виджета.
Проблема начинается, когда два человека одновременно нажимают «записаться» на один и тот же слот. Если проверять свободность отдельным запросом перед вставкой записи, между проверкой и вставкой остаётся окно в доли секунды, и оба запроса успевают пройти проверку. Решение простое и не требует отдельной базы вроде Postgres, обычный MySQL с InnoDB справляется: на комбинацию мастер плюс время начала ставлю уникальный индекс, и вторая попытка вставить запись на тот же слот падает с ошибкой дублирования на уровне базы, которую обработчик формы ловит и возвращает клиенту сообщение «слот уже занят, выберите другое время».
Для записи с предоплатой добавляю статус pending и поле expires_at, чтобы слот держался забронированным 10-15 минут, пока клиент оплачивает, а не оставался занятым навсегда. Просроченные брони снимает отдельный запрос по расписанию, который освобождает слот обратно в список доступных.
Готовые виджеты записи и штатные возможности Tilda и WordPress
Tilda: форма записи и предоплата без правки кода
Отдельного блока с интерактивным календарём бронирования в Tilda нет, поэтому запись обычно собирают через обычную форму с полями даты и времени, а логику проверки занятости слота я переношу на свой обработчик вместо стандартной отправки заявки в CRM Tilda. Штатно при этом доступна интеграция с Робокассой прямо в настройках платёжных систем, так что предоплату за визит можно подключить без единой строчки кода в head. Если нужна привязка к учёту услуг и остатков расходников в 1С, у Tilda есть обмен через CommerceML прямо из интерфейса сайта.
WordPress и WooCommerce: плагины бронирования поверх магазина
В ядре WooCommerce модуля бронирования нет, это отдельные плагины, которые ставятся и настраиваются сверху. Я работаю поверх такого плагина, когда клиенту хватает типовой логики записи на один ресурс, и пишу свой обработчик на PHP, когда правила пересечения времени нестандартные: например, услуга занимает два ресурса одновременно, мастер и кабинет, или у одного клиента не может быть двух активных записей сразу.
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Напоминания клиенту: email, SMS и Telegram
Три канала напоминаний ведут себя по разному, и выбор зависит не от платформы сайта, а от того, что клиент реально откроет.
| Канал | Скорость доставки | Что нужно от клиента |
|---|---|---|
| Может уйти в спам, открываемость нестабильна | Только адрес почты из формы записи | |
| SMS | Доходит почти всегда, даже без интернета | Номер телефона и подключённый SMS-шлюз |
| Telegram-бот | Доставляется мгновенно через Bot API | Клиент должен сам нажать «start» боту заранее |
Telegram самый дешёвый в реализации канал, потому что доставка сообщений через Bot API бесплатна и платить нужно только за разработку. Ограничение одно: бот может написать только тому, у кого уже есть свой chat_id, то есть кто сам нажал «start», поэтому его обычно подключают вторым каналом рядом с email или SMS, а не единственным способом напомнить о визите.
Простое напоминание за сутки до визита делается по расписанию: раз в час скрипт выбирает из таблицы appointments записи на завтра и отправляет запрос к Bot API.
curl -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" \
-d chat_id=123456789 \
-d text="Напоминаем: ваша запись завтра в 15:00"
Если нужен полноценный бот с меню переноса и отмены записи, а не просто рассылка, я делаю Telegram-бота для напоминаний о записи, который отвечает клиенту и сразу пишет отметку о переносе в базу.
Для более сложных цепочек уведомлений, например напоминание за сутки, потом ещё раз за два часа до визита плюс письмо с кнопкой переноса, я собираю сценарий в n8n. У сервиса есть облачный тариф, где свой сервер не нужен, а self-hosted вариант это уже отдельный VPS, который придётся настраивать, обновлять и оплачивать ежемесячно отдельно от хостинга сайта.
Оплата и CRM при онлайн-записи
Предоплата за визит закрывает часть отмен в последний момент. На Tilda это Робокасса из коробки, на WordPress чаще эквайринг банка через плагин или отдельный обработчик, который создаёт платёж и подтверждает бронь только после успешной оплаты, а не сразу при отправке формы.
Данные о записи обычно нужно продублировать в CRM, амоCRM, Битрикс24 или что использует клиент, через вебхук сразу после подтверждения брони. Контакты клиентов, телефон, имя и историю записей храню в своей базе на российском хостинге или в CRM с серверами в РФ, а не в Google Sheets или Airtable, требование о локализации персональных данных по 152-ФЗ касается именно места хранения серверов.
Сколько стоит внедрение и когда нужна кастомная разработка
| Вариант | Что входит | Стоимость |
|---|---|---|
| Доработка формы под Tilda или WordPress | Проверка занятости слота, запись в свою базу, одно уведомление | от 3 000 ₽ |
| Комплексная интеграция записи с CRM и оплатой | Предоплата, вебхук в CRM, напоминания в несколько каналов | от 40 000 ₽ |
| Автоматизация уведомлений в n8n | Цепочка напоминаний в нескольких каналах, связка с CRM | от 25 000 ₽ |
| Веб-приложение с личным кабинетом | Кабинеты клиента и мастера, история записей, своя аналитика | от 300 000 ₽ |
Простая доработка формы под запись с проверкой занятости слота занимает 3-5 дней. Комплексная интеграция с CRM и оплатой растягивается на 2-3 недели, а веб-приложение с личным кабинетом клиента и мастера я делаю от 8 недель, потому что там кроме записи обычно добавляются история визитов, отмена и перенос из личного кабинета без звонка администратору.
Частые вопросы
Сколько времени занимает подключение онлайн-записи на сайт?
Простая доработка формы с проверкой слота на Tilda или WordPress занимает 3-5 дней. Если добавляется CRM и оплата, срок растягивается до 2-3 недель, а полноценное веб-приложение с личными кабинетами делается от 8 недель.
Нужен ли отдельный сервер для календаря записи?
Нет, если это форма записи на существующем сайте. Обработчик на PHP и таблицы в MySQL работают на обычном хостинге, который уже оплачен вместе с сайтом. Отдельный сервер нужен только для сложной автоматизации вроде self-hosted n8n или нагруженного бота.
Как защититься от двойного бронирования одного времени?
Уникальным индексом на комбинации мастер плюс время начала слота прямо в базе данных. Вторая попытка записаться на уже занятое время падает с ошибкой на уровне базы, а не на уровне проверки в коде, поэтому гонка запросов при одновременном клике двух клиентов исключена.
Можно ли добавить онлайн-запись на уже готовый сайт на Tilda?
Да, форма остаётся штатной, а логику проверки занятости и запись в базу я переношу на свой обработчик, куда форма отправляет данные вместо стандартной CRM Tilda. Дизайн и структуру сайта при этом не трогаю.