<!-- source: https://nodbot.ru/integrations/woocommerce/; markdown: /llms/pages/generated/integrations-woocommerce.md; type: IntegrationGuide -->
---
title: "WooCommerce и n8n: заказы в CRM без дублей | Nodbot"
source_url: "https://nodbot.ru/integrations/woocommerce/"
canonical_url: "https://nodbot.ru/integrations/woocommerce/"
language: "ru"
content_type: "IntegrationGuide"
section: "integrations"
generated_at: "2026-05-30"
word_count_source: 973
---

## AI summary

Problem/Solution-гайд по WooCommerce и n8n: как принимать order webhooks, нормализовать товары и клиента, не создавать дубли и безопасно синхронизировать CRM или склад.

## Best used for

Страница нужна интеграторам, product/engineering-командам и владельцам n8n, которые хотят внедрить связку без дублей, ручного хаоса и потери контекста.

## Key topics

- WooCommerce
- n8n
- webhooks
- REST API
- orders
- CRM
- warehouse
- idempotency
- line items
- WordPress

# Интеграция WooCommerce и n8n: заказы, webhooks и синхронизация CRM

Обновлено: 2026-05-30

Импортируйте JSON в n8n, замените credentials, URL API, project/list IDs, поля и лимиты под вашу инфраструктуру.

- Проблема и решение

- Архитектура workflow

- Контракт данных

- Code Node и проверки

- Готовый workflow JSON

- Пошаговая настройка

- Тесты перед production

- Production-риски

- Полезные ссылки

- Критерии готовности

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

Решение: Надёжная интеграция WooCommerce и n8n разделяет order.created и order.updated, собирает ключ по shop+topic+order_id, нормализует line items и обновляет CRM/склад по понятному статусу.


## Проблема: почему простая интеграция создаёт дубли и ручной хаос

WooCommerce часто используют в связке с WordPress, CRM, складом, Telegram-уведомлениями и email. На старте кажется, что достаточно создать webhook “Order created” и принять JSON в n8n. Но в реальной эксплуатации заказ может обновляться много раз: оплата, смена статуса, адрес доставки, комментарий менеджера, возврат или изменение состава товаров.

Если не различать события и не сохранять order_id как ключ, downstream-системы получают несколько одинаковых заказов. Особенно это опасно для склада: дубли line items могут привести к ошибочной отгрузке или неверному резервированию остатков.


## Архитектура workflow для n8n

| Блок | Задача | Production-проверка |

| --- | --- | --- |

| WooCommerce Webhook | принимает order event | secret, topic/action, JSON body |

| Normalize order | готовит customer, billing, shipping и line_items | SKU, quantity, price не потеряны |

| Build dedupe key | собирает ключ shop+topic+order_id | order_id не пустой |

| Find existing record | ищет заказ в CRM/складе/таблице | по external_order_id |

| Create or update | создаёт заказ или обновляет статус | нет второй записи на update |

| Respond / alert | возвращает 2xx и пишет ошибки | без секретов и персональных данных |

Для WooCommerce лучше хранить внешний номер заказа отдельно: external_order_id и order_number могут отличаться. Не используйте только name или email покупателя как ключ.


## Контракт входных данных

```json
{
  "id": 10492,
  "number": "10492",
  "status": "processing",
  "currency": "RUB",
  "date_created": "2026-05-30T10:00:00",
  "total": "15900.00",
  "payment_method": "card",
  "billing": {
    "first_name": "Ольга",
    "last_name": "Смирнова",
    "email": "olga@example.ru",
    "phone": "+7 916 222-33-44"
  },
  "shipping": {
    "city": "Москва",
    "address_1": "ул. Примерная, 15"
  },
  "line_items": [
    {
      "id": 731,
      "name": "Консультация n8n",
      "sku": "N8N-CONSULT",
      "quantity": 1,
      "total": "15900.00"
    }
  ]
}
```

В тестовом payload показан заказ WooCommerce. В production добавьте shop domain и topic из webhook-заголовков или параметров endpoint, чтобы ключ дедупликации был стабильным.


## Code Node: нормализация, mapping и guard-условия

