Отправка ответа не тому клиенту — критическая ошибка изоляции диалогов. До исправления лучше ограничить проблемный канал, потому что повторная отправка может раскрыть персональные или коммерческие данные.
Проследите один ответ по трём идентификаторам: внутренний 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 с мессенджером, устранить смешивание диалогов и добавить аудит отправок.