Разработка сервиса бронирования и аренды: от записи клиента до возврата

Сервис бронирования отвечает на один вопрос: свободно ли это время или этот предмет, и держит ответ верным, пока клиент платит. Делаем его на заказ для услуг, помещений, оборудования и транспорта: занятость, блокировки на время оплаты, отмены, напоминания, личный кабинет. Начинаем с модели занятости, потому что именно она определяет, будет ли сервис продавать одно и то же дважды. Агрегатор чужих исполнителей с выплатами и нативные мобильные приложения мы не делаем.

Обследование — 200 000 ₽, вычитается из первого этапаОплата через ваш эквайринг, данные карт к нам не попадаютИсходный код в вашем репозитории с первого коммита

С чем приходят

Когда запись по телефону и таблице перестаёт работать

Двойные брони

Администратор записал клиента в таблицу, а ссылка на сайте в это время продала то же место. Выясняется это при встрече у двери.

Бронь висит, оплаты нет

Клиент выбрал время, ушёл за картой и не вернулся. Слот заблокирован, а следующий клиент видит «занято» и уходит к конкуренту.

Отмены решаются в переписке

Правила отмены знает только администратор, возвраты считаются вручную, и каждый случай обсуждается заново.

Конструктор записи упёрся в потолок

Нужны группы ресурсов, залог, минимальный срок аренды, цена по сезону или обмен с учётной системой, а готовый сервис этого не умеет или хранит данные у себя.

Модели занятости

Четыре способа хранить занятость: слоты, интервалы, единицы парка и места

Выбор модели — первое решение проекта. Менять её на работающем сервисе дорого, потому что от неё зависят поиск свободного, цена и отмена.

Модель
Как хранится занятость
Что проверяем
Где ломается
МодельСлоты фиксированной длинызапись к мастеру, врачу, на консультацию
Как хранится занятостьУслуга, исполнитель и сетка времени, например по полчаса
Что проверяемРасписание исполнителя пересекается с отпуском, перерывами и услугой, которая длится два слота
Где ломаетсяДлинная услуга ставится в расписание так, что ломает следующий слот
МодельИнтервалы произвольной длиныпомещения, переговорные, спортивные площадки
Как хранится занятостьРесурс и диапазон времени от и до, в минутах или часах
Что проверяемПроверка пересечения диапазонов, учёт подготовки и уборки между бронями
Где ломаетсяДве брони встык без времени на уборку, брони через полночь
МодельЕдиницы паркааренда оборудования, транспорта, инструмента
Как хранится занятостьМодель и количество единиц; конкретная единица выдаётся при выдаче
Что проверяемУчёт на уровне модели и на уровне единицы, залог, ремонт и обслуживание, комплекты
Где ломаетсяЕдиницу забрали на ремонт, а сервис продолжает считать её свободной
МодельМеста на мероприятиезанятия, группы, экскурсии
Как хранится занятостьСобытие с вместимостью и счётчик свободных мест
Что проверяемОдновременные покупки последних мест, листы ожидания, переносы события
Где ломаетсяМест оказалось продано больше, чем есть, потому что счётчик читали без блокировки
Блокировки

Как не продать одно и то же время дважды

Двойную бронь предотвращает база данных, а не интерфейс: если проверка живёт только в браузере, её обходит второй клиент в соседней вкладке.

Защита строится из трёх слоёв, и каждый закрывает свой случай.

  • Удержание на время оплаты. Когда клиент выбрал время и нажал «забронировать», слот переходит в состояние «удержан» с таймером. Остальные клиенты видят его занятым, а если оплата не пришла, удержание снимается само. Срок таймера задаёт владелец сервиса: он зависит от способа оплаты.
  • Проверка и запись одной операцией. Свободно ли время и создание брони выполняются в одной транзакции базы, иначе два запроса, пришедших в одну секунду, оба увидят «свободно». Читать и затем записывать отдельными шагами нельзя.
  • Ограничение в самой базе. PostgreSQL умеет запрещать пересекающиеся диапазоны времени для одного ресурса на уровне схемы. Даже если в коде сервиса окажется ошибка, второе пересекающееся бронирование база не примет, а клиент увидит понятный отказ.

Время и часовые пояса

В базе время хранится в едином стандарте, в интерфейсе показывается по часовому поясу площадки, а не клиента: помещение в Новосибирске бронируют по его местному времени, откуда бы ни пришёл клиент. Поддержка часовых поясов закладывается сразу, потому что у сети площадок они разные.

