Webhook из Telegram-бота в CRM нужен не для галочки в интеграциях, а чтобы не потерять момент, когда человек стал лидом: оставил телефон, нажал кнопку покупки, прошел квалификацию, оплатил или попросил менеджера. Правильный вебхук передает в CRM не только имя и телефон, а событие, Telegram ID, источник, статус, ответы пользователя и ссылку на дальнейшее действие.
Короткий вывод: если CRM нужна только как таблица лидов, хватит одного исходящего HTTP-запроса из сценария. Если CRM должна запускать бота обратно, нужен входящий API-вебхук с ключом события и идентификатором контакта. Если продажи идут прямо в Telegram, часто проще держать CRM-слой внутри Strelo и отправлять наружу только те события, которые действительно нужны внешней системе.
Для кого эта статья
Онлайн-школа
Нужно передавать заявки, оплаты, тарифы и доступы между ботом, CRM и обучающей платформой без ручной сверки.
Отдел продаж
Менеджеры работают в CRM, а лиды приходят из Telegram-бота, рекламы, канала и повторных касаний.
Telegram-магазин
Бот собирает заказ, уточняет параметры, передает данные в CRM и получает обратно статус оплаты или доставки.
Сначала разделите три разных вебхука
В одном запросе люди часто смешивают три вещи. Первая - служебный 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 платформе | Бот или сценарий отправляет данные в CRM | CRM, сайт или backend отправляет событие в Strelo |
| Что запускает | Прием входящих сообщений | Создание лида, сделки, задачи или поля в CRM | Опубликованную воронку по event key |
| Кто обычно настраивает | Платформа после подключения токена | Маркетолог или интегратор в ноде HTTP | Владелец CRM или backend через API-ссылку |
| Главный риск | Перехват токена другим сервисом | Отправить данные без Telegram ID и source | Запустить событие без секрета или без идемпотентности |
Если не разделить эти маршруты, проект быстро ломается. Маркетолог ждет, что "вебхук 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.
Как бот отправляет лида в CRM
Собрать данные в сценарии
Бот получает имя, телефон, email, выбранный продукт, ответы на вопросы и источник входа.
Проверить готовность лида
Отправлять в CRM стоит не каждое сообщение, а событие: заявка, квалификация, оплата, запрос менеджера.
Отправить HTTP-запрос
Нода внешнего запроса вызывает публичный endpoint CRM, передает JSON и заголовки авторизации.
Сохранить ответ
Если CRM вернула ID сделки или ошибку, ответ можно сохранить в переменную и использовать в условии.

