Каждая ночь проверяется отдельно
Сайт открывает даты, если на каждую ночь есть свободный бокс нужного типа. Один бокс на весь срок для этого не нужен. Строка внизу показывает, сколько «Премиумов» свободно в каждую ночь.
Собственный бизнес · Краснодар
Гостиница для кошек в Краснодаре и мой собственный бизнес. Сайт, CRM, звонки и реклама здесь работают как одна система, которую я разрабатываю.

Ниже я провожу одну бронь через всю систему: от клика по рекламе до оплаты. Тиша и его хозяйка вымышлены. Экраны CRM настоящие, но сняты на демонстрационной базе, а правила и тексты уведомлений взяты из кода.
За вопросом есть места на шесть ночей?
стоят тарифы, календарь боксов, переезды, звонки и реклама. Я собрал это в одну цепочку, где данные не теряются между этапами.
Метки Директа и ClientID Метрики запоминаются при заходе с рекламы и уходят вместе с заявкой: в CRM, в уведомление и обратно в Метрику. Так видно, какая реклама приводит оплаченные брони, а не только клики.
В броньyclid, UTM и ClientID
Что это, сколько стоит и есть ли места на мои даты: ответы видны сразу. Около 78 % визитов приходят со смартфонов, так показывала Метрика, когда я переделывал первый экран. Поэтому на телефоне даты выбираются в шторке снизу, а окно расчёта помещается даже на экран 320 × 568 без внутренней прокрутки.


В броньпосетитель считал стоимость ×2
Ставка зависит от номера и длины проживания, вторая кошка добавляет половину, ранняя бронь снимает ещё 10 %. Считает только сервер: если он не ответил, сайт не покажет «примерную» сумму, которая потом не совпадёт с CRM.
Цены по тарифу от 2 сентября 2026 года. Каждая бронь помнит свою версию тарифа, поэтому смена цен не пересчитывает старые брони; с апреля таких версий было шесть. С октября можно задать праздничную цену ночи на конкретные даты.
В бронь2 970 ₽ с ранней бронью
Это боксы. В CRM каждый становится строкой календаря, а каждая ночь столбцом.
Октябрь в примере почти полон. Тиша просится на 9–15 октября. Каждую ночь какой-нибудь «Премиум» свободен, но ни один не свободен все шесть подряд. Простой календарь ответил бы «мест нет».
Сайт открывает даты, если на каждую ночь есть свободный бокс нужного типа. Один бокс на весь срок для этого не нужен. Строка внизу показывает, сколько «Премиумов» свободно в каждую ночь.
С первой ночи подходят два бокса: Б2 свободен одну ночь, Б3 три. Алгоритм выбирает тот, что свободен дольше, и держит его, пока серия не кончится.
С 12 октября дольше всех свободен Б6. Выходит один переезд, и меньше не бывает: жадный выбор самой длинной серии даёт минимум переездов, это классическая задача о покрытии отрезка.
«Б3 (09.10–12.10) → Б6 (12.10–15.10)» появляется в карточке брони и пунктиром в календаре, а при подборе из CRM приходит ещё и в Telegram. Для хозяйки Тиши это просто свободные даты.
Попробуйте сами: нажмите на первую ночь, затем на последнюю.

В броньмаршрут Б3 → Б6, один переезд
Мобильная связь в гостинице нестабильна, поэтому сайт сообщает о намерениях. Нажали на телефон, открыли Макс или Telegram: сотрудник получает сообщение с источником и тем, что человек уже делал на сайте. Это сигнал быть на связи, а не подтверждение звонка.
Ушки · уведомлениябот
📞 Нажали на номер телефона — возможно, скоро позвонят.
• Страница: /
• Источник: Яндекс Директ · zoogostinica_krasnodar
• Устройство: смартфон
Этот посетитель за сутки: считал стоимость ×2, открывал форму заявки
🐾 Новая заявка на бронирование
Бронирование:
• Даты: 09.10.2026 - 15.10.2026
• Номер (выбор клиента): Премиум
• Бокс: Б3 (подобран автоматически)
• Ночей: 6
• Статус: Заявка
Финансы:
• Предварительная сумма: 2 970 ₽ (предварительно)
• Клиент видел на сайте: 2 970 ₽ (Премиум)
С 24 по 27 сентября прокси перестал пропускать Telegram, и три дня уведомления не доходили. Никто об этом не знал. Теперь каждая неудачная отправка считается: на всех страницах CRM висит красный баннер, а со второй ошибки подряд владельцу уходит SMS, не чаще раза в шесть часов. Баннер исчезает сам после первой успешной отправки.