Жизнь брони

Состояния брони: что происходит и что держит время

Бронь — это машина состояний. Переходы между ними описаны заранее, поэтому статус не меняют руками в обход правил.

Состояние
Что происходит
Держит ли время
Как выходит из состояния
СостояниеУдержана
Что происходитКлиент выбрал время и находится на странице оплаты
Держит ли времяДа, на срок таймера
Как выходит из состоянияОплата прошла, либо таймер снял удержание
СостояниеПодтверждена
Что происходитОплата или предоплата получена, клиенту ушли подтверждение и напоминания
Держит ли времяДа
Как выходит из состоянияКлиент пришёл, отменил или перенёс бронь
СостояниеВ процессе
Что происходитУслуга идёт или предмет выдан: фиксируем выдачу, состояние предмета, залог
Держит ли времяДа, до фактического конца
Как выходит из состоянияЗавершение или продление
СостояниеЗавершена
Что происходитЗакрываем расчёт, возвращаем залог, при необходимости снимаем доплату
Держит ли времяНет
Как выходит из состоянияКонечное состояние
СостояниеОтменена или неявка
Что происходитПрименяется правило отмены: возврат полный, частичный или без возврата
Держит ли времяНет, время освобождается
Как выходит из состоянияКонечное состояние, журнал сохраняется
Оплата

Предоплата, залог и возвраты: что подключаем и чьи договоры

Предоплата или полная оплата

Платёжную форму вашего провайдера подключаем по его документации. Карточные данные остаются у провайдера, мы их не получаем и не храним. Результат приходит уведомлением, бронь подтверждается по нему, а не по возврату на сайт.

Залог в аренде

Залог держится на карте клиента, если эквайринг умеет блокировать сумму, либо вносится отдельным платежом. Какая схема доступна, определяет ваш провайдер, мы описываем её в сервисе и учитываем в расчёте.

Возвраты

Возврат инициируется сервисом по правилу отмены и проходит через провайдера. Сумму, статус и причину видят клиент и администратор. Сумма, которая вернулась частично, не должна расходиться с учётом.

Чеки и документы

Чек формирует ваша онлайн-касса или сервис фискализации. Для организаций формируются счёт и акт: данные берутся из учётной системы, обмен с 1С или CRM описываем на обследовании.

Отмены

Правила отмены и переноса: записаны как данные, а не как решение администратора

Правило отмены не должно жить в голове сотрудника. Его записывают как таблицу условий: за сколько до начала отмена бесплатна, какая часть суммы удерживается позже, что происходит при неявке, кто может перенести бронь и сколько раз. Сервис читает эту таблицу при каждой отмене и показывает клиенту итог до подтверждения.

  • Правило привязано к услуге или ресурсу. Для массажа, переговорной и экскурсии условия разные, и они хранятся отдельно.
  • Исключения делает сотрудник, и это записывается. Возврат в обход правила допустим, но с причиной и именем в журнале.
  • Перенос не равен отмене с новой оплатой. Бронь переезжает на другое время, если оно свободно, платёж сохраняется, разница в цене учитывается отдельно.
  • Сбой на стороне площадки (исполнитель заболел, предмет сломан) оформляется отдельной причиной: возврат полный и без штрафа.

Саму политику (условия, сроки, штрафы) определяет владелец вместе с юристом: оферту и правила возврата мы не пишем. Мы делаем так, чтобы согласованная политика выполнялась одинаково для всех клиентов.

Связь с клиентом

Напоминания, календарь и кабинет клиента

Подтверждения и напоминания

Письма, SMS и сообщения в мессенджере уходят через ваших провайдеров. Неявок становится меньше, когда напоминание содержит кнопку отмены и переноса, а не только номер телефона.

Календарь исполнителя и клиента

Исполнитель видит расписание на телефоне в адаптивном интерфейсе. Бронь выгружается в календарь клиента файлом iCal, а календарь исполнителя может подтягивать личные занятия, чтобы не ставить запись на собственные дела.

Личный кабинет клиента

История броней, повтор, отмена и перенос по правилам, документы, сохранённые данные. Права проверяются на сервере, клиент видит только свои брони.

Рабочее место администратора

Сводка по дням, ручное создание брони по звонку, блокировка времени на ремонт или отпуск, журнал изменений. Ручная бронь проходит те же проверки, что и онлайн.

Что делаем