Важная деталь: не отправляйте запрос на каждый текст пользователя. CRM обычно не нужна вся переписка в режиме реального времени. Ей нужны события, которые меняют статус лида: заявка создана, квалификация пройдена, нужен менеджер, заказ оплачен, доступ выдан, клиент отказался. Так база не забивается шумом, а менеджеры видят только рабочие сигналы.
Контракт payload: что отправлять в CRM
Хороший payload не должен быть огромным. Но он должен позволить CRM однозначно понять, кто это, что случилось и что делать дальше. Минимальный набор: event, telegram_id, phone или email, name, source, status, answers, occurred_at и stable_id для идемпотентности.
Какие поля стоит передавать в CRM
Набор зависит от бизнеса, но эти поля закрывают большую часть Telegram-продаж.
| Критерий | Поле | Зачем нужно | Ошибка при отсутствии |
|---|---|---|---|
| event | lead_created, qualified, order_paid | CRM понимает смысл события | Все события выглядят одинаково |
| telegram_id | Числовой ID пользователя | Связывает CRM-сделку с диалогом в боте | Нельзя надежно вернуть человека в Telegram |
| phone или email | Контакт для CRM и менеджера | Помогает найти дубль и связаться вне Telegram | Менеджер видит лид без рабочего контакта |
| source и campaign | Канал, пост, реклама, короткая ссылка | Маркетинг понимает, откуда пришла продажа | Все лиды сваливаются в общий источник |
| stable_id | lead_id, order_id или event_id | Защищает от дублей при повторной доставке | Повторный webhook создает вторую сделку |
Если у вас есть только 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 полезен только если сценарий умеет на него реагировать.
| Критерий | Ответ | Действие бота | Что записать |
|---|---|---|---|
| ok | CRM создала сделку | Подтвердить заявку пользователю | crm_deal_id и статус |
| duplicate | Контакт уже был в CRM | Не создавать новый путь, обновить контекст | existing_contact_id |
| unauthorized | Ошибка секрета или токена | Не обещать создание заявки, уведомить оператора | http_status и тело ошибки |
| timeout | CRM не ответила вовремя | Поставить тег ручной проверки | request_id и время попытки |
В 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 или другой параметр, который сопоставляется с контактом.
Как CRM запускает воронку в Telegram
Создать API-ссылку
В настройках создается пользовательский вебхук с token, при необходимости включается дополнительный secret.
Назвать event key
В триггере внешнего события указывается ключ, например order_paid, demo_booked или access_opened.
Отправить POST
CRM отправляет event и идентификатор контакта: telegram_id, email, phone, username, contact_id или external_id.
Запустить нужную ветку
Strelo находит контакт, кладет payload в переменные и запускает опубликованную воронку по ключу события.
В панели триггера "Внешнее событие (API)" задается ключ события. Если CRM отправила event = order_paid, сработает опубликованная воронка с таким ключом. Все поля payload становятся переменными сценария, поэтому можно сразу использовать сумму, тариф, product_id, имя менеджера или ссылку на доступ.

Этот маршрут особенно полезен, когда CRM остается главным учетным контуром, но коммуникация с клиентом живет в Telegram. Менеджер поменял статус в CRM, бот отправил клиенту инструкцию. Платежка подтвердила оплату, бот выдал доступ. Сайт поймал заявку, бот продолжил прогрев. Без входящего события это приходится делать руками.
Безопасность вебхуков
Вебхук - это публичный URL. Если на него можно отправить что угодно без проверки, любой человек сможет создать фальшивое событие, запускать воронки, отмечать оплаты или засыпать CRM мусором. Минимальная защита: секрет в заголовке, проверка event, ограничение публичных URL для исходящих запросов, логирование и идемпотентность.
Что нужно делать и чего избегать
- Передавать secret в заголовке X-Strelo-Secret или Authorization Bearer.
- Разделять события по event key, а не по свободному тексту.
- Хранить stable_id для защиты от дублей.
- Логировать request_id, статус и короткое тело ошибки.
- Класть секрет в текст сообщения, query или поле event.
- Принимать любые события без проверки и ограничений.
- Создавать новую сделку при каждом повторном webhook.
- Отправлять в CRM всю переписку и внутренние данные модели.
В 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-интеграции
Повторная доставка события не должна создавать новую сделку или повторную выдачу доступа.
Внешний endpoint должен отвечать быстрее, а тяжелую работу лучше уносить в фон.
Публичный 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.
Чеклист перед запуском
Перед публикацией пройдите путь на тестовом контакте. Создайте заявку в боте, проверьте, что CRM получила event, contact_id или telegram_id, phone, email, source и status. Затем отправьте ответ CRM с ошибкой и убедитесь, что бот не обещает невозможное.
Потом проверьте обратный маршрут: CRM отправляет event в Strelo, контакт находится, воронка запускается, переменные доступны в сообщениях. После этого повторите тот же запрос дважды и убедитесь, что CRM и бот не создают дублей.
Проверка перед публикацией воронки
Отправьте тестовую заявку
Проверьте, что CRM получила event, контакт, source, status и stable_id.
Сломайте авторизацию
Неверный secret должен вернуть ошибку, а бот не должен обещать создание заявки.
Повторите событие
Один и тот же stable_id не должен создавать вторую сделку или второй запуск ветки.
Запустите обратный маршрут
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 находит контакт и запускает опубликованную ветку.
