Подбор строго по базе
Десять книг заказчика (анимация, шоу, квесты, подростковые программы, тимбилдинги, welcome-зона, площадка, прайсы) собираются в единую базу импортёром, который проверяет полноту и отдаёт отчёт о пробелах. Система не имеет права назвать услугу, которой нет в базе, или цену, которой нет в прайсе.
Считает код, а не текст
Калькулятор сметы знает аренду площадки, обязательные и необязательные позиции, ставки за исполнителя в час и минимальный состав праздника. Отдельная логика: ставка это не готовая стоимость, и пока не известен масштаб зоны, сумма не складывается. Такие вещи решает код.
Двадцать сторожей на выходе
Главное архитектурное решение проекта. Перед отправкой ответ проходит два десятка детерминированных проверок: вывод о деньгах без расчёта, цена без «от», два вопроса в одном сообщении, подаренный платный блок, услуга не по возрасту, перевранное название карточки, выбор, сделанный за клиента, путаница в роде ребёнка. Замечание возвращается, ответ переписывается и проверяется заново, до трёх кругов. Если замечание про деньги осталось, ответ не уходит вовсе, вместо него передача менеджеру.
Правила живут в таблице заказчика
Поведение и формулировки возражений в его Google-таблице: строка это правило. Добавить правило значит дописать строку. Обязателен ли технический час на площадке, заказчик менял три раза, теперь это переключатель в его таблице, а не правка кода.
Три уровня «кто сейчас говорит»
Общий выключатель смены и персональный у каждого менеджера, потому что сотрудники заканчивают в разное время. Менеджер ответил клиенту сам, система в этом чате замолкает до новой смены: слово менеджера всегда приоритет. Галочка в сделке amoCRM сильнее любых настроек телеграма. Плюс человеческий интерфейс прямо в телеграме: список клиентов с кнопками, где включено, а где нет.
Мирное сосуществование с Wazzup
В тех же телеграмах уже работал Wazzup, который на каждое входящее сам заводит контакт и сделку. Две системы гонялись за одним клиентом и плодили дубли. Решено без просьб что-то отключать: система узнаёт чужой контакт по его собственным полям, подхватывает созданную им сделку и дописывает в неё свои. А на первом сообщении намеренно уступает первый ход, сначала отвечает клиенту и только потом идёт в CRM, за эти секунды Wazzup успевает создать сделку, и переписка ложится в ту же карточку.
Дисциплина тестирования
Правило проекта: нашли баг, сначала тест, потом починка. Каждый живой сбой из переписки с реальными клиентами превращён в регрессионный тест. Полный ход диалога прогоняется с поддельным ответчиком, интеграции с поддельным транспортом: 810 проверок идут за секунды, без сети и без единого ключа от внешних сервисов.
Эксплуатация
Служебные команды для диагностики: состояние смены, список подключений с правами, чаты где система молчит и по чьей вине, последние события с причинами. Разбор любого «почему не ответило» занимает одну команду вместо получаса догадок.