ПроектыПроект для клиента

SetHub — система для съёмочной студии в Лос-Анджелесе

Set Hub в Даунтауне сдаёт шестнадцать сетов под одной крышей, крышу над городом и площадку с винтажным «Мерседесом». Мы построили для студии всю систему — CRM, сайт с онлайн-бронью и оплатой, кабинет гостя и два приложения, — и брони из всех каналов сошлись в одну базу.

  • Next.js 16 · TypeScript
  • PostgreSQL · Prisma 6
  • Stripe · оплата и подписки
  • Expo · iOS и Android
  • Gmail · Google Calendar

В цифрах

4канала броней в одной базе: Peerspace, Giggster, сайт студии и прямые
19календарей площадок: брони в них система ставит, двигает и снимает сама
2мобильных приложения из одной кодовой базы — для команды и для гостей
43таблицы в базе, 49 миграций, 74 файла автотестов

Задача

Студия сдаёт девятнадцать площадок через четыре канала — Peerspace, Giggster, свой сайт и напрямую, — и у каждого свои письма и свой календарь. Сводила их таблица, которую вели руками. Бронь всей студии и бронь одного сета внутри неё жили в разных календарях Google, и ничто не мешало площадке продать всю студию поверх уже занятого сета: она просто не видела ту бронь. Оплата с сайта приходила, а за что именно заплатили, нигде не было записано. Ошибка здесь — не опечатка в таблице, а две съёмочные группы у одной двери.

Что сделали

Письма Peerspace и Giggster сами становятся бронями

Скрипт в почте студии раз в пять минут пересылает новые письма площадок, а разбирают их правила, без ИИ. Запрос — не бронь: «забронировано» даёт оплаченную бронь с суммой, комиссией площадки и выплатой студии, письмо о переносе двигает уже заведённую, выплата сверяется с бронью по гостю и сумме. Сама записывается только бронь из письма, которое прошло проверку DMARC и прочитано целиком; остальное ждёт человека в «Захвате» с красной пометкой. Накладку из письма система не отклоняет — площадка её уже продала, — а ставит срочную задачу на сегодня.

Девятнадцать календарей и одна правда

Источник правды — база SetHub, а 19 календарей Google — табло «занято», которое читают сайт, Peerspace и Giggster. Бронь всей студии закрывает все 16 сетов внутри неё, любой сет закрывает студию, а крыша и площадка с машиной — только себя. События ставит, двигает и снимает скрипт студии раз в минуту, и в них нет ни телефонов, ни почты, ни сумм. События, которые ставят сами площадки, не дублируются: SetHub дописывает к ним свой блок. Накладка — отказ везде: в форме, в «Захвате», в приложении и в командах ИИ.

«Захват»: текст, фото, документ или голос становятся черновиком

Что прислали руками — текст, снимок чека, PDF, голосовое в Telegram-бот, запрос из Make или Zapier, — попадает в одну очередь и ждёт подтверждения. Обычный текст и Word разбирают правила без ИИ: дату, время, сумму и депозит, контакты, площадку, источник, сотрудника, известного клиента; угаданное подсвечивается. Модель нужна только тому, чего нет текстом: голосу, снимкам, сканам. То же сообщение от того же человека в течение десяти минут вернёт уже заведённое, а не создаст дубль.

Бронь на сайте: время держится, пока гость платит

Гость выбирает сет, день и время по живой занятости — она считается по броням всех каналов. «Book now» ставит предварительную бронь и держит время 35 минут: проверка «свободно» и запись идут под блокировкой базы, поэтому два гостя один час не возьмут. Дальше — Stripe Checkout; вебхук с проверкой подписи подтверждает именно эту бронь, а неоплаченные удержания снимает таймер. Цену считает сервер: −10 % от 4 часов, −15 % от 8, полный день по фиксированной цене, добавки, уборка. Если в середине занято, бронь делится в обход: с 12 до 4 при занятом часе с 2 до 3 — это 12–2 и 3–5 по цене одной брони, а перерыв не оплачивается.

Письма гостю: код от двери — за сутки

Сразу после брони гость получает подтверждение: бронь, строки суммы, правила студии и чек в PDF — без кода от двери. За сутки до начала приходит напоминание с кодом, этажом и видео, как войти; если бронь сделана меньше чем за сутки, всё приходит одним письмом. Перенос переставляет напоминание, отмена его снимает. Письма уходят из ящика самой студии, до 1000 в сутки, гостям — первыми; коды стираются из очереди сразу после отправки. Для съёмочной группы — подписанная ссылка: время, адрес, «как войти» и «добавить в календарь», а после конца съёмки — «That’s a wrap».

Кабинет гостя: вход без пароля, бонусы, абонементы

Вход — шестизначный код на почту: десять минут и пять попыток. В кабинете — свои брони, «забронировать снова» с тем же сетом, часами и добавками, чек в PDF и событие для календаря. Скидка растёт с числом визитов; абонемент — подписка Stripe с часами на месяц, есть пакеты часов и подарочные карты: код из 16 знаков хранится только хешем, а срока у карты нет — так требует закон Калифорнии. После съёмки приходит письмо с оценкой в пять звёзд; ссылку на отзыв в Google видят все оценившие, а не только довольные: выборочно просить хорошие отзывы Google запрещает.

