Интеграции: вебхуки наружу и внутрь
Слово «вебхук» в разговорах про интеграции означает две разные вещи, и их постоянно путают. Внутрь: внешний сервис стучится в вашу CRM и запускает воронку. Наружу: CRM сама отправляет данные в чужой сервис — из блока воронки или потоком событий. Если сразу понять, в какую сторону идут данные, половина вопросов «почему не работает» снимается до того, как их зададут.
Где что лежит
Раздел «Интеграции и оплата» в группе «Настройки» открыт только администратору школы. Вкладки:
- «Эквайринг» открывается первой: платёжки, товары и оплаты. Как это устроено — «Приём оплат: эквайринг и ссылки на оплату».
- «Телефония» — своя АТС школы. Вкладка есть, когда подключён модуль «Отдел продаж».
- «Озвучка» — ключ ElevenLabs для голосовых из текста. Вкладка есть, если школе доступна озвучка.
- «Вебхуки» — адрес и токен, по которым внешний сервис запускает воронку, и приём анкеты с сайта.
- «Отправка событий» — адреса, куда CRM сама шлёт события воронок, оплат и сделок.
- «Прочее» — аккаунты GetCourse и SMSC, если они доступны школе.
Входов внутрь три: общий вебхук событий на вкладке «Вебхуки», анкета с сайта там же и свой адрес у старта «Вебхук (любой сервис)» прямо в воронке. Выходов наружу два: действие «Вебхук» в блоке «Действия» и вкладка «Отправка событий». Следствие простое: «внешний сервис не запускает воронку» разбирают во входах и в стартовом блоке, «данные не доходят до аналитики» — в действии «Вебхук», его прогонах или в журнале доставок.
12345- Вкладки раздела
- «Запуск сценариев из внешнего сервиса»: состояние токенов и требования к запросу
- Карточка вебхука: метод и путь, «Копировать URL», ниже полный адрес, заголовок и токен
- «Заголовки одним блоком» — готовый JSON для вставки во внешний сервис; ниже свёрнутые «Поля запроса и пример» и строка «Ответ:»
- Ниже — «Анкета с сайта» со своим адресом
Пока строка красная, вторую сторону настраивать бесполезно
Вкладка «Вебхуки» начинается с карточки «Запуск сценариев из внешнего сервиса» и одной из двух строк: «Токены вебхуков настроены» или «Токены вебхуков не настроены — запросы будут отклоняться». Вторая означает ровно это: внешний сервис получит отказ на каждый вызов. Токен руками не заводится, его выдаёт платформа. Поэтому сначала строка зелёная, потом настройка на той стороне.
Тот, у кого есть токен, запускает воронки на ваших клиентах: пишет им от имени школы, двигает этапы, создаёт чаты. Токену не место в публичном репозитории, в общем чате и в описании задачи. Передавайте его лично тому, кто настраивает интеграцию.
Каждый адрес описан карточкой: метод и путь, кнопка «Копировать URL», назначение, затем «Полный URL», «Заголовок» и «Токен» со своими кнопками «Копировать». Ниже — «Заголовки одним блоком», свёрнутые «Поля запроса и пример» и строка «Ответ:».
Заголовок называется X-Event-Token, у событий и анкеты он общий. Перепечатанное руками имя с опечаткой или лишний пробел в токене дают одну картину: внешний сервис уверен, что всё передал, а CRM отвечает отказом. Готовый JSON копируется целиком и этой ошибки не оставляет.
Внутрь: одно событие на все случаи
Общий вход — POST на /webhooks/event (полный адрес берите кнопкой, он свой у каждой школы). Тело — JSON, токен — в заголовке X-Event-Token.
- event_key — обязателен. Ключ события: именно он связывает вызов с воронкой.
- lead — обязателен. Кому событие:
tg_id,usernameилиlead_key. Ник ищется без учёта регистра, с «@» и без. По телефону этот вход человека не находит. - vars — необязателен. Любые поля события: они доступны в условии запуска и подставляются в тексты. Телефон из
phoneили «телефон» ляжет в карточку клиента, если там пусто. - event_id — необязателен. Номер события, например номер заказа: по нему CRM узнаёт повторную доставку того же события.
{
"event_key": "payment_ok",
"lead": { "lead_key": "lead-123" },
"vars": { "amount": 1000 },
"event_id": "order-5521"
}
Мысль, на которой спотыкаются все: идентификатор в теле — способ найти человека, а не адрес доставки. Куда уйдёт первое сообщение — в бот, в личку или в групповой чат, — решает поле «Где вести воронку» в стартовом блоке.
Что означает ответ
На каждый вызов приходит { status, event_key, binding_id, run_started, run_id, repeat }. Смотреть надо не на код ответа, а на run_started.
status: ok, run_started: true | Человек найден, воронка запущена. Единственный полностью успешный исход. |
run_started: false, repeat: true | Повтор: по этому событию воронка у человека уже запускалась. Это не сбой. |
run_started: false, repeat: false | Человек найден, воронка не пошла: нет включённой воронки с таким ключом или не подошло условие запуска. |
status: lead_not_ready | Карточка есть, но писать некуда: ни группового чата, ни лички, ни переписки с ботом. |
| Ошибка 404 | По присланному ключу человека не нашли ни в карточках, ни в переписке. |
| Ошибка 401 или 400 | Не тот токен либо не передан event_key. |
| Ошибка 503 | Приём закрыт со стороны школы: токен не выдан или воронки выключены (в «Настройках» на вкладке «Воронка» карточка «Воронки TERVIO» показывает «выключены»). Пишите в поддержку. |
Тот же след виден и в CRM: в переписке клиента администратор увидит строку «Колбек · событие „payment_ok“» с пришедшими полями, а если воронка не поехала — с припиской «воронка не запустилась» или «повтор, уже было».
Внешний сервис видит «200, всё хорошо» и считает работу сделанной, а run_started при этом false. Если на той стороне есть логи, сохраняйте в них именно это поле: вопрос «почему клиенту ничего не пришло» тогда решается за минуту.
Связь ключа с воронкой
Со стороны CRM вызов принимает стартовый блок: «Что запускает воронку» → «Внешнее событие (вебхук)» и поле с ключом события. Совпадение — буква в букву: payment_ok и Payment_OK разные ключи. Сам старт разобран в «Триггеры: чем запускается воронка», для интеграции важны три следствия:
- Воронка должна быть включена. Выключенная событие не поймает, а вызов ответит без ошибки — самый частый
run_started: false. - Группа «Повторный запуск» в старте. По умолчанию у внешнего события стоит «Только один раз»: событие запускает воронку у человека однажды. «При каждом событии» — каждое событие новый запуск: вторая оплата, второй приглашённый друг. Повтор того же события отсекается по
event_id, а без него — одинаковое событие в течение 10 минут. Есть и «Не чаще, чем раз в …». У системных событий CRM — оплат, доступа к курсу, заявки в чат — «один раз» не бывает. - Служебному событию вроде «оплата дошла» нужен переключатель «Не состояние»: обычный запуск останавливает активные воронки клиента, и платёж собьёт человека с прогрева.
Свой адрес у воронки: старт «Вебхук (любой сервис)»
Общему входу нужен токен в заголовке и тело в его формате. Форма Tilda, платёжка или CRM школы так часто не умеют. Для них в стартовом блоке есть «Вебхук (любой сервис)»: после сохранения листа у старта появляется своё поле «Адрес вебхука». Сервис шлёт туда GET или POST — JSON, форму или параметры в адресе, — и поля тела становятся переменными воронки: {name}, {tarif}, всё тело целиком — {вебхук_тело}.
- «Кого запускает»: «Без человека» — каждый вызов идёт своим прогоном: вычисления, вебхук в другой сервис, «Создать заявку», «Ответ странице», но писать человеку нельзя. «Человека из CRM» — человек ищется по
tg_id,lead_key, телефону, почте или нику из тела, дальше обычная воронка. - «Ждать ответа сценария» — сервис ждёт до 8 секунд и получает в поле
replyто, что вернуло действие «Ответ странице»: цену, ссылку на оплату, номер заявки. - «Последние вызовы» — что пришло и что запустилось. Первая проверка, когда «сервис говорит, что отправил».
Токена у этого входа нет: кто знает адрес, тот и запускает воронку. Адрес утёк — нажмите «Новый адрес» и сохраните лист. Старый перестанет работать сразу, поэтому новый нужно вписать во все сервисы, которые его зовут.
Анкета с сайта без воронки
Вторая карточка вкладки «Вебхуки» — «Анкета с сайта», POST на /webhooks/anketa с тем же заголовком X-Event-Token. Форма присылает ответы «вопрос → ответ», а CRM кладёт их в переписку примечанием «Анкета», ставит групповому чату этап «Сдал анкету» и записывает телефон в карточку. Воронку собирать не нужно. Чтобы CRM узнала человека, добавьте в ссылку на анкету его id: …/anketa?tg_id={tg_id} — воронка подставит его сама, а форма вернёт в lead.tg_id. Если форма умеет только событие с переменными, возьмите готовую воронку: «Сценарии» → «Шаблоны» → «Анкета с сайта».
Наружу: из блока или потоком
Действие «Вебхук» в воронке
Адрес, метод, тело, заголовки и поле «Сохранить ответ». Как его заполнять — в «Блок «Действия»: этапы, вебхук, событие, команда, переходы, A/B». Для интеграции важно, когда придут данные.
Если сервис отвечает прямо в теле, переменная появляется сразу. Если он отвечает отдельным вызовом к вам, то есть событием, значения в момент прохода ещё нет, и обычная стрелка уведёт человека по ветке «пусто» раньше, чем данные доедут. Спасает стрелка с условием по этой переменной: под условием стоит переключатель ожидания («Ждать переменную …»), он включён по умолчанию, и поле «Сколько ждать» — 10 минут. Не дождались — ветка выбирается по тому, что есть («Стрелки: ожидание, время, дожимы»).
Ошибка внешнего сервиса воронку не обрывает: причина видна в прогонах того человека. А если адрес отвечает ошибкой раз за разом, CRM напишет об этом в телеграм — событие «Воронка не может отправить данные» («Уведомления: о чём TERVIO пишет в телеграм»).
«Отправка событий»: всё в аналитику без блоков
Когда аналитику или BI нужны данные по всем воронкам, ставить блок «Вебхук» в каждую не нужно. На вкладке «Отправка событий» → «Добавить адрес» вы указываете адрес, отмечаете, какие события отправлять, и выбираете «Пачкой» или «По одному». События разбиты на группы: «Воронки» (вошёл, прошёл блок, ответил, перешёл по ссылке, блок «ИИ» выбрал выход), «Кнопки ботов», «Переписка», «Клиенты, этапы и теги», «Деньги», «Рассылки».
- Подпись. Каждый запрос подписан заголовком
X-Tervio-Signature. Секрет показывается один раз, при создании адреса. Проверяйте подпись на своей стороне, чтобы принимать только события TERVIO. - «Отправить тестовое событие» — проверка, что адрес отвечает кодом 2xx.
- «Выгрузить историю» — события за прошлый период уходят на адрес с пометкой
"history": true. - «Журнал доставок» — что ушло и что вернул ваш сервер.
Не принимает адрес почти сутки — отправка встаёт на паузу, а CRM присылает уведомление «Отправка событий на паузе». События при этом копятся и после «Возобновить отправку» уходят по порядку. Повторные доставки приходят с тем же id: по нему ваша сторона отсеивает дубли.
Связка целиком: от оплаты до ссылки в ответ
- Собираете воронку «После оплаты»: «Старт» — «Внешнее событие (вебхук)», ключ
payment_ok, «Где вести воронку» — «В личке лида», «Не состояние». Включаете лист. - В «Интеграциях» на вкладке «Вебхуки» проверяете, что строка зелёная, и копируете полный URL и «Заголовки одним блоком».
- На стороне платёжного сервиса (напрямую или через n8n) настраиваете вызов:
POSTпо этому адресу, тело{"event_key":"payment_ok","lead":{"tg_id":…},"vars":{"amount":…},"event_id":…}. - Клиент оплатил — CRM находит его по
tg_id, запускает воронку и отвечаетrun_started: true. - Первый блок пишет в личку: «Оплата на {amount} ₽ дошла» — сумма подставилась из
vars. - Дальше блок «Действия»: «Действие TERVIO» → «Сдвинуть этап» на ваш этап оплаты, теперь оплата видна в карточке и в аналитике. Следом в том же блоке «Вебхук»:
POSTв вашу систему учёта, в «Сохранить ответ» —link -> ssylka. - От блока — стрелка с условием по
ssylkaи ожиданием переменной: пришла ссылка — уходит сообщение с доступом, не пришла — вторая ветка ставит задачу куратору.
- Знаете, на какой вкладке «Интеграций» лежит токен для входящих событий, а на какой — адреса для отправки событий наружу.
- Назовёте обязательные части вызова общего входа: заголовок с токеном,
event_key,lead. - Понимаете, почему успешный ответ с
run_started: false— это не успех, и чем от него отличаетсяrepeat: true. - Знаете, когда в «Повторном запуске» ставить «При каждом событии» и зачем передавать
event_id. - Выберете старт «Вебхук (любой сервис)», когда сервис не умеет передавать токен в заголовке.
- Понимаете, когда на стрелке нужно ждать переменную, а когда ответ доступен сразу.
Дальше — «ИИ-подсказки ответа, база знаний и блок «ИИ»»: как включить черновики ответов от модели и откуда она берёт факты про вашу школу.
Справочник по этому разделуДокументация TERVIO: что делает каждая кнопка на экране.