Лендинг массажиста с онлайн-записью и предоплатой: разбор проекта
Частный мастер ручного массажа из села в Забайкальском крае. Лендинг со свободными окнами, предоплатой и правилом отмены за 24 часа, плюс панель мастера. Сайт живой, оплата идёт переводом по СБП с ручным подтверждением, напоминания в Telegram ещё не включены.
Коротко (TL;DR)
- Частный мастер ручного массажа из села в Забайкальском крае. Нужен сайт, где клиент видит свободное время и вносит предоплату.
- Собрал лендинг и запись на FastAPI и SQLite: календарь на 21 день, удержание окна до предоплаты, отмена по правилу «за 24 часа», панель мастера, абонемент, лист ожидания, отзывы.
- Предоплату сейчас принимает человек: клиент переводит по СБП, мастер жмёт «Оплата пришла». Эквайринга нет.
- Сайт живой и отвечает. Запись и отмену я проверил на локальной копии, на боевом сайте тестовых броней не делал. Напоминания в Telegram написаны, но бот не создан, не проверено.
Мастер ведёт приём одна. Людей записывали по телефону, время путалось, часть клиентов не приходила и не предупреждала. Расскажу, как я собрал сайт с записью и предоплатой и что в нём не доделано.
Задача
Две услуги: расслабляющий массаж на 60 минут и консультация с сессией по запросу на 40 минут. Нужны были лендинг, который находят в поиске, и запись, где свободное время видно сразу.
Главное требование касалось денег. Не предупредил за сутки или не пришёл: предоплата остаётся у мастера. Предупредил вовремя: предоплата возвращается. Стиль взят из её сторис: серый мрамор, тонкий капс, серифный курсив, оливковый акцент.
Что я сделал
Сервер на FastAPI с базой SQLite, страницы на чистых HTML, CSS и JS без сборки, всё за nginx на одном небольшом сервере. В API 34 эндпоинта, 16 из них закрыты входом мастера. В базе 8 таблиц, страниц пять: лендинг, запись клиента, панель мастера, форма отзыва, политика данных.
Цены, часы приёма, размер предоплаты и скидки мастер меняет в панели, сайт подхватывает их сам.
Кроме записи есть абонемент на 5 массажей со скидкой 10%: мастер подтверждает оплату, дальше клиент записывается по номеру телефона без предоплаты, а поздняя отмена сжигает сеанс. Ещё сделал скидку за приглашённую подругу, лист ожидания на занятое время, заявку на подарочный сертификат без оплаты на сайте и отзывы, которые публикует только мастер. Про пакеты услуг я писал в статье абонементы и пакеты.
Главную страницу отдаёт сервер: в неё попадают город, цены, десять вопросов FAQ и разметка. Рядом лежат robots.txt, sitemap.xml и llms.txt. Про локальный запрос я писал в статье про GEO для нишевого бизнеса. Эти адреса отвечают 200, а попал ли сайт в выдачу, не проверено.
Окна и удержание времени
Свободные окна считает сервер. Он берёт часы приёма по дням недели, шаг начала сеанса 30 минут, длину услуги и перерыв после неё, 15 минут после массажа и 20 после консультации. Вычитаются занятое время и блокировки мастера. Календарь показывает 21 день.
Выбранное окно закрепляется за клиентом до оплаты. Не оплатил, окно само возвращается в календарь. Время успели занять: сервер отвечает 409. Четвёртую неоплаченную бронь с одного адреса он не принимает и отвечает 429.
Предоплата, отмена и напоминания
Предоплата составляет треть стоимости массажа и две пятых консультации, остальное клиент платит на месте. Адрес приёма он видит только после подтверждённой записи. Похожую схему я разбирал в статье про бронь зала.
Отмена больше чем за 24 часа возвращает предоплату и освобождает время. Меньше чем за 24 часа или неявка оставляют предоплату мастеру. Правило считает сервер по времени сеанса, а мастер потом отмечает «Пришла» или «Не пришла».
Режимов оплаты два. В demo кнопка «Оплатить» подтверждает запись без денег. В manual клиент видит номер для перевода по СБП и сумму, а мастер подтверждает платёж в панели. Карточный эквайринг не подключён, ему нужен самозанятый или ИП с договором. Разницу я описал в статье эквайринг или СБП.
Напоминания в два слоя. Ссылка на запись отдаёт файл .ics с будильниками за сутки и за три часа, я проверил, что они в нём есть. Второй слой, Telegram-бот, написан: раз в пять минут сервер ищет подтверждённые записи за срок от 24 до 2 часов и пишет клиенту. Самого бота я не создавал, токена нет, на боевом сайте выключено.
Что было сложно
Первое, часовой пояс. Правило «за 24 часа» зависит от него. Расчёт идёт по Asia/Chita, пояс зашит в код, в файл .ics время переводится в UTC. Сменить пояс можно только правкой кода.
Второе, удержание окна при ручной оплате. Для карты хватает 20 минут. Для перевода мало: человек открывает банк, а мастер увидит платёж позже. На боевом сайте стоит 180 минут. Цена решения в том, что окно до трёх часов занято за человека, который может и не заплатить.
Третье, отзывы. Выдуманные я не писал. Блок скрыт, пока нет настоящих, и на боевом адресе список пуст, это я проверил запросом. Собираю их по общей ссылке.
Четвёртое, персональные данные. Телефон клиента попадает в базу, поэтому на сайте есть политика и обязательная галочка согласия в каждой форме.
Что получилось
| Что | Состояние |
|---|---|
| Эндпоинты API | 34, из них 16 для мастера |
| Таблицы в базе | 8 |
| Свободных окон на массаж | 270 в день проверки |
| Адреса сайта | 11 из 11 проверенных ответили 200 |
| Оплата на боевом сайте | СБП вручную, подтверждает мастер |
| Карточный эквайринг | не подключён |
| Напоминания .ics | работают |
| Напоминания в Telegram | бот не создан, не проверено |
| Реальные записи на боевом | не проверено |
Автотестов в репозитории нет, проверял я скриптами на локальной копии с чистой базой. Первый скрипт сделал 21 проверку: слоты, удержание, повторная бронь, возврат и невозврат предоплаты, истёкшая бронь, вход в панель, неявка. 20 прошли. Проверка лимита неоплаченных броней в скрипте не дошла до конца, я повторил её вручную и получил 429. Второй сценарий прошёл без ошибок: скидка по приглашению, абонемент, лист ожидания, отзыв.
На боевом сайте я тестовых броней не делал, чтобы не засорять мастеру панель. Записываются ли там клиенты, не проверено.
Что дальше
Сначала бот для напоминаний: создать, прописать токен, проверить на живом чате. Потом первые настоящие отзывы, Вебмастер, Search Console, карточки в Яндекс Бизнесе и 2ГИС. Эквайринг подключу, когда у мастера будет договор с банком.
Частые вопросы
Зачем частному мастеру предоплата?
Она закрепляет время за клиентом. Пока окно оплачено, на него никого не записывают. Пустое окно без предоплаты оплачивает сам мастер.
Можно ли принимать оплату картой на таком сайте?
Можно, но нужен эквайринг на самозанятого или ИП. Режима с провайдером в коде пока нет, в бою работает перевод по СБП.
Работают ли напоминания клиентам?
Частично. Календарный файл с будильниками за сутки и за три часа работает. Напоминание в Telegram в коде есть, но бот не создан, поэтому оно выключено.
Коротко о главном
Для частного мастера запись с предоплатой собирается небольшим сервером: календарь окон, удержание времени, правило отмены и панель, где день виден целиком. Приём денег я оставил ручным, потому что договора с банком у мастера нет.
Сейчас это живой лендинг с записью, проверенный на локальной копии, без подтверждённых боевых броней в моих данных. Напоминания в Telegram и карточную оплату я считаю следующим этапом. Если нужен такой лендинг под вашу услугу, это входит в разработку сайтов. Напишите в Telegram, MAX или VK.
Что я делаю для бизнеса
- Боты в Telegram, MAX, VK
- Автоматизация процессов и CRM
- Аналитика и дашборды
- Сайты и лендинги под ключ
Бесплатно: чек-лист «Готов ли ваш бизнес к 152-ФЗ»
12 пунктов, которые проверяют готовность за час: данные, согласия, уведомление в РКН, локализация, защита. Отметьте, что уже сделано, и увидите дыры, за которые сейчас штрафуют.
Готовы обсудить вашу задачу?
Бесплатная консультация — разберём, как внедрить это в вашем бизнесе под ключ. Без форм, пишите напрямую.
Разборы, кейсы и практика — без воды. Выходит регулярно, читать 3–5 минут.


