AI18 октября 2026 г.4 мин

Двойная заявка с AI-лендинга: где искать повтор

Разбираю дубли заявок по цепочке браузер → обработчик → CRM. Как воспроизвести повтор и проверить защиту при двойном клике и тайм-ауте.

Обложка статьи: Двойная заявка с AI-лендинга: где искать повтор

Две одинаковые заявки не всегда означают, что посетитель дважды нажал кнопку. Повтор может появиться в обработчике, очереди доставки или интеграции с CRM. Я бы искал его по цепочке одного действия, начиная с браузера.

Эта проверка нужна после сборки лендинга с Claude Code, когда форма уже отправляет данные. Общий список приёмки полезен до запуска, а здесь задача узкая: найти место размножения одной заявки и доказать, что исправление его закрыло. Используйте согласованное тестовое окружение и синтетические контакты.

У одной попытки должен быть след

Добавьте в тестовую заявку узнаваемую метку, например TEST-DOUBLE-A. Зафиксируйте время, адрес страницы и ожидаемого получателя. В браузере откройте Network, включите сохранение журнала при переходах и отправьте форму один раз. Отфильтруйте запросы к обработчику. Считать нужно фактические запросы, а не вспышки индикатора загрузки.

Потом найдите ту же метку в серверном журнале и CRM. В журнале достаточно технического идентификатора попытки и статуса; копировать телефон, почту и полный текст заявки в диагностический отчёт не требуется. Если у разных систем свои ID, сохраните соответствие между ними.

Диагностическая карта; количества условные
БраузерОбработчикCRMКуда смотреть
2 запроса2 создания2 записиДвойной обработчик, клик и submit одновременно
1 запрос2 создания2 записиПовтор исполнения или повторная доставка внутри сервера
1 запрос1 создание2 записиИнтеграция, очередь, несколько получателей
2 запроса1 создание1 записьСервер подавил повтор; проверить ответ второй попытки

Что исправляет блокировка кнопки

На время отправки кнопка должна показывать понятное состояние и не запускать новую попытку. Проверьте обычный клик, Enter в поле и нажатие с клавиатуры. Если код отправляет запрос одновременно через onClick кнопки и onSubmit формы, блокировка одного пути может оставить второй. Предпочтительнее одна точка запуска отправки.

Но кнопка контролирует только текущий интерфейс. Обновление страницы, повтор сети или второй клиент могут обойти её состояние. MDN объясняет, что одинаковые POST-запросы могут иметь дополнительные последствия, например создавать новые записи. Сам метод POST не обещает защиту от дублей.

Сервер различает повтор и новую заявку

Практический вариант — идентификатор логической отправки. Первая попытка создаёт запись и сохраняет результат вместе с ключом. Повтор с тем же ключом возвращает результат той же операции. Создание записи и закрепление ключа должны работать согласованно, иначе два одновременных запроса успеют пройти проверку «ещё нет».

Ключ нельзя каждый раз генерировать заново внутри повторного сетевого запроса: тогда сервер увидит разные операции. А одинаковый ключ с другим содержанием нужно считать конфликтом. Срок хранения ключей, границы повторной попытки и поведение после успешной отправки задаёт разработчик под сценарий продукта.

Склейка всех обращений по телефону — другое правило. Человек может законно оставить новую задачу завтра. Поэтому дедупликацию технической отправки отделяйте от правила подсчёта лидов в CRM. Один контакт, одна попытка и одна коммерческая возможность — разные сущности.

Самый полезный тест — ответ потерялся

  1. В тестовом окружении отправьте заявку и искусственно задержите ответ после создания записи.
  2. Дождитесь сообщения о тайм-ауте и повторите действие предусмотренным способом.
  3. Проверьте, сохранился ли идентификатор логической отправки.
  4. Найдите записи у конечного получателя и сравните их ID.
  5. Убедитесь, что интерфейс сообщает итог, а не оставляет человека с бесконечным ожиданием.

Сценарий «сервер записал, браузер не получил ответ» отличается от сценария «сервер не принял данные». Именно здесь повтор без защиты часто создаёт вторую запись. Если нельзя уверенно определить результат, интерфейс должен честно предложить проверку статуса либо контролируемый повтор. Тексты таких состояний разобраны в карте ошибок формы.

Для передачи исправления сохраните последовательность действий, число запросов и ID конечных записей. Настройки обработчика передавайте по карте окружения без секретов. Фраза «поставил disabled» описывает изменение кода. Проверенная одна запись после повторной попытки описывает результат.

Ещё по теме