Кнопка «Отправить» создаёт у пользователя ожидание, что компания получила обращение. Если лид остался только в браузере, потерялся между сервисами или пришёл без контекста, интерфейс дал ложное подтверждение. Архитектура должна обеспечивать не эффект клика, а наблюдаемый путь до ответственного.
1. Начните с процесса, а не с API
Нарисуйте фактический маршрут одного обращения: откуда оно приходит, кто отвечает, какие решения принимаются, где меняется статус и чем заканчивается работа. Отдельно выпишите исключения: повторный клиент, дубль, неверный контакт, недоступный менеджер, возврат к отложенной сделке.
Статус должен означать факт и подсказывать следующее действие. «В работе» слишком расплывчато. «Связаться до 15:00», «ждём документы клиента» или «квалифицирован — подготовить предложение» гораздо полезнее, если они соответствуют реальному процессу.
Список источников, схема статусов, роли и права, обязательные данные, срок реакции, причины завершения и владелец каждого шага.
2. Зафиксируйте контракт данных
До интеграции согласуйте имена и смысл полей. Минимум обычно включает идентификатор запроса, время, источник, страницу, имя, контакт, сообщение, версию согласия и технический контекст. Собирайте только то, что действительно нужно для заявленной цели.
Контракт отвечает на неприятные вопросы заранее: какие поля обязательны, допустима ли пустая строка, как хранится телефон, кто нормализует UTM, где находится источник истины и что происходит с незнакомым значением. Версионирование особенно важно, когда сайт и CRM обновляются независимо.
3. Не отправляйте лид прямо из браузера во внешнюю CRM
Секретный ключ нельзя безопасно спрятать во фронтенде. Между формой и внешней системой нужен серверный слой: он валидирует ввод, ограничивает злоупотребление, добавляет служебный контекст, записывает событие и только потом вызывает CRM.
Сначала сохраните заявку в контролируемом журнале или базе, затем выполняйте внешнюю доставку. Тогда временная недоступность CRM не превращается в безвозвратную потерю. Пользовательский ответ должен быть честным: успех сообщается после принятия на сервере, а не до отправки запроса.
4. Защититесь от дублей и повторов
Пользователь может нажать кнопку дважды, браузер повторит запрос, а сервер — повторную доставку после таймаута. Без идемпотентности одна заявка создаст несколько сделок и уведомлений.
Создайте уникальный идентификатор события и передавайте его через весь контур. При повторе система должна вернуть прежний результат или безопасно пропустить обработку. Не полагайтесь только на совпадение телефона: один человек может отправить новое осмысленное обращение.
- Блокируйте кнопку на время запроса, но не считайте это серверной защитой.
- Определите окно и правило дедупликации для каждого канала.
- Повторяемые побочные эффекты — сообщения, счета, задачи — тоже требуют своего ключа.
5. Спроектируйте временный сбой
Внешний API иногда отвечает медленно, возвращает ограничение частоты или недоступен. Повторять запрос сразу и бесконечно опасно: можно усилить сбой. Используйте ограниченные повторные попытки с увеличивающимся интервалом и переводите исчерпанные события в отдельную очередь для разбора.
Таймаут не всегда означает, что внешняя система ничего не создала. Перед повтором проверьте результат по идентификатору или используйте идемпотентный API. У критических ошибок должны быть журнал, уведомление и ответственный, иначе лог лишь архивирует потерю.
6. Ограничьте данные и доступ
Форма не должна просить чувствительные сведения «на всякий случай». Доступы разделяются по ролям, секреты хранятся на сервере, журналы не содержат токены и лишние персональные данные, а резервные копии защищены не слабее основной системы.
Техническая реализация — только часть соответствия требованиям. Цели и основания обработки, сроки хранения, локальные документы и договоры с внешними обработчиками должны проверяться в конкретном юридическом контексте.
7. Сделайте путь наблюдаемым
Для каждого события нужен ответ: когда принято, какой версией обработано, куда доставлено, сколько попыток выполнено и какой идентификатор присвоила CRM. Логи связываются корреляционным ID, но не превращаются в копию клиентской базы.
Бизнес-наблюдаемость не менее важна технической. Из единых статусов должны считаться скорость первого ответа, конверсия этапов, доля необработанных лидов, причины отказа и результат по источнику. Если менеджеры обходят статусы, отчётность перестаёт отражать реальность.
8. Проверьте интеграцию end-to-end
Успешный ответ API ещё не означает работающий процесс. Отправьте тестовую заявку с публичного сайта и пройдите её глазами пользователя и менеджера. Затем повторите запрос, временно сломайте внешний канал в тестовой среде и убедитесь, что событие не потеряно.
- Валидация формы понятна и доступна с клавиатуры.
- Сервер принимает корректный запрос и отклоняет мусор.
- Повтор не создаёт непредусмотренный дубль.
- CRM получает все обязательные поля и источник.
- Ответственный видит задачу и срок.
- Ошибка записывается и вызывает действие.
- Путь результата возвращается в аналитику.
Готовая CRM или собственная?
Выбирайте не по моде. Готовая CRM выигрывает, если её модель и права соответствуют процессу, команда принимает интерфейс, а интеграции не требуют постоянных обходов. Собственная система оправдана, когда процесс создаёт конкурентное преимущество, типовые ограничения критичны и есть ресурс на сопровождение.
В обоих случаях сначала нужен контракт процесса. Если хотите спроектировать его вместе и внедрить связку, посмотрите CRM и автоматизацию заявок.