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

SetHub CRM — операційна система знімальної студії

Веб-CRM, у якій студія в Даунтауні Лос-Анджелеса веде все: броні з чотирьох каналів, запити, завдання команди, гроші, листування з гостями й дев’ятнадцять календарів. Листи платформ, оплати Stripe і повідомлення в Telegram самі стають записами, звичайний текст розбирається без ШІ, а ChatGPT і Claude працюють із даними в межах тих самих прав, що й люди.

  • Next.js 16 · React 19
  • TypeScript strict
  • PostgreSQL 16 · Prisma 6 · pg_trgm
  • Stripe · Gmail · Google Calendar
  • MCP · OAuth 2.1

У цифрах

43таблиці й 50 міграцій — від броні та виплати платформи до запису зустрічі
836автотестів у 74 файлах: кожна функція перевіряється на тимчасовій базі Postgres
26команд для ChatGPT і Claude через MCP — і жодна нічого не видаляє
1292рядки словника інтерфейсу: уся CRM англійською та російською

Завдання

До CRM студія жила в таблиці та в пошті. Броні Peerspace і Giggster приходили листами, оплати з сайту — у Stripe, прямі броні — повідомленнями менеджерові, запити — в Instagram. Щоб відповісти, чи вільний Victorian Set у суботу, треба було зазирнути в чотири місця. Гроші зводили вручну наприкінці місяця, особисті витрати власника змішувалися з витратами бізнесу, завдання губилися в чатах, а терміни зсувалися мовчки. Ціна помилки тут — не опечатка, а дві знімальні групи біля одних дверей і гроші, яких ніхто не помітив.

Що всередині

Дашборд власника: беззбитковість у реальному часі

Головний екран показує, скільки студія заробила цього місяця порівняно з витратами бізнесу і де проходить лінія беззбитковості. Виторг — лише броні, що відбулися; підтверджені майбутні йдуть окремим рядком «заброньовано наперед», щоб не видавати бажане за зароблене. Особисті витрати власника зберігаються з окремою позначкою й у P&L бізнесу не потрапляють — їх бачить лише він. Нижче — помісячний підсумок, завантаження й виторг кожного з 19 місць, частки каналів.

Накладка — це відмова, а не попередження

Перетин броней перевіряє одна функція для всіх входів: форма, «Capture», застосунок, листи платформ і команди ШІ. Уся студія закриває 16 сетів усередині неї, будь-який сет закриває студію, а дах і майданчик з авто — лише себе. Свідома накладка можлива лише кнопкою «Зберегти все одно», і форма при цьому не втрачає введеного. Уже наявні перетини збираються червоним блоком над списком броней. Оплата змінюється окремими кнопками — завдаток, решта, повернення, — а «Зберегти» її не чіпає.

«Capture»: будь-яке повідомлення — чернетка запису

Текст, фото чека, PDF, голосове, файл Word — одне вікно для всього. Звичайний текст розбирають правила, без ШІ: дату, час, суму й завдаток, контакти, майданчик, джерело, співробітника, відомого клієнта; вгадане підсвічується, а впевненість показано у відсотках. Модель потрібна лише для того, чого немає текстом: голосу, знімків і сканів. Те саме повідомлення від тієї самої людини протягом десяти хвилин поверне вже заведене, а не створить дубль. Нічого не записується, доки людина не підтвердить.

Робоче місце менеджера: що зробити просто зараз

Запит отримує номер SH-xxxx і йде етапами: новий, у розмові, чекаємо завдаток, підтверджений, завершений або втрачений. Рівень уваги не зберігається, а обчислюється: клієнт відповів — «дайте відповідь», завдаток прострочено на два дні, немає наступного кроку — усе червоним і на верх черги. Тим самим правилом рахується число в меню, тому воно ніколи не розходиться зі списком. Для огляду — дошка з перетягуванням карток між етапами.

Завдання, терміни яких не зсуваються мовчки

Термін і виконавця ставлять власник і менеджер; співробітник термін не змінює, а просить перенести його з новою датою й причиною — заборона стоїть на сервері, а не у формі. У завдання є контрольні точки: менеджер позначає їх виконаними або пропущеними, виконавець пише пояснення, а позначене вже не редагується. Нагадування приходять за годину до терміну, при простроченні й щоранку з 9 до 20 за годинником студії. Люди різняться кольором, завдання групуються за виконавцем із лічильником «у роботі · готово».

Стійкий до опечаток пошук за десяті частки секунди

⌘K шукає одразу серед клієнтів, броней, запитів, завдань і витрат: початок слова, входження й триграмна схожість pg_trgm — «victorain» знайде Victorian. Телефон знаходиться за цифрами в будь-якому форматі, дата — у будь-якому вигляді: «11/5», «5 ноя», «Nov 5», сума — з доларом і без. Результат відкривається вікном поверх сторінки: зміни зберігаються на місці, набране у формі під вікном не зникає, а права ті самі, що й у сторінки.

