# Webhook

<Aside type="caution" icon="setting" title="Требуется помощь разработчика">
 Вам понадобится помощь вашей команды разработчиков для настройки элемента Webhook. Поделитесь с ними этим руководством, чтобы начать работу.
</Aside>

Вебхуки позволяют отправлять данные из Journey во внешние сервисы, такие как системы аналитики, CRM и маркетинговые инструменты. Вы можете:

* Уведомлять внешние системы, когда клиент совершает действие в Journey
* Отправлять данные о клиентах в инструменты аналитики
* Запускать отправку email, SMS или WhatsApp от сторонних сервисов при определенных событиях в Journey

<Aside type="note">
Ознакомьтесь с примерами реализации вебхуков для различных сценариев использования и сервисов: [Примеры интеграции вебхуков](/ru/developer/guides/customer-journey/webhook-samples/)
</Aside>

## Как настроить элемент Webhook 
### Добавьте элемент Webhook
Перетащите элемент **Webhook** на канвас. Разместите **Webhook** в любом месте, учитывая, какую информацию из Journey вы собираетесь отправлять в сторонний сервис.

<img src="/journey-elements-README-40.webp" alt="Элемент Webhook на канвасе с настройками имени и запроса"/>

### Назовите шаг Webhook и укажите URL и тип запроса
В поле **STEP NAME** введите название для вебхука. Может быть удобно называть вебхуки в соответствии с сервисами, в которые они отправляют данные, или по сценарию использования.

Далее в поле **URL** укажите URL-адрес запроса, на который должны быть отправлены данные. Рядом с полем URL выберите тип запроса из выпадающего списка **REQUEST TYPE**: `GET` или `POST`.
<img src="/journey-elements-webhook-1.webp" alt="Интерфейс настройки Webhook, показывающий поле URL и выпадающий список REQUEST TYPE для выбора метода GET или POST"/>
### Настройте заголовки
В разделе **HEADERS** установите тип контента. 

По умолчанию тип контента — **application/json**. Если сервис, в который вы отправляете вебхук, требует другой тип контента, введите соответствующее значение в заголовок **Content-Type**. 

Примеры типов контента:

* `x-www-form-urlencoded`
* `text/plain`
* `text/xml`

При необходимости добавьте дополнительные заголовки, нажав **+ ADD HEADER**. Вы можете удалить любой заголовок, нажав на значок «x» рядом с ним.

Например, некоторые API могут требовать **базовую HTTP-аутентификацию**. Для аутентификации таких запросов выполните следующие действия:

1. Откройте простой текстовый редактор и введите ваше имя пользователя и пароль без пробелов, разделенные двоеточием. Например: `myuser:mypass`
2. Закодируйте эту строку в Base64.
3. Скопируйте полученную строку Base64 (например, `bXl1c2VyOm15cGFzcw==`).
4. В настройках вебхука добавьте заголовок Authorization со значением: `Basic <ВАША СТРОКА BASE64>`. Убедитесь, что после слова «Basic» есть пробел.

<img src="/journey-elements-webhook-2.webp" alt="Пример заголовка Authorization для базовой аутентификации в настройках вебхука, показывающий заголовки Content-Type и Authorization"/>
### Добавьте тело JSON-запроса
В разделе **DATA** введите тело вашего JSON-запроса. Убедитесь, что тело запроса имеет правильный формат JSON.

<Aside type="note">
Если на момент отправки POST-запроса для плейсхолдера динамических данных нет значения, будет передано значение null.
</Aside>

Пример:
```
{
  "hwid": "{{device:hwid}}"
}
```



### Используйте динамические данные и макросы

Панель **DATA BUILDER** позволяет вставлять динамическую информацию (например, данные о пользователе, устройстве, Tag или Event) непосредственно в тело вашего JSON-запроса. С помощью динамических данных вы можете включать значения, специфичные для конкретного пользователя, проходящего через Journey.