```javascript
const src = $json.body ?? $json;
const headers = $json.headers ?? {};
const topic = String(headers['x-wc-webhook-topic'] ?? src.topic ?? 'order.updated').trim();
const shop = String(src.shop_domain ?? headers.host ?? 'woocommerce').trim().toLowerCase();
const orderId = String(src.id ?? '').trim();
if (!orderId) throw new Error('No WooCommerce order id');
const email = String(src.billing?.email ?? '').trim().toLowerCase();
const phone = String(src.billing?.phone ?? '').trim();
const lines = Array.isArray(src.line_items) ? src.line_items.map(item => ({
  sku: String(item.sku ?? '').trim(),
  name: String(item.name ?? '').trim(),
  quantity: Number(item.quantity ?? 0),
  total: Number(item.total ?? 0)
})) : [];
return [{ json: {
  action: topic.includes('deleted') ? 'ignore' : 'sync_order',
  idempotency_key: `woocommerce:${shop}:${topic}:${orderId}`,
  external_order_id: `woocommerce:${shop}:${orderId}`,
  order_id: orderId,
  order_number: String(src.number ?? orderId),
  status: String(src.status ?? '').trim(),
  total: Number(src.total ?? 0),
  currency: String(src.currency ?? '').trim(),
  customer_email: email,
  customer_phone: phone,
  shipping_city: String(src.shipping?.city ?? '').trim(),
  line_items: lines,
  crm_comment: `WooCommerce order ${src.number ?? orderId}, status=${src.status ?? 'unknown'}`
}}];
```

Один заказ WooCommerce может обновляться десятки раз. Если topic/status не входит в правило обработки, изменение оплаты или адреса создаст новую запись вместо обновления существующей.


## Готовый workflow JSON: скачать и импортировать

Скачать готовый workflow JSON Скачать тестовый payload

```json
{
  "name": "Nodbot - WooCommerce orders to CRM with dedupe",
  "nodes": [
    {
      "name": "WooCommerce Webhook",
      "type": "n8n-nodes-base.webhook",
      "purpose": "Принять order event"
    },
    {
      "name": "Normalize WooCommerce order",
      "type": "n8n-nodes-base.code",
      "purpose": "Собрать order contract"
    },
    {
      "name": "Build idempotency key",
      "type": "n8n-nodes-base.code",
      "purpose": "Защититься от повторов"
    },
    {
      "name": "Find order in CRM",
      "type": "n8n-nodes-base.httpRequest",
      "purpose": "Найти external_order_id"
    },
    {
      "name": "Create or update order",
      "type": "n8n-nodes-base.httpRequest",
      "purpose": "Синхронизировать CRM/склад"
    },
    {
      "name": "Respond",
      "type": "n8n-nodes-base.respondToWebhook",
      "purpose": "Вернуть 2xx"
    }
  ],
  "connections": "WooCommerce Webhook → Normalize WooCommerce order → Build idempotency key → Find order in CRM → Create or update order → Respond"
}
```


## Пошаговая настройка связки

- Создайте WooCommerce webhook для нужных order events.

- Настройте секрет webhook и отдельный endpoint n8n для магазина.

- Импортируйте workflow JSON и замените CRM/склад endpoint, credentials и поля.

- Решите, какие статусы создают заказ, а какие только обновляют статус.

- Прогоните тесты на повторный webhook и order.updated.


## Тесты перед production

```bash
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/integration-woocommerce-n8n-order-sync" \
  -H "Content-Type: application/json" \
  --data @integration-woocommerce-n8n-order-sync-payload.json
```

- Повторный payload не создаёт дубль и возвращает тот же output key.

- Некорректный mapping останавливается до запроса к внешнему API.

- Пустые необязательные поля не ломают workflow.

- Ошибка API уходит в alert или DLQ с безопасным payload.

- Execution data не содержит секретов, токенов и лишних персональных данных.


## Production-риски

- Order update создаёт новую запись. CRM и склад получают дубли.

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

- Нет shop domain в ключе. Несколько магазинов конфликтуют по одинаковым order_id.

- Webhook secret не проверяется. Endpoint можно дергать извне.

- Статусы WooCommerce не сопоставлены с CRM. Processing, completed и cancelled попадают в один статус.


## Полезные ссылки и смежные материалы

- WooCommerce Webhooks

- WooCommerce REST API

- Working with webhooks in WooCommerce

- WordPress и n8n

- Webhook idempotency to Postgres

- Shopify и n8n


## Критерии готовности

- Order id и shop domain входят в ключ дедупликации.

- Line items передаются структурно: SKU, quantity, total.

- Статусы WooCommerce сопоставлены с CRM/складом.

- Повторный webhook не создаёт второй заказ.

- Ошибки downstream-систем уходят в alert или DLQ.

Nodbot настроит WooCommerce + n8n: webhooks, REST API, статусы заказа, line items, дедупликацию, retry, alert и безопасную передачу в CRM/ERP.