Платформи й оплати — без участі людини

Скрипт у пошті студії кожні п’ять хвилин пересилає листи Peerspace і Giggster: «заброньовано» дає оплачену бронь із комісією платформи та виплатою студії, перенесення рухає вже заведену, скасування знімає, а виплата звіряється за гостем і сумою. Сама записується лише бронь із листа, який пройшов перевірку DMARC і прочитаний повністю. Оплата Stripe приходить вебхуком із перевіркою підпису HMAC і перетворюється на бронь із рядками рахунку — за що саме заплатив гість.

Сповіщення: кожному — своє, його мовою

Кожна дія записується в журнал і перетворюється на рядки сповіщень для тих, кому вони потрібні за роллю: менеджерові — нові запити, виконавцеві — його завдання, власникові — усе, крім власних дій. Рядки накопичуються, доки не мине хвилина тиші, і йдуть одним листом; push у браузер шифрується за стандартом Web Push без сторонніх бібліотек; у Telegram — одним повідомленням із кнопкою. Мова за замовчуванням — англійська, російська — на вибір людини.

ШІ-помічники через MCP — з тими самими правами, що й у людини

ChatGPT і Claude підключаються до CRM як до сервера MCP із входом через OAuth 2.1: PKCE S256, білий список адрес повернення, ротація ключів оновлення, а повторне використання вже заміненого ключа вважається крадіжкою й гасить доступ повністю. 26 команд — броні, завдання, клієнти, запити, витрати — перевіряють ті самі ролі, що й сторінки, і видалення немає в жодній. Зміна пароля, ролі чи вимкнення облікового запису гасить сесії браузера, ключі телефонів і доступи ШІ.

Екрани

Дашборд власника: прибуток місяця проти лінії беззбитковості й помісячний підсумок
Дашборд власника: прибуток місяця проти лінії беззбитковості й помісячний підсумок
Календар місяця для всіх 19 місць: крапки — броні дня, праворуч — розклад вибраного дня
Календар місяця для всіх 19 місць: крапки — броні дня, праворуч — розклад вибраного дня
Черга менеджера: увага обчислюється — «клієнт відповів», «завдаток прострочено», «немає наступного кроку»
Черга менеджера: увага обчислюється — «клієнт відповів», «завдаток прострочено», «немає наступного кроку»
Дошка запитів: картки переходять між етапами перетягуванням, сума й наступний крок на виду
Дошка запитів: картки переходять між етапами перетягуванням, сума й наступний крок на виду
Заявка з Instagram стала чернеткою броні: поля розібрали правила, без ШІ
Заявка з Instagram стала чернеткою броні: поля розібрали правила, без ШІ
Завдання за людьми й категоріями: прострочені — червоним, наступна контрольна точка просто в рядку
Завдання за людьми й категоріями: прострочені — червоним, наступна контрольна точка просто в рядку
⌘K: клієнти й броні за одним запитом, збіг підсвічено
⌘K: клієнти й броні за одним запитом, збіг підсвічено
Бронь відкрита вікном над дашбордом: редагування без переходу й без утрати набраного
Бронь відкрита вікном над дашбордом: редагування без переходу й без утрати набраного
Листування з гостем: відповідь іде йому листом після пари хвилин тиші
Листування з гостем: відповідь іде йому листом після пари хвилин тиші

Технології

Next.js 16 на App Router і серверних діях, React 19, TypeScript у суворому режимі — близько 60 тисяч рядків разом із застосунками. PostgreSQL 16 через Prisma 6: 43 таблиці, 50 міграцій, кожне розгортання застосовує їх під час запуску, а перед будь-якою міграцією робиться копія бази з перевіркою відновленням. Пошук — розширення pg_trgm і запити на сирому SQL з вагами полів. Час усюди зберігається «за годинником студії» й порівнюється з «зараз» Лос-Анджелеса, а не сервера: броні, терміни й межі місяця не з’їжджають під час переведення годинника.

Усі 836 автотестів піднімають тимчасову базу Postgres і перевіряють функцію повністю — від запису до сповіщення. Права живуть в одному модулі ролей, який використовують сторінки, дії сервера, 73 маршрути API і команди ШІ: схована кнопка захистом не вважається. Пошта, календарі й платежі підключені без посередників: скрипт Google у скриньці студії, календарі Google через службовий обліковий запис, вебхук Stripe із перевіркою підпису. Відео на головній сторінці сайту студія змінює сама: ролик стискається в браузері в H.264, сервер перевіряє файл побайтово.

Потрібна CRM під ваш процес?

Розкажіть, звідки приходять замовлення і де вони губляться. Почнемо з одного вузького місця — у Set Hub це були листи платформ, — а решта виросте довкола.

WhatsApp