B2BPRO.KZ | Рекламное агентство в Алматы

Интеграция сайта с Битрикс24 через вебхук: как это устроено

Разработчица настраивает передачу заявок с формы сайта в CRM Битрикс24 через вебхук

Клиент заполнил форму на сайте, увидел «Спасибо, мы свяжемся с вами», а менеджер так ничего и не получил. Письмо с заявкой ушло в спам, ящик читает один человек, и он в отпуске. Такие потери почти всегда обнаруживают случайно, когда клиент звонит с претензией. Интеграция сайта с Битрикс24 через вебхук решает эту проблему напрямую: заявка сразу становится лидом или сделкой в CRM, получает ответственного и попадает в воронку, где её видно руководителю. Настраивается это за день, а вот ошибки в настройке всплывают месяцами, поэтому про типичные поломки здесь написано не меньше, чем про саму схему.

Что такое вебхук в Битрикс24: входящий и исходящий

Вебхук в Битрикс24 это адрес, по которому внешняя система обращается к REST API портала без полноценного приложения и без OAuth-авторизации. Для связки «сайт и CRM» такой вариант самый короткий: не нужно публиковать приложение в Маркете, хватает прав администратора портала и небольшого серверного кода на стороне сайта.

Вебхуков два вида, и работают они в противоположных направлениях.

Входящий вебхук принимает запросы от сайта. Сайт отправляет данные на адрес вида https://ваш-портал.bitrix24.kz/rest/{ID пользователя}/{секретный код}/{метод}.json, и Битрикс24 выполняет указанный метод: создаёт лид, ищет контакт, добавляет комментарий. Именно входящий вебхук отвечает за передачу заявок с сайта в CRM.

Исходящий вебхук работает наоборот. Когда в CRM происходит событие (создана сделка, изменилась стадия), Битрикс24 отправляет POST-запрос на адрес обработчика, который вы указали. Так сайт или внешний сервис узнаёт об изменениях в CRM.

Для обычной формы «оставьте заявку» хватает входящего. Исходящий нужен, когда CRM должна что-то сообщить обратно: например, изменить статус заказа в личном кабинете покупателя.

Как заявка проходит путь от формы до сделки

Со стороны посетителя всё выглядит одинаково, но за кнопкой «Отправить» стоит цепочка из нескольких шагов, и каждый из них может отказать.

  1. Посетитель заполняет форму, браузер отправляет данные на сервер сайта.
  2. Серверный обработчик (PHP-скрипт, хук WordPress, модуль 1С-Битрикс) проверяет поля и отсекает спам.
  3. Обработчик формирует запрос к входящему вебхуку: название лида, имя, телефон, почта, источник, UTM-метки.
  4. Битрикс24 создаёт запись в CRM и возвращает её ID.
  5. Обработчик сохраняет ответ в журнал и только после этого показывает посетителю сообщение об успешной отправке.
  6. В CRM срабатывают роботы воронки: назначение ответственного, уведомление, задача перезвонить.

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

Где создаётся вебхук и какие права ему давать

Входящий вебхук создают в разделе «Приложения» → «Разработчикам» → «Готовые сценарии» → «Другое» → «Входящий вебхук». Создать его может администратор портала или сотрудник, которому выдано такое право. При создании отмечают, к каким разделам API вебхук получит доступ. Для передачи заявок достаточно раздела CRM, остальное лучше не включать.

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

Во-первых, если создать вебхук под учётной записью директора, все лиды с сайта будут появляться в ленте как созданные директором. Если потом директору урежут права в CRM, вместе с ними урежется и интеграция. Разумнее завести отдельную служебную учётную запись, дать ей права только на создание лидов и контактов и создать вебхук под ней.

Во-вторых, секретный код в адресе вебхука фактически заменяет логин и пароль. Кто знает этот адрес, тот может работать с CRM с правами создателя вебхука. Поэтому код должен храниться только на сервере сайта, в конфигурации или переменных окружения. Встречаются сайты, где адрес вебхука прописан прямо в JavaScript формы и виден любому посетителю через «Просмотр кода страницы». При такой схеме любой желающий может читать базу клиентов или заливать в неё мусор, а форма при этом исправно работает, так что никто ничего не замечает.

