Что такое n8n и зачем он нужен с RetailCRM
n8n — это open-source платформа для автоматизации workflow (рабочих процессов). Это аналог Zapier/Make.com, но с полным контролем и возможностью хостить на своем сервере.
Зачем нужен n8n, если в RetailCRM уже есть триггеры?
Триггеры RetailCRM — это мощный инструмент, но у них есть ограничения:
- ❌ Нет планировщика (scheduled tasks) — нельзя запускать действия по расписанию
- ❌ Нет сложной бизнес-логики с множественными условиями и циклами
- ❌ Ограниченная интеграция с внешними API (только HTTP-запросы)
- ❌ Нельзя агрегировать данные из нескольких источников
- ❌ Нет работы с AI/ML моделями для персонализации
- ❌ Сложно делать batch-обработку больших объемов данных
n8n решает эти задачи и открывает возможности продвинутой автоматизации.
## Архитектура связки n8n + RetailCRM
┌──────────────────┐
│ RetailCRM │
│ (События CRM) │
└────────┬─────────┘
│ Webhook
▼
┌──────────────────┐ ┌─────────────────┐
│ n8n │◄────►│ Внешние API │
│ (Оркестратор) │ │ (GPT, Telegram,│
└────────┬─────────┘ │ Analytics...) │
│ └─────────────────┘
│ API Call
▼
┌──────────────────┐
│ RetailCRM │
│ (Обновление) │
└──────────────────┘
## Сценарий #1: Умные серийные рассылки с персонализацией через AI
### Проблема
В RetailCRM можно отправить email через триггер, но нельзя:
- Создать серию писем (Day 1, Day 3, Day 7) автоматически
- Персонализировать контент на основе поведения клиента
- Использовать AI для генерации уникального текста для каждого клиента
Решение через n8n
Workflow:
1. Webhook от RetailCRM (новый клиент зарегистрировался)
↓
2. Получить историю заказов клиента через API RetailCRM
↓
3. Анализ данных: сегмент, интересы, средний чек
↓
4. Генерация персонального текста через OpenAI GPT-4
↓
5. Создание серии задач в n8n (отложенная отправка на Day 1, 3, 7)
↓
6. Отправка email через SendGrid/UniSender с уникальным контентом
↓
7. Логирование результатов обратно в RetailCRM
#### Пример n8n workflow (JSON фрагмент)
{
"nodes": [
{
"name": "Webhook RetailCRM",
"type": "n8n-nodes-base.webhook",
"parameters": {
"path": "retailcrm-new-customer",
"httpMethod": "POST"
}
},
{
"name": "Get Customer Data",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "=https://yourstore.retailcrm.ru/api/v5/customers/{{$json.customer.id}}",
"authentication": "genericCredentialType",
"method": "GET",
"headers": {
"X-API-KEY": "{{$credentials.retailcrm.apiKey}}"
}
}
},
{
"name": "Generate Personalized Content",
"type": "n8n-nodes-base.openAi",
"parameters": {
"resource": "text",
"operation": "complete",
"model": "gpt-4",
"prompt": "=Напиши персональное приветственное письмо для клиента интернет-магазина {{$json.customer.firstName}}. Его интересы: {{$json.tags.join(', ')}}. Средний чек: {{$json.avgCheck}}₽. Тон: дружелюбный, стиль: современный."
}
},
{
"name": "Schedule Email Day 1",
"type": "n8n-nodes-base.schedule",
"parameters": {
"rule": {
"interval": [{"field": "days", "value": 1}]
}
}
},
{
"name": "Send Email",
"type": "n8n-nodes-base.sendGrid",
"parameters": {
"to": "={{$json.customer.email}}",
"subject": "Добро пожаловать в наш магазин!",
"text": "={{$node['Generate Personalized Content'].json.choices[0].text}}"
}
}
]
}
#### Результат
✅ Open Rate вырос с 18% до 34% благодаря персонализации ✅ Click Rate увеличился на 67% ✅ Конверсия серии писем: 12% (было 4%)
## Сценарий #2: Автоматический ежедневный отчет руководителю
### Проблема
RetailCRM не умеет автоматически отправлять отчеты по расписанию. Триггеры срабатывают только на события.
### Решение через n8n
Задача: Каждое утро в 9:00 отправлять директору отчет о продажах за вчера + план на сегодня.
#### Workflow
1. Schedule Trigger (каждый день в 9:00)
↓
2. Получить заказы за вчера (API RetailCRM)
↓
3. Получить незавершенные задачи на сегодня
↓
4. Агрегация: сумма продаж, количество заказов, средний чек
↓
5. Сравнение с планом (данные из Google Sheets)
↓
6. Генерация красивого HTML-отчета
↓
7. Отправка в Telegram + Email директору
↓
8. Если план не выполнен — создать задачу в RetailCRM "Разобраться с низкими продажами"
#### Пример кода для агрегации данных
// Code Node в n8n (JavaScript)
const orders = $input.all();
const stats = {
totalRevenue: 0,
orderCount: orders.length,
avgCheck: 0,
topProducts: {},
topManagers: {}
};
orders.forEach(order => {
stats.totalRevenue += order.json.totalSumm;
// Топ товары
order.json.items.forEach(item => {
if (!stats.topProducts[item.offer.name]) {
stats.topProducts[item.offer.name] = 0;
}
stats.topProducts[item.offer.name] += item.quantity;
});
// Топ менеджеры
const manager = order.json.manager?.name || 'Не назначен';
if (!stats.topManagers[manager]) {
stats.topManagers[manager] = { count: 0, revenue: 0 };
}
stats.topManagers[manager].count++;
stats.topManagers[manager].revenue += order.json.totalSumm;
});
stats.avgCheck = stats.totalRevenue / stats.orderCount;
// Сортировка топов
stats.topProducts = Object.entries(stats.topProducts)
.sort((a, b) => b[1] - a[1])
.slice(0, 5);
stats.topManagers = Object.entries(stats.topManagers)
.sort((a, b) => b[1].revenue - a[1].revenue)
.slice(0, 3);
return [{ json: stats }];
#### Пример Telegram-сообщения
📊 Отчет за {{yesterday}}
💰 Выручка: {{totalRevenue}} ₽ (план: 500 000₽)
📦 Заказов: {{orderCount}} шт
🧮 Средний чек: {{avgCheck}} ₽
🔥 Топ товары:
1. {{topProducts[0].name}} — {{topProducts[0].qty}} шт
2. {{topProducts[1].name}} — {{topProducts[1].qty}} шт
3. {{topProducts[2].name}} — {{topProducts[2].qty}} шт
⭐ Лучшие менеджеры:
1. {{topManagers[0].name}} — {{topManagers[0].revenue}}₽
2. {{topManagers[1].name}} — {{topManagers[1].revenue}}₽
📋 Задачи на сегодня: {{todayTasks}} шт
{{planStatus === 'failed' ? '⚠️ План не выполнен! Требуется разбор.' : '✅ План выполнен!'}}
## Сценарий #3: Умная очистка дублей клиентов
### Проблема
В RetailCRM накапливаются дубли клиентов (один клиент оформлял заказы с разных номеров или email). Ручная очистка отнимает часы работы.
### Решение через n8n
Workflow: Еженедельная проверка и автоматическое объединение дублей
1. Schedule (каждое воскресенье в 3:00 ночи)
↓
2. Получить всех клиентов из RetailCRM (пагинация по 100 шт)
↓
3. Анализ схожести:
- Levenshtein distance для имен (с учетом опечаток)
- Совпадение телефонов/email
- Схожие адреса доставки
↓
4. Группировка потенциальных дублей
↓
5. Для каждой группы:
- Определить "главного" клиента (с максимумом данных)
- Перенести заказы от дублей к главному
- Объединить теги и кастомные поля
- Удалить дубли через API
↓
6. Отчет в Telegram: "Очищено X дублей, объединено Y заказов"
#### Алгоритм поиска дублей (Code Node)
// Поиск дублей по схожести
function findDuplicates(customers) {
const duplicateGroups = [];
const processed = new Set();
customers.forEach((customer, index) => {
if (processed.has(customer.id)) return;
const group = [customer];
for (let i = index + 1; i 85% — считаем дублем
if (score > 0.85) {
group.push(other);
processed.add(other.id);
}
}
if (group.length > 1) {
duplicateGroups.push(group);
}
processed.add(customer.id);
});
return duplicateGroups;
}
function calculateSimilarity(c1, c2) {
let score = 0;
let checks = 0;
// Телефон (вес 40%)
if (c1.phones && c2.phones) {
const phones1 = c1.phones.map(p => p.number.replace(/\D/g, ''));
const phones2 = c2.phones.map(p => p.number.replace(/\D/g, ''));
if (phones1.some(p => phones2.includes(p))) {
score += 0.4;
}
checks++;
}
// Email (вес 30%)
if (c1.email && c2.email && c1.email.toLowerCase() === c2.email.toLowerCase()) {
score += 0.3;
checks++;
}
// Имя (вес 20%, с учетом опечаток)
if (c1.firstName && c2.firstName) {
const nameSimilarity = 1 - (levenshteinDistance(
c1.firstName.toLowerCase(),
c2.firstName.toLowerCase()
) / Math.max(c1.firstName.length, c2.firstName.length));
score += nameSimilarity * 0.2;
checks++;
}
// Адрес (вес 10%)
if (c1.address && c2.address) {
const addrSimilarity = 1 - (levenshteinDistance(
c1.address.text?.toLowerCase() || '',
c2.address.text?.toLowerCase() || ''
) / Math.max(c1.address.text?.length || 0, c2.address.text?.length || 0));
score += addrSimilarity * 0.1;
checks++;
}
return checks > 0 ? score : 0;
}
// Levenshtein distance для сравнения строк
function levenshteinDistance(str1, str2) {
const matrix = [];
for (let i = 0; i item.json);
const duplicates = findDuplicates(customers);
return duplicates.map(group => ({ json: { group } }));
#### Результат
✅ Очистка 200-300 дублей в неделю автоматически ✅ Экономия 3-4 часов работы менеджера ✅ Точность определения: 94%
## Сценарий #4: Интеграция с системами без API (парсинг + автозаполнение)
### Проблема
У вас есть старая учетная система поставщика без API. Нужно ежедневно проверять остатки товаров, но это возможно только через их веб-интерфейс.
### Решение через n8n
Используем headless browser для автоматизации:
1. Schedule (каждый день в 6:00)
↓
2. Puppeteer Node: открыть сайт поставщика
↓
3. Автоматическая авторизация (логин/пароль)
↓
4. Переход в раздел "Остатки товаров"
↓
5. Парсинг HTML таблицы с остатками
↓
6. Сопоставление артикулов поставщика с вашими товарами (mapping)
↓
7. Обновление остатков в RetailCRM через API
↓
8. Если товар закончился — создать задачу менеджеру по закупкам
#### Пример Puppeteer-скрипта
// Execute Command Node (Puppeteer)
const puppeteer = require('puppeteer');
async function scrapeSupplierStocks() {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
// Авторизация
await page.goto('https://supplier.example.com/login');
await page.type('#username', 'your-login');
await page.type('#password', 'your-password');
await page.click('#login-button');
await page.waitForNavigation();
// Переход к остаткам
await page.goto('https://supplier.example.com/stocks');
await page.waitForSelector('#stocks-table');
// Парсинг таблицы
const stocks = await page.evaluate(() => {
const rows = Array.from(document.querySelectorAll('#stocks-table tbody tr'));
return rows.map(row => {
const cells = row.querySelectorAll('td');
return {
article: cells[0]?.textContent.trim(),
name: cells[1]?.textContent.trim(),
quantity: parseInt(cells[2]?.textContent.trim()) || 0,
price: parseFloat(cells[3]?.textContent.replace(/[^0-9.]/g, '')) || 0
};
});
});
await browser.close();
return stocks;
}
const stocks = await scrapeSupplierStocks();
return stocks.map(item => ({ json: item }));
## Сценарий #5: Резервное копирование и аналитика
### Проблема
Нужно хранить исторические данные по клиентам и заказам для глубокой аналитики, но не хочется перегружать RetailCRM большими выборками.
### Решение через n8n
Ежедневный экспорт данных в аналитическое хранилище:
1. Schedule (каждую ночь в 2:00)
↓
2. Получить все заказы за вчера (RetailCRM API)
↓
3. Обогащение данных:
- Добавить UTM-метки из внешней системы аналитики
- Рассчитать LTV клиента
- Определить RFM-сегмент
↓
4. Запись в Google BigQuery / PostgreSQL
↓
5. Обновление дашборда в Google Data Studio / Metabase
↓
6. Если аномалия (резкое падение заказов) — уведомление в Telegram
#### Пример записи в PostgreSQL
// Postgres Node в n8n
INSERT INTO analytics.orders (
order_id,
customer_id,
order_date,
total_amount,
items_count,
utm_source,
utm_medium,
utm_campaign,
customer_ltv,
rfm_segment
) VALUES (
'{{$json.id}}',
'{{$json.customer.id}}',
'{{$json.createdAt}}',
{{$json.totalSumm}},
{{$json.items.length}},
'{{$json.customFields.utm_source}}',
'{{$json.customFields.utm_medium}}',
'{{$json.customFields.utm_campaign}}',
{{$node['Calculate LTV'].json.ltv}},
'{{$node['RFM Segmentation'].json.segment}}'
) ON CONFLICT (order_id) DO UPDATE SET
total_amount = EXCLUDED.total_amount,
rfm_segment = EXCLUDED.rfm_segment;
## Сценарий #6: Кросс-платформенные уведомления с эскалацией
### Проблема
Важные заказы (VIP-клиенты, крупные суммы) требуют немедленной реакции менеджера. Одного email недостаточно — нужна эскалация по каналам.
### Решение через n8n
Умная система уведомлений с эскалацией:
1. Webhook от RetailCRM (новый VIP-заказ > 50 000₽)
↓
2. Отправка уведомления в Telegram менеджеру
↓
3. Wait 10 минут
↓
4. Проверка: изменился ли статус заказа?
↓
5. Если НЕТ:
- Звонок менеджеру через API телефонии (Zadarma/Mango)
- Дублирование уведомления руководителю
- Создание задачи с высоким приоритетом
↓
6. Wait еще 20 минут
↓
7. Если ВСЕ ЕЩЕ НЕТ реакции:
- Push-уведомление директору
- SMS резервному менеджеру
- Автоматическое назначение заказа другому менеджеру
#### Пример workflow с условиями
{
"nodes": [
{
"name": "VIP Order Webhook",
"type": "n8n-nodes-base.webhook"
},
{
"name": "Send Telegram to Manager",
"type": "n8n-nodes-base.telegram"
},
{
"name": "Wait 10 min",
"type": "n8n-nodes-base.wait",
"parameters": {
"amount": 10,
"unit": "minutes"
}
},
{
"name": "Check Order Status",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "=https://yourstore.retailcrm.ru/api/v5/orders/{{$json.order.id}}"
}
},
{
"name": "IF Status Changed",
"type": "n8n-nodes-base.if",
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$json.order.status.code}}",
"value2": "new"
}
]
}
}
},
{
"name": "Call Manager",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"url": "https://api.zadarma.com/v1/request/callback/",
"method": "POST",
"body": {
"from": "{{$json.manager.phone}}",
"to": "internal-number",
"sip": "your-sip"
}
}
}
]
}
## Установка и настройка n8n для работы с RetailCRM
### Вариант 1: Docker (рекомендуется)
# docker-compose.yml
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=your-secure-password
- N8N_HOST=n8n.yourdomain.com
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.yourdomain.com/
- GENERIC_TIMEZONE=Europe/Moscow
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
Запуск:
docker-compose up -d
### Вариант 2: npm (для разработки)
npm install -g n8n
n8n start
### Настройка RetailCRM Credentials в n8n
- Зайти в n8n Settings Credentials
- Add Credential HTTP Header Auth
- Заполнить:
Name: RetailCRM API
Header Name: X-API-KEY
Header Value: ваш-api-ключ-из-retailcrm
- Save
Создание первого workflow
Простой пример: логирование новых заказов в Google Sheets
- Создать новый Workflow
- Добавить Webhook Trigger
- Добавить HTTP Request для получения деталей заказа
- Добавить Google Sheets Node для записи данных
- Активировать workflow
- В RetailCRM создать webhook на событие
order.createс URL из n8n
Стоимость внедрения и поддержки
### Затраты
Компонент Стоимость
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
n8n (self-hosted) Бесплатно (Open Source)
Сервер (VPS 2GB RAM) 500 - 1000₽/мес
Домен + SSL Бесплатно (Let's Encrypt)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Настройка (услуга) 20 000 - 50 000₽
Разработка кастомных workflow 5 000₽ за workflow
Обучение команды 10 000₽
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ИТОГО (старт) 30 000 - 60 000₽
Ежемесячно 500 - 1000₽
Альтернатива: n8n Cloud (платный хостинг) — от $20/мес
## Реальные кейсы и результаты
### Кейс 1: Магазин электроники
Задача: Автоматизация работы с гарантийными заявками
Решение через n8n:
- Webhook при создании заказа с кастомным полем "Гарантийный ремонт"
- Автоматическое создание тикета в Jira для сервисного центра
- Отправка клиенту трек-номера для отслеживания ремонта
- Еженедельные уведомления клиенту о статусе ремонта
- При завершении ремонта — автоматическая печать накладной и уведомление курьеру
Результат: Сокращение времени обработки гарантийных заявок с 3 дней до 4 часов. NPS вырос на 28%.
### Кейс 2: Оптовая торговля стройматериалами
Задача: Динамическое ценообразование на основе остатков
Решение через n8n:
- Каждый час анализ остатков товаров
- Если остаток 200% — цена -10% (распродажа излишков)
- Автоматическое обновление цен в RetailCRM и на сайте
- Уведомление менеджерам о критических остатках
Результат: Рост маржи на 8%, сокращение неликвида на 34%.
## Когда НЕ нужен n8n
n8n — это мощный инструмент, но он избыточен, если:
- Все ваши задачи решаются встроенными триггерами RetailCRM
- Нет необходимости в интеграции с экзотическими сервисами
- В команде нет технически подкованного человека (хотя бы базовый JS)
- Бюджет на автоматизацию меньше 50 000₽
Вывод
n8n + RetailCRM — это pro-level автоматизация для бизнеса, который:
- Хочет выжать максимум из данных CRM
- Интегрируется с 5+ внешними сервисами
- Нуждается в сложной бизнес-логике (не покрываемой триггерами)
- Готов вкладываться в технологии для конкурентного преимущества
С n8n вы можете автоматизировать процессы, которые раньше казались невозможными. Это инвестиция в масштабируемость и эффективность.
## Нужна помощь с внедрением n8n?
Команда Sideback поможет настроить автоматизацию на n8n + RetailCRM:
- ✅ Аудит процессов и подбор сценариев для автоматизации
- ✅ Установка и настройка n8n на вашем сервере
- ✅ Разработка кастомных workflow под ваши задачи
- ✅ Интеграция с внешними сервисами (AI, аналитика, телефония)
- ✅ Обучение команды работе с n8n
- ✅ Техническая поддержка и доработка workflow
Стоимость: от 30 000₽ | Срок: 1-2 недели