---
title: "МойСклад и n8n: товары и заказы без дублей | Nodbot"
source_url: "https://nodbot.ru/integrations/moysklad/"
canonical_url: "https://nodbot.ru/integrations/moysklad/"
language: "ru"
content_type: "IntegrationGuide"
section: "integrations"
generated_at: "2026-05-30"
word_count_source: 1000
---

# Интеграция МойСклад и n8n: товары, остатки и заказы без дублей

## AI summary

Problem/Solution-гайд по МойСклад и n8n: как синхронизировать товары, остатки и заказы через JSON API без дублей, прыгающих остатков и ручных CSV.

## Best used for

Страница подходит для специалистов, которым нужна production-интеграция, а не общий обзор: конкретная боль, workflow JSON, payload, Code Node, тесты, риски и чек-лист готовности.

## Key topics

- Проблема и решение
- Архитектура workflow
- Контракт входных данных
- Нормализация и проверка данных
- Готовый workflow JSON
- Пошаговая настройка
- Тесты перед production
- Production-риски
- Критерии готовности

## Source outline

Проблема: МойСклад становится источником товаров, остатков и заказов, но простая синхронизация по расписанию быстро создаёт дубли контрагентов, скачущие остатки и конфликт между интернет-магазином, маркетплейсом и складом.

Решение: Решение — строить integration layer в n8n: нормализовать SKU и контрагентов, использовать внешний ключ заказа, проверять idempotency, обновлять только изменившиеся остатки и вести audit-log каждого write-действия в МойСклад.

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

```json
{
  "event_id": "ms-order-10492-updated",
  "event_type": "customerorder.updated",
  "source": "moysklad",
  "external_order_id": "shop-10492",
  "moysklad_href": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/uuid",
  "customer": {
    "name": "ООО Ромашка",
    "inn": "7700000000",
    "phone": "+7 916 123-45-67"
  },
  "items": [
    {
      "sku": "SKU-001",
      "qty": 2,
      "price": 1490
    },
    {
      "sku": "SKU-002",
      "qty": 1,
      "price": 3900
    }
  ],
  "warehouse": "main-msk",
  "payment_status": "paid",
  "updated_at": "2026-05-30T10:00:00+03:00"
}
```

### Code Node

```javascript
const src = $json.body ?? $json;
const orderId = String(src.external_order_id ?? src.id ?? '').trim();
if (!orderId) throw new Error('No external_order_id for MoySklad sync');
const items = Array.isArray(src.items) ? src.items : [];
if (!items.length) throw new Error(`Order ${orderId} has no items`);
const normalizedItems = items.map((item) => ({
  sku: String(item.sku ?? item.article ?? '').trim().toUpperCase(),
  quantity: Number(item.qty ?? item.quantity ?? 0),
  price: Number(item.price ?? 0)
}));
for (const item of normalizedItems) {
  if (!item.sku || item.quantity <= 0) throw new Error(`Invalid item in ${orderId}`);
}
return [{ json: {
  idempotency_key: `moysklad:customerorder:${orderId}`,
  external_order_id: orderId,
  customer_phone: String(src.customer?.phone ?? '').replace(/[^0-9+]/g, ''),
  customer_inn: String(src.customer?.inn ?? '').replace(/\D/g, ''),
  items: normalizedItems,
  warehouse: src.warehouse ?? 'main',
  operation: 'upsert_customer_order',
  audit: { event_id: src.event_id, received_at: new Date().toISOString() }
}}];
```

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

- Повторный external_order_id не создаёт второй заказ.
- Каждый SKU сопоставлен с кодом номенклатуры или отправлен в review.
- Остатки обновляются через diff и имеют safety stock.
- Ошибки API попадают в alert или DLQ с понятным сообщением.
- Есть владелец workflow, audit-log и инструкция replay.

## Related Nodbot pages

- [МойСклад stock alert](/workflows/moysklad-stock-alert/)
- [Wildberries и n8n](/integrations/wildberries/)
- [1C и n8n через HTTP](/integrations/onec-http/)