Если код всё-таки утёк, создайте новый вебхук, пропишите его адрес в настройках сайта и удалите старый. Пока старый вебхук существует, его адрес продолжает работать.

Что передавать в CRM, кроме имени и телефона

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

Что стоит передавать в лид:

  • Название лида по понятному шаблону, например «Заявка с сайта: расчёт стоимости». По нему менеджер сразу видит, с какой формы пришёл клиент.
  • Телефон и e-mail. В Битрикс24 это мультиполя: у лида может быть несколько телефонов, и каждый передаётся как отдельный элемент со значением и типом (рабочий, мобильный).
  • Источник (поле SOURCE_ID). Для заявок с сайта обычно выбирают «Веб-сайт», а если форм несколько, заводят собственные источники в справочнике CRM.
  • UTM-метки. У лида есть стандартные поля UTM_SOURCE, UTM_MEDIUM, UTM_CAMPAIGN, UTM_CONTENT, UTM_TERM. Сайт должен запомнить метки при первом заходе посетителя (в cookie или сессии), иначе к моменту отправки формы они потеряются: человек мог перейти с рекламы, погулять по каталогу и отправить заявку с третьей страницы.
  • Адрес страницы, с которой отправлена форма, и комментарий посетителя.
  • Ответственный (ASSIGNED_BY_ID), если распределение по менеджерам не делают роботы внутри CRM.
  • Пользовательские поля под вашу специфику: город, интересующая услуга, выбранный тариф.

Для создания лида долго использовался метод crm.lead.add, и большинство готовых примеров в интернете написаны под него. В актуальной документации он отмечен как устаревший, а вместо него рекомендуется универсальный crm.item.add, где тип объекта задаётся параметром entityTypeId (1 для лида, 2 для сделки). Существующие интеграции на старом методе при этом продолжают работать, но новую разумно сразу писать на новом.

Лиды или сделки: сначала проверьте режим CRM

В Битрикс24 есть два режима CRM. Классический работает с лидами: заявка сначала попадает в лиды, менеджер её квалифицирует и конвертирует в сделку. Простой режим работает без лидов, всё сразу идёт в сделки.

Режим влияет на то, как поведёт себя интеграция. Согласно документации REST API, в простом режиме система автоматически конвертирует созданный через API лид в сделку, а сам лид получает статус «сконвертирован». Условие конвертации: у лида должно быть заполнено имя. Узнать текущий режим можно методом crm.settings.mode.get, он возвращает 1 для классического режима и 2 для простого.

Отсюда типичная ситуация. Компания переключает CRM в простой режим, интеграцию никто не трогает, и часть заявок перестаёт появляться в сделках. Разбор показывает, что у этих заявок было пустое поле имени: форма на лендинге просила только телефон. Лиды создавались, но без конвертации так и лежали в лидах, куда после перехода на простой режим никто не заглядывал. Поэтому при смене режима CRM интеграцию с сайтом нужно проверять отдельно, а поле имени лучше подставлять хотя бы значением вроде «Без имени», если посетитель его не заполнил.

Дубли контактов: как не плодить одного клиента десять раз

Постоянный клиент оставляет заявку третий раз за полгода. Простая интеграция создаёт новый лид с тем же телефоном, и в CRM появляется ещё одна карточка. Через год в базе десятки дублей, менеджеры спорят, чей клиент, а история общения размазана по разным записям.

Для проверки дублей в API есть метод crm.duplicate.findbycomm. Он принимает тип средства связи (телефон или e-mail) и список значений, до 20 за один запрос, и возвращает ID лидов, контактов и компаний, у которых найдено совпадение. Логика обработчика тогда выглядит так: перед созданием лида проверить телефон, и если контакт уже есть, привязать новую заявку к нему или создать сделку на существующего клиента.

Здесь есть тонкость с форматом номеров. Посетители вводят телефон как угодно: с восьмёркой, с +7, со скобками и пробелами. Если сайт не приводит номер к единому виду до отправки, проверка дублей будет промахиваться. Нормализацию номера лучше сделать на стороне сайта, это несколько строк кода.

