Webhook из Telegram-бота в CRM нужен не для галочки в интеграциях, а чтобы не потерять момент, когда человек стал лидом: оставил телефон, нажал кнопку покупки, прошел квалификацию, оплатил или попросил менеджера. Правильный вебхук передает в CRM не только имя и телефон, а событие, Telegram ID, источник, статус, ответы пользователя и ссылку на дальнейшее действие.

Короткий вывод: если CRM нужна только как таблица лидов, хватит одного исходящего HTTP-запроса из сценария. Если CRM должна запускать бота обратно, нужен входящий API-вебхук с ключом события и идентификатором контакта. Если продажи идут прямо в Telegram, часто проще держать CRM-слой внутри Strelo и отправлять наружу только те события, которые действительно нужны внешней системе.

Сценарии

Для кого эта статья

Онлайн-школа

Нужно передавать заявки, оплаты, тарифы и доступы между ботом, CRM и обучающей платформой без ручной сверки.

Отдел продаж

Менеджеры работают в CRM, а лиды приходят из Telegram-бота, рекламы, канала и повторных касаний.

Telegram-магазин

Бот собирает заказ, уточняет параметры, передает данные в CRM и получает обратно статус оплаты или доставки.

Главный принцип: webhook должен передавать событие и идентификатор контакта. Если передать только текст заявки, CRM увидит строку, но не сможет связать ее с Telegram-диалогом и следующим шагом воронки.

Сначала разделите три разных вебхука

В одном запросе люди часто смешивают три вещи. Первая - служебный webhook Telegram Bot API, по которому Telegram присылает платформе входящие сообщения. Его обычный пользователь конструктора не настраивает вручную: он подключает токен бота, а платформа регистрирует и обслуживает этот вход.

Вторая - исходящий запрос из сценария. Бот дошел до шага, собрал телефон или email и отправил POST в CRM. Именно это чаще всего имеют в виду, когда говорят: "нужно передать лида из Telegram-бота в CRM".

Третья - входящий API-вебхук в сторону платформы. CRM, сайт, платежка или свой backend отправляет в Strelo событие, например order_paid или demo_booked, а опубликованная воронка запускается для найденного контакта.

Разбор терминов

Три маршрута, которые называют webhook

Перед настройкой важно понять, какой именно маршрут нужен вашему процессу.

КритерийTelegram webhookИсходящий запрос в CRMВходящий API-вебхук
Кто отправляетTelegram присылает updates платформеБот или сценарий отправляет данные в CRMCRM, сайт или backend отправляет событие в Strelo
Что запускаетПрием входящих сообщенийСоздание лида, сделки, задачи или поля в CRMОпубликованную воронку по event key
Кто обычно настраиваетПлатформа после подключения токенаМаркетолог или интегратор в ноде HTTPВладелец CRM или backend через API-ссылку
Главный рискПерехват токена другим сервисомОтправить данные без Telegram ID и sourceЗапустить событие без секрета или без идемпотентности
Для передачи лида в CRM почти всегда нужен второй маршрут. Для обратной реакции CRM в Telegram нужен третий.

Если не разделить эти маршруты, проект быстро ломается. Маркетолог ждет, что "вебхук Telegram" создаст сделку в CRM. Разработчик настраивает endpoint Telegram Bot API, хотя бизнесу нужен обычный POST с лидом. Менеджер видит в CRM контакт без Telegram ID и не может вернуть человека в бот. Поэтому начинать нужно не с URL, а с вопроса: какое событие передаем и кто должен отреагировать.

Когда достаточно исходящего запроса в CRM

Исходящий запрос подходит, если сценарий в Telegram уже собрал нужные данные и должен просто сообщить их CRM. Например, пользователь нажал "Хочу консультацию", ответил на три вопроса, оставил телефон и согласился на связь. В этот момент бот отправляет в CRM payload с именем, телефоном, Telegram ID, тегом интереса, источником и временем.

В Strelo для этого используется действие "Внешний запрос (API)". Оно отправляет HTTP-запрос на публичный адрес, поддерживает GET, POST, PUT и DELETE, заголовки, JSON-тело и сохранение ответа в переменную. Это не требует писать отдельный сервер, если CRM уже умеет принимать webhooks или имеет API.

Маршрут 1

