
Как интегрировать WordPress с Битрикс24, amoCRM и МойСклад через плагины, REST API и вебхуки. Примеры PHP-кода, ограничения API, безопасность и чек-лист внедрения.
Интеграция WordPress с российскими CRM: полное руководство по подключению Битрикс24, amoCRM и МойСклад
Введение: зачем интегрировать WordPress с CRM
WordPress CRM integration – это связка сайта на WordPress с системой управления клиентскими отношениями. Под неё попадают любые механизмы передачи данных: заявки с форм, синхронизация заказов WooCommerce, обновление статусов сделок, учёт остатков товаров.
Для российского бизнеса интеграция решает конкретные задачи:
- Лидогенерация. Заявки с сайта автоматически попадают в воронку продаж.
- E-commerce. Заказы из WooCommerce синхронизируются с CRM и складом.
- Складской учёт. Остатки товаров на сайте актуализируются из МойСклад.
- Маркетинг. CRM фиксирует источники заявок и повторные продажи.
Битрикс24, amoCRM и МойСклад – одни из самых распространённых решений на российском рынке. Битрикс24 объединяет CRM, задачи и коммуникации; amoCRM заточена под воронки продаж; МойСклад – под склад, закупки и производство.
Статья будет полезна руководителям, которые выбирают CRM, и техническим специалистам, которым предстоит реализация. Все примеры кода проверены на актуальных версиях API и учитывают типичные ошибки внедрений.
Выбор способа интеграции: плагины, REST API и вебхуки
Перед подключением важно понимать, какой механизм подходит под задачу.
| Способ | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
| Готовый плагин | Стандартная задача: форма → лид, WooCommerce → заказ | Быстрая настройка, поддержка автором | Ограниченная кастомизация, зависимость от обновлений |
| REST API + PHP | Нестандартная логика, кастомные поля, массовая синхронизация | Гибкость, контроль данных | Требует разработки, нужно поддерживать |
| Вебхуки | Двусторонний обмен: статусы сделок, обновления из CRM | Реальное время, минимум запросов | Нужен публичный HTTPS-адрес, защита endpoint'ов |
Когда достаточно плагина
Если на сайте стоит Contact Form 7, WPForms или Elementor Forms, и задача – только отправлять лиды в CRM, готовый плагин справится за 30–60 минут.
Когда нужна кастомная разработка
- В CRM используются кастомные поля, воронки с несколькими этапами, роботы.
- Нужно передавать не только контакт, но и содержимое корзины, скидки, UTM-метки.
- Требуется двусторонняя синхронизация: статусы заказов возвращаются на сайт.
Требования к инфраструктуре
- Хостинг с возможностью исходящих
cURL-запросов. Рекомендуется PHP 8.0+ и WordPress 6.0+. - SSL-сертификат. Все три системы работают с вебхуками только по HTTPS.
- Актуальные версии WooCommerce, если используется магазин.
Интеграция WordPress с Битрикс24
Плагины для Битрикс24
Официальных плагинов от «1С-Битрикс» для WordPress немного, но есть рабочие сторонние решения:
- Integration of Bitrix24 with Contact Form 7 – передаёт заявки из Contact Form 7.
- Bitrix24 – официальный плагин/виджет для встраивания форм и чата на сайт.
- Flamix: Bitrix24 + WooCommerce / Contact Form 7 – серия платных коннекторов для синхронизации заказов и форм.
Перед покупкой проверяйте: поддерживает ли плагин входящие вебхуки (обновление статусов из CRM) и кастомные поля сделок.
Настройка подключения по вебхуку
В Битрикс24 вебхук настраивается в разделе Разработчикам → Вебхуки → Входящий вебхук. Создайте вебхук с правами на CRM.
Пример URL входящего вебхука:
https://your.bitrix24.ru/rest/1/WEBHOOK_TOKEN/crm.lead.add.jsonВажно: REST API и вебхуки в облачном Битрикс24 доступны с платных тарифов. Бесплатный план ограничен и не подходит для полноценной интеграции через API.
Пример отправки лида из WordPress в Битрикс24
Добавьте код в functions.php дочерней темы или в собственный плагин:
function pt_send_lead_to_bitrix24( $data ) {
$webhook_url = 'https://your.bitrix24.ru/rest/1/WEBHOOK_TOKEN/crm.lead.add.json';
$payload = [
'fields' => [
'TITLE' => 'Заявка с сайта: ' . sanitize_text_field( $data['service'] ),
'NAME' => sanitize_text_field( $data['name'] ),
'PHONE' => [ [ 'VALUE' => sanitize_text_field( $data['phone'] ), 'VALUE_TYPE' => 'WORK' ] ],
'EMAIL' => [ [ 'VALUE' => sanitize_email( $data['email'] ), 'VALUE_TYPE' => 'WORK' ] ],
'COMMENTS' => sanitize_textarea_field( $data['message'] ),
'SOURCE_ID' => 'WEB',
'UTM_SOURCE' => sanitize_text_field( $data['utm_source'] ?? '' ),
'UTM_MEDIUM' => sanitize_text_field( $data['utm_medium'] ?? '' ),
],
'params' => [ 'REGISTER_SONET_EVENT' => 'Y' ],
];
$response = wp_remote_post( $webhook_url, [
'body' => $payload,
'timeout' => 30,
] );
if ( is_wp_error( $response ) ) {
error_log( 'Bitrix24 lead error: ' . $response->get_error_message() );
return false;
}
$body = json_decode( wp_remote_retrieve_body( $response ), true );
return $body['result'] ?? false;
}Подключение к форме:
add_action( 'wpcf7_mail_sent', 'pt_cf7_to_bitrix24' );
function pt_cf7_to_bitrix24( $contact_form ) {
$submission = WPCF7_Submission::get_instance();
if ( ! $submission ) {
return;
}
$data = $submission->get_posted_data();
pt_send_lead_to_bitrix24( $data );
}Ограничения REST API Битрикс24
Лимит запросов зависит от тарифа:
- На большинстве облачных тарифов – до 2 запросов в секунду.
- На Enterprise – до 5 запросов в секунду.
Лимит считается по IP-адресу и аккаунту. При массовой синхронизации используйте batch-методы (до 50 запросов в одном вызове) и exponential backoff при получении ошибки QUERY_LIMIT_EXCEEDED. Примитивный sleep(1) между запросами не гарантирует отсутствие блокировок.
Синхронизация статусов сделок
Для обратной передачи статусов создайте исходящий вебхук в Битрикс24:
https://your-site.ru/wp-json/pt/v1/bitrix24/statusВ WordPress зарегистрируйте endpoint:
add_action( 'rest_api_init', function () {
register_rest_route( 'pt/v1', '/bitrix24/status', [
'methods' => 'POST',
'callback' => 'pt_handle_bitrix24_status',
'permission_callback' => 'pt_verify_bitrix24_request',
] );
} );
function pt_verify_bitrix24_request( $request ) {
// Битрикс24 использует динамический пул IP-адресов.
// Актуальный список: https://dl.bitrix24.com/webhook/app-world.json
// В идеале проверяйте подпись или секретный заголовок.
return true;
}
function pt_handle_bitrix24_status( $request ) {
$body = $request->get_json_params();
$deal_id = absint( $body['data']['FIELDS']['ID'] ?? 0 );
$deal_data = pt_get_bitrix24_deal( $deal_id );
if ( ! empty( $deal_data['ORDER_ID'] ) ) {
update_post_meta( $deal_data['ORDER_ID'], '_bitrix24_status', sanitize_text_field( $deal_data['STAGE_ID'] ) );
}
return [ 'success' => true ];
}Типичные ошибки
- Невалидный токен. Битрикс24 возвращает
NO_AUTH_FOUNDилиINVALID_CREDENTIALS. Проверьте, не истёк срок входящего вебхука. - Превышение лимитов. Используйте batch и backoff вместо последовательных одиночных запросов.
- Дублирование лидов. Перед созданием лида делайте поиск по телефону или email через
crm.duplicate.findbycomm.
Интеграция WordPress с amoCRM
Плагины и коннекторы
amoCRM имеет более развитую экосистему интеграций для WordPress:
- amoForms – официальные виджеты форм.
- Contact Form 7 – amoCRM Integration – популярный бесплатный плагин.
- WPCF7 amoCRM и аналоги для WPForms.
- Коммерческие решения для WooCommerce.
Получение токена
В новых аккаунтах amoCRM используется OAuth 2.0. Для серверной интеграции нужно:
- Создать интеграцию в личном кабинете.
- Получить
client_idиclient_secret. - Реализовать обмен authorization code на
access_tokenиrefresh_token.
Для простых случаев можно использовать личный токен из раздела Настройки → API.
Цены: актуальные тарифы amoCRM см. на amocrm.ru. Минимальные решения для бизнеса обычно начинаются от ~749 ₽/мес.
Пример создания сделки и контакта через REST API
function pt_send_to_amocrm( $data ) {
$subdomain = 'yourcompany';
$access_token = defined( 'AMOCRM_ACCESS_TOKEN' ) ? AMOCRM_ACCESS_TOKEN : '';
$base_url = "https://{$subdomain}.amocrm.ru/api/v4";
$contact = [
'name' => sanitize_text_field( $data['name'] ),
'custom_fields_values' => [
[
'field_code' => 'PHONE',
'values' => [ [ 'value' => sanitize_text_field( $data['phone'] ) ] ],
],
[
'field_code' => 'EMAIL',
'values' => [ [ 'value' => sanitize_email( $data['email'] ) ] ],
],
],
];
$response = wp_remote_post( "{$base_url}/contacts", [
'headers' => [
'Authorization' => 'Bearer ' . $access_token,
'Content-Type' => 'application/json',
],
'body' => json_encode( [ $contact ] ),
'timeout' => 30,
] );
if ( is_wp_error( $response ) ) {
error_log( 'amoCRM contact error: ' . $response->get_error_message() );
return false;
}
$body = json_decode( wp_remote_retrieve_body( $response ), true );
$contact_id = $body['_embedded']['contacts'][0]['id'] ?? 0;
if ( ! $contact_id ) {
return false;
}
$lead = [
'name' => 'Заявка с сайта',
'price' => isset( $data['price'] ) ? intval( $data['price'] ) : 0,
'_embedded' => [
'contacts' => [ [ 'id' => $contact_id ] ],
],
];
$lead_response = wp_remote_post( "{$base_url}/leads", [
'headers' => [
'Authorization' => 'Bearer ' . $access_token,
'Content-Type' => 'application/json',
],
'body' => json_encode( [ $lead ] ),
'timeout' => 30,
] );
return ! is_wp_error( $lead_response );
}Обработка входящих вебхуков из amoCRM
amoCRM отправляет вебхуки на указанный URL при изменении сделок, контактов или задач. Пример приёма:
add_action( 'rest_api_init', function () {
register_rest_route( 'pt/v1', '/amocrm/webhook', [
'methods' => 'POST',
'callback' => 'pt_handle_amocrm_webhook',
'permission_callback' => '__return_true',
] );
} );
function pt_handle_amocrm_webhook( $request ) {
$body = $request->get_body_params();
if ( empty( $body['leads']['status'] ) ) {
return [ 'success' => true ];
}
foreach ( $body['leads']['status'] as $lead ) {
$status_id = sanitize_text_field( $lead['status_id'] );
$lead_id = absint( $lead['id'] );
$order_id = pt_get_order_by_amocrm_lead_id( $lead_id );
if ( $order_id ) {
$order = wc_get_order( $order_id );
if ( $order ) {
$order->update_status( pt_map_amocrm_status( $status_id ) );
}
}
}
return [ 'success' => true ];
}Частые проблемы
- Истечение access-токена. Access-токен живёт 24 часа. Реализуйте автоматическое обновление через
refresh_token. - Структура воронок. ID воронок и статусов различаются между аккаунтами. Храните их в настройках плагина.
- Кастомные поля. В amoCRM поля часто создаются вручную. Перед отправкой получайте список полей через
/api/v4/leads/custom_fields.
Интеграция WordPress с МойСклад
Зачем связывать WordPress и МойСклад
МойСклад чаще всего нужен не как CRM, а как система учёта. Типичные сценарии:
- Выгрузка каталога товаров из МойСклад на сайт.
- Проверка остатков перед оформлением заказа.
- Создание заказов покупателя в МойСклад из WooCommerce.
Способы интеграции
- Готовые плагины для WooCommerce, включая официальный плагин «МойСклад».
- JSON API МойСклад – полноценный REST-интерфейс.
- Вебхуки МойСклад – уведомления об изменениях товаров, заказов, контрагентов.
Важно: актуальный базовый URL JSON API МойСклад –
https://api.moysklad.ru/api/remap/1.2. Доменonline.moysklad.ruустарел.
Тарифы: бесплатный тариф МойСклад сильно ограничен (100 товаров/контрагентов/документов, 1 сотрудник). Для полноценной интеграции с WooCommerce обычно нужен тариф «Базовый» или выше. Актуальные цены см. на moysklad.ru/subscription.
Пример получения остатков товара через JSON API
function pt_get_moysklad_stock( $product_uuid ) {
$login = defined( 'MOYSKLAD_LOGIN' ) ? MOYSKLAD_LOGIN : '';
$pass = defined( 'MOYSKLAD_PASSWORD' ) ? MOYSKLAD_PASSWORD : '';
$url = 'https://api.moysklad.ru/api/remap/1.2/entity/assortment';
$response = wp_remote_get( add_query_arg( [
'filter' => 'id=' . urlencode( $product_uuid ),
], $url ), [
'headers' => [
'Authorization' => 'Basic ' . base64_encode( "{$login}:{$pass}" ),
],
'timeout' => 30,
] );
if ( is_wp_error( $response ) ) {
return null;
}
$body = json_decode( wp_remote_retrieve_body( $response ), true );
$item = $body['rows'][0] ?? null;
if ( ! $item ) {
return null;
}
return [
'name' => $item['name'],
'stock' => $item['stock'] ?? 0,
'price' => $item['salePrices'][0]['value'] ?? 0,
];
}Синхронизация заказов WooCommerce с МойСклад
В JSON API МойСклад сущности идентифицируются по UUID, а не по артикулу или коду. Храните UUID товара в мета-поле WooCommerce (_moysklad_uuid) и подставляйте его в meta.href.
add_action( 'woocommerce_thankyou', 'pt_create_moysklad_order', 10, 1 );
function pt_create_moysklad_order( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
$login = defined( 'MOYSKLAD_LOGIN' ) ? MOYSKLAD_LOGIN : '';
$pass = defined( 'MOYSKLAD_PASSWORD' ) ? MOYSKLAD_PASSWORD : '';
$positions = [];
foreach ( $order->get_items() as $item ) {
$product = $item->get_product();
$product_uuid = $product ? $product->get_meta( '_moysklad_uuid' ) : '';
if ( ! $product_uuid ) {
continue;
}
$positions[] = [
'quantity' => $item->get_quantity(),
'price' => $item->get_total() * 100,
'assortment' => [
'meta' => [
'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/product/' . $product_uuid,
'type' => 'product',
],
],
];
}
$payload = [
'name' => 'Заказ с сайта №' . $order_id,
'positions' => $positions,
'sum' => $order->get_total() * 100,
'organization' => [
'meta' => [
'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/organization/YOUR_ORG_UUID',
'type' => 'organization',
],
],
];
wp_remote_post( 'https://api.moysklad.ru/api/remap/1.2/entity/customerorder', [
'headers' => [
'Authorization' => 'Basic ' . base64_encode( "{$login}:{$pass}" ),
'Content-Type' => 'application/json',
],
'body' => json_encode( $payload ),
'timeout' => 30,
] );
}Ограничения и лимиты
- Лимит запросов. МойСклад ограничивает частоту: не более 45 запросов в течение 3 секунд на один аккаунт.
- UUID вместо кода. В API МойСклад многие сущности идентифицируются по UUID. Для надёжности храните UUID товара в мета-поле WooCommerce.
- Вебхуки доступны не на всех тарифах. Проверяйте возможность подписки на события в вашем тарифе.
Сравнение Битрикс24, amoCRM и МойСклад для WordPress
| Критерий | Битрикс24 | amoCRM | МойСклад |
|---|---|---|---|
| Сложность подключения | Средняя | Средняя | Низкая для остатков, средняя для заказов |
| Стоимость | Бесплатный план ограничен; API – с платных тарифов | Актуальные цены см. на amocrm.ru | Бесплатный тариф ограничен; платные – от 495 ₽/мес, для WooCommerce обычно нужен «Базовый» |
| Лучше всего для | Универсальной CRM, задач, коммуникаций | Воронок продаж, лидогенерации | Склада, учёта, e-commerce |
| Интеграция с WooCommerce | Плагины + API | Плагины + API | Официальный плагин + API |
| Двусторонний обмен | Вебхуки + REST | Вебхуки + REST | Вебхуки + JSON API |
| Поддержка кастомных полей | Да | Да | Да |
Рекомендации по выбору
- Лидогенерация и продажи: amoCRM или Битрикс24. amoCRM проще в настройке воронок; Битрикс24 шире по функциям.
- E-commerce + склад: МойСклад + WooCommerce. При необходимости передавайте лиды из форм в amoCRM или Битрикс24.
- Комплексная автоматизация: WordPress + WooCommerce + МойСклад + amoCRM/Битрикс24. Связка требует разработки, но покрывает полный цикл.
Безопасность токенов и данных при интеграции
Где хранить API-токены
Никогда не храните токены в открытом виде в коде темы или плагина. Используйте:
- Константы в
wp-config.phpвне корня веб-сервера, если возможно. - Переменные окружения сервера.
- Плагины секретов, например WP Secrets или аналоги.
Пример в wp-config.php:
define( 'BITRIX24_WEBHOOK_TOKEN', getenv( 'BITRIX24_WEBHOOK_TOKEN' ) ?: '' );
define( 'AMOCRM_ACCESS_TOKEN', getenv( 'AMOCRM_ACCESS_TOKEN' ) ?: '' );
define( 'MOYSKLAD_LOGIN', getenv( 'MOYSKLAD_LOGIN' ) ?: '' );
define( 'MOYSKLAD_PASSWORD', getenv( 'MOYSKLAD_PASSWORD' ) ?: '' );Защита endpoint'ов
Все вебхук-endpoint'ы должны проверять источник запроса. Минимальный набор мер:
- Проверка подписи или секретного заголовка, если CRM их поддерживает.
- Ограничение по IP с актуальным списком серверов CRM. Для Битрикс24 список публикуется по адресу
https://dl.bitrix24.com/webhook/app-world.json. - Логирование всех входящих запросов.
- Rate limiting.
Пример проверки секретного заголовка:
function pt_verify_crm_webhook( $request ) {
$secret = defined( 'CRM_WEBHOOK_SECRET' ) ? CRM_WEBHOOK_SECRET : '';
$header = $request->get_header( 'x-crm-signature' );
if ( ! $secret || ! hash_equals( $secret, $header ) ) {
return new WP_Error( 'forbidden', 'Access denied', [ 'status' => 403 ] );
}
return true;
}Валидация и логирование
function pt_sanitize_crm_data( $data ) {
return [
'name' => sanitize_text_field( $data['name'] ?? '' ),
'phone' => preg_replace( '/[^0-9+]/', '', $data['phone'] ?? '' ),
'email' => sanitize_email( $data['email'] ?? '' ),
'message' => sanitize_textarea_field( $data['message'] ?? '' ),
];
}Логируйте ошибки интеграции отдельно от общих логов WordPress:
function pt_log_crm_error( $message ) {
$log_file = WP_CONTENT_DIR . '/uploads/pt-crm-errors.log';
error_log( gmdate( 'Y-m-d H:i:s' ) . ' ' . $message . "\n", 3, $log_file );
}Резервное копирование и план отката
Перед запуском интеграции:
- Сделайте полный бэкап сайта и базы данных.
- Настройте тестовое окружение или используйте песочницу CRM.
- Подготовьте переключатель для отключения интеграции без правки кода:
if ( ! defined( 'PT_CRM_INTEGRATION_ENABLED' ) || ! PT_CRM_INTEGRATION_ENABLED ) {
return;
}Пошаговый чек-лист внедрения интеграции
- Аудит бизнес-процессов. Зафиксируйте, какие данные должны передаваться и в каком направлении.
- Выбор CRM или учётной системы. Определитесь с одной основной системой и возможными вспомогательными.
- Проверка форм на сайте. Убедитесь, что все поля имеют понятные
nameи валидируются. - Выбор метода интеграции. Плагин, REST API, вебхуки или комбинация.
- Тестовое подключение. Отправьте 10–20 тестовых заявок, проверьте дублирование и ошибки.
- Настройка маппинга полей. Сопоставьте поля формы с полями CRM.
- Запуск в продакшен. Включайте интеграцию постепенно, мониторьте логи первые 2–3 недели.
Часто задаваемые вопросы
Можно ли интегрировать WordPress с CRM без программиста?
Да, если задача стандартная: заявка из Contact Form 7 или WPForms → лид в amoCRM/Битрикс24. Для этого подходят готовые плагины. Двусторонняя синхронизация, кастомные поля и обмен с МойСклад обычно требуют разработки.
Какая CRM лучше для WooCommerce?
Для склада и учёта – МойСклад. Для воронки продаж и лидов – amoCRM или Битрикс24. Часто используют комбинацию: WooCommerce + МойСклад для товаров и заказов, amoCRM/Битрикс24 для CRM.
Как защитить вебхук-endpoint от посторонних запросов?
Используйте проверку подписи или секретного заголовка, ограничение по IP-адресам CRM, логирование и rate limiting. Никогда не полагайтесь только на security through obscurity – секретный URL недостаточен.
Заключение
WordPress CRM integration для российского рынка – это не одна универсальная схема, а три разных подхода:
- Битрикс24 подходит для комплексной работы: лиды, задачи, коммуникации, склад.
- amoCRM – для чистых воронок продаж и быстрой автоматизации.
- МойСклад – для складского учёта и синхронизации товаров с WooCommerce.
Что можно сделать самостоятельно: настроить готовый плагин, создать простой вебхук, отправлять лиды через PHP. Что стоит отдать разработчику: двусторонний обмен, синхронизацию заказов с кастомными полями, объединение нескольких систем.
Если интеграция кажется сложной – начните с аудита. Чёткое понимание, какие данные и куда должны идти, сокращает время внедрения в 2–3 раза и убирает лишние доработки.
