Одна платформа для салонов, СТО, фитнеса и конюшен
SaaS для сервисного бизнеса: онлайн-запись 24/7, клиентская база, персонал и напоминания. Платформа подстраивается под отрасль — от салонов красоты до конных клубов.
Задача
Сервисному бизнесу нужна запись без звонков и переписок, но салон, СТО и конюшня бронируют совсем разное: мастера, бокс или лошадь.
Результат
Мультитенантная платформа, где запись резервирует набор ресурсов, а не только мастера. Двойные записи отсекаются на уровне базы, клиенты получают напоминания, а бизнес управляет всем из веба или приложения.
Ключевые функции
Онлайн-запись 24/7
Ресурсы под отрасль: мастера, боксы, лошади
Защита от двойных записей
Авто-напоминания
Клиентская база
Персонал и графики
Абонементы
Мобильные приложения
Как это построено
CRM с записью, на которой одинаково работают салон красоты, автосервис и конный клуб: публичная страница записи, приложение для бизнеса и приложение для клиента на одном API. Вот решения, которые её сформировали.
50+
Модулей бэкенда
129
Миграций схемы
2
Приложения, один API
24/7
Запись без звонка
Отрасль — это поле, а не форк
У каждого бизнеса есть код отрасли — намеренно отдельный от типа бизнеса внутри бьюти. Терминология, секции форм и правила записи читаются из конфига отрасли, а сервис бронирования берёт стратегию из реестра по тому же коду.
Именно это решение позволяет конному клубу и ногтевой студии жить в одном деплое. Ресурсы универсальны — кресло, денник или подъёмник это одна сущность с разными словами вокруг — а бьюти остаётся значением по умолчанию, так что новая отрасль ничего не меняет для тех, кто уже работает.
Та же платформа, одетая под конный клуб
Два клиента не могут занять один слот
Создание записи открывает транзакцию и сразу берёт advisory-лок PostgreSQL на мастера и на каждый задействованный ресурс, причём у каждого ключа есть префикс класса, чтобы id мастера и id ресурса никогда не совпали. Только после этого идёт проверка пересечений.
У ресурсов есть вместимость: ресурс считается занятым только когда пересечений набралось столько, сколько он выдерживает, поэтому зал на восьмерых не блокируется первой записью. Вся арифметика интервалов, буферов и пересечений считается в минутах по местному времени бизнеса — именно это держит её правильной в разных часовых поясах.
Деньги остаются у бизнеса
Предоплаты не проходят через платформу. Бизнес подключает собственные мерчант-данные monobank, которые хранятся отдельно для каждого бизнеса, и счета выставляются на этот счёт; альтернатива — LiqPay.
Поэтому платформа никогда не становится платёжным посредником: нечего держать, нечего выплачивать и не нужно брать на себя роль, которую продукту для записи брать не стоит. Деньги приходят в банк самого салона.
Напоминания — это и есть продукт
Уведомления разделены по каналам — запись, бизнес, платформа, социальные — так что клиент может выключить маркетинг и не потерять напоминание о завтрашнем визите.
Письма рендерятся из шаблонов Handlebars, пуши идут через Firebase, а SMS работают в рамках квоты тарифа, потому что SMS — единственный канал, который стоит настоящих денег за сообщение. Telegram несёт операционные алерты команде, а не клиентам.
Уведомления и напоминания — то, за что бизнес на самом деле платит
Сайт с записью без веб-разработчика
Каждый бизнес может опубликовать собственный сайт с записью по шаблону. Сам шаблон живёт в коде — палитра, шрифты, раскладка блоков — потому что дизайн меняется вместе с рендером, а не отдельно от него. В базе лежит ровно одно: с какого тарифа шаблон можно публиковать.
Выключенный шаблон исчезает из выбора, но не гасит уже опубликованные на нём сайты. Эта асимметрия намеренная: администратор, разбирающий список шаблонов, не должен иметь возможности выключить чей-то работающий сайт.
Подписки на трёх фронтах
Одна и та же подписка должна работать и когда её покупают в вебе, и когда её продаёт Apple внутри приложения. Веб-биллинг идёт через собственные тарифы и дополнения платформы; покупки в приложении проверяются на сервере через библиотеку App Store Server, так что доступ даёт чек, а не клиент.
Тарифы сравниваются по рангу, а не по названию — иначе каждая проверка функции перечисляла бы «basic» и «pro» руками и разъехалась бы на первом же новом тарифе.
Чего потребовал продакшен
Фоновая работа крутится на очередях Bull поверх Redis, который заодно держит кеш. Медиа ложится в S3-совместимое хранилище и по дороге сжимается через sharp. Сессии подписанные и куки-базированные, пароли — argon2, эндпоинты под рейт-лимитом, здоровье отдаёт Terminus, API описано в Swagger.
Непоказные части — выгрузки в Excel для бухгалтерии, выплаты мастерам, учёт расходов, служба поддержки — есть потому, что CRM, на которой бизнес ведёт свой день, не может заканчиваться календарём.
Результат
Платформа записи в продакшене на zapys24.com: веб-кабинет, приложение клиента и приложение бизнеса на iOS и Android, две отрасли уже живые, а модель готова к остальным.