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, дві галузі вже живі, а модель готова до решти.