Запросы, задачи и сроки — без чатов

Запрос получает номер SH-xxxx и идёт по этапам: новый, в разговоре, ждём депозит, подтверждён, завершён или потерян; уровень внимания считается, а не хранится, и очередь менеджера собирается тем же правилом. Срок и исполнителя задачи ставят владелец и менеджер; сотрудник срок не правит, а просит перенос с датой и причиной, и запрет стоит на сервере, а не в форме. Напоминания приходят за час до срока, при просрочке и каждое утро по часам студии. Оповещения — письмом-сводкой, push в браузер, в Telegram и на телефон напрямую через Apple и Google; задачу можно закрыть кнопкой прямо в уведомлении.

Четыре роли — права проверяет сервер

Владелец видит всё. Главный менеджер — операционку и деньги бизнеса, но не личные траты владельца. Клиент-менеджер — клиентов, брони с суммами и запросы, без доходов и расходов студии. Сотрудник — задачи, расписание и «Захват», без денег вообще: в приложение ему приходит день без сумм, оплаты, источника и контактов гостя. Один модуль ролей проверяют страницы, сервер, мобильные API и 26 команд для ИИ-помощников — ChatGPT и Claude подключаются по MCP со входом через OAuth, и ни одна команда ничего не удаляет. Смена пароля или выключение учётной записи гасит сессии, ключи телефонов и доступы ИИ.

Два приложения из одной кодовой базы

«Set Hub Team» — для сотрудников: вход по Face ID или отпечатку, снимки экрана запрещены, ключ лежит только в связке ключей этого телефона, данные клиентов — только в памяти. Виджет «Сегодня» и экран блокировки показывают время и площадку без имён гостей и сумм, а «Захват» открывается одним касанием из Пункта управления. «Set Hub» — для гостей: бронь на ленте времени, подбор сета по фото-референсу, золотой час на крыше по формуле NOAA и прогнозу погоды, «как войти» за Face ID — работает даже в подвале без сети. Оба собраны и проверены на симуляторе iPhone и эмуляторе Android; публикация в App Store и Google Play — следующий шаг.

Экраны

Девятнадцать площадок с ценой за час. Для системы это 19 мест со своими календарями: бронь всей студии закрывает все 16 сетов внутри неё
Девятнадцать площадок с ценой за час. Для системы это 19 мест со своими календарями: бронь всей студии закрывает все 16 сетов внутри неё
У каждого сета своя страница: фото, площадь, вместимость, правила студии и бронь прямо на ней
У каждого сета своя страница: фото, площадь, вместимость, правила студии и бронь прямо на ней
Скидку, пакет оборудования и добавки собирает сервер: из браузера уходит только выбор гостя
Скидку, пакет оборудования и добавки собирает сервер: из браузера уходит только выбор гостя
Занятость живая: в календаре брони всех каналов, а время — по Лос-Анджелесу, где бы ни был гость
Занятость живая: в календаре брони всех каналов, а время — по Лос-Анджелесу, где бы ни был гость
Свет, стабилизаторы, камера добавляются в бронь одним нажатием: почасовое считается по часам брони, штучное — по количеству
Свет, стабилизаторы, камера добавляются в бронь одним нажатием: почасовое считается по часам брони, штучное — по количеству
Подвал сайта
Подвал сайта

Технологии

Next.js 16 и TypeScript, PostgreSQL через Prisma 6: 43 таблицы, 49 миграций, 74 файла автотестов. Права — в одном модуле ролей, который проверяют страницы, действия сервера, мобильные API и команды ИИ: спрятанная кнопка защитой не считается. Время везде — по часам студии в Лос-Анджелесе: брони, сроки, границы месяца и напоминания сравниваются со «сейчас» студии, а не с часами сервера. Старая таблица перенесена целиком: у каждой записи хранится исходная строка, а несошедшиеся разбираются на отдельном экране сверки. Интерфейс команды — на английском и русском, для гостей — на английском.

Оплата — Stripe Checkout и подписки, вебхук с проверкой подписи. Почта и календари — скрипт Google в ящике студии и календари Google через служебную учётную запись, без посредников вроде Make. Голос, снимки и PDF разбирает OpenAI, обычный текст — правила. Push на телефоны уходит напрямую в Apple и Google, в браузер — по VAPID без сторонних библиотек. Приложения — Expo и React Native с общим ядром: виджеты, Live Activity, плитка быстрых настроек Android и модуль на Swift, который напоминает «как войти», когда гость подходит к студии.

Брони идут из нескольких каналов?

Расскажите, откуда приходят ваши заказы и где они теряются, — начнём с того, что болит сильнее всего. У Set Hub это были письма площадок и календари, а остальное выросло вокруг. Сайт студии можно открыть прямо сейчас: внизу каждой страницы стоит наша подпись «Site by ProfiLab».

WhatsApp