Из чего состоит работа и сколько она стоит

Цены — по тарифам. Точная цена называется у обследования, дальше идёт вилка. Остановиться можно после любой ступени.

Обследование: одна площадка и одна-две системы

Модель занятости, правила отмены, оплата, расписание, роли. На выходе схема данных, состав первой версии и вилка бюджета. Вычитается из первого этапа.

200 000 ₽ · 2–3 недели

Обследование: сеть площадок и несколько систем

Несколько площадок или исполнителей, 1С, CRM, касса, провайдер оплаты и бронирование вместе: схема обменов.

350 000 ₽ · 3–4 недели

Пилот: один сценарий брони

Бронь одного ресурса с удержанием, оплатой и отменой на реальных данных. Проверяет модель занятости до разработки всего сервиса.

150 000–400 000 ₽ · 2–8 недель

Первая версия сервиса

Поиск свободного, бронь, оплата, отмены и переносы, напоминания, кабинет клиента, рабочее место администратора. В тарифах это ступень «Пилот, тяжёлый».

400 000–1 200 000 ₽ · 2–3 месяца

Вывод в эксплуатацию

Нагрузочные испытания, опытная эксплуатация на нескольких площадках, мониторинг, обучение администраторов.

от 1 500 000 ₽ этапами по 300 000–700 000 ₽ · от 3 месяцев

Сопровождение

Мониторинг, обращения, разбор инцидентов; плановые доработки с пакета на 60 000 ₽. Сверх пакета — 5 000 ₽ в час.

20 000 / 60 000 / 120 000 ₽ в месяц
Процесс

Как идёт работа

2–4 недели — Обследование

Модель занятости, расписания, правила цены и отмены, провайдер оплаты, учётные системы. Записываем состояния брони и переходы между ними.

Перед разработкой — Макеты интерфейса

Кликабельные макеты поиска, брони, оплаты, кабинета и рабочего места администратора. Показываем администраторам и нескольким клиентам и правим до кода.

От 4 недель — Разработка

Занятость и блокировки, оплата, отмены, уведомления, интерфейсы. Работаем в вашем репозитории, раз в две недели показываем версию на тестовом стенде.

1–2 недели — Проверка

Тесты гонки: десятки одновременных попыток занять одно время, отказы оплаты на каждом шаге, отмены по каждому правилу, часовые пояса.

3–7 дней — Запуск

Включаем одну площадку или один тип услуги, наблюдаем журнал и обращения, затем подключаем остальные.

Дальше — развитие или сопровождение

Новые типы услуг и площадки по этапам с отдельной приёмкой. Объём работ в месяц записан в договоре.

Цена

Что двигает цену сервиса внутри вилки

Модель занятости

Слоты проще интервалов, интервалы проще парка с залогом и комплектами. Каждый новый вид ресурса добавляет свои правила поиска и цены.

Правила цены и отмены

Одна цена и одно правило отмены — одно, сезонные цены, пакеты, минимальный срок и разные условия по ресурсам — другое.

Оплата и учёт

Предоплата проще залога, залог проще частичных возвратов с закрывающими документами. Обмен с 1С добавляет работу на каждую роль.

Число площадок и исполнителей

Расписания, часовые пояса, роли сотрудников и права по площадкам растут быстрее числа экранов.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

  • Исходный код в вашем репозитории с первого коммита.
  • База, файлы и учётные записи на ваших серверах или у вашего хостера; развёртывание описано инструкцией.
  • Описание состояний брони и правил отмены в проверяемом виде.
  • Макеты интерфейса и документация: с ними можно идти к другому подрядчику.
  • Право остановиться после любой ступени: сделанное остаётся у вас по акту.

Мы этого не делаем

  • Не делаем агрегатор чужих исполнителей с комиссиями и выплатами: платформа работает на вас или на ваши площадки.
  • Не делаем нативные мобильные приложения: адаптивный интерфейс входит в проект, установка на экран телефона возможна.
  • Не принимаем платежи и не храним данные карт: эквайринг, онлайн-кассу и SMS-провайдера подключаете вы.
  • Не продвигаем сервис и не пишем оферту и правила возврата: их готовит юрист заказчика, юридических консультаций мы не даём.
  • Не размещаем сервис у себя, не дежурим круглосуточно, не берём работы дешевле 150 000 ₽.
Граница

Сервис бронирования, личный кабинет, CRM или магазин: где проходит граница