Как бот отправляет лида в CRM

  1. Собрать данные в сценарии

    Бот получает имя, телефон, email, выбранный продукт, ответы на вопросы и источник входа.

  2. Проверить готовность лида

    Отправлять в CRM стоит не каждое сообщение, а событие: заявка, квалификация, оплата, запрос менеджера.

  3. Отправить HTTP-запрос

    Нода внешнего запроса вызывает публичный endpoint CRM, передает JSON и заголовки авторизации.

  4. Сохранить ответ

    Если CRM вернула ID сделки или ошибку, ответ можно сохранить в переменную и использовать в условии.

На публичном блоке интеграций Strelo отдельно выделены вебхуки, HTTP и API: это слой обмена данными между Telegram, CRM, платежами и внешними сервисами.
На публичном блоке интеграций Strelo отдельно выделены вебхуки, HTTP и API: это слой обмена данными между Telegram, CRM, платежами и внешними сервисами.

Важная деталь: не отправляйте запрос на каждый текст пользователя. CRM обычно не нужна вся переписка в режиме реального времени. Ей нужны события, которые меняют статус лида: заявка создана, квалификация пройдена, нужен менеджер, заказ оплачен, доступ выдан, клиент отказался. Так база не забивается шумом, а менеджеры видят только рабочие сигналы.

Контракт payload: что отправлять в CRM

Хороший payload не должен быть огромным. Но он должен позволить CRM однозначно понять, кто это, что случилось и что делать дальше. Минимальный набор: event, telegram_id, phone или email, name, source, status, answers, occurred_at и stable_id для идемпотентности.

Контракт данных

Какие поля стоит передавать в CRM

Набор зависит от бизнеса, но эти поля закрывают большую часть Telegram-продаж.

КритерийПолеЗачем нужноОшибка при отсутствии
eventlead_created, qualified, order_paidCRM понимает смысл событияВсе события выглядят одинаково
telegram_idЧисловой ID пользователяСвязывает CRM-сделку с диалогом в ботеНельзя надежно вернуть человека в Telegram
phone или emailКонтакт для CRM и менеджераПомогает найти дубль и связаться вне TelegramМенеджер видит лид без рабочего контакта
source и campaignКанал, пост, реклама, короткая ссылкаМаркетинг понимает, откуда пришла продажаВсе лиды сваливаются в общий источник
stable_idlead_id, order_id или event_idЗащищает от дублей при повторной доставкеПовторный webhook создает вторую сделку
Лучший payload короткий, но достаточный для связи контакта, события, источника и следующего действия.

Если у вас есть только username, интеграция будет хрупкой. Username можно сменить, он может отсутствовать, а менеджер не всегда сможет написать человеку напрямую. Telegram ID надежнее для связи внутри бота, phone и email лучше для CRM и внешних продажных процессов, external_id полезен, если контакт уже существует в другой системе.

Матчинг

Какие идентификаторы хранить

telegram_id

Главный ключ для связи с Telegram-диалогом и запуска воронки для конкретного контакта.

phone и email

Нужны CRM, менеджеру, оплатам, дублям и внешним каналам связи.

external_id

Сохраняет связь с уже существующей записью в CRM, LMS или backend.

Отдельно решите, что делать с UTM и источником. Если реклама ведет в Telegram, CRM должна получить не просто "лид из бота", а campaign, content, объявление или хотя бы короткую ссылку. Иначе отдел продаж видит заявки, но маркетинг не понимает, какая реклама дала нормальные лиды.

Как обрабатывать ответ CRM

Не все CRM только принимают данные. Иногда они возвращают статус: сделка создана, дубль найден, нужен другой менеджер, лимит достигнут, ошибка авторизации. Если ответ важен для сценария, сохраните его в переменную и поставьте после HTTP-запроса условие.

Например, CRM вернула статус ok. Бот отвечает: "Заявка принята, менеджер напишет". Если вернулась ошибка, бот может предложить ручной контакт или перевести диалог оператору. Сценарий не должен молча продолжаться так, будто внешняя система всегда доступна.

Ответ CRM

Что делать после ответа внешней системы

Ответ CRM полезен только если сценарий умеет на него реагировать.

КритерийОтветДействие ботаЧто записать
okCRM создала сделкуПодтвердить заявку пользователюcrm_deal_id и статус
duplicateКонтакт уже был в CRMНе создавать новый путь, обновить контекстexisting_contact_id
unauthorizedОшибка секрета или токенаНе обещать создание заявки, уведомить оператораhttp_status и тело ошибки
timeoutCRM не ответила вовремяПоставить тег ручной проверкиrequest_id и время попытки
Webhook без обработки ошибок создает иллюзию интеграции. Пользователь думает, что заявка ушла, а CRM могла ее не принять.