Отдельно стоит решить, что делать с найденным дублем. Одним компаниям нужен новый лид на каждое обращение, потому что каждая заявка это отдельная продажа. Другим нужна одна карточка клиента и новые сделки внутри неё. Это бизнес-решение, и принимать его стоит до написания кода, иначе переделывать придётся уже с накопленной базой.

Лимиты API и почему заявки иногда пропадают

У REST API Битрикс24 есть ограничения на частоту запросов. По документации, на большинстве тарифов допустимая постоянная скорость составляет 2 запроса в секунду, на тарифе Enterprise 5 в секунду. Работает это по принципу «дырявого ведра»: каждый запрос увеличивает счётчик, счётчик постепенно уменьшается, и короткие всплески допускаются. Когда счётчик превышает порог (50 на обычных тарифах, 250 на Enterprise), следующие запросы получают ошибку QUERY_LIMIT_EXCEEDED с HTTP-кодом 503. Помимо частоты, учитывается и суммарное время выполнения каждого метода: при превышении API возвращает ошибку OPERATION_TIME_LIMIT.

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

Кроме лимитов, заявку теряют ещё по нескольким причинам:

  • у сайта истёк SSL-сертификат или хостинг обновил PHP, и запросы к порталу перестали уходить;
  • вебхук пересоздали, а адрес на сайте не поменяли;
  • сотруднику, под которым создан вебхук, изменили права в CRM;
  • в CRM добавили обязательное поле, и лид без него не создаётся;
  • форму на сайте переделали, а поля в обработчике остались старые.

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

Пример: интеграция для компании с тремя формами

Возьмём условную компанию, которая продаёт промышленное оборудование. На сайте три формы: «Запросить прайс», «Заказать звонок» и «Рассчитать проект». Реклама идёт в Google Ads и Яндекс Директе, CRM работает в классическом режиме с лидами.

Схема, которую имеет смысл собрать в таком случае:

  1. Под служебного пользователя «Сайт» создаётся входящий вебхук с доступом только к CRM.
  2. В справочнике CRM заводятся три источника по названиям форм, чтобы в отчётах сразу было видно, какая форма приносит сделки.
  3. Сайт сохраняет UTM-метки при первом визите и передаёт их в стандартные поля лида.
  4. Перед созданием лида обработчик нормализует телефон и ищет дубли. Если контакт найден, лид привязывается к нему.
  5. Для формы «Рассчитать проект» передаются дополнительные пользовательские поля: отрасль и примерный объём.
  6. Распределение по менеджерам делают роботы в воронке лидов, а не код на сайте. Так руководитель продаж может менять правила сам, не обращаясь к разработчику.
  7. Каждая попытка отправки пишется в журнал. При ошибке заявка сохраняется, отправка повторяется, а на почту руководителя уходит копия.

На шестом пункте экономить не стоит. Бизнес-логику (кому назначить, какую задачу поставить, какое уведомление отправить) лучше держать в Битрикс24, а сайт пусть отвечает только за доставку данных. Тогда изменения в работе отдела продаж не требуют правки кода сайта.

Если настраивать такую схему своими силами некому, её можно заказать вместе с воронками и роботами: внедрение и настройка Битрикс24 обычно включает и интеграцию форм сайта, и проверку, что UTM-метки доходят до отчётов.

Исходящий вебхук: когда CRM должна сообщить сайту

Обратная связь из CRM нужна реже, но есть задачи, где без неё не обойтись. Интернет-магазин показывает покупателю статус заказа, который меняют менеджеры в сделке. Сервис бронирования закрывает слот, когда сделка переходит в стадию «Оплачено». Партнёрский кабинет показывает агенту, сколько его клиентов дошло до покупки.

Исходящий вебхук настраивается в том же разделе для разработчиков. Выбирается событие, например добавление или изменение сделки, и указывается адрес обработчика на сайте. Когда событие происходит, Битрикс24 отправляет POST-запрос с данными в формате application/x-www-form-urlencoded.

