ПроєктиПроєкт для клієнта

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 і прочитаний повністю; решта чекає на людину в «Capture» з червоною позначкою. Накладку з листа система не відхиляє — платформа її вже продала, — а ставить термінове завдання на сьогодні.

Дев’ятнадцять календарів і одна правда

Джерело правди — база SetHub, а 19 календарів Google — табло «зайнято», яке читають сайт, Peerspace і Giggster. Бронь усієї студії закриває всі 16 сетів усередині неї, будь-який сет закриває студію, а дах і майданчик з авто — лише себе. Події ставить, рухає й знімає скрипт студії щохвилини, і в них немає ні телефонів, ні пошти, ні сум. Події, які ставлять самі платформи, не дублюються: SetHub дописує до них свій блок. Накладка — це відмова всюди: у формі, в «Capture», у застосунку та в командах ШІ.

«Capture»: текст, фото, документ чи голос стають чернеткою

Що надіслали вручну — текст, знімок чека, 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; завдання можна закрити кнопкою просто в сповіщенні.

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

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

Два застосунки з однієї кодової бази

«Set Hub Team» — для співробітників: вхід за Face ID чи відбитком, знімки екрана заборонені, ключ лежить лише у зв’язці ключів цього телефона, дані клієнтів — тільки в пам’яті. Віджет «Today» і екран блокування показують час і майданчик без імен гостей і сум, а «Capture» відкривається одним дотиком із Пункту керування. «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