# Рассылки в Edna Chat Center

В этой статье вы узнаете, как запустить рассылки через канал Edna Chat Center.Первым делом перед созданием Слота необходимо создать Канал Проекта Edna Chat Center. Подробнее об этом: Edna Chat Center

## Создание шаблона рассылки

Шаблоны — это сообщения, с помощью которых Бот в WhatsApp стартует Чат с Собеседником. Чтобы произвести рассылку по Собеседникам в WhatsApp, необходимо создать шаблон, отправить на согласование, в случае неуспеха переформулировать и отправить новый шаблон, а в случае согласования инициировать рассылку с помощью Слота Notification.Подробнее: <https://docs.edna.ru/kb/template-types/>

## Создание слота

После создания шаблона рассылки, создайте Слот Notification и заполните поля Слота на всех вкладках.

### Вкладка General

Вкладка General содержит основные настройки Слота.

1. Вид вкладки:\
   ![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-Tv1QwYFeUM/dad8235499d97bb1d75e04992ca88286cccf03779efe9b4c2724b02213bbe432fe0c94a9d26e123fbcc95c58be2f9ceb93c3c3a46292d0d03b4469ac971949d2da699f3c0cc1bf8fc53312056e8cfe0b44cb0b62f8ec7d586e3c3eed65d41df1e0605f54)
2. Элементы и поля вкладки:
3. 1. Name\* — название Слота, которое будет отображено в Дерево сценария. Максимальная длина значения поля — 40 символов.
   2. Destination channel\* — Конечный канал, через который будет осуществляться рассылка.
   3. Chatbot webhook — вебхук, на который Агент будет получать Запрос на рассылку.\
      Значение появится в поле после сохранения и повторного  открытия Слота. Вебхук начнет работать после Обучение Агента.\
      ![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-dkJFbufnBf/bb1445a9bd3547a8a75de9675a6e272437cd3ba1a1d765cc8e67af9eb985f0621174fdcb55165cbbed5a14afa1ad2a9037a9830c3b3dcfa19cb23741e11f1c7fb1749f6e34e2ce814735b694cbc1bc3e15a253028018dae8e8166108ef9528ea10ad4498)
   4. Кнопка копирования вебхука.
   5. 1. По нажатию кнопки адрес вебхука копируется в буфер обмена.\
         ![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-p9OPTwIDXF/261c797f3a13f9296726de7e4cfea98c8b9674fed5586c8242a146c0d3752755a00359b2795b3c1c013b3204de5749a2ef238a01f5f67511fd6238d58599dd2dc759b197a0c34ae6cd03fa15bc0b57e44900167a040594192ede7ac885af5b3377c0d9e9)
      2. Кнопка становится доступной к нажатию, только когда поле Chatbot webhook заполнено значением вебхука.
   6. Кнопка GENERATE NEW WEBHOOK.
   7. 1. Кнопка становится доступной к нажатию, только когда поле Chatbot webhook заполнено значением вебхука.
      2. По нажатию кнопки происходит генерация нового вебхука.
      3. Изменения после перегенерации вебхука вступают в силу после переобучения Агента.

### Вкладка Incoming Data   &#x20;

Вкладка Incoming Data предназначена для настроек парсинга тела Запрос на рассылку для последующего использования полученных данных в Сценарий агента.

1. Вид вкладки:\
   ![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-o2t4MnjbIc/9e63b8f8db0a6cd2c274778bb4633e3b748421813c8bfe5f946335ca6b90e1fd29baa79bdca2f6500d329013a309c71e71ff3dc84cf741a61e20b78689096e8436a6036fe0201f721831e22efd4279d31e570d17c94c0647581002d329f404923b0bf672)
2. Поля вкладки:
3. 1. PARSE REQUEST BODY — массив пар Context key — Request key.
   2. 1. Context key — имя Контекстная переменная для парсинга;
      2. Request key — ключ из тела Запрос на рассылку, значение которого будет записано в Context key либо Выражение.
      3. > Важно: обращение к ключу объекта, если его имя совпадает с именем Зарезервированные методы объектов происходит через квадратные скобки и кавычки.
      4. > Пример: {{ data\["keys"] }}

### Вкладка Destination

На вкладке Destination происходит настройка отправки рассылочных сообщений в выбранный на вкладке General Конечный канал, исходя из его требований.

1. Вид вкладки:\
   ![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-2ax2lBrppC/053eed25d7c4372e7f51154f355f83258ae194b1600554ec3854aa0ba6c54202b43fd77fd193e0963e1fb8e8e904ca27bee03dadeaa72964ee6d650f57efb99be32e0330b00d7e5b5da2624716dcaf1640e721263cfeda5ab8efc37ca29679f7bbdfa479)
