В статье рассказываем, как внедрить окно чатов Wazzup в свою CRM и настроить работу раскрывающегося списка «Сделки» по событиям.
Список «Сделки» — инструмент в окне чата с контактом, который:

Мы рекомендуем работать со списком «Сделки» с помощью вебхуков. А если вебхуки не подходят — по событиям.
Сейчас через окно чатов по API нельзя создать диалог MAX, Telegram по номеру телефона. Чтобы создать чат MAX, воспользуйтесь методом отправки сообщений, чтобы создать чат Telegram — методом отправки сообщений или юзернеймом. После вы получите id чата, с помощью которого сможете открывать диалоги MAX, Telegram в iframe.
Метод POST /v2/iframe-links/chats
| Body-параметр. Обязательные отмечены * | Тип | Описание |
user.id* |
String |
ID пользователя в CRM, который открывает окно с чатами |
author_name |
String |
Имя отправителя. Если не указано, используется имя CRM-пользователя |
scope* |
String |
Контекст, в котором открывается окно: global — окно со всеми доступными пользователю чатами, card — чат, который открывают из сделки, контакта или другой карточки |
chats |
Object (Array) |
Массив чатов, которые нужно показать. Обязателен для scope=card. Если scope=global, не передавайте chats |
chats.contact_name |
String |
Имя контакта. Можно уточнить для нового контакта, с которым еще не было переписки |
chats.chat_type* |
String |
Тип чата. Доступные значения:
|
chats.chat_id* |
String |
Вариант идентификации для всех типов чата — ID чата, то есть аккаунт контакта в мессенджере.
|
chats.username* |
String |
Дополнительный вариант идентификации только для Telegram Personal. Имя пользователя в Telegram, без @ в начале. Можно использовать, если неизвестен chat_id |
active_chat |
Object |
Чат, активный при открытии iframe |
active_chat.channel_id |
String |
Идентификатор канала, с которым нужно открыть активный чат |
active_chat.chat_type* |
String |
Тип чата. Значения те же, что у chats.chat_type |
active_chat.chat_id* |
String |
ID чата (аккаунт контакта в мессенджере). Формат, как для chats.chat_id |
active_chat.username* |
String |
Только для Telegram Personal. Имя пользователя в Telegram, без @ в начале. Можно использовать, если неизвестен ID чата |
use_events |
Object |
Настройки по событиям в iFrame. Обязателен, если решили создавать контакты и сделки по событиям |
use_events.deals |
Boolean |
Укажите true, если хотите узнавать от iframe, что нужно создать или показать пользователю сделку. Событие приходит, когда пользователь кликает на + в списке «Сделки», чтобы создать сделку, или на сущность в списке «Сделки», чтобы открыть ее |
use_events.messages |
Boolean |
Укажите true, если хотите узнавать от iframe, что нужно создать новый контакт. Событие приходит, когда пользователь отвечает на входящее сообщение из iframe |
client_type |
String |
Тип CRM. Можно ничего не указывать |
Если контакта с указанными chat_type и chat_id нет в базе данных Wazzup — при открытии его в карточке контакта CRM-системы он будет создан. В качестве имени будет использовано значение contact_name или id, если первое отсутствует.
Пример запроса для iframe в карточке
{
"user_id": "crm-user-id-123",
"author_name": "Иван Петров",
"scope": "card",
"chats": [
{
"contact_name": "Петр Сидоров",
"chat_type": "whatsapp",
"chat_id": "79111234567"
},
{
"contact_name": "Петр Сидоров",
"chat_type": "telegram",
"username": "my_tg_user"
},
{
"contact_name": "Петр Сидоров",
"chat_type": "telegram",
"chat_id": "1670185"
}
],
"active_chat": {
"channel_id": "string",
"chat_type": "whatsapp",
"chat_id": "79111234567"
},
"use_events": {
"deals": false,
"messages": false
},
}
Пример минимального запроса для iframe со всеми чатами пользователя
{
"user_id": "crm-user-1",
"scope": "global"
}
Пример запроса для создания чата в Telegram по username
{
"user": {
"id": "crm-user-id-123",
"name": "Иван Петров"
},
"scope": "card",
"filter": [
{
"chatType": "telegram",
"username": "best_client"
}]
}
200
В ответе придет json со ссылкой для открытия окна чатов.
{
"data": {
"link": "https://app.wazzup24.com/1234-1234/chat/telegram/1670185301/123?token=token"
},
"meta": {
"timestamp": 1764849838
}
}
Если открываете ссылку в iframe, добавьте в тег атрибут allow="microphone *; clipboard-write *".
Указать microphone нужно, чтобы из окна с чатами можно было записывать голосовые сообщения. Если этого не сделать, пользователь увидит ошибку при нажатии на значок микрофона для записи.
Передавать clipboard-write необходимо, чтобы в нашем iframe правильно работало копирование в буфер обмена. Например, пользователь мог по кнопке скопировать код ошибки из уведомления.
<iframe src="ссылка" allow="microphone *; clipboard-write *" ></iframe>
Параметры ответа в ошибках
| Параметр. Обязательные отмечены * | Тип | Описание |
code* |
string |
Код ошибки. Возможные значения для разных HTTP-статусов описаны ниже. Пример: INTERNAL_SERVER_ERROR |
title* |
string |
Название ошибки. Пример: Internal Server Error |
status* |
number |
HTTP-статус. Значения: 400, 401, 403, 500 |
detail* |
string |
Описание ошибки. Возможные значения для разных HTTP-статусов описаны ниже. Пример: One or more fields did not pass validation. |
instance* |
string |
URI вызова, приведшего к ошибке. Пример: /v2/templates/waba/123 |
method* |
string |
HTTP-метод. Значения: GET, POST, PATCH, PUT, DELETE |
errors |
array |
Дополнительное поле, если ошибок несколько (например, несколько параметров не прошли валидацию). Пример: ["validation_error_string"] |
Пример ошибки
{
"code": "VALIDATION_FAILED",
"title": "Validation Failed",
"status": 400,
"detail": "One or more fields did not pass validation.",
"instance": "/v2/iframe-links/chats",
"method": "POST",
"errors": [
"user_id should not be empty",
"scope must be a valid enum value"
]
}
400
Возможные коды ошибок для статуса 400
code |
Описание |
VALIDATION_FAILED |
Одно или несколько полей в запросе не прошли валидацию |
401
Возможные коды ошибок для статуса 401
code |
Описание |
OAUTH_AUTH_HEADER_MISSING |
Заголовок Authorization не указан |
OAUTH_UNKNOWN_SCHEME |
Неизвестная схема авторизации. Используйте Basic или Bearer |
OAUTH_INVALID_PARTNER_TOKEN |
Неверный партнёрский токен |
OAUTH_TOKEN_INVALID_OR_EXPIRED |
Токен доступа недействителен или истёк |
OAUTH_TOKEN_UNKNOWN_OR_REVOKED |
Токен доступа неизвестен или отозван |
403
Возможные коды ошибок для статуса 403
code |
Описание |
OAUTH_SCOPE_FORBIDDEN |
У пользователя нет доступа к нужному scope |
OAUTH_CRM_INTEGRATION_REQUIRED |
Для работы с методами CRM требуется активная интеграция |
OAUTH_BASIC_SCHEME_FORBIDDEN |
Этот метод нельзя вызывать с авторизацией Basic |
OAUTH_BEARER_SCHEME_FORBIDDEN |
Этот метод нельзя вызывать с авторизацией Bearer |
OAUTH_PARTNER_NOT_FOUND |
Партнёр не найден |
OAUTH_PARTNER_NOT_ACTIVE |
Партнёрский аккаунт отключён или не активен |
OAUTH_CLIENT_NOT_CHILD_OF_PARTNER |
Клиент не относится к этому партнёру |
500
Возможные коды ошибок для статуса 500
code |
Описание |
INTERNAL_SERVER_ERROR |
Произошла непредвиденная ошибка |
События сигнализируют о том, что нужно:
Пользователь нажимает на + в списке «Сделки», чтобы создать сделку
Что значит: нужно создать новую сделку с теми параметрами, которые передал iframe.
Название события: WZ_CREATE_ENTITY
Что содержит:
| Поле | Тип | Описание |
type |
String |
Название события — WZ_CREATE_ENTITY |
data |
Object |
Объект, который содержит данные о событии |
data.chatType |
String |
Тип чата мессенджера: whatsapp, instagram, telegram, vk, avito |
data.chatId |
String |
ID чата (аккаунт контакта в мессенджере) |
data.channelId |
String |
Идентификатор канала |
data.userId |
Number |
ID пользователя в CRM |
data.integrationId |
String |
ID интеграции |
Пример события:
{
type: 'WZ_CREATE_ENTITY',
data: {
chatType: whatsapp,
chatId: 79998887766,
channelId: c16tc1c-9f20-4rda-46jd-q92ty4j6s36888,
userId: test_id,
integrationId: 608df5ye-45hj-j6k7-l77k-qe5t88j4h1222
}
После создания сделки нужно передать данные о новой сделке из CRM в Wazzup.
Пользователь открывает сделку, контакт или другую сущность в списке «Сделки»
Что значит: пользователю нужно показать сделку, контакт или другую сущность, с параметрами, которые передает iframe.
Название события: WZ_OPEN_ENTITY
Что содержит:
| Поле | Тип | Описание |
type |
String |
Название события — WZ_OPEN_ENTITY |
data |
Object |
Объект, который содержит данные о событии |
data.chatType |
String |
Тип чата мессенджера: whatsapp, instagram, telegram, vk, avito |
data.chatId |
String |
ID чата (аккаунт контакта в мессенджере) |
data.channelId |
String |
Идентификатор канала |
data.userId |
Number |
ID пользователя в CRM |
data.integrationId |
String |
ID интеграции |
data.entity |
Object |
Объект, который содержит данные о сущности |
data.entity.closed |
Boolean |
Флаг: закрыта или открыта сделка |
data.entity.id |
Number |
Идентификатор сущности, которую открывает пользователь |
data.entity.link |
String |
Ссылка на сущность (может отсутствовать) |
data.entity.name |
String |
Имя сущности |
data.entity.responsibleUserName |
String |
Имя пользователя, ответственного за сущность |
Пример события
{
type: 'WZ_OPEN_ENTITY',
data: {
chatType: whatsapp,
chatId: 79998887766,
channelId: c16tc1c-9f20-4rda-46jd-q92ty4j6s36888,
userId: test_id,
integrationId: 608df5ye-45hj-j6k7-l77k-qe5t88j4h1222,
entity: {
closed: false,
id: clientId3,
link: #,
name: ТестоваяСделка,
responsibleUserName: ТестовыйПользователь
}
}
}
Сделали html-страницу, которая служит примером того, как можно отлавливать события iframe. Как пользоваться:
*Запрещены и признаны экстремистскими на территории РФ