Форма на WordPress может отправить письмо менеджеру за несколько секунд, но для бизнеса этого часто мало. Заявку нужно сохранить в CRM, связать с контактом, назначить ответственного, передать источник и не создать второй дубль, если пользователь нажал кнопку повторно.
Эта статья полезна компаниям, которые хотят связать WordPress с Битрикс24 через REST API. Разберём, когда достаточно встроенной CRM-формы Битрикс24, когда нужен собственный обработчик на сайте и как построить интеграцию так, чтобы она переживала повторные запросы, ошибки сети и рост нагрузки.
Главный принцип: WordPress не должен знать больше секретов и бизнес-логики, чем необходимо, а Битрикс24 должен получать нормализованные данные с устойчивым идентификатором заявки.
Что обычно синхронизируют между WordPress и Битрикс24
| Сценарий | Источник | Результат в CRM |
|---|---|---|
| Форма обратной связи | WordPress | Контакт и лид или сделка |
| Заявка на услугу | WordPress | Сделка в нужной воронке |
| Регистрация клиента | WordPress | Контакт с внешним ID |
| Заказ WooCommerce | WordPress / WooCommerce | Сделка с суммой, товарами и источником |
| Изменение статуса | Битрикс24 | Обновление статуса на сайте или запуск действия |
Архитектура интеграции
- ФормаWordPress принимает и валидирует данные пользователя
- ОчередьЗаявка получает внутренний ID и сохраняется до успешной отправки
- СопоставлениеСистема ищет существующий контакт по заранее выбранному правилу
- REST APIСоздаётся или обновляется нужная сущность Битрикс24
- КонтрольОтвет API, внешний ID и ошибки фиксируются для повторной обработки
Главный принцип: отправка заявки должна быть идемпотентной — повторный запуск не создаёт новую сущность без необходимости.
Когда достаточно CRM-формы Битрикс24
Битрикс24 позволяет размещать CRM-формы на сайте. По официальной справке данные такой формы автоматически сохраняются в CRM. Это хороший вариант, если сценарий типовой и не требуется сложная логика до отправки.
- нужна обычная заявка или обратный звонок;
- поля формы напрямую соответствуют полям CRM;
- дизайн встроенной формы подходит;
- не требуется объединять данные из нескольких источников;
- нет сложных правил по дублям, товарам, ролям или статусам.
Если форма уже реализована в Elementor, Contact Form 7, Gravity Forms или кастомном коде и её нельзя просто заменить, удобнее оставить интерфейс WordPress и передавать данные серверным запросом.
Когда нужен REST API
REST API нужен, когда сайт должен управлять тем, что именно создаётся в CRM. Например, сначала найти контакт, затем создать сделку в определённой воронке, записать UTM-метки, внешний номер заявки и связать сущности.
Актуальная документация Битрикс24 рекомендует универсальные методы crm.item.* для ряда CRM-сущностей. Метод crm.item.add создаёт новый элемент и позволяет передавать поля, включая привязки к контактам, источники и пользовательские поля.
POST https://YOUR_PORTAL.bitrix24.ru/rest/USER_ID/WEBHOOK_KEY/crm.item.add
Content-Type: application/json
{
"entityTypeId": 2,
"fields": {
"title": "Заявка с сайта #SITE_REQUEST_ID",
"contactId": 123,
"sourceId": "WEB",
"originId": "SITE_REQUEST_ID"
}
}
В примере используются placeholders. Реальный webhook-ключ нельзя хранить в JavaScript, HTML страницы, публичном GitHub-репозитории или URL, который видит браузер пользователя.
Где выполнять запрос: только на серверной стороне
Опасный вариант — отправлять REST-запрос из frontend JavaScript прямо в Битрикс24. Тогда адрес входящего webhook с секретом оказывается у пользователя в DevTools и может быть скопирован.
Безопаснее отправлять форму на собственный endpoint WordPress, а уже PHP-код или отдельный backend обращается к CRM. Секрет можно хранить в переменной окружения, конфигурации сервера или защищённой настройке, недоступной через публичный API.
add_action( 'wp_ajax_nopriv_asg_crm_request', 'asg_crm_request' );
add_action( 'wp_ajax_asg_crm_request', 'asg_crm_request' );
function asg_crm_request() {
check_ajax_referer( 'asg_crm_form', 'nonce' );
$name = sanitize_text_field( $_POST['name'] ?? '' );
$phone = sanitize_text_field( $_POST['phone'] ?? '' );
// Сначала сохраняем заявку локально и присваиваем SITE_REQUEST_ID.
// Затем ставим задачу отправки в CRM.
wp_send_json_success();
}
Nonce защищает форму от части CSRF-сценариев, но не заменяет валидацию данных, антиспам и контроль частоты запросов.
Как избежать дублей контактов и сделок
Самая частая ошибка интеграции — на каждую отправку формы безусловно вызывать создание контакта и сделки. Если пользователь отправил форму дважды, браузер повторил запрос или очередь сделала retry, CRM получает дубли.
Лучше разделить защиту на два уровня.
- Сайт выдаёт заявке уникальный внутренний ID.
- Этот ID сохраняется локально до отправки.
- Перед созданием контакта интеграция выполняет поиск по согласованному признаку — например, нормализованному телефону или e-mail.
- Для сделки передаётся внешний идентификатор заявки, например в
originIdили в отдельное пользовательское поле. - После успешного ответа сохраняется ID сущности Битрикс24.
- Повторная задача проверяет сохранённую связь и обновляет запись вместо создания новой.
Правило поиска контакта нужно согласовать с бизнесом. Телефон может быть общим для семьи, e-mail — корпоративным, поэтому универсального ключа для всех проектов нет.
Нужно ли создавать лид или сразу сделку
Это зависит от настроек CRM. Если компания работает с лидами, заявка может сначала попадать в лид, а после квалификации конвертироваться. Если лиды отключены или бизнес сразу работает со сделками, сайт может создавать контакт и сделку.
Не стоит жёстко зашивать этот выбор в тему WordPress. Лучше вынести тип сущности, воронку, стадию и ответственного в настройки интеграционного модуля.
Что передавать кроме имени и телефона
- URL страницы, с которой пришла заявка;
- UTM-метки;
- тип формы или услуги;
- внутренний ID заявки сайта;
- товары и сумму, если это заказ;
- город или филиал;
- согласие на обработку данных, если оно требуется вашему процессу;
- комментарий пользователя.
Полезно заранее составить таблицу соответствий «поле WordPress → поле Битрикс24». Тогда до разработки видно, каких пользовательских полей в CRM не хватает и какие данные не следует передавать вообще.
Исходящие события: когда Битрикс24 должен уведомлять сайт
Интеграция может быть двусторонней. Например, менеджер переводит сделку в новую стадию, а сайт должен показать клиенту обновлённый статус или отправить событие в другой сервис.
В REST API Битрикс24 есть механизм событий. Метод event.bind регистрирует обработчик события в контексте авторизованного приложения. Для локальных интеграций также используются входящие и исходящие webhooks. При проектировании важно проверять подлинность запросов и не запускать тяжёлую синхронную обработку прямо в HTTP-обработчике.
Почему нужна очередь и retry
Даже правильный API иногда отвечает ошибкой или временно недоступен. Официальная документация Битрикс24 описывает ограничения REST и возможные ответы при слишком интенсивных или ресурсоёмких запросах. Поэтому форма не должна зависеть от мгновенного ответа CRM.
Практический вариант:
- пользователь отправляет форму;
- WordPress валидирует данные;
- заявка сохраняется локально;
- пользователь сразу получает подтверждение;
- фоновая задача отправляет данные в Битрикс24;
- при временной ошибке задача повторяется с задержкой;
- после нескольких неудач запись попадает в журнал ошибок.
Так временная проблема CRM не превращается в потерянную заявку.
Как не получить цикл событий
При двусторонней синхронизации легко создать цикл: WordPress обновляет сделку, событие Битрикс24 вызывает webhook, сайт снова обновляет сделку, и процесс повторяется.
Официальные рекомендации безопасности Битрикс24 отдельно предупреждают о сценарии, когда изменение данных в обработчике события снова вызывает это же событие. Защита обычно строится на сравнении изменившихся полей, идентификаторе источника и отметке последнего применённого состояния.
Безопасность интеграции
- не передавать webhook-ключ во frontend;
- использовать HTTPS;
- не отключать проверку SSL-сертификата;
- маскировать токены и персональные данные в логах;
- выдавать интеграции минимально необходимые права;
- ограничивать частоту публичных endpoint сайта;
- проверять входящие события Битрикс24;
- не хранить секреты в теме WordPress, которую можно скачать из админки.
Когда плагина достаточно
Готовый коннектор подходит, если он поддерживает вашу форму и точно умеет передавать нужные сущности. Перед установкой стоит проверить не количество интеграций в описании, а конкретные сценарии: поиск дублей, пользовательские поля, воронки, логирование ошибок и retry.
Если требования типовые, готовое решение дешевле сопровождать. Если CRM отражает сложный процесс компании, набор из нескольких универсальных плагинов часто становится труднее поддерживать, чем один небольшой кастомный модуль.
Когда лучше делать кастомную интеграцию
- на сайте несколько форм с разной логикой;
- нужно создавать контакт и сделку по собственным правилам;
- есть WooCommerce и нужно передавать состав заказа;
- используются разные воронки и филиалы;
- нужна обратная синхронизация статусов;
- важны очередь, retry и собственный журнал ошибок;
- данные одновременно уходят в Битрикс24 и другие сервисы.
В таком случае интеграцию разумно оформить отдельным WordPress-плагином или backend-сервисом. Это позволяет обновлять тему и конструктор страниц независимо от бизнес-логики.
Чек-лист перед запуском
- Определено, что создаём: лид, контакт, сделку или несколько сущностей.
- Зафиксирована таблица соответствий полей.
- Выбрано правило поиска дублей.
- У каждой заявки есть внутренний уникальный ID.
- Webhook или OAuth-секрет хранится только на сервере.
- Настроены логирование ошибок, очередь и retry.
- Проверена повторная отправка одной и той же заявки.
- Проверен сценарий недоступности Битрикс24.
- Для двустороннего обмена исключены циклы событий.
Частые вопросы
Можно ли подключить Битрикс24 к Contact Form 7?
Да. Форму можно оставить как есть, а после успешной серверной валидации передавать нормализованные данные в интеграционный слой. Конкретный хук зависит от версии и реализации формы.
Можно ли интегрировать Elementor Forms?
Да. Принцип тот же: форма отвечает за интерфейс, а отдельный серверный код — за очередь, сопоставление полей и REST API.
Нужен ли отдельный сервер?
Для небольшого потока заявок обычно достаточно WordPress-хостинга. Отдельный worker или backend становится полезен при большом количестве событий, нескольких интеграциях или требованиях к независимому масштабированию.
Что лучше: webhook или OAuth-приложение?
Входящий webhook удобен для локальной интеграции одного портала с ограниченным набором методов. OAuth-приложение логичнее для тиражируемого решения, нескольких порталов или сценария, где требуется полноценная авторизация приложения.
Можно ли передавать заказы WooCommerce?
Да. Обычно заказ связывают со сделкой, отдельно передают клиента, сумму, источник и при необходимости товарные позиции. Важно определить момент отправки: создание заказа, успешная оплата или другой статус.
Что делать, если Битрикс24 временно не отвечает?
Не заставлять пользователя повторно заполнять форму. Сохранить заявку локально и повторить отправку фоновой задачей с ограниченным retry.
Порядок внедрения
- описать формы и текущий путь заявки;
- определить сущности и поля Битрикс24;
- согласовать правила дублей и источники истины;
- создать серверный endpoint и очередь;
- подключить REST API;
- добавить журнал обмена и retry;
- протестировать повторы, ошибки и права;
- после этого подключать обратные события CRM.
Если сайт уже работает, такую интеграцию можно внедрить как интеграцию CRM с сайтом без полного редизайна. Для существующего WordPress-проекта также подходит доработка WordPress, а при более широком обмене между сервисами — автоматизация бизнес-процессов.
Официальные источники
- Битрикс24: настройка и использование REST API
- Битрикс24: входящие и исходящие webhooks
- Битрикс24: crm.item.add
- Битрикс24: event.bind
- Битрикс24: рекомендации по безопасности REST-приложений
- Битрикс24: размещение CRM-формы на сайте
Вывод
Надёжная интеграция WordPress с Битрикс24 — это не один вызов API после отправки формы. Нужны правила по сущностям и дублям, серверное хранение секретов, внутренний ID заявки, очередь, retry и контроль двусторонних событий.
Если нужно спроектировать такую связку для существующего сайта, можно описать формы, воронки и текущий процесс. По этим данным уже можно определить, хватит ли готового коннектора или нужен отдельный модуль интеграции.
Обсуждение
Вопросы и комментарии
Можно уточнить детали статьи или поделиться своим опытом. Первый комментарий проходит проверку.