#Когда встречается проблема
В ленте контакта появляются идентичные заметки, хотя оператор создавал одну запись. Отличаем повтор API от нескольких разных действий. amoCRM с внешними интеграциями API; пользователь видит ленту, разработчик проверяет серверный журнал.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Отправитель повторяет POST при тайм-ауте, не проверив ответПри сетевом тайм-ауте отправляется второй POST для того же события. | Сравните request ID и созданные note ID. | Проверьте код повторов запросов |
| Одно событие обрабатывают две параллельные очередиДва обработчика очереди создают две заметки на одно событие. | Сверьте записи обработчиков по внешнему event ID. | Добавьте защиту от дублей в интеграцию |
| Заметки создаются как разные типы примечаний из нескольких источниковСходные на вид записи имеют разные типы или авторов. | Просмотрите тип и автора обеих записей в ленте. | Определите реальное число копий |
#Пошаговая диагностика и исправление
- Определите реальное число копийОткройте карточку контакта и в ленте событий найдите повторяющийся текст. Запишите время каждой записи, автора/интеграцию и различия содержимого. Скройте персональные данные на снимках. Ожидаемый результат: Зафиксировано, сколько отдельных заметок создано. Если не получилось: Если записи выглядят одинаково, но имеют разные типы, не удаляйте их до выяснения источника.
- Убедитесь, что заметка относится к контактуСкопируйте ID контакта из адреса и сравните его со связанной сделкой: примечания к контакту и к сделке — разные сущности. Переключитесь на исходную карточку и повторите поиск текста. Ожидаемый результат: Исключена ошибка просмотра одной заметки в разных карточках. Если не получилось: Если записи есть только у сделки, потребуется проверять интеграцию сделок, а не контактов.
- Сопоставьте время с источником событийПопросите владельца интеграции найти журнал за минуту появления заметок и идентификатор события входящего источника. Ищите два исходящих запроса на создание заметки для одного ID контакта, не раскрывая содержимое секретных полей. Ожидаемый результат: Понятно, был один запрос или несколько. Если не получилось: Если отправка не протоколируется, включите временно запись служебных идентификаторов без токенов и текста клиентских сообщений.
- Проверьте повтор при сетевой задержке на тестеВ тестовой среде интеграции отправьте только одно искусственное событие и сравните число созданных примечаний. Не имитируйте сетевые сбои на рабочем сервере, если это может нарушить отправку настоящих обращений. Ожидаемый результат: Один тест приводит к одной заметке. Если не получилось: Если результат плавающий, проверьте повторные задания очереди и обработчики вебхуков.
- Проверьте код повторов запросовРазработчик сверяет, как обрабатывается ответ POST
/api/v4/contacts/{entity_id}/notes: успешный ответ и созданный ID нужно сохранять до повтора. Сетевой тайм-аут не доказывает, что запись не была создана. Ожидаемый результат: Найдено место, где один запрос превращается в повтор. Если не получилось: Если изменить интеграцию нельзя, настройте временное наблюдение и передайте разработчику пример служебного события. - Добавьте защиту от дублей в интеграциюПредусмотрите на стороне отправителя уникальный ID внешнего события и сохранение результата его обработки; при повторной доставке используйте уже записанный ID примечания, а не создавайте новое. Проверяйте это сначала в тестовом аккаунте. Ожидаемый результат: Повтор одного внешнего события не создаёт вторую заметку. Если не получилось: Если система-источник не передаёт стабильный ID, согласуйте другой ключ уникальности, не используя один лишь текст.
- Проверьте сохранённые заметки и завершите проверкуПовторите два теста: одно событие и два разных события с одинаковым текстом. В первом случае должна появиться одна заметка, во втором — две. Старые дубликаты в рабочей карточке пока не удаляйте, чтобы не потерять аудит коммуникаций. Ожидаемый результат: Повторная доставка и независимые одинаковые сообщения различаются. Если не получилось: Если тест не проходит, верните предыдущую версию интеграции и зарегистрируйте ошибку с временными отметками.
#Как проверить результат
Одно внешнее событие при повторной доставке создаёт одну заметку; два самостоятельных события не теряются.
#Если проблема осталась
Сохраните точное время, версию приложения или тип учётной записи, один обезличенный пример, выполненные шаги и наблюдаемый результат. Обращайтесь в официальную поддержку сервиса или к администратору организации. Не публикуйте пароли, токены и персональные данные клиентов.