Если нужен сервис, где клиент подбирает время, платит и получает подтверждение, это эта страница. Если клиентам нужен только кабинет с заказами и документами, достаточно личного кабинета. Если бронирование — внутренний инструмент сотрудников, а клиент звонит, смотрите CRM и внутренние системы.

Продажа товаров с корзиной и доставкой — это платформа онлайн-торговли. Подписка с регулярными списаниями разобрана на странице-разборе «B2C-сервис по подписке». Общее устройство программы — на страницах про веб-сервисы и API и серверную часть.

Инструменты

На чём собираем

Серверная часть и данные
  • Python: Django или FastAPI, при необходимости Go
  • PostgreSQL: транзакции и ограничения на пересечение диапазонов времени
  • Redis или совместимое хранилище для таймеров удержания и кэша
  • Очередь уведомлений и обмена с учётом: PostgreSQL или RabbitMQ
Интерфейс и развёртывание
  • React или Vue, TypeScript, адаптивная вёрстка, установка на экран телефона
  • Календарь расписания и выгрузка в формат iCal
  • Docker, Nginx, GitLab CI
  • Журнал действий и мониторинг оплат и уведомлений
Материалы

Материалы по теме

Статья

Как сделать сервис бронирования: занятость, блокировки, отмены

Разбор по шагам: модель занятости, удержание на время оплаты, защита от двойной брони, правила отмены.

  • Модели занятости
  • Блокировки
  • Отмены
Читать →
Статья

Проектирование API для интеграций: на что смотреть

Если бронь должна уходить в учёт и CRM, интерфейс обмена проектируют заранее.

  • Повторы без дублей
  • Версии
  • Ошибки
Читать →
Статья

Как составить техническое задание на разработку

Что записать до начала работ, чтобы оценка сходилась с результатом.

  • Состав версии
  • Критерии приёмки
  • Что отложить
Читать →
Заявка

Разберём, что у вас бронируют и по каким правилам

Сорок минут созвона: что бронируется, кто и как сейчас записывает, какие правила оплаты и отмены. Скажем, с какой ступени начинать и в какую вилку это укладывается.

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы: сервис бронирования и аренды

Сколько стоит разработка сервиса бронирования?

Обследование — 200 000 ₽ за одну площадку и одну-две системы или 350 000 ₽ за сеть и несколько систем. Пилот одного сценария — 150 000–400 000 ₽, первая версия — 400 000–1 200 000 ₽ за 2–3 месяца, вывод в эксплуатацию — от 1 500 000 ₽ этапами по 300 000–700 000 ₽. Обследование вычитается из первого этапа, если продолжаете с нами.

Когда хватит готового сервиса онлайн-записи?

Когда у вас слоты фиксированной длины, одно правило отмены, стандартная предоплата и не нужен обмен с учётной системой. Если появляются залог, парк с комплектами, цена по сезону, сеть площадок или требование хранить данные у себя, готовый сервис упирается в потолок. Мы скажем об этом на обследовании, если вам не нужна заказная разработка.

Как сервис защищается от двойной брони?

Тремя слоями: удержание времени на срок оплаты, проверка и запись в одной транзакции, ограничение на пересечение диапазонов в самой базе. В проверку входят тесты, в которых десятки запросов одновременно пытаются занять одно время.

Принимаете ли вы платежи и храните ли данные карт?

Нет. Платёжную форму подключаем по документации вашего провайдера, карточные данные попадают к нему, а не в нашу систему. Договор с провайдером и с онлайн-кассой заключаете вы.

Можно ли подключить сервис к нашей 1С или CRM?

Да. С 1С работаем через HTTP-сервисы, OData или файлы, с CRM через её API. Что именно уходит в учёт (брони, оплаты, закрывающие документы), решаем на обследовании. Если у системы нет ни интерфейса, ни выгрузки, скажем об этом до договора.

Вы делаете мобильное приложение и агрегатор исполнителей?

Нет. Мы делаем адаптивный веб-сервис, который можно установить на экран телефона. Нативные приложения для iOS и Android и агрегатор чужих исполнителей с комиссиями и выплатами в наш профиль не входят.

Где работает сервис и кому принадлежит код?

На ваших серверах или у выбранного вами хостера. Исходный код лежит в вашем репозитории с первого коммита, результат передаётся по акту. Персональные данные граждан России обычно должны храниться на серверах в России.

Вы работаете только в Ростове-на-Дону?

Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.