В Strelo HTTP-запрос не должен останавливать всю воронку навсегда. Поэтому важно заранее продумать fallback: если endpoint не ответил, не обещайте пользователю, что заявка точно создана. Лучше сказать, что данные приняты в чате, поставить тег "проверить вручную" и уведомить оператора.

Входящий API-вебхук: когда CRM запускает бота обратно

Обратный маршрут нужен, когда событие рождается не в боте. Примеры: менеджер в CRM перевел сделку в "счет оплачен", сайт записал человека на консультацию, LMS открыла доступ, платежный сервис прислал подтверждение, свой backend посчитал скоринг лида.

В Strelo для такого сценария есть пользовательская API-ссылка вида /api/hooks/<token>. Внешняя система отправляет POST с полем event и идентификатором контакта. Идентификатором может быть contact_id, telegram_id, email, username, external_id, phone или другой параметр, который сопоставляется с контактом.

Маршрут 2

Как CRM запускает воронку в Telegram

  1. Создать API-ссылку

    В настройках создается пользовательский вебхук с token, при необходимости включается дополнительный secret.

  2. Назвать event key

    В триггере внешнего события указывается ключ, например order_paid, demo_booked или access_opened.

  3. Отправить POST

    CRM отправляет event и идентификатор контакта: telegram_id, email, phone, username, contact_id или external_id.

  4. Запустить нужную ветку

    Strelo находит контакт, кладет payload в переменные и запускает опубликованную воронку по ключу события.

В панели триггера "Внешнее событие (API)" задается ключ события. Если CRM отправила event = order_paid, сработает опубликованная воронка с таким ключом. Все поля payload становятся переменными сценария, поэтому можно сразу использовать сумму, тариф, product_id, имя менеджера или ссылку на доступ.

Strelo как Telegram-слой: воронка, CRM, оплаты, AI и аналитика живут рядом, поэтому внешний webhook нужен только там, где есть реальная внешняя система.
Strelo как Telegram-слой: воронка, CRM, оплаты, AI и аналитика живут рядом, поэтому внешний webhook нужен только там, где есть реальная внешняя система.

Этот маршрут особенно полезен, когда CRM остается главным учетным контуром, но коммуникация с клиентом живет в Telegram. Менеджер поменял статус в CRM, бот отправил клиенту инструкцию. Платежка подтвердила оплату, бот выдал доступ. Сайт поймал заявку, бот продолжил прогрев. Без входящего события это приходится делать руками.

Безопасность вебхуков

Вебхук - это публичный URL. Если на него можно отправить что угодно без проверки, любой человек сможет создать фальшивое событие, запускать воронки, отмечать оплаты или засыпать CRM мусором. Минимальная защита: секрет в заголовке, проверка event, ограничение публичных URL для исходящих запросов, логирование и идемпотентность.

Безопасность

Что нужно делать и чего избегать

Правильно
  • Передавать secret в заголовке X-Strelo-Secret или Authorization Bearer.
  • Разделять события по event key, а не по свободному тексту.
  • Хранить stable_id для защиты от дублей.
  • Логировать request_id, статус и короткое тело ошибки.
Рискованно
  • Класть секрет в текст сообщения, query или поле event.
  • Принимать любые события без проверки и ограничений.
  • Создавать новую сделку при каждом повторном webhook.
  • Отправлять в CRM всю переписку и внутренние данные модели.
Безопасный webhook скучный: проверяет секрет, знает событие, не плодит дубли и не передает лишнее.

В Strelo пользовательский API-вебхук закрыт секретным token в URL. Если у вебхука задан дополнительный secret, он проверяется через заголовок X-Strelo-Secret или Bearer. Для исходящих HTTP-запросов используется защита от внутренних адресов: нельзя дергать localhost, приватные сети и служебные адреса облака. Это важно, потому что URL задает пользователь, а запрос выполняет сервер.

Контроль

Минимальная защита интеграции

КритерийКонтрольДля чегоЧто проверять на тесте
Token в URLСкрывает существование вебхукаНе пустить случайный внешний запросНеверный token возвращает 404
Дополнительный secretПередается в заголовкеЗащищает от утечки URLНеверный secret возвращает 401
SSRF guardДля исходящих HTTP-запросовБлокирует внутренние и служебные адресаlocalhost и приватная сеть не проходят
Таймаут10 секунд на внешний ответСценарий не зависает на мертвом endpointМедленный CRM endpoint не блокирует воронку
Проверяйте не только счастливый путь, но и ошибочные запросы. Именно они показывают, насколько интеграция готова к трафику.

