Интеграция WooCommerce с CRM: заказы, клиенты, API и автоматизация

Автор:vkuzyomko

Интеграция WooCommerce с CRM: заказы, клиенты, API и автоматизация

Краткий ответ: интеграция WooCommerce с CRM нужна, чтобы автоматически передавать заказы, клиентов, товары, статусы, оплату, доставку и UTM-метки из интернет-магазина в систему продаж. Сделать это можно через готовый плагин, webhook, REST API, сервис-посредник или кастомный WordPress-плагин. Самое важное — не просто “отправить заказ”, а правильно обработать дубли, статусы, ошибки, безопасность и повторную отправку данных.

Причина

WooCommerce хранит заказы внутри WordPress. Менеджер может работать с ними в админке, но для реального отдела продаж этого часто мало.

CRM нужна, когда магазин должен:

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

Проблема в том, что простая интеграция “заказ → 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.

Нужно быстро решить проблему на сайте?

Если не хотите рисковать сайтом и тратить время на эксперименты, можно оставить заявку. Я посмотрю задачу и предложу аккуратное решение.

Оставить заявку

Решение

1. Выбрать способ интеграции

Есть несколько рабочих вариантов. Правильный выбор зависит от CRM, нагрузки магазина и нужной логики.

Способ Когда подходит Риск
Готовый плагин CRM популярная, нужна быстрая настройка Ограниченная логика и зависимость от плагина
Webhook WooCommerce CRM умеет принимать входящие webhooks Нужна правильная обработка ошибок и подписи
REST API CRM Нужно отправлять точные данные по своей логике Нужен код и тестирование
Сервис-посредник Нужно быстро связать WooCommerce и CRM без разработки Дополнительная стоимость и зависимость от сервиса
Кастомный плагин Нужны статусы, логи, очереди, UTM, товары, сложная логика Нужна разработка и поддержка

Если магазин простой, можно начать с готового плагина или webhook. Если есть разные типы заказов, менеджеры, статусы, склады, UTM, Telegram-уведомления и CRM с нестандартным API, лучше делать отдельную доработку. В таких задачах обычно подходит доработка WooCommerce, потому что интеграция затрагивает заказы, checkout, оплату, доставку и безопасность.

2. Определить событие WooCommerce

Главная ошибка — отправлять заказ в CRM слишком рано или слишком поздно.

  • woocommerce_new_order — заказ создан, но ещё может быть не оплачен;
  • woocommerce_checkout_order_processed — checkout обработан, заказ уже есть;
  • woocommerce_payment_complete — оплата прошла;
  • woocommerce_order_status_processing — заказ перешёл в обработку;
  • woocommerce_order_status_completed — заказ выполнен;
  • woocommerce_order_status_changed — можно синхронизировать смену статуса.

Для большинства магазинов удобная схема такая:

  • создавать лид или сделку при новом заказе;
  • обновлять сделку при смене статуса;
  • передавать оплату только после подтверждения платежа;
  • не создавать дубль, если CRM уже получила этот заказ;
  • сохранять CRM ID обратно в meta заказа WooCommerce.

3. Сделать карту полей

Перед кодом нужно составить карту соответствия полей.

WooCommerce CRM Комментарий
order_id Внешний ID сделки Нужен для защиты от дублей
billing_first_name Имя клиента Можно объединять с фамилией
billing_phone Телефон Лучше нормализовать формат
billing_email Email Может быть пустым или техническим
order_total Сумма сделки Учитывайте валюту
line_items Товары сделки SKU лучше передавать отдельно
payment_method Способ оплаты Важно для менеджера и бухгалтерии
shipping_method Доставка Часто требует отдельного поля
utm_source Источник Нужно сохранить в заказ заранее

Код

Важно: код ниже — пример структуры интеграции. Он отправляет данные заказа во внешнюю CRM. Не вставляйте реальные API-ключи в HTML, JavaScript или публичные файлы темы. Перед установкой на рабочий сайт проверьте код на копии сайта и сделайте резервную копию.

1. Хранить CRM API-ключ в wp-config.php

Куда вставлять: файл 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-коде.

2. Отправить заказ WooCommerce в CRM

Куда вставлять: лучше в отдельный мини-плагин. Для быстрого теста можно использовать 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 сделки, его лучше сохранить в заказ отдельно.

3. Обновлять CRM при смене статуса заказа