2. Поля вкладки:
3. 1. Cascade id\* — значение поля подтягивается из поля Сhannel webhook Token из настроек Канал Проекта.\
      ![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-urpM6uRbbu/3350f1ceb609c5c72492fe4f4b61877f644f4b5551e31a0fc4d034fdef1812ebaf519811b1e1db1975e1282056ae904db19808af052142d68aa80b7b54c4edab56c63c29cb4e0dbb88f21f9885c150f9310d087d3d04f06b72a5af9dedde837a730f9c1c)
   2. Content\* — JSON-объект с содержимым рассылки.
   3. 1. Формат (красным курсивом выделены опциональные элементы, которые необходимо добавлять только при наличии соответствующего контента в шаблоне рассылки):\
         {\
         &#x20;  "whatsappContent": {\
         &#x20;      "contentType": "TEXT",\
         &#x20;     "header": {\
         &#x20;              "headerType": "<тип заголовка (видео/изображение/документ)>",\
         &#x20;              "text": "<текст заголовка>",\
         &#x20;              "headerExampleMediaUrl": "<ссылка на пример файла заголовка>"\
         &#x20;          },\
         &#x20;      "text": "Текст рассылки",\
         &#x20;     "footer": {\
         &#x20;              "text": "<текст подписи>"\
         &#x20;          },\
         &#x20;      "keyboard": {\
         &#x20;          "rows": \[\
         &#x20;              {\
         &#x20;                  "buttons": \[\
         &#x20;                      {\
         &#x20;                          "text": "<текст кнопки>",\
         &#x20;                          "buttonType": "\<URL (для кнопки-ссылки)>",\
         &#x20;                          "url": ""\
         &#x20;                      },\
         &#x20;                      {\
         &#x20;                          "text": "",\
         &#x20;                          "buttonType": "",\
         &#x20;                          "phone": ""\
         &#x20;                      }\
         &#x20;                  ]\
         &#x20;              }\
         &#x20;          ]\
         &#x20;      }\
         &#x20; }\
         }
      2. Необходимо прописывать данные согласованного шаблона рассылки, в противном случае адресат не получит рассылку (подробнее: Notification fail).

## Запуск рассылки

После того, как Канал Проекта создан, шаблон рассылки создан и согласован, а Слот Notification настроен, можно запускать рассылку. Для этого необходимо отправит запрос на рассылку.

### Формат запроса на рассылку

1. Запрос на рассылку должен обязательно включать идентификатор Собеседника в конечном канале на первом уровне JSON-а, случае c WhatsApp, это номер телефона. По этому идентификатору Платформа вычислит Чат или в случае, если он не существует, создаст новый Чат для отправки запроса. Название ключа зависит от Конечный канал.
2. 1. Формат идентификатора:
   2. 1. поле типа “текст”;
      2. От 10 до 18 цифр (от 11 до 19 с учетом +);
      3. Допускается знак + в начале.
3. Запрос на рассылку может быть срочным или несрочным (параметр "is\_urgent"):
4. 1. значение true — для срочного Запрос на рассылку — выполняется незамедлительно и прерывает Активный диалог.
   2. значение false — для несрочного Запрос на рассылку — выполняется после закрытия Диалога.
   3. если ключ is\_urgent не найден, используется значение по умолчанию false.
