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

Проследите один ответ по трём идентификаторам: внутренний conversation_id, внешний chat/contact id и tenant_id. Связь должна быть явной и проверяться перед отправкой.

Что сделать в первую очередь

  • Приостановите автоматическую отправку в проблемном канале.
  • Сохраните ID диалога, сообщения и менеджера.
  • Определите диапазон возможных ошибочных отправок.
  • Проверьте, не было ли объединения или переноса контактов в CRM.

Почему возникает проблема

Ошибки маршрутизации появляются при поиске диалога по телефону, последнему сообщению или неуникальному внешнему ID.

  • Номер нормализуется по-разному при входящем и исходящем сообщении.
  • Внешний chat id не разделён по подключённым аккаунтам.
  • Менеджер отвечает из старой вкладки, а интерфейс подменил активный диалог.
  • Очередь хранит ссылку на изменяемый объект.
  • Webhook повторно создаёт или объединяет контакт.

Пошаговая диагностика

  • Постройте цепочку inbound webhook — conversation — outbound request.
  • Проверьте уникальные ограничения в таблице диалогов.
  • Сравните payload двух клиентов с похожими телефонами.
  • Проверьте параллельные ответы нескольких менеджеров.
  • Найдите момент, когда conversation_id стал соответствовать чужому контакту.

Как исправить

Исходящее сообщение должно адресоваться по неизменяемому идентификатору диалога и проходить серверную проверку владельца.

  • Храните составной ключ provider_account_id и external_chat_id.
  • Перед отправкой проверяйте tenant, контакт и активность канала.
  • Передавайте в очередь неизменяемые ID, а не сериализованный объект контакта.
  • Добавьте версию или блокировку при объединении диалогов.
  • Показывайте менеджеру получателя в подтверждении для чувствительных действий.

Как проверить результат

  • Два параллельных тестовых диалога не смешивают ответы.
  • Повторный webhook не создаёт вторую связь.
  • Ответ из старой вкладки либо корректен, либо блокируется.
  • Аудит фиксирует менеджера, conversation_id и внешний message id.

Как не допустить повторения

  • Добавьте интеграционные тесты нескольких каналов и tenants.
  • Запретите неуникальные внешние ключи.
  • Мониторьте несоответствие контакта и канала.
  • Ограничьте хранение полного текста сообщений в логах.

Чего не стоит делать

  • Не исправляйте вручную одну запись без анализа соседних сообщений.
  • Не маршрутизируйте ответ по отображаемому имени клиента.
  • Не возобновляйте отправку без параллельного теста.

Что подготовить для диагностики

  • ID ошибочного сообщения и диалога.
  • Обезличенные webhook и исходящий запрос.
  • Схема таблиц контактов и каналов.
  • Информация о недавнем объединении контактов или обновлении.

Частые вопросы

Достаточно ли использовать номер телефона?

Нет. Один номер может встречаться в разных каналах и аккаунтах, а формат меняется; нужен внешний ID в контексте подключения.

Как исключить ответ из устаревшей вкладки?

Перед отправкой сервер повторно проверяет версию диалога и его принадлежность, а интерфейс обновляет активный контекст.

Когда стоит обратиться за помощью

Если уже были ошибочные отправки, требуется не только исправление кода, но и определение затронутого диапазона по журналу операций.

Итог

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