Куда вставлять: в тот же мини-плагин или 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 );
    }
}

4. Вынести отправку в фон через Action Scheduler

Если 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 магазин должен работать без ручного копирования заказов.

Хороший результат выглядит так:

  • после заказа в CRM появляется сделка;
  • контакт клиента создаётся или обновляется;
  • товары заказа передаются с количеством, ценой и SKU;
  • статус WooCommerce синхронизируется с этапом CRM;
  • UTM-метки и источник заявки сохраняются;
  • повторная отправка не создаёт дубли;
  • ошибки пишутся в лог WooCommerce;
  • при сбое CRM заказ не теряется;
  • checkout не тормозит из-за внешнего API.

Если параллельно нужно отправлять быстрые уведомления менеджеру, можно дополнительно связать WooCommerce с Telegram. Это не заменяет CRM, но помогает быстрее реагировать на новые заказы: как связать WooCommerce с Telegram.

Дополнительные способы

Интеграция через WooCommerce Webhooks

В WooCommerce можно создать webhook в разделе WooCommerce → Настройки → Дополнительно → Webhooks.

Типовая настройка:

  • Name: Send order to CRM
  • Status: Active
  • Topic: Order created
  • Delivery URL: URL CRM или промежуточного обработчика
  • Secret: секретная строка для проверки подписи

Webhook удобен, если CRM умеет принимать входящие запросы. Но если CRM требует сложное преобразование полей, авторизацию, несколько запросов или проверку дублей, лучше делать промежуточный обработчик.

Интеграция через REST API WooCommerce

Этот вариант работает в другую сторону: CRM сама забирает данные из WooCommerce по API.

Подходит, когда CRM должна:

  • периодически получать новые заказы;
  • сверять статусы;
  • обновлять остатки;
  • синхронизировать клиентов;
  • забирать товары и категории.

Минус такого подхода — нужно следить за лимитами, авторизацией, безопасностью ключей, скоростью API и тем, чтобы CRM не пропускала заказы между запросами.

Интеграция через сервис-посредник

Сервисы автоматизации удобны, если нужно быстро связать WooCommerce с CRM без разработки.

Они подходят, когда:

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

Но если нужна точная логика по товарам, менеджерам, складам, языкам, кастомным полям и UTM, сервис-посредник может стать ограничением.

Интеграция через кастомный плагин

Кастомный плагин нужен, если интеграция должна быть управляемой.

Что обычно добавляют в такой плагин:

  • страницу настроек CRM API;
  • тестовую отправку;
  • выбор статусов для синхронизации;
  • таблицу логов;
  • повторную отправку заказа вручную;
  • очередь задач;
  • маппинг полей;
  • сохранение CRM ID в заказе;
  • защиту от дублей;
  • отдельную обработку ошибок.

Частые ошибки

Создавать сделку при каждом обновлении заказа

Заказ WooCommerce может обновляться много раз: оплата, доставка, комментарий, статус, пересчёт, изменение meta. Если на каждое обновление создавать новую сделку, CRM быстро заполнится дублями.

Не сохранять CRM ID в заказе

Если CRM вернула ID сделки, его нужно сохранить в meta заказа WooCommerce. Тогда при следующем обновлении можно менять существующую сделку, а не создавать новую.

Отправлять запрос в CRM без timeout

Внешняя CRM может отвечать медленно. Без timeout checkout может зависнуть. Для прямых запросов используйте короткий timeout, а для надёжности — очередь.

Передавать лишние персональные данные

В CRM должны уходить только данные, которые реально нужны для обработки заказа. Не стоит передавать технические поля, внутренние заметки, лишние meta-данные и приватную информацию без необходимости.

Не логировать ошибки

Если интеграция не пишет ошибки в лог, невозможно понять, почему заказ не попал в CRM: неверный токен, ошибка формата, 401, 403, 500, таймаут или неправильное поле.

Не тестировать реальные статусы оплаты

Тест “создал заказ — сделка появилась” недостаточен. Нужно проверить: успешную оплату, неуспешную оплату, отмену, возврат, заказ вручную из админки и повторную смену статуса.

Диагностика проблем

Заказ не попадает в CRM

  • Проверьте, срабатывает ли нужный хук WooCommerce.
  • Проверьте WooCommerce logs.
  • Проверьте debug.log.
  • Проверьте API URL CRM.
  • Проверьте API token.
  • Проверьте, не блокирует ли запрос хостинг или firewall.
  • Проверьте ответ CRM и HTTP-код.

