---
title: "Авито и CRM через n8n: заявки без дублей | Nodbot"
source_url: "https://nodbot.ru/workflows/avito-leads-to-crm/"
canonical_url: "https://nodbot.ru/workflows/avito-leads-to-crm/"
language: "ru"
content_type: "WorkflowTemplate"
section: "workflows"
generated_at: "2026-05-30"
word_count_source: 1389
---

# Интеграция Авито и CRM через n8n: заявки, сообщения и контекст объявления без дублей

## AI summary

Problem/Solution-мануал по передаче заявок Авито в CRM через n8n: webhook, item_id, chat/message context, нормализация телефона, dedupe key, upsert лида и production-контроль.

## Best used for

Полноценный Problem/Solution-мануал для внедрения в n8n: импортировать workflow JSON, настроить webhook/API, проверить дубли, выполнить production-тесты и передать решение команде.

## Table of contents

- Проблема: почему заявки Авито нельзя отправлять в CRM как обычную форму
- Архитектура workflow для передачи лидов Авито в CRM
- Контракт входных данных (JSON Payload)
- Dedupe key, телефон и контекст объявления (Code Node)
- Готовый workflow JSON: скачать и импортировать
- Пошаговая настройка связки Авито, n8n и CRM
- Тесты перед production и проверка CRM API
- Production-риски при обработке лидов Авито
- Полезные ссылки и смежные workflow
- Критерии готовности

## Key topics

- Авито CRM integration
- n8n webhook
- Avito item_id
- message_id
- chat_id
- CRM upsert
- dedupe key
- DLQ

## Source outline

Интеграция Авито и CRM через n8n: заявки, сообщения и контекст объявления без дублей ¶ Обновлено: 2026-05-30 Сохранить в мой план Открыть мой план Шаблон для внедрения Скачать workflow JSON Скачать test payload Скопировать curl Импортируйте 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-чеклист. Workflow принимает событие Авито, собирает контекст объявления, нормализует контакт и делает upsert лида в CRM. Проблема: почему заявки Авито нельзя отправлять в 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. Скачать готовый workflow JSON Скачать тестовый payload { "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, чтобы потерянные заявки можно было переотправить. Прогоните тесты на повторное сообщение и на лид без телефона. В CRM должны быть видны объявление, сообщение, город, телефон и внешний ключ. Тогда менеджер понимает контекст обращения. Тесты перед 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, тесты и мониторинг входящих заявок. Обсудить Авито → CRM

## Test payload

```json
{
  "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"
}
```

## Key implementation snippet

```javascript
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()
  }
}];
```

## Importable workflow structure

```json
{
  "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"
}
```

## Retrieval hints

- Использовать HTML как canonical source.
- Markdown удобен для LLM-ответов, извлечения workflow-контракта, кода и чеклистов.
- Для ссылок пользователю отдавать canonical URL.