Здесь есть три момента, которые нужно учесть при разработке.

Первый: в запросе обычно приходит только идентификатор объекта, а не все его поля. Чтобы узнать новую стадию сделки, обработчику нужно сделать встречный запрос в API через входящий вебхук.

Второй: обработчик должен проверять подлинность запроса. В каждом запросе передаётся токен приложения (auth[application_token]), и его нужно сравнивать с токеном из настроек исходящего вебхука. Без этой проверки кто угодно, узнав адрес обработчика, сможет отправлять сайту поддельные события.

Третий: адрес обработчика должен быть доступен из интернета и работать по HTTPS с действующим сертификатом. Обработчик на локальном сервере или за корпоративным файрволом события не получит.

Вебхук, CRM-форма или готовый модуль

Связать сайт с Битрикс24 можно не только вебхуком, и для простых сайтов он бывает избыточен.

CRM-формы Битрикс24 встраиваются на сайт готовым кодом и создают лиды без программирования. Это разумный вариант, когда форма простая, а дизайн формы Битрикс24 устраивает. Ограничения начинаются, если форму нужно полностью встроить в дизайн сайта или добавить сложную логику проверки.

Готовые модули и плагины для WordPress и других CMS связывают формы с CRM через настройки в админке. Они экономят время на старте, но у каждого свои ограничения по полям, UTM и работе с дублями, и при обновлении CMS они иногда перестают работать. Подробнее о подводных камнях для WordPress мы писали в статье об интеграции WordPress с CRM.

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

Приложение с OAuth нужно, если одна интеграция должна работать с несколькими порталами Битрикс24 или встраиваться в интерфейс CRM. Для связки одного сайта с одним порталом это избыточно.

Что проверить после запуска

Интеграцию, которую один раз проверили тестовой заявкой, нельзя считать работающей. Проверьте сразу после запуска и потом раз в месяц:

  • каждая форма сайта создаёт запись в CRM, включая формы в попапах и на лендингах;
  • заявка с рекламной ссылкой приносит в лид все UTM-метки;
  • повторная заявка с тем же телефоном не создаёт дубль контакта;
  • ответственный назначается правильно, уведомление приходит;
  • при недоступности портала заявка не теряется, а сохраняется и уходит повторно;
  • адрес вебхука не виден в исходном коде страницы;
  • число заявок в журнале сайта совпадает с числом лидов в CRM за тот же период.

Последний пункт самый показательный. Если за месяц сайт принял 140 заявок, а в CRM 128 лидов, интеграция где-то теряет данные, даже если каждая тестовая отправка проходит успешно.

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

Нужен ли программист, чтобы подключить сайт к Битрикс24 через вебхук?

Создать сам вебхук может администратор портала за несколько минут. Обработчик на стороне сайта, который принимает форму, проверяет данные и отправляет их в CRM, пишется кодом. Если нужна простая форма без доработок, можно обойтись CRM-формой Битрикс24 без программирования.

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

Да, если секретный код хранится только на сервере сайта, а вебхук создан под служебным пользователем с минимальными правами. Опасно размещать адрес вебхука в JavaScript на странице: тогда он доступен любому посетителю.

Почему заявка с сайта не появилась в сделках?

Частые причины: CRM работает в простом режиме, а у лида не заполнено имя, поэтому он не сконвертировался в сделку; сработал лимит запросов к API; изменились права пользователя, под которым создан вебхук; в CRM появилось обязательное поле. Начинать стоит с журнала ошибок обработчика на сайте.

Можно ли передавать в Битрикс24 UTM-метки из формы?

Можно. У лида есть стандартные поля для пяти UTM-меток. Главное, чтобы сайт сохранял метки при первом заходе посетителя, а не пытался прочитать их из адреса страницы в момент отправки формы.

Чем входящий вебхук отличается от исходящего?

Входящий принимает запросы от внешней системы и выполняет методы API: так сайт создаёт лиды. Исходящий сам отправляет запросы на указанный адрес, когда в CRM происходит событие: так сайт узнаёт, например, об изменении стадии сделки.

Прокрутить вверх