Краткий ответ: интеграция WooCommerce с CRM нужна, чтобы автоматически передавать заказы, клиентов, товары, статусы, оплату, доставку и UTM-метки из интернет-магазина в систему продаж. Сделать это можно через готовый плагин, webhook, REST API, сервис-посредник или кастомный WordPress-плагин. Самое важное — не просто “отправить заказ”, а правильно обработать дубли, статусы, ошибки, безопасность и повторную отправку данных.
WooCommerce хранит заказы внутри WordPress. Менеджер может работать с ними в админке, но для реального отдела продаж этого часто мало.
CRM нужна, когда магазин должен:
Проблема в том, что простая интеграция “заказ → CRM” часто работает только на первом тестовом заказе. Потом появляются реальные случаи: повторные клиенты, отменённые оплаты, частичные возвраты, смена статусов, разные валюты, вариативные товары, промокоды, доставка, нестандартные поля checkout и дубли сделок.
Перед подключением CRM нужно определить, какие данные реально должны уходить из WooCommerce и в какой момент.
| Что передаём | Откуда в WooCommerce | Зачем CRM |
|---|---|---|
| Номер заказа | Order ID / order number | Связать сделку с заказом |
| Клиент | Billing fields | Создать контакт или обновить существующий |
| Телефон и email | Billing phone / billing email | Связь менеджера с покупателем |
| Товары | Order line items | Понять, что купил клиент |
| Сумма | Order total | Сумма сделки |
| Статус заказа | Order status | Этап сделки в CRM |
| Оплата | Payment method | Финансовый контроль |
| Доставка | Shipping method / address | Логистика и обработка заказа |
| UTM-метки | Cookies / order meta | Аналитика рекламы |
| Комментарий клиента | Customer note | Контекст для менеджера |
Если нужно передавать не только WooCommerce-заказы, но и заявки с форм, лучше сначала продумать общую схему интеграции WordPress. Подробно похожая логика разобрана в материале Интеграция WordPress с CRM/API.
Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.
Есть несколько рабочих вариантов. Правильный выбор зависит от CRM, нагрузки магазина и нужной логики.
| Способ | Когда подходит | Риск |
|---|---|---|
| Готовый плагин | CRM популярная, нужна быстрая настройка | Ограниченная логика и зависимость от плагина |
| Webhook WooCommerce | CRM умеет принимать входящие webhooks | Нужна правильная обработка ошибок и подписи |
| REST API CRM | Нужно отправлять точные данные по своей логике | Нужен код и тестирование |
| Сервис-посредник | Нужно быстро связать WooCommerce и CRM без разработки | Дополнительная стоимость и зависимость от сервиса |
| Кастомный плагин | Нужны статусы, логи, очереди, UTM, товары, сложная логика | Нужна разработка и поддержка |
Если магазин простой, можно начать с готового плагина или webhook. Если есть разные типы заказов, менеджеры, статусы, склады, UTM, Telegram-уведомления и CRM с нестандартным API, лучше делать отдельную доработку. В таких задачах обычно подходит доработка WooCommerce, потому что интеграция затрагивает заказы, checkout, оплату, доставку и безопасность.
Главная ошибка — отправлять заказ в CRM слишком рано или слишком поздно.
woocommerce_new_order — заказ создан, но ещё может быть не оплачен;woocommerce_checkout_order_processed — checkout обработан, заказ уже есть;woocommerce_payment_complete — оплата прошла;woocommerce_order_status_processing — заказ перешёл в обработку;woocommerce_order_status_completed — заказ выполнен;woocommerce_order_status_changed — можно синхронизировать смену статуса.Для большинства магазинов удобная схема такая:
Перед кодом нужно составить карту соответствия полей.
| WooCommerce | CRM | Комментарий |
|---|---|---|
order_id |
Внешний ID сделки | Нужен для защиты от дублей |
billing_first_name |
Имя клиента | Можно объединять с фамилией |
billing_phone |
Телефон | Лучше нормализовать формат |
billing_email |
Может быть пустым или техническим | |
order_total |
Сумма сделки | Учитывайте валюту |
line_items |
Товары сделки | SKU лучше передавать отдельно |
payment_method |
Способ оплаты | Важно для менеджера и бухгалтерии |
shipping_method |
Доставка | Часто требует отдельного поля |
utm_source |
Источник | Нужно сохранить в заказ заранее |
Важно: код ниже — пример структуры интеграции. Он отправляет данные заказа во внешнюю CRM. Не вставляйте реальные API-ключи в HTML, JavaScript или публичные файлы темы. Перед установкой на рабочий сайт проверьте код на копии сайта и сделайте резервную копию.
Куда вставлять: файл wp-config.php, выше строки /* That's all, stop editing! */.
define( 'SC_CRM_API_URL', 'https://crm.example.com/api/orders' );
define( 'SC_CRM_API_TOKEN', 'your_crm_api_token_here' );
Так ключ не будет лежать в теме или frontend-коде.
Куда вставлять: лучше в отдельный мини-плагин. Для быстрого теста можно использовать functions.php дочерней темы, но постоянную интеграцию лучше хранить в плагине.
add_action( 'woocommerce_checkout_order_processed', 'sc_send_order_to_crm_after_checkout', 20, 3 );
function sc_send_order_to_crm_after_checkout( $order_id, $posted_data, $order ) {
if ( ! $order_id || ! $order ) {
return;
}
if ( ! defined( 'SC_CRM_API_URL' ) || ! defined( 'SC_CRM_API_TOKEN' ) ) {
return;
}
$already_sent = $order->get_meta( '_sc_crm_order_sent' );
if ( $already_sent === 'yes' ) {
return;
}
$items = array();
foreach ( $order->get_items() as $item ) {
$product = $item->get_product();
$items[] = array(
'name' => $item->get_name(),
'quantity' => $item->get_quantity(),
'total' => $item->get_total(),
'sku' => $product ? $product->get_sku() : '',
);
}
$payload = array(
'external_order_id' => $order->get_id(),
'order_number' => $order->get_order_number(),
'status' => $order->get_status(),
'currency' => $order->get_currency(),
'total' => $order->get_total(),
'customer' => array(
'first_name' => $order->get_billing_first_name(),
'last_name' => $order->get_billing_last_name(),
'phone' => $order->get_billing_phone(),
'email' => $order->get_billing_email(),
),
'shipping' => array(
'method' => $order->get_shipping_method(),
'city' => $order->get_shipping_city(),
'address' => $order->get_shipping_address_1(),
),
'payment_method' => $order->get_payment_method_title(),
'customer_note' => $order->get_customer_note(),
'items' => $items,
);
$response = wp_remote_post(
SC_CRM_API_URL,
array(
'timeout' => 10,
'headers' => array(
'Authorization' => 'Bearer ' . SC_CRM_API_TOKEN,
'Content-Type' => 'application/json',
),
'body' => wp_json_encode( $payload ),
)
);
if ( is_wp_error( $response ) ) {
sc_log_crm_error( 'CRM request error: ' . $response->get_error_message(), $order_id );
return;
}
$response_code = wp_remote_retrieve_response_code( $response );
$response_body = wp_remote_retrieve_body( $response );
if ( $response_code < 200 || $response_code >= 300 ) {
sc_log_crm_error( 'CRM bad response. Code: ' . $response_code . '. Body: ' . $response_body, $order_id );
return;
}
$order->update_meta_data( '_sc_crm_order_sent', 'yes' );
$order->update_meta_data( '_sc_crm_last_response', wp_strip_all_tags( $response_body ) );
$order->save();
}
function sc_log_crm_error( $message, $order_id = 0 ) {
if ( function_exists( 'wc_get_logger' ) ) {
wc_get_logger()->error(
$message,
array(
'source' => 'sc-crm-integration',
'order_id' => $order_id,
)
);
}
}
В этом примере есть базовая защита от дублей через meta-поле _sc_crm_order_sent. Если CRM возвращает свой ID сделки, его лучше сохранить в заказ отдельно.
Куда вставлять: в тот же мини-плагин или functions.php дочерней темы.
add_action( 'woocommerce_order_status_changed', 'sc_send_order_status_to_crm', 20, 4 );
function sc_send_order_status_to_crm( $order_id, $old_status, $new_status, $order ) {
if ( ! $order_id || ! $order ) {
return;
}
if ( ! defined( 'SC_CRM_API_TOKEN' ) ) {
return;
}
$crm_order_sent = $order->get_meta( '_sc_crm_order_sent' );
if ( $crm_order_sent !== 'yes' ) {
return;
}
$crm_status_url = 'https://crm.example.com/api/order-status';
$payload = array(
'external_order_id' => $order->get_id(),
'order_number' => $order->get_order_number(),
'old_status' => $old_status,
'new_status' => $new_status,
'total' => $order->get_total(),
);
$response = wp_remote_post(
$crm_status_url,
array(
'timeout' => 8,
'headers' => array(
'Authorization' => 'Bearer ' . SC_CRM_API_TOKEN,
'Content-Type' => 'application/json',
),
'body' => wp_json_encode( $payload ),
)
);
if ( is_wp_error( $response ) ) {
sc_log_crm_error( 'CRM status error: ' . $response->get_error_message(), $order_id );
return;
}
$response_code = wp_remote_retrieve_response_code( $response );
if ( $response_code < 200 || $response_code >= 300 ) {
sc_log_crm_error( 'CRM status bad response. Code: ' . $response_code, $order_id );
}
}
Если CRM отвечает медленно, не стоит заставлять покупателя ждать внешний API во время checkout. Лучше поставить задачу в очередь.
add_action( 'woocommerce_checkout_order_processed', 'sc_queue_order_to_crm', 20, 3 );
function sc_queue_order_to_crm( $order_id, $posted_data, $order ) {
if ( ! $order_id ) {
return;
}
if ( function_exists( 'as_enqueue_async_action' ) ) {
as_enqueue_async_action(
'sc_send_order_to_crm_async',
array(
'order_id' => $order_id,
),
'sc-crm-integration'
);
}
}
add_action( 'sc_send_order_to_crm_async', 'sc_send_order_to_crm_async_callback', 10, 1 );
function sc_send_order_to_crm_async_callback( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
sc_send_order_to_crm_after_checkout( $order_id, array(), $order );
}
Такой подход особенно полезен, если CRM иногда отвечает с задержкой, недоступна или ограничивает количество запросов.
После нормальной интеграции WooCommerce с CRM магазин должен работать без ручного копирования заказов.
Хороший результат выглядит так:
Если параллельно нужно отправлять быстрые уведомления менеджеру, можно дополнительно связать WooCommerce с Telegram. Это не заменяет CRM, но помогает быстрее реагировать на новые заказы: как связать WooCommerce с Telegram.
В WooCommerce можно создать webhook в разделе WooCommerce → Настройки → Дополнительно → Webhooks.
Типовая настройка:
Send order to CRMActiveOrder createdWebhook удобен, если CRM умеет принимать входящие запросы. Но если CRM требует сложное преобразование полей, авторизацию, несколько запросов или проверку дублей, лучше делать промежуточный обработчик.
Этот вариант работает в другую сторону: CRM сама забирает данные из WooCommerce по API.
Подходит, когда CRM должна:
Минус такого подхода — нужно следить за лимитами, авторизацией, безопасностью ключей, скоростью API и тем, чтобы CRM не пропускала заказы между запросами.
Сервисы автоматизации удобны, если нужно быстро связать WooCommerce с CRM без разработки.
Они подходят, когда:
Но если нужна точная логика по товарам, менеджерам, складам, языкам, кастомным полям и UTM, сервис-посредник может стать ограничением.
Кастомный плагин нужен, если интеграция должна быть управляемой.
Что обычно добавляют в такой плагин:
Заказ WooCommerce может обновляться много раз: оплата, доставка, комментарий, статус, пересчёт, изменение meta. Если на каждое обновление создавать новую сделку, CRM быстро заполнится дублями.
Если CRM вернула ID сделки, его нужно сохранить в meta заказа WooCommerce. Тогда при следующем обновлении можно менять существующую сделку, а не создавать новую.
Внешняя CRM может отвечать медленно. Без timeout checkout может зависнуть. Для прямых запросов используйте короткий timeout, а для надёжности — очередь.
В CRM должны уходить только данные, которые реально нужны для обработки заказа. Не стоит передавать технические поля, внутренние заметки, лишние meta-данные и приватную информацию без необходимости.
Если интеграция не пишет ошибки в лог, невозможно понять, почему заказ не попал в CRM: неверный токен, ошибка формата, 401, 403, 500, таймаут или неправильное поле.
Тест “создал заказ — сделка появилась” недостаточен. Нужно проверить: успешную оплату, неуспешную оплату, отмену, возврат, заказ вручную из админки и повторную смену статуса.
debug.log.Для простой задачи подойдёт готовый плагин или webhook. Для сложной логики лучше сделать кастомный плагин: заказы, клиенты, товары, статусы, UTM, логи, защита от дублей и повторная отправка.
Webhook отправляет событие из WooCommerce в CRM сразу после действия. REST API чаще используется, когда CRM сама забирает данные из WooCommerce. Для заказов обычно удобнее webhook или кастомная отправка из WordPress.
Зависит от процесса продаж. Если менеджер должен видеть все заявки — при создании заказа. Если нужны только оплаченные заказы — после оплаты или перехода в статус processing.
Передавайте внешний ID заказа WooCommerce, сохраняйте CRM ID обратно в заказ и проверяйте, была ли отправка раньше. Не создавайте новую сделку при каждом обновлении заказа.
Да. WooCommerce позволяет получить товары заказа, количество, сумму, SKU и другие данные. Важно заранее понять, как CRM принимает товары: как текст, позиции сделки или отдельные товарные сущности.
Да, но UTM нужно сначала сохранить в заказ WooCommerce. Обычно метки сохраняют из cookies в order meta, а затем передают в CRM вместе с заказом.
Причина может быть в неверном API-ключе, ошибке endpoint, обязательных полях CRM, блокировке firewall, таймауте, PHP-ошибке или неправильном хуке WooCommerce. Начните с логов и HTTP-кода ответа CRM.
Если интеграция важна для продаж, лучше да. Код в теме легко потерять при смене дизайна, а отдельный плагин проще поддерживать, обновлять, логировать и расширять.
Интеграция WooCommerce с CRM — это не просто отправка формы в сторонний сервис. Это связка заказов, клиентов, товаров, оплаты, доставки, статусов, UTM, логов и обработки ошибок.
Минимальная интеграция может работать через webhook или готовый плагин. Надёжная интеграция должна иметь защиту от дублей, сохранение CRM ID в заказе, логирование, повторную отправку, обработку ошибок API и понятную карту статусов.
Если CRM используется как основной инструмент продаж, лучше сразу строить интеграцию как отдельный модуль WordPress/WooCommerce. Тогда магазин не теряет заказы, менеджеры видят актуальные данные, а владелец сайта понимает, где именно возникла ошибка при сбое синхронизации.
Об авторе