#Когда возникает проблема и к чему относится
Проверяем нормализацию телефонов, повторные отправки формы, сопоставление по email и логику интеграции, создающей контакт вместо связи с существующим. Подходит для встроенных форм amoCRM и сторонних сайтов с API-интеграцией. Поведение поиска дублей зависит от способа создания: рекомендации по импорту файла не следует автоматически переносить на API формы.
#Как отличить основные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Форма отправляет запрос дваждыДвойной обработчик кнопки или повтор запроса после тайм-аута создаёт одинаковые события. | Дубликаты имеют одинаковое время создания | Проверить повторный POST и защиту от повторов |
| Телефон записан в разных форматахПробелы, код страны, добавочные и email требуют осторожного сопоставления. | Контакты выглядят одинаково, но номера отличаются префиксом | Нормализовать сравнение на стороне интеграции |
| Интеграция всегда создаёт контактНекоторые внешние модули не запрашивают существующий контакт либо не привязывают сделку к нему. | Одна форма приводит к новому контакту даже при существующем email | Сверить поиск перед созданием |
#Пошаговая диагностика и решение
- Сохраните примеры дублей до измененийВ «Контактах» откройте два повторяющихся контакта, запишите их ID, дату создания, связанные сделки и варианты телефона/email. Выясните, поступили ли они из одного источника или из разных форм. Не объединяйте сразу: карточки могут принадлежать разным людям с одинаковым рабочим номером.
- Проведите один тест на своей формеВведите в форму разрешённые тестовые данные, отправьте один раз и дождитесь сообщения об успешной отправке, затем в «Контактах» найдите тестовый телефон и email. Если появилось две новые карточки с одинаковым временем, проверьте, не срабатывает ли кнопка дважды и нет ли двух подключённых модулей.
- Проверьте обработчики отправки на сайтеАдминистратор сайта проверяет, включены ли одновременно стандартный модуль CRM, отдельный скрипт и обработчик конструктора формы. В журналах сайта сопоставьте время, ID заявки и число HTTP-запросов. Если уходят два POST, отключайте один из дублирующих маршрутов в тестовой версии сайта, не отключая сбор всех живых заявок.
- Сравните точные контактные данныеВ первой и второй карточках проверьте номер целиком, включая код страны, дополнительные номера, пробелы и email. Внешняя интеграция должна сравнивать нормализованный номер и адрес, но не объединять людей только по совпадению имени. Создайте согласованный единый формат ввода телефона в форме и проверяйте корректность международных номеров.
- Проверьте логику поиска через APIЕсли используется собственная интеграция, попросите разработчика перед созданием контакта искать существующий по разрешённым идентификаторам, затем привязывать новую сделку к найденному ID. Проверьте контроль гонки запросов и повторов после тайм-аута: одинаковый ID заявки на сайте не должен порождать два контакта. Не публикуйте OAuth-токены.
- Различите результат стандартной формы и импортаЕсли дубли возникли только при загрузке CSV, откройте «Контакты» → «Импорт» и проверьте правила объединения и обновления, отдельно от сайта. Если они появляются именно от веб-формы, настройки поиска дублей CSV могут ничего не изменить. Исправляйте тот канал, который реально создаёт записи.
- Проверьте исправление на повторной отправкеПосле изменения в тестовой среде отправьте форму с тестовым номером два раза и отдельно один раз с другим адресом. Убедитесь, что для известного клиента повторная заявка связана с существующим контактом, а независимый новый клиент не склеен ошибочно. Удаление и объединение исторических дублей оформите отдельной согласованной процедурой.
#Как убедиться, что проблема решена
Два корректных тестовых обращения от одного человека не создают лишние контакты; разные люди остаются разными карточками, заявки сохраняются.
#Если исправление не помогло
При повторе покажите разработчику ID формы/заявки, время двух запросов и идентификаторы созданных контактов без передачи личных данных клиентов.