Клиент может получать статусы брони в Макс. Бот не может написать первым, поэтому ссылка в окне «Заявка принята» передаёт ему номер брони с подписью: чужую бронь по такой ссылке не привязать.
В броньстатус «Заявка» и бокс Б3
У сайта, Яндекс Карт и 2ГИС свои номера, поэтому канал звонка известен заранее. Запись скачивается, Whisper её расшифровывает, а GPT по строгой JSON-схеме раскладывает разговор по репликам, ставит итог и пишет, что сделать дальше.


Если клиент не дозвонился, приходит 🔴. Пока никто не связался, раз в час с 9 до 21 приходит напоминание ответом на исходное сообщение, не больше пяти. После разговора все эти сообщения переписываются в ✅ с итогом из разбора звонка.
🔴 Клиент не дозвонился✅ Связались с клиентом
+79000000150
Звонок: 12.10.2026 10:52 · 2ГИС
Нужно связаться с клиентом.Дозвонились: Ольга
Разговор: 2:41
Итог разговора: Записан
🔴 Клиент не дозвонился
⏰ Нужно связаться с клиентом
Обращение открыто 1 ч.
Напоминание 1-е.✅ Связались с клиентом
Дозвонились: Ольга
В переписке с Авито работали подсказки ответов: GPT получал последние восемь сообщений, свободные даты и тариф и предлагал два-три варианта. Если менеджер уже ответил, подсказок нет. Сейчас канал на паузе: для API мессенджера Авито нужна платная подписка.
В броньитог «Записан», статус «Подтверждено»
Сводка «Сегодня» собирает заезды, выезды и тех, кому нужно перезвонить. Карточка брони показывает маршрут по боксам и сумму. С телефона доступен тот же день, только короче.



С телефона
Заезды, выезды и проживающие на выбранный день. Бокс показывается по сегменту: в день переезда Тиша уже в Б6.
В бронь«Заехал» 9 октября, переезд 12 октября
Когда бронь создана и когда оплачена, CRM отправляет офлайн-конверсию в Метрику: с yclid или ClientID и суммой. В стратегии Директа цели из CRM стоят приоритетными, поэтому реклама учится на настоящих бронях, а не на кликах.
21 деньза это время оплата связывается с рекламным визитом
Каждый день по просьбе «разбери вчера» Claude через API смотрит расходы, поисковые запросы и цели, добавляет минус-слова и правит ставки. Каждое изменение вместе с причиной попадает в журнал рекламного кабинета. За три месяца там набралось больше 160 записей.
Записи на снимке демонстрационные: в настоящих есть бюджеты и ставки.

В броньоплачено, конверсия в Метрике
автотестов PHPUnit: бронирование, цены, звонки, уведомления и страницы сайта. Ещё 28 проверяют маску телефона и 5 защищают деплой.
Деплой сравнивает файлы по SHA1, выкладывает только изменённые и перед этим делает резервную копию базы.
Груминг на паузе: витрина отдаёт 404, админка работает, статьи из поиска открываются по прямым ссылкам.
Все «ошибки формы» за месяц оказались проверками роботов Яндекса. Фильтр нарочно узкий, чтобы не отсечь телефоны CUBOT и приложение Яндекса.
Каждые 5 минут напоминания о недозвонах, каждые 10 обработка записей, каждые 30 сверка с отчётом АТС.
231 маршрут
37 моделей
68 миграций
Давайте знакомиться
Нужен технический партнёр, помощь команде или решение для рабочего процесса? Расскажите, что хотите изменить — обсудим, чем я могу помочь.
@work_ilyaЛично мне в Telegram