5. Запрос на рассылку должен быть POST-запросом с валидным телом JSON и заголовком "Content-Type": "application/json"
6. Лимит на запросы на рассылку по умолчанию — 20 запросов в секунду на Компания. Лимит можно изменить через техподдержку.
7. Пример запроса на рассылку:\
   POST <[https://admin.chatme.ai/api/notification/42282::0a04b116e59032ef014d649602cc0b54/chat'>\\](https://admin.chatme.ai/api/notification/42282::0a04b116e59032ef014d649602cc0b54/chat'>\\)
   headers: {"Content-Type": "application/json"}\
   body: {\
   "phone\_number": "79291642944",\
   "is\_urgent": true\
   }

## Работа слота

Работа слота начинается с момента получения Платформа Запрос на рассылку из внешней системы.

### 1. Обработка входящего запроса на рассылку

В процессе обработки входящего запроса на рассылку выполняется ряд операций. По итогу выполнения операций вы можете получить один из указанных в таблице статусов:

| Ответ, полученный на запроса на рассылку                                                                | Расшифровка ответа                                                                                                                    |
| ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| HTTP status: 429                                                                                        | Превышение  Лимит на запросы на рассылку для Компания                                                                                 |
| HTTP status: 405                                                                                        | Запрос на рассылку не с POST-методом                                                                                                  |
| HTTP status: 400                                                                                        | <ul><li>в Запрос на рассылку нет заголовка content-type: application/json</li><li>невалидный JSON в теле Запрос на рассылку</li></ul> |
| HTTP status: 404                                                                                        | Не найдена  Компания, связанная с Идентификатор рассылки  (он содержится в вебхуке в поле Chatbot webhook)                            |
| <p>HTTP status: 400 invalid<br>BODY:<br>“status”: “Recipient ID not found or invalid.”</p>              | идентификатор Собеседника не был найден или он невалидный                                                                             |
| <p>HTTP status: 404 Not Found<br>BODY:<br>“status”: “Notification not found”</p>                        | нет обученного Агента со Слотом с таким вебхуком                                                                                      |
| <p>HTTP status: 404 Not Found<br>BODY:<br>“status”: “There is no active channel for received event”</p> | Канал Проекта данного слота Notification удален\неактивен                                                                             |
| <p>HTTP status: 200 OK<br>BODY:<br>“status”: “Accepted for execution”<br>“task\_id”:  </p>              | Запрос на рассылку поставлен в очередь на выполнение                                                                                  |

### 2. Выполнение задачи на рассылку

1. Слот Notification собирает запрос в Конечный канал из параметров на вкладке Destination  и идентификатора собеседника (phone\_number).\
   ![image.png](https://codahosted.io/docs/_pM7PjYCmj/blobs/bl-aPAt12wNYc/ea8740a583c7a0ed1163990cd2331ccf092df25299deb4dd4d6249a5211e92d033d3a5697461dd49200695fe757b7b7573054893a7d4d2cc868a36823a26fe8247a3f6a2e22757cf12ab5cfa12a36595d71a40f4d3b7e184471054472f620ba313dc7a35)
2. Далее слот Notification выполняет отправку запроса на рассылку в выбранный в поле Destination Channel Конечный канал.
3. По итогу выполнения данного шага вы можете получить один из указанных в таблице результатов:

| Событие                                                                                                                                         | Что записывается в переменную notification\_raw\_status                                                                                                                                                                                                                             | Что записывается в переменную notification\_status | Переход по Сценарию Агента                                                              |
| ----------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | --------------------------------------------------------------------------------------- |
| Не удалось составить запрос по какой-либо причине, например, не удалось спарсить и создать переменную, которая используется в id шаблона        | {‘description’:’failed to build request’}                                                                                                                                                                                                                                           | ‘failed’                                           | переход в ветку Notification fail                                                       |
| Конечный канал принял запрос и ответил успешным ответом                                                                                         | <p>{‘description’:’received by channel’,<br>‘channel\_response’: тело ответа от канала (объект)}(если application/json = объект, если text = str; в иных cлучаях записывается null).</p>                                                                                            | ‘sent’                                             | Агент ожидает статуса обработки рассылки от Конечный канал                              |
| Запрос в Конечный канал ушел, но в ответ получен response с кодом 4хх или 5хх                                                                   | {‘description’:’channel error <код ответа> ’channel\_response’: тело ответа от канала}Если в ответе на запуск рассылки пришел JSON-объект, то в ’channel\_response’ сохраняется этот JSON-объект. Если в ответе пришел текст, то сохраняется текст. В ином случае сохраняется None. | ‘failed’                                           | переход в ветку Notification fail                                                       |
| Не удалось выполнить запрос в Конечный канал (канал недоступен, пинг не идет и т.д.)                                                            | {‘description’:’channel inaccessible’}                                                                                                                                                                                                                                              | ‘failed’                                           | переход в ветку Notification fail                                                       |
| В поле Content слота указаны данные несуществующего или несогласованного  шаблона рассылки, при этом нет Активный диалог с получателем рассылки | {‘status’: ‘UNDELIVERED’, ‘error’: ‘not-template-match’}                                                                                                                                                                                                                            |                                                    | переход в ветку Notification fail                                                       |
| В поле Content слота указаны данные несуществующего или несогласованного  шаблона рассылки, при этом естьАктивный диалог с получателем рассылки |                                                                                                                                                                                                                                                                                     |                                                    | получателю придет текст, указанный в поле Content, переход в ветку Notification success |

<br>

### 3. Переход в ветки подслотов и ответы из канала

После того как Конечный канал принял запрос на рассылку, происходит переход в один из Подслотов:

| Переход в Подслот                       | Причины                                                                                                                            | Что записывается в переменную notification\_raw\_status                                                                                                                                                                                                                                 | Что записывается в переменную notification\_status |
| --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
| Переход в ветку Notification Fail       | Любые проблемы, относящиеся к данной конкретной задаче на рассылку, кроме отсутствия аккаунта на данном идентификаторе Собеседника | {‘description’:’channel couldn’t sent message’, ‘channel\_response’: тело ответа от канала}Если в ответе на запуск рассылки пришел JSON-объект, то в ’channel\_response’ сохраняется этот JSON-объект. Если в ответе пришел текст, то сохраняется текст. В ином случае сохраняется None | ‘failed’                                           |
| Переход в ветку Notification no account | Отсутствие аккаунта на данном идентификаторе Собеседника (в случае WhatsApp — номере телефона)                                     | {‘description’:’no account on <номер телефона\ключевой идентификатор собеседника>’, ‘channel\_response’: тело ответа от канала as is (объект)} (если application/json = объект, если text = str; в иных cлучаях записывается null).                                                     | ‘no\_account’                                      |
| Переход в ветку Notification Success    | Получение статуса отправки, доставки или прочтения сообщения Собеседником                                                          | {‘description’:’success’,‘channel\_response’: тело ответа от канала (объект)} (если application/json = объект, если text = str; в иных cлучаях записывается null).                                                                                                                      | ‘delivered’                                        |
| Переход в ветку Notification Success    | получение Сообщение собеседника                                                                                                    | {‘description’:’success’, ‘channel\_response’: тело принятного запроса от канала (объект), откуда распарсили текст Сообщение собеседника} (если application/json = объект, если text = str; в иных cлучаях записывается null).                                                          | ‘delivered’                                        |
