Интеграция Авито и CRM через n8n: заявки, сообщения и контекст объявления без дублей ¶
Обновлено: 2026-05-30
Импортируйте workflow в n8n и замените endpoint вашей CRM, правило dedupe и alert-канал.
- Проблема: почему заявки Авито нельзя отправлять в CRM как обычную форму
- Архитектура workflow для передачи лидов Авито в CRM
- Контракт входных данных (JSON Payload)
- Dedupe key, телефон и контекст объявления (Code Node)
- Готовый workflow JSON: скачать и импортировать
- Пошаговая настройка связки Авито, n8n и CRM
- Тесты перед production и проверка CRM API
- Production-риски при обработке лидов Авито
- Полезные ссылки и смежные workflow
- Критерии готовности
Проблема: лиды Авито приходят не как аккуратная форма сайта. Один покупатель может написать по нескольким объявлениям, вернуться в тот же чат, прислать короткое сообщение без телефона или оставить номер в свободном тексте. Если просто отправлять каждое событие в CRM, отдел продаж получает дубли и теряет контекст объявления.
Решение: интеграция Авито и CRM через n8n должна сохранять item_id, chat_id, message_id, текст сообщения и нормализованный телефон. На их основе workflow собирает dedupe_key, делает upsert лида и передаёт в CRM не “заявку из Авито”, а понятный объект: кто написал, по какому объявлению, с каким вопросом и почему это не дубль.
Это практический скрипт n8n для автоматизации обработки входящих сообщений: готовый workflow JSON, тестовый payload, Code Node, таблица архитектуры, тесты и production-чеклист.
Проблема: почему заявки Авито нельзя отправлять в CRM как обычную форму ¶
Обычная форма сайта имеет предсказуемые поля: имя, телефон, email, комментарий. Авито-лид часто состоит из сообщения, объявления, чата и частично заполненного контакта. Для менеджера важен не только телефон, но и само объявление: цена, город, категория, ссылка и история диалога.
Без контекста CRM-карточка становится бесполезной: менеджер видит “Максим, нужен расчет”, но не понимает, по какой услуге или товару человек написал. Поэтому в этом workflow контекст объявления — обязательная часть лида, а не второстепенный комментарий.
Архитектура workflow для передачи лидов Авито в CRM ¶
| Нода | Роль | Что проверить |
|---|---|---|
| Webhook input | Принимает событие Авито или коннектора | Источник события, подпись/секрет, формат JSON |
| Normalize Avito context | Собирает dedupe_key, телефон и контекст | lead_id, chat_id, message_id, item_id |
| CRM upsert lead | Создаёт или обновляет лид | Endpoint CRM, поле внешнего ключа, обработка дублей |
| Failed response alert | Отправляет ошибку в alert/DLQ | Не логировать полный телефон и сообщение без маскирования |
| Respond | Возвращает 200 OK источнику | Короткий ответ без внутренних деталей |
Если ваша CRM — amoCRM или Битрикс24, upsert можно заменить на соответствующий API-вызов. Если CRM самописная, оставьте единый endpoint /leads/upsert и договоритесь о внешнем ключе dedupe_key.
Контракт входных данных (JSON Payload) ¶
Payload ниже показывает минимальный контракт. В реальном проекте добавьте цену, категорию, менеджера по направлению и ссылку на вложения, если они приходят из вашего источника.
{
"lead_id": "avito-981221",
"chat_id": "chat-493002",
"message_id": "msg-883120",
"item_id": "ad-44219",
"item_url": "https://www.avito.ru/example/ad-44219",
"item_title": "Настройка n8n под ключ",
"name": "Максим",
"phone": "8 926 555-12-12",
"message": "Добрый день, сколько стоит интеграция с CRM?",
"city": "Москва",
"received_at": "2026-05-30T10:15:00Z"
}
Нельзя строить дедупликацию только по телефону: номер может появиться позже, а диалог уже нужно закрепить за объявлением. Поэтому workflow использует приоритет: lead_id → message_id → chat_id + item_id → phone + item_id.
Dedupe key, телефон и контекст объявления (Code Node) ¶
Code Node ниже собирает стабильный ключ и готовит карточку для CRM. Он не падает, если телефона нет, но требует хотя бы один идентификатор события или нормализованный номер.
const src = $json.body ?? $json;
const phoneRaw = String(src.phone ?? src.contact_phone ?? '').trim();
let digits = phoneRaw.replace(/\D/g, '');
if (digits.length === 11 && digits.startsWith('8')) {
digits = `7${digits.slice(1)}`;
}
if (digits.length === 10) {
digits = `7${digits}`;
}
const phone = /^7\d{10}$/.test(digits) ? `+${digits}` : '';
const leadId = String(src.lead_id ?? '').trim();
const chatId = String(src.chat_id ?? '').trim();
const messageId = String(src.message_id ?? '').trim();
const itemId = String(src.item_id ?? src.ad_id ?? '').trim();
if (!leadId && !chatId && !messageId && !phone) {
throw new Error('Need Avito lead/chat/message id or normalized phone');
}
const dedupeKey = leadId
? `avito:lead:${leadId}`
: messageId
? `avito:message:${messageId}`
: chatId && itemId
? `avito:chat:${chatId}:item:${itemId}`
: `avito:phone:${digits}:item:${itemId || 'unknown'}`;
return [{
json: {
dedupe_key: dedupeKey,
source: 'avito',
phone_normalized: phone,
customer_name: String(src.name ?? src.user_name ?? 'Авито лид').trim(),
message: String(src.message ?? src.text ?? '').trim(),
item_id: itemId,
item_title: String(src.item_title ?? src.title ?? '').trim(),
item_url: src.item_url ?? '',
city: src.city ?? '',
crm_title: `Авито: ${src.item_title ?? itemId || 'новая заявка'}`,
received_at: src.received_at ?? new Date().toISOString()
}
}];
Такой подход удобно отлаживать: по dedupe_key можно найти execution в n8n, запись в CRM и строку в логах. Это особенно важно, когда менеджер говорит: “заявка пропала” или “клиент создался два раза”.
Готовый workflow JSON: скачать и импортировать ¶
Полный workflow JSON доступен в архиве сайта. После импорта замените CRM endpoint, credential, map полей и канал для failed response alert.
{
"name": "Nodbot - Avito leads to CRM with context and dedupe",
"nodes": [
{ "name": "Webhook input", "type": "n8n-nodes-base.webhook", "purpose": "Принять событие от Авито, коннектора или промежуточного сервиса" },
{ "name": "Normalize Avito lead context", "type": "n8n-nodes-base.code", "purpose": "Собрать dedupe_key, телефон, item_id, chat_id и текст сообщения" },
{ "name": "CRM upsert lead", "type": "n8n-nodes-base.httpRequest", "purpose": "Создать или обновить лид в вашей CRM" },
{ "name": "Send alert on failed CRM response", "type": "n8n-nodes-base.httpRequest", "purpose": "Отправить ошибку в alert/DLQ" },
{ "name": "Respond to Webhook", "type": "n8n-nodes-base.respondToWebhook", "purpose": "Вернуть безопасный ответ источнику" }
],
"connections": "Webhook → Normalize context → CRM upsert → optional alert → Respond"
}
Если вы получаете Авито-события через промежуточный сервис, не теряйте исходные ID. Даже если CRM не умеет хранить их в отдельных полях, сохраните их хотя бы в custom fields или техническом комментарии.
Пошаговая настройка связки Авито, n8n и CRM ¶
- Определите источник событий: прямой API, коннектор, парсер входящих сообщений или промежуточный webhook.
- Импортируйте workflow JSON в n8n и укажите production URL в источнике событий.
- Настройте маппинг CRM: название лида, телефон, сообщение, item_id, item_url, город и dedupe_key.
- Создайте в CRM отдельное поле “Внешний ключ Авито”, чтобы повторное событие можно было обновить, а не создать заново.
- Добавьте alert/DLQ для ошибок CRM API, чтобы потерянные заявки можно было переотправить.
- Прогоните тесты на повторное сообщение и на лид без телефона.
Тесты перед production и проверка CRM API ¶
Тестируйте не “заявка появилась”, а весь цикл: первый вход, повтор того же сообщения, новое сообщение в том же чате, другое объявление того же клиента и отсутствие телефона. Эти сценарии должны давать разные, но объяснимые результаты.
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/avito-leads-to-crm" \
-H "Content-Type: application/json" \
--data @avito-leads-to-crm-payload.json
Отдельно проверьте, что CRM возвращает понятные ошибки на дубликат внешнего ключа, временную недоступность и неверный токен. В production такие события должны попадать в retry или DLQ, а не исчезать в истории executions.
Production-риски при обработке лидов Авито ¶
- Дедупликация только по телефону. Потеряете события без номера и объедините разные объявления одного человека.
- Нет item_id в CRM. Менеджер не понимает, по какому объявлению пришёл клиент.
- Alert содержит полный текст сообщения и телефон. Это риск персональных данных и внутренней утечки.
- Повтор webhook считается ошибкой. Для интеграций повтор — нормальное явление; обработчик должен быть идемпотентным.
- CRM API временно недоступна. Без DLQ заявка потеряется, хотя клиент уже написал.
- Нет владельца направления. При изменении структуры объявлений никто не обновит маппинг.
Полезные ссылки и смежные workflow ¶
Для реализации держите рядом документацию вашего источника Авито-событий, документацию CRM API и внутренний список обязательных полей лида.
Смотрите также внутри Nodbot:
- Установка n8n — подготовка окружения.
- n8n в Docker Compose — production self-hosted запуск.
- Tilda → amoCRM — пример CRM-дедупликации по телефону.
- Tilda → Битрикс24 — пример передачи UTM в CRM.
- Retry и DLQ для HTTP Request — что делать при сбоях CRM API.
Критерии готовности ¶
- Повторный
lead_idилиmessage_idне создаёт новый лид. item_id, ссылка на объявление и текст сообщения попадают в CRM.- Лид без телефона не теряется, если есть chat/message ID.
- CRM API ошибки уходят в retry/DLQ и видны владельцу процесса.
- В alert персональные данные замаскированы.
- Workflow содержит тестовый payload и описание правила дедупликации.
Нужно связать Авито с CRM?
Nodbot поможет собрать production-интеграцию: webhook, dedupe key, upsert в CRM, DLQ, тесты и мониторинг входящих заявок.