Секрет не должен жить в тексте сообщения, в названии события или в query-параметре, который копируется в чаты. Держите его в заголовке. Если секрет утек, ротируйте его и не пытайтесь "замаскировать" старый URL.

Идемпотентность: один лид не должен стать пятью

CRM и платежные системы могут отправлять событие повторно. Сеть оборвалась, сервер вернул 500, внешний сервис решил повторить доставку. Это нормально. Плохо, когда каждый повтор создает новую сделку, повторную задачу менеджеру и вторую серию сообщений клиенту.

Используйте stable_id: order_id, lead_id, payment_id или другой внешний ID события. CRM должна обновлять известную запись, а не создавать новую. Бот тоже должен понимать, что повторный order_paid по тому же заказу не должен повторно выдавать доступ и запускать дожим.

Надежность

Три метрики webhook-интеграции

Дублицель
0

Повторная доставка события не должна создавать новую сделку или повторную выдачу доступа.

Таймаутлимит
10 сек

Внешний endpoint должен отвечать быстрее, а тяжелую работу лучше уносить в фон.

Secretдля продакшена
обязателен

Публичный webhook без секрета подходит только для чернового теста, не для реальных оплат и лидов.

Если CRM не умеет отдавать стабильный ID, создайте свой event_id на стороне сценария. Главное правило: timestamp не подходит как главный ключ. Каждый повтор получит новый timestamp и будет выглядеть как новое событие.

Какие данные не стоит отправлять

Не передавайте в CRM все подряд. Лишние данные повышают риск утечки и усложняют поддержку. Для лида обычно достаточно контакта, источника, статуса, выбранного продукта и ответов на квалификационные вопросы. Паспортные данные, токены, полные переписки и внутренние промпты модели не должны уходить в обычный webhook.

Данные

Что отправлять, а что оставить внутри бота

Отправлять

event, telegram_id, phone, email, source, status, product, answers, stable_id, occurred_at.

Не отправлять без нужды

Секреты, токены, внутренние промпты, полную переписку, лишние персональные данные и служебные поля.

Если менеджеру нужна история диалога, лучше давать ссылку или короткую выжимку, а не весь чат. Если CRM не использует поле, не отправляйте его "на всякий случай". Через полгода никто не вспомнит, зачем там лежит лишний параметр, а удалять его будет страшно.

Частые ошибки при связке бота и CRM

Самая дорогая ошибка - передавать только phone и забыть Telegram ID. Пока менеджер работает в CRM, все нормально. Как только нужно вернуть клиента в бот, оказывается, что связать сделку с Telegram-контактом невозможно.

Вторая ошибка - делать один event для всего. lead, qualified, manager_needed, order_paid и refund - разные события. Если все назвать update, воронка не сможет понять, что делать.

Третья ошибка - не проверять негативный путь. Все тестируют успешную заявку, но никто не проверяет 401, таймаут, дубль, пустой телефон, выключенный webhook, неверный secret и повторную доставку события.

Антипаттерны

Четыре ошибки, из-за которых интеграция выглядит рабочей, но ломает продажи

Только телефон

CRM получила номер, но потеряла Telegram ID. Вернуть клиента в бот и понять его путь уже сложно.

Один event на все

lead_update не говорит, что случилось: заявка, оплата, возврат или запрос менеджера.

Нет fallback

CRM не ответила, а бот обещал, что заявка создана. Пользователь ждет менеджера, которого никто не назначил.

Дубли без контроля

Повторный webhook создает вторую сделку, второй дожим и двойную работу менеджера.

Как это выглядит в Strelo

В простом сценарии Strelo может закрыть CRM внутри себя: контакт создается при первом сообщении, теги и поля ставятся воронкой, менеджер видит историю, AI отвечает по базе знаний, покупки и статусы остаются рядом с диалогом. Тогда внешний webhook нужен не для всего, а для точечной синхронизации: отправить квалифицированного лида в корпоративную CRM, передать заказ в учетную систему или получить событие обратно.

Если у вас уже есть CRM, Strelo становится Telegram-слоем вокруг нее. Бот собирает данные без кода, отправляет в CRM нормальный payload, получает ответ и продолжает сценарий. CRM может вызвать входящий API-вебхук, чтобы запустить следующую ветку в Telegram.