Для этого: 
1. Выберите **категорию**. Вы можете извлекать данные из трех категорий:

- **Device:** Используйте данные об устройстве, когда вам нужна техническая информация, привязанная к устройству пользователя.

- **Tag:** Используйте данные тегов, когда вы хотите отправить информацию, хранящуюся в профиле пользователя.

- **Event:** Используйте данные о событии, когда вебхук должен отправлять значения из события, запустившего Journey.

2. Выберите **параметр** (например, HWID, любимая категория и т. д.).
3. Pushwoosh сгенерирует макрос, который выглядит следующим образом:

```
{{tag:Language}}
```

4. Скопируйте макрос и вставьте его в тело JSON в разделе DATA.

Когда вебхук запускается в активном Journey, Pushwoosh автоматически заменяет макрос фактическим значением для этого пользователя.

<img src="/journey-elements-webhook-3.webp" alt="Вставка плейсхолдеров динамических данных в тело запроса вебхука"/>

### Сопоставьте данные ответа вебхука с переменными

Помимо отправки данных, элемент Webhook также может получать данные из ответа, который он получает, и преобразовывать их в переменные. Эти переменные затем можно использовать позже в Journey. Например, установить тег с помощью [**Обновить профиль пользователя**](/ru/product/customer-journey/journey-elements/flow-controls/update-user-profile/#use-a-value-from-a-webhook-response) или запланировать [**Задержку по времени**](/ru/product/customer-journey/journey-elements/flow-controls/time-delay/#use-a-date-from-a-webhook-response) на основе значения, возвращенного внешним сервисом. Полный пример Journey см. в разделе [Использование данных ответа вебхука в вашем Journey](/ru/product/customer-journey/journey-elements/using-webhook-response-data-in-journeys/).

В разделе **RESPONSE MAPPING** нажмите **+ ADD MAPPING** и заполните два поля для каждого значения, которое вы хотите получить:

* **Path:** расположение значения в теле JSON-ответа
* **Attribute:** имя, которое вы будете использовать для ссылки на это значение позже в Journey

<img src="/journey-elements-webhook-4.webp" alt="Раздел сопоставления ответов с полями Path и Attribute и кнопкой Add mapping в настройках вебхука"/>

Например, если ваша CRM отвечает:

```
{
  "data": {
    "user": {
      "id": "789xyz"
    }
  }
}
```

Установите **Path** в `data.user.id` и **Attribute** в `crm_user_id`, чтобы получить этот ID.

<Aside type="note">
Несколько моментов, которые нужно знать о сопоставлении:

- **Path** — это простой путь, разделенный точками (ключи объектов и, для массивов, числовые индексы, например `results.0.code`). Он не поддерживает подстановочные знаки или фильтры, поэтому может указывать только на одно конкретное значение за раз.
- Значения сохраняются точно в том виде, в каком они приходят из JSON-ответа (текст, число или true/false). Преобразование типов не производится. Если вы планируете использовать значение в качестве даты в элементе **Time Delay**, убедитесь, что ваш сервис возвращает его в одном из форматов даты, поддерживаемых **Time Delay**.
- Если ответ не является валидным JSON или **Path** ничему не соответствует, соответствующая переменная для этого пользователя не создается. Ошибка не отображается, и шаг **Webhook** все равно завершается нормально.
</Aside>

<Aside type="caution">
Тела ответов размером более 64 КБ вообще не обрабатываются для сопоставления. Если вы планируете сопоставлять значения из ответа, который отправляет ваша конечная точка, делайте его достаточно небольшим.
</Aside>

<LinkCard title="Использование данных ответа вебхука в вашем Journey" href="/product/customer-journey/journey-elements/using-webhook-response-data-in-journeys/" />

### Протестируйте Webhook
Нажмите **Test webhook**, чтобы убедиться, что ваша конфигурация вебхука верна и запрос успешно отправлен.

### Сохраните вашу конфигурацию
Нажмите **Apply**, чтобы сохранить конфигурацию вебхука.