Как подключить CRM к омниканальному инбоксу через вебхуки
Как подключить CRM к омниканальному инбоксу через вебхуки: события, идемпотентность, повторы, сопоставление контактов, приватность и референсная архитектура.
Автор: OmniChannels.ai Editorial Team · Проверил: BroadNet Messaging Solutions Team
Интеграции
Короткий ответ
Чтобы подключить CRM к омниканальному инбоксу, подпишитесь на вебхуки инбокса для событий диалогов и сообщений. Принимайте их на небольшом endpoint, который проверяет подпись и сохраняет каждое событие один раз по его ID. Затем обрабатывайте события асинхронно: сопоставляйте отправителя с контактом CRM по нормализованному номеру телефона, адресу электронной почты или ID в соцсети и записывайте активности обратно. В обратном направлении используйте API инбокса, чтобы отправлять сообщения или менять ответственного из сценариев CRM.
На этой странице
- Какими данными должны обмениваться CRM и омниканальный инбокс?
- На какие события вебхуков стоит подписаться?
- Как построить надёжный приёмник вебхуков?
- Как сопоставлять контакты между каналами?
- Как обеспечить приватность данных при интеграции с CRM?
- Как выглядит референсная архитектура?
- Пример из практики: группа клиник в Джидде
- Какие ошибки встречаются чаще всего?
- Чем помогает OmniChannels.ai
Главное
- Вебхуки передают события из инбокса в CRM почти в реальном времени, а API забирает данные или запускает действия в обратном направлении. Надёжная интеграция использует и то и другое.
- Доставка вебхуков обычно работает по принципу at-least-once (как минимум один раз), поэтому получатель должен дедуплицировать события по ID и учитывать, что они могут приходить не по порядку.
- Подтверждайте приём вебхуков быстро, а работу с CRM выполняйте в фоновой очереди: медленные вызовы CRM не должны вызывать повторные отправки и дубликаты.
- Сопоставляйте контакты по нормализованным идентификаторам, таким как номера телефонов в формате E.164 и адреса электронной почты в нижнем регистре, и никогда не объединяйте записи только по имени.
- Передавайте в CRM только нужные ей данные, не храните там текст сообщений, если достаточно краткого содержания, и соблюдайте применимое законодательство о защите данных, например GDPR или законы о защите данных ОАЭ и Саудовской Аравии.
Это руководство для CTO, архитекторов решений и администраторов CRM, которым нужно, чтобы CRM и омниканальный инбокс показывали единую картину клиента. Здесь объясняется, какие события синхронизировать, как построить приёмник вебхуков, устойчивый к повторам и дубликатам, как сопоставлять контакты в WhatsApp, Instagram и электронной почте и какие правила приватности влияют на архитектуру.
Какими данными должны обмениваться CRM и омниканальный инбокс?
Инбокс должен сообщать CRM, кто обратился, по какому каналу, по какому вопросу и с каким результатом. CRM должна сообщать инбоксу, кто этот клиент, кто за него отвечает и какой контекст нужен операторам.
| Направление | Данные | Типичное применение |
|---|---|---|
| Инбокс → CRM | Новый диалог, канал, идентификаторы контакта | Создание или обновление контакта, запись активности |
| Инбокс → CRM | Смена ответственного и статуса, закрытие диалога | Обновление хронологии обращения или сделки, отчёт о времени обработки |
| Инбокс → CRM | Статус доставки исходящих шаблонов | Отслеживание результатов кампаний или уведомлений |
| CRM → инбокс | Имя контакта, язык, ответственный по аккаунту, уровень клиента | Маршрутизация и персонализация |
| CRM → инбокс | Триггер отправки одобренного шаблона | Обновления по заказу, записи или обращению |
| CRM → инбокс | Смена ответственного | Маршрутизация постоянных клиентов к их аккаунт-менеджеру |
Начните с минимального набора, который поддерживает реальный рабочий сценарий. Синхронизировать тексты всех сообщений в CRM нужно редко, а риски для приватности при этом растут.
На какие события вебхуков стоит подписаться?
Подписывайтесь на события жизненного цикла, а не только на сообщения. Точные названия событий на разных платформах отличаются, поэтому сопоставьте их со следующими категориями:
- Диалог создан — первое сообщение клиента в любом канале.
- Сообщение получено — входящее сообщение клиента с каналом и идентификатором отправителя.
- Сообщение отправлено — исходящее сообщение оператора или шаблон.
- Статус сообщения — отправлено, доставлено, прочитано или не доставлено, если канал сообщает об этом.
- Диалог назначен — изменился ответственный или очередь.
- Диалог закрыт или открыт повторно — смена статуса.
- Контакт обновлён — в инбоксе изменились идентификаторы или атрибуты.
В случае WhatsApp вебхуки самой Meta передают платформе входящие сообщения и обновления статусов исходящих сообщений, а ваш провайдер инбокса затем отдаёт вашим системам собственные события.
Как построить надёжный приёмник вебхуков?
Принимайте быстро, проверяйте, сохраняйте один раз, обрабатывайте позже. Большинство проблем с доставкой возникает из-за того, что работа с CRM выполняется внутри самого запроса вебхука.
Пошаговая схема приёмника
- Откройте один HTTPS endpoint для каждого окружения, например
/webhooks/inbox. - Проверьте подлинность. Проверьте подпись (обычно это HMAC от исходного тела запроса с общим секретом, как определено в RFC 2104) или токен, который описывает отправитель. Вычисляйте её по исходным байтам до разбора JSON.
- Проверьте актуальность. Если передаётся временная метка, отклоняйте события за пределами короткого допуска, чтобы ограничить повторное воспроизведение.
- Дедуплицируйте. Вставляйте ID события в таблицу с ограничением уникальности. Если вставка не удалась, потому что ID уже существует, верните успешный ответ и остановитесь.
- Поставьте в очередь. Поместите событие в очередь и сразу верните ответ 2xx.
- Обрабатывайте асинхронно. Воркер читает очередь, сопоставляет контакт и записывает данные в CRM через upsert.
- Повторяйте с задержкой. Если CRM недоступна, повторяйте попытки из своей очереди с экспоненциальной задержкой (backoff) и не рассчитывайте на повторные отправки со стороны отправителя.
- Используйте очередь недоставленных событий. После нескольких неудач переместите событие в dead-letter queue и оповестите сотрудника.
- Сверяйте данные. Запускайте периодическую задачу, которая сравнивает недавние диалоги инбокса с записями CRM и восполняет пропуски через API инбокса.
Почему важны идемпотентность и порядок событий
Отправители вебхуков обычно повторяют запрос, если не получили своевременный успешный ответ, поэтому доставка работает по принципу at-least-once. Одно и то же событие может прийти дважды, а событие «закрыто» может прийти раньше последнего события «сообщение получено». Чтобы справиться с этим:
- используйте ID события как ключ дедупликации;
- используйте upsert по ID диалога или сообщения в CRM;
- сравнивайте временные метки или порядковые номера событий и игнорируйте более старое состояние.
Когда сценарий CRM вызывает API инбокса, чтобы отправить сообщение, передавайте ключ идемпотентности, если API его поддерживает. Распространённый подход описан в черновике IETF для HTTP-заголовка Idempotency-Key.
Как сопоставлять контакты между каналами?
Сопоставляйте по нормализованным идентификаторам, отдавайте предпочтение детерминированным совпадениям, а неоднозначные случаи передавайте человеку.
| Идентификатор | Как нормализовать | Надёжность совпадения | Примечания |
|---|---|---|---|
| Номер телефона в WhatsApp или SMS | E.164, например +9715XXXXXXXX | Высокая | Следите за местными форматами с ведущим нулём |
| Адрес электронной почты | В нижнем регистре, без лишних пробелов | Высокая | Алиасы могут принадлежать одному человеку, но не считайте это данностью |
| Аккаунт Instagram | ID пользователя в рамках платформы | Высокая в пределах этого аккаунта | Никнеймы могут меняться: храните ID, а не только никнейм |
| Пользователь Telegram | ID пользователя платформы | Высокая в пределах этого бота или аккаунта | Телефон может быть скрыт |
| Имя | Отдельно не используется | Низкая | Никогда не объединяйте записи по имени |
Правила принятия решений:
- Одно точное совпадение: связать.
- Совпадений нет: создать лид или «несопоставленный контакт» с указанием исходного канала.
- Несколько совпадений: пометить для оператора, не объединять автоматически.
- Клиент подтвердил другой идентификатор в диалоге: связать его и добавить пометку с основанием.
Как обеспечить приватность данных при интеграции с CRM?
Передавайте каждой системе только то, что ей нужно, документируйте причины и добейтесь, чтобы удаление данных работало в обеих системах.
- Минимизация данных. Храните в CRM ссылки на диалоги, результаты и краткое содержание, а полные переписки оставляйте в инбоксе, если у вас нет определённой цели.
- Правовое основание и согласие. Фиксируйте согласие на получение маркетинговых сообщений (opt-in) по каждому каналу: обращение в поддержку не является согласием на маркетинговые шаблоны.
- Срок хранения. Согласуйте сроки хранения в инбоксе, CRM, очередях и логах: логи payload вебхуков часто забывают.
- Контроль доступа. Ограничьте круг лиц, которые видят текст сообщений и вложения в CRM.
- Запросы на удаление и доступ. Сделайте так, чтобы запрос в одной системе распространялся на другую.
- Трансграничная передача. Проверьте, где каждая система хранит данные. GDPR распространяется на персональные данные людей в ЕС, а в ОАЭ и Саудовской Аравии действуют собственные законы о защите персональных данных. Актуальные требования уточняйте у соответствующего регулятора и юристов вашей компании.
Как выглядит референсная архитектура?
В текстовом виде поток таков: каналы → инбокс → приёмник → очередь → воркер → CRM, а сценарии CRM возвращаются в API инбокса.
| Компонент | Ответственность | Ключевое проектное решение |
|---|---|---|
| Каналы (WhatsApp, Instagram, электронная почта, Telegram) | Доставляют сообщения клиентов в инбокс | Действуют правила каждой платформы |
| Омниканальный инбокс | Диалоги, назначение, операторы, события | Отправляет вебхуки, предоставляет API |
| Приёмник вебхуков | Проверка, дедупликация, постановка в очередь | Без сохранения состояния, быстрый ответ 2xx |
| Хранилище событий и очередь | Надёжный буфер, повторное воспроизведение | Уникальный ID события, dead-letter queue |
| Воркер синхронизации | Сопоставление контактов, upsert в CRM | Идемпотентные записи, backoff |
| CRM | Контакты, сделки, обращения, сценарии | Вызывает API инбокса с ключами идемпотентности |
| Задача сверки | Поиск и устранение пропусков | Запускается по расписанию |
| Мониторинг | Задержки, сбои, недоставленные события | Оповещения ответственному |
Пример из практики: группа клиник в Джидде
«Wahat Clinics» — вымышленная медицинская группа в Саудовской Аравии. Она использует CRM для записи пациентов на приём и инбокс для WhatsApp и электронной почты.
- Пациент пишет в WhatsApp. Инбокс отправляет событие «диалог создан», приёмник проверяет его, сохраняет и ставит в очередь.
- Воркер нормализует номер до формата E.164, находит одну карточку пациента и записывает активность со ссылкой на диалог, а не с текстом сообщения.
- CRM показывает, что предпочитаемый язык пациента — арабский, и передаёт это в инбокс, который направляет диалог в арабскую очередь.
- Когда запись на приём оформлена в CRM, сценарий вызывает API инбокса и отправляет подтверждение одобренным служебным шаблоном (utility). ID записи передаётся как ключ идемпотентности, чтобы повторная попытка не отправила два подтверждения.
- Событие инбокса «сообщение доставлено» обновляет запись о приёме.
Какие ошибки встречаются чаще всего?
- Запись в CRM внутри запроса вебхука, из-за чего возникают тайм-ауты, повторные отправки и дубликаты.
- Отсутствие дедупликации, из-за чего создаются дубликаты активностей и контактов.
- Сопоставление по ненормализованным номерам телефонов, из-за чего форматы +971 и с ведущим 0 никогда не совпадают.
- Автоматическое объединение по имени или частичным совпадениям.
- Копирование всего содержимого сообщений в CRM без цели и правила хранения.
- Отсутствие сверки, из-за чего один пропущенный событие превращается в постоянное расхождение данных.
- Секреты в исходном коде и отсутствие плана их ротации.
Чем помогает OmniChannels.ai
OmniChannels.ai, платформа на базе BroadNet Technologies, объединяет диалоги из WhatsApp, Instagram, Messenger, Telegram и электронной почты в одном общем инбоксе (едином окне для всех каналов) Omni Inbox с назначением операторов и тегами. Кроме того, платформа поддерживает подключение WhatsApp через Meta Embedded Signup и одобренные шаблоны с переменными, медиа и кнопками. Для интеграции с CRM REST API публично документирован со спецификацией OpenAPI 3.1, а вебхуки передают статусы доставки (SENT, DELIVERED, READ, FAILED и другие) в едином нормализованном формате. Отчёты о доставке с фильтрами и экспортом в CSV помогают при сверке. Начните со страницы для разработчиков.
Часто задаваемые вопросы
Чем вебхук отличается от API при интеграции с CRM?
Вебхук — это HTTP-запрос, который инбокс отправляет на ваш endpoint, когда что-то происходит: пришло новое сообщение или диалог закрыт. API — это то, что вызывает ваша система, чтобы прочитать данные или выполнить действие, например отправить ответ или переназначить диалог. Вебхуки поддерживают актуальность CRM без опроса, а API позволяет сценариям CRM управлять инбоксом.
Что такое идемпотентность для вебхуков?
Идемпотентность означает, что повторная обработка того же события даёт тот же результат, что и первая. Отправитель вебхуков повторяет запрос, если не получил своевременный успешный ответ, поэтому ваш endpoint может получить дубликаты. Сохраняйте уникальный ID каждого события, пропускайте уже обработанные ID и делайте записи в CRM в виде upsert, чтобы повторное событие не создало вторую активность или второй контакт.
Как сопоставить номер WhatsApp с контактом в CRM?
Приведите обе стороны к международному формату E.164: с кодом страны, без пробелов и ведущих нулей, и найдите запись в CRM по этому значению. Если найден ровно один контакт, свяжите его с диалогом. Если совпадений нет, создайте лид или несопоставленный контакт. Если совпадений несколько, не угадывайте: передайте диалог оператору на выбор и сохраните его решение на будущее.
Нужно ли хранить полные переписки в CRM?
Только если у вас есть чёткая цель и правовое основание. Многие команды хранят в CRM ссылку на диалог, краткое содержание, результат и временные метки, а полная переписка остаётся в инбоксе со своими настройками доступа и сроком хранения. Так в системах дублируется меньше персональных данных, а запросы на удаление данных проще выполнять по законам вроде GDPR.
Как защитить endpoint для вебхуков?
Принимайте запросы только по HTTPS, проверяйте подпись или общий секрет, который отправитель передаёт с каждым запросом, отклоняйте запросы со старыми временными метками, чтобы ограничить повторное воспроизведение (replay), и храните секреты в менеджере секретов, а не в коде. Ограничьте возможности endpoint: он должен только ставить события в очередь, не раскрывать данные CRM и не принимать произвольные команды.
Источники
Читайте дальше
Ещё руководстваИнтеграции
Как выбрать API для обмена сообщениями: чек-лист для CTO
Как выбрать API для сообщений: чек-лист для CTO по каналам, качеству маршрутов, вебхукам, безопасности, лимитам, повторам, SMPP, MCP, комплаенсу и ценам.
13 мин чтения
Интеграции
Руководство по интеграции API сообщений: REST, SMPP, вебхуки
Руководство по интеграции API для сообщений: REST, SMPP и вебхуки, аутентификация, идемпотентность, отчёты о доставке, повторы, лимиты запросов и тесты.
9 мин чтения
Поддержка клиентов
Поддержка клиентов в Instagram DM: как организовать в масштабе
Как использовать Instagram Direct для поддержки и продаж в масштабе: доступ к API, 24-часовое окно ответа, работа команды и модерация сообщений в DM.
8 мин чтения