CRM возвращает 401

  • Проверьте API-ключ.
  • Проверьте формат заголовка Authorization.
  • Проверьте, не истёк ли токен.
  • Проверьте права пользователя API.
  • Проверьте, не нужен ли другой тип авторизации.

CRM возвращает 403

  • Проверьте права API-ключа.
  • Проверьте whitelist IP.
  • Проверьте ограничения CRM по домену.
  • Проверьте firewall на стороне CRM.
  • Проверьте, разрешён ли нужный endpoint.

CRM возвращает 400

  • Проверьте обязательные поля.
  • Проверьте формат телефона.
  • Проверьте формат суммы.
  • Проверьте валюту.
  • Проверьте JSON.
  • Проверьте, не передаётся ли пустое поле, которое CRM требует заполнить.

Появляются дубли сделок

  • Проверьте, на каком хуке отправляется заказ.
  • Проверьте, не работают ли одновременно плагин и кастомный код.
  • Сохраняйте CRM ID в заказе WooCommerce.
  • Передавайте внешний ID заказа.
  • Добавьте проверку перед созданием сделки.

Checkout стал медленнее

  • Проверьте время ответа CRM.
  • Уменьшите timeout.
  • Вынесите отправку в Action Scheduler.
  • Не отправляйте несколько запросов на один заказ.
  • Не передавайте тяжёлые данные, если они не нужны CRM.

Статус в CRM не совпадает с WooCommerce

  • Проверьте карту статусов.
  • Проверьте кастомные статусы WooCommerce.
  • Проверьте платёжный шлюз.
  • Проверьте повторные смены статуса.
  • Проверьте, не меняет ли CRM статус обратно через API.

FAQ

Как лучше интегрировать WooCommerce с CRM?

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

Что лучше: webhook или REST API?

Webhook отправляет событие из WooCommerce в CRM сразу после действия. REST API чаще используется, когда CRM сама забирает данные из WooCommerce. Для заказов обычно удобнее webhook или кастомная отправка из WordPress.

Когда отправлять заказ в CRM?

Зависит от процесса продаж. Если менеджер должен видеть все заявки — при создании заказа. Если нужны только оплаченные заказы — после оплаты или перехода в статус processing.

Как избежать дублей в CRM?

Передавайте внешний ID заказа WooCommerce, сохраняйте CRM ID обратно в заказ и проверяйте, была ли отправка раньше. Не создавайте новую сделку при каждом обновлении заказа.

Можно ли передавать товары заказа в CRM?

Да. WooCommerce позволяет получить товары заказа, количество, сумму, SKU и другие данные. Важно заранее понять, как CRM принимает товары: как текст, позиции сделки или отдельные товарные сущности.

Можно ли передавать UTM-метки?

Да, но UTM нужно сначала сохранить в заказ WooCommerce. Обычно метки сохраняют из cookies в order meta, а затем передают в CRM вместе с заказом.

Почему заказ не приходит в CRM?

Причина может быть в неверном API-ключе, ошибке endpoint, обязательных полях CRM, блокировке firewall, таймауте, PHP-ошибке или неправильном хуке WooCommerce. Начните с логов и HTTP-кода ответа CRM.

Нужно ли делать отдельный плагин для интеграции?

Если интеграция важна для продаж, лучше да. Код в теме легко потерять при смене дизайна, а отдельный плагин проще поддерживать, обновлять, логировать и расширять.

Вывод

Интеграция WooCommerce с CRM — это не просто отправка формы в сторонний сервис. Это связка заказов, клиентов, товаров, оплаты, доставки, статусов, UTM, логов и обработки ошибок.

Минимальная интеграция может работать через webhook или готовый плагин. Надёжная интеграция должна иметь защиту от дублей, сохранение CRM ID в заказе, логирование, повторную отправку, обработку ошибок API и понятную карту статусов.

Если CRM используется как основной инструмент продаж, лучше сразу строить интеграцию как отдельный модуль WordPress/WooCommerce. Тогда магазин не теряет заказы, менеджеры видят актуальные данные, а владелец сайта понимает, где именно возникла ошибка при сбое синхронизации.

Об авторе

vkuzyomko administrator