Практичная hybrid-схема выглядит так: Strelo хранит Telegram-диалог, теги, текущий шаг, ответы пользователя, оплату и быстрые действия менеджера, а внешняя CRM получает итоговые события для отчетности, задач и long-term учета. Так вы не превращаете CRM в архив каждого сообщения, но и не оставляете отдел продаж без контрольной системы. Если позже понадобится заменить CRM, Telegram-воронки и база контактов не разваливаются, потому что главный пользовательский путь остается в Strelo, а внешний контур получает согласованные события.

Сборка

Как спроектировать интеграцию без лишнего кода

События

Назовите 5-7 событий, которые реально меняют статус лида: заявка, квалификация, оплата, отказ, нужен менеджер.

Payload

Согласуйте поля с CRM до запуска: идентификаторы, источник, статус, продукт, stable_id и дата события.

Защита

Включите secret, проверьте 401, 404, таймаут, повтор события и неверный event key.

Как выглядит рабочий кабинет Strelo: воронка, CRM, диалоги и аналитика в одном интерфейсе.

Чеклист перед запуском

Перед публикацией пройдите путь на тестовом контакте. Создайте заявку в боте, проверьте, что CRM получила event, contact_id или telegram_id, phone, email, source и status. Затем отправьте ответ CRM с ошибкой и убедитесь, что бот не обещает невозможное.

Потом проверьте обратный маршрут: CRM отправляет event в Strelo, контакт находится, воронка запускается, переменные доступны в сообщениях. После этого повторите тот же запрос дважды и убедитесь, что CRM и бот не создают дублей.

QA

Проверка перед публикацией воронки

  1. Отправьте тестовую заявку

    Проверьте, что CRM получила event, контакт, source, status и stable_id.

  2. Сломайте авторизацию

    Неверный secret должен вернуть ошибку, а бот не должен обещать создание заявки.

  3. Повторите событие

    Один и тот же stable_id не должен создавать вторую сделку или второй запуск ветки.

  4. Запустите обратный маршрут

    CRM отправляет event в Strelo, контакт находится, воронка стартует и видит переменные payload.

Итог

Webhook из Telegram-бота в CRM - это не просто "вставить URL". Это контракт между событием, контактом, статусом и следующим действием. Сначала определите, где рождается событие. Потом выберите маршрут: исходящий HTTP-запрос в CRM, входящий API-вебхук обратно в Strelo или CRM внутри самой Telegram-платформы.

Для бизнеса в Telegram лучший результат дает не самый сложный API, а понятная связка: человек дошел до нужного шага, событие записалось, CRM увидела контекст, бот знает следующий шаг, менеджер не ищет данные вручную. Именно такой контур и стоит собирать.

Интеграции без лишнего кода

Соберите Telegram-воронку, CRM и webhooks в Strelo

Подключите бота, настройте события, передавайте лиды в CRM и запускайте обратные сценарии по API-вебхуку. В одном кабинете остаются диалоги, контакты, статусы, оплаты, AI и аналитика.

Открыть Strelo

Частые вопросы

Что значит webhook из Telegram-бота в CRM?

Это HTTP-запрос, который бот или платформа отправляет в CRM при событии: заявка, квалификация, запрос менеджера, заказ или оплата. В запросе должны быть event, идентификаторы контакта и бизнес-контекст.

Можно ли отправлять в CRM каждое сообщение пользователя?

Технически можно, но обычно это плохая практика. CRM нужны события, которые меняют статус лида. Полную переписку лучше хранить в inbox или передавать ссылкой и короткой выжимкой.

Что делать, если CRM не ответила на webhook?

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

Как не создать дубли в CRM?

Передавайте stable_id: lead_id, order_id, payment_id или event_id. CRM должна обновлять существующую запись при повторной доставке того же события.

Можно ли использовать webhook без сервера?

Да, если CRM принимает webhooks напрямую. В Strelo исходящий запрос можно настроить в ноде сценария. Сервер нужен, если CRM требует сложную подпись, преобразование данных или нестандартную бизнес-логику.

Когда лучше не отправлять лид во внешнюю CRM?

Если продажи и поддержка полностью идут в Telegram, а менеджеру достаточно карточки контакта, тегов, полей, оплаты и аналитики внутри Strelo. Тогда внешний webhook нужен только для бухгалтерии, склада или корпоративной CRM.

Что такое external_event в Strelo?

Это фоновый триггер, который запускает воронку по входящему API-событию. Внешняя система отправляет event и идентификатор контакта, Strelo находит контакт и запускает опубликованную ветку.