---
title: "Используйте ThunderPhone с n8n"
description: "Установите узел ThunderPhone для n8n, подключите ключ API сервера и создайте рабочий процесс, который запускается каждый раз после завершения звонка."
---

[n8n](https://n8n.io) — инструмент для автоматизации рабочих процессов. Пакет ThunderPhone
для n8n добавляет два узла:

- **Триггер ThunderPhone** запускает рабочий процесс при завершении звонка (**Звонок
  завершён**) или завершении запуска оценки звонка (**Звонок оценён**).
- **ThunderPhone** выполняет исходящие звонки, добавляет контакты в кампании и
  запускает их, получает звонки с их расшифровкой и записью, а также выводит список ваших
  агентов и телефонных номеров.

Это проверенный узел сообщества, представленный на странице
[ThunderPhone в n8n](https://n8n.io/integrations/thunderphone/).

## Установите узел

В редакторе n8n нажмите **+**, чтобы открыть панель узлов, и найдите
**ThunderPhone**. Владельцу экземпляра может потребоваться настроить проверенные узлы, прежде чем
другие пользователи смогут их добавлять.

В самостоятельно развёрнутом n8n также можно выполнить установку по имени пакета: откройте
**Настройки > Узлы сообщества** и установите `n8n-nodes-thunderphone`. Ознакомьтесь с рисками, связанными с узлами сообщества, и политикой вашего экземпляра
перед установкой.

## Создайте серверный API-ключ

<Steps>
  <Step title="Откройте вкладку «Ключи»">
    В ThunderPhone перейдите в **Организация → Ключи** и нажмите **Создать ключ**.
  </Step>
  <Step title="Задайте имя">
    Используйте имя, указывающее, где хранится ключ, например «n8n».
  </Step>
  <Step title="Скопируйте его сейчас">
    Полный секрет `sk_live_...` отображается один раз. Скопируйте его, прежде чем закрыть
    диалоговое окно.
  </Step>
</Steps>

Создать ключ может только администратор или владелец, и ThunderPhone считает, что запросы,
выполненные с его помощью, поступают от этого человека. Для триггера и операций с кампаниями
этот человек должен сохранять роль администратора или владельца.
[Создание серверного API-ключа](/ru/guides/api-keys) описывает ротацию и отзыв.

## Добавьте учётные данные в n8n

1. В n8n создайте учётные данные типа **ThunderPhone API**.
2. Вставьте ключ в поле **API-ключ**.
3. Сохраните их и запустите проверку учётных данных. Проверка считывает сведения об одном звонке из вашей
   организации с помощью `GET /v1/calls?limit=1`.

## Создайте первый рабочий процесс

Этот рабочий процесс добавляет строку в Google Таблицу каждый раз после завершения звонка.

<Steps>
  <Step title="Добавьте триггер">
    Добавьте **ThunderPhone Trigger**, выберите учётные данные API ThunderPhone и
    задайте для **Событие** значение **Звонок завершён**.
  </Step>
  <Step title="Получите данные звонка">
    Добавьте узел **ThunderPhone**. Задайте для **Ресурс** значение **Звонок**, для **Операция**
    — **Получить**, а для **ID звонка** — выражение `{{ $json.data.call_id }}`.
    На выходе вы получите [запись звонка](/api-reference/calls), а также `transcripts`
    и `recording_url` — ссылку с коротким сроком действия, которая имеет значение `null`, если у звонка
    нет записи.
  </Step>
  <Step title="Добавьте строку">
    Добавьте узел Google Таблиц, который добавляет строку, и сопоставьте нужные
    столбцы с данными из результата «Получить звонок» (см. таблицу ниже).
  </Step>
  <Step title="Активируйте рабочий процесс">
    Сохраните и активируйте. Триггер регистрирует свой Продакшен URL в качестве конечной точки
    вебхука в вашей организации ThunderPhone. Деактивация рабочего процесса
    удаляет эту конечную точку.
  </Step>
  <Step title="Протестируйте">
    Откройте агента в конструкторе, нажмите **Поговорить** и завершите звонок. Тестовые
    звонки из конструктора доставляются как `web.complete` — одно из двух событий,
    соответствующих «Звонок завершён», поэтому рабочий процесс запускается и появляется строка.
  </Step>
</Steps>

Полезные столбцы:

| Столбец | Выражение |
|---|---|
| ID звонка | `{{ $json.call_id }}` |
| Направление | `{{ $json.direction }}` |
| От | `{{ $json.from_number }}` |
| Кому | `{{ $json.to_number }}` |
| Начало | `{{ $json.start_time }}` |
| Длительность (с) | `{{ $json.duration_seconds }}` |
| Статус | `{{ $json.status }}` |
| Причина завершения | `{{ $json.end_reason }}` |
| Ссылка на звонок | `https://app.thunderphone.com/dashboard/call-history/{{ $json.call_id }}` |

Ссылка на звонок открывает звонок в панели управления ThunderPhone для участников
вашей организации вместе с его расшифровкой и записью, поэтому их не нужно
хранить в таблице.

Чтобы всё же добавить расшифровку, сопоставьте
`{{ $json.transcripts.filter(t => typeof t.content === 'string').map(t => t.role + ': ' + t.content).join('\n') }}`.
URL записи истекает, поэтому сохраните ID звонка и снова выполните операцию «Получить звонок»,
когда потребуется актуальная ссылка. Расшифровки звонков, сводки и записи могут содержать
персональную информацию или сведения о здоровье. Отправляйте их только в приложения, которые
вашей организации разрешено использовать для таких данных, по соглашению BAA, если речь идёт
о сведениях о здоровье, и храните только необходимые поля.

<Note>
  ThunderPhone доставляет события методом `POST` на **Продакшен
  URL** триггера, поэтому ваш экземпляр n8n должен быть доступен из интернета по HTTPS,
  а рабочий процесс должен быть активен. Триггер проверяет HMAC
  `X-ThunderPhone-Signature` в каждом запросе и возвращает `401`
  для любых неподписанных или недействительных запросов.
</Note>

Триггер выводит полное событие: `type`, `event_id` и `data`. Все поля см. в
[`telephony.complete` / `web.complete`](/ru/webhooks/call-complete) и
[`call.graded`](/ru/webhooks/events). Доставка выполняется как минимум один раз,
а `event_id` остаётся одинаковым при повторных попытках доставки одного события, поэтому проверяйте
его перед этапом, который нельзя выполнять повторно.

## Безопасное совершение исходящих звонков

**Совершить исходящий звонок** (ресурс **Исходящий звонок**, операция **Совершить**)
принимает:

| Поле | Значение |
|---|---|
| Имя или ID агента | Сохранённый агент. В раскрывающемся списке указаны ваши агенты. |
| Имя или ID номера телефона | Номер отправителя. В раскрывающемся списке указаны только номера, включённые для исходящих звонков. |
| Номер получателя | Номер назначения в формате E.164, например `+14155552671`. |
| Переменные | Объект JSON со значениями для заполнителей в промпте агента. |
| Ключ идемпотентности | Стабильный ID из вышестоящей записи или события. Обязательное поле. |

Сопоставьте **Ключ идемпотентности** с ID из источника запуска, например с
ID записи CRM или `event_id` триггера. Узел отправляет
`n8n:<node ID>:<your value>`, поэтому:

- Автоматическая повторная попытка или **Повторить выполнение** отправляет тот же ключ, и
  ThunderPhone возвращает исходный звонок с `idempotent_replay: true`
  вместо повторного набора номера.
- Два узла ThunderPhone, получившие одну и ту же запись, отправляют разные ключи.
- Пустое значение вызывает ошибку до отправки запроса.

Не используйте временные метки, случайные значения и ID выполнения или рабочего процесса n8n. Новое
значение при повторной попытке совершает второй реальный звонок. Полный ключ может содержать не более 128
символов. Повторное использование ключа с другим агентом, номером или переменными завершается
конфликтом.

**Кампании.** **Добавить контакты** (ресурс **Кампания**) добавляет контакты в
черновик кампании. Для этого нужны ID кампании и массив JSON с контактами. Для каждого контакта требуется `phone_number`; остальные ключи
становятся переменными звонка. Узел завершается ошибкой, если отклонены все контакты, и устанавливает
`partial_success: true`, если отклонена только часть контактов. **Запустить** требует установить флажок,
подтверждающий, что кампания совершает реальные звонки и расходует кредиты ThunderPhone.
См. [Исходящие кампании](/ru/guides/outbound-campaigns).

Перед тем как рабочий процесс начнёт совершать звонки:

- Если ThunderPhone просит вашу организацию подтвердить, что её исходящие звонки
  соответствуют TCPA и другим законам о звонках, администратор должен сначала
  зафиксировать это подтверждение в панели управления.
- Номер отправителя должен быть включён для исходящих звонков. Номера, которые вы переносите от
  собственного оператора, становятся доступными после проверки. Номера ThunderPhone изначально
  доступны только для входящих звонков и могут быть одобрены для исходящего использования: администратор запрашивает это
  на странице «Номера телефонов». См.
  [Получить номер телефона](/ru/guides/get-a-phone-number).
- Ваша организация отвечает за наличие согласия на звонок по каждому номеру
  и за соблюдение применимых законов о звонках. См.
  [Законы об исходящих звонках](/ru/guides/outbound-calling-laws).

## Примеры рабочих процессов

- **Контакты CRM в кампанию.** Добавьте контакты CRM в черновик кампании
  ThunderPhone, затем запустите кампанию, когда кто-то одобрит список.
- **Завершённый звонок в запись клиента.** При событии «Звонок завершён» выполните «Получить звонок»
  и сохраните расшифровку и ссылку на запись в соответствующей записи клиента.
- **Низкие оценки на проверку.** При событии «Звонок оценён» отфильтруйте по
  `{{ $json.data.grade.score }}` и направьте звонки с низкой оценкой в очередь проверки
  с ID звонка и сведениями об оценке. Звонок может быть оценён более одного раза,
  и каждый завершённый запуск оценки активирует триггер, поэтому сохраняйте только последнее значение
  `graded_at` для каждого ID звонка.

Расшифровки, сводки и записи звонков могут содержать персональную информацию или
информацию о здоровье. Отправляйте их только в приложения, которые ваша организация имеет право использовать для
таких данных, по соглашению BAA, если речь идёт об информации о здоровье, и храните только
нужные поля.

<Note>
  Вместо этого отправляете те же события звонков на собственный сервер? См.
  [Конечные точки вебхуков](/ru/webhooks/endpoints).
  [Совершение исходящих звонков](/ru/guides/place-outbound-calls) описывает API для
  совершения исходящего звонка.
</Note>
