Перейти к содержимому
OmniChannels.ai
Меню

Как подключить CRM к омниканальному инбоксу через вебхуки

Как подключить CRM к омниканальному инбоксу через вебхуки: события, идемпотентность, повторы, сопоставление контактов, приватность и референсная архитектура.

Обновлено 8 мин чтения

Автор: OmniChannels.ai Editorial Team · Проверил: BroadNet Messaging Solutions Team

Интеграции

Короткий ответ

Чтобы подключить CRM к омниканальному инбоксу, подпишитесь на вебхуки инбокса для событий диалогов и сообщений. Принимайте их на небольшом endpoint, который проверяет подпись и сохраняет каждое событие один раз по его ID. Затем обрабатывайте события асинхронно: сопоставляйте отправителя с контактом CRM по нормализованному номеру телефона, адресу электронной почты или ID в соцсети и записывайте активности обратно. В обратном направлении используйте API инбокса, чтобы отправлять сообщения или менять ответственного из сценариев CRM.

На этой странице
  1. Какими данными должны обмениваться CRM и омниканальный инбокс?
  2. На какие события вебхуков стоит подписаться?
  3. Как построить надёжный приёмник вебхуков?
  4. Как сопоставлять контакты между каналами?
  5. Как обеспечить приватность данных при интеграции с CRM?
  6. Как выглядит референсная архитектура?
  7. Пример из практики: группа клиник в Джидде
  8. Какие ошибки встречаются чаще всего?
  9. Чем помогает 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 выполняется внутри самого запроса вебхука.

Пошаговая схема приёмника

  1. Откройте один HTTPS endpoint для каждого окружения, например /webhooks/inbox.
  2. Проверьте подлинность. Проверьте подпись (обычно это HMAC от исходного тела запроса с общим секретом, как определено в RFC 2104) или токен, который описывает отправитель. Вычисляйте её по исходным байтам до разбора JSON.
  3. Проверьте актуальность. Если передаётся временная метка, отклоняйте события за пределами короткого допуска, чтобы ограничить повторное воспроизведение.
  4. Дедуплицируйте. Вставляйте ID события в таблицу с ограничением уникальности. Если вставка не удалась, потому что ID уже существует, верните успешный ответ и остановитесь.
  5. Поставьте в очередь. Поместите событие в очередь и сразу верните ответ 2xx.
  6. Обрабатывайте асинхронно. Воркер читает очередь, сопоставляет контакт и записывает данные в CRM через upsert.
  7. Повторяйте с задержкой. Если CRM недоступна, повторяйте попытки из своей очереди с экспоненциальной задержкой (backoff) и не рассчитывайте на повторные отправки со стороны отправителя.
  8. Используйте очередь недоставленных событий. После нескольких неудач переместите событие в dead-letter queue и оповестите сотрудника.
  9. Сверяйте данные. Запускайте периодическую задачу, которая сравнивает недавние диалоги инбокса с записями 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 пользователя платформы Высокая в пределах этого бота или аккаунта Телефон может быть скрыт
Имя Отдельно не используется Низкая Никогда не объединяйте записи по имени

Правила принятия решений:

  1. Одно точное совпадение: связать.
  2. Совпадений нет: создать лид или «несопоставленный контакт» с указанием исходного канала.
  3. Несколько совпадений: пометить для оператора, не объединять автоматически.
  4. Клиент подтвердил другой идентификатор в диалоге: связать его и добавить пометку с основанием.

Как обеспечить приватность данных при интеграции с 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 и не принимать произвольные команды.

Источники

  1. Webhooks — WhatsApp Cloud API, Meta for Developers
  2. The Idempotency-Key HTTP Header Field — IETF HTTPAPI Working Group draft
  3. RFC 2104: HMAC — Keyed-Hashing for Message Authentication
  4. Regulation (EU) 2016/679 (GDPR) — EUR-Lex
  5. Data protection laws — The UAE Government portal (u.ae)