Перейти к содержанию

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

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

Открыть мой план
Шаблон для внедрения

Импортируйте workflow в n8n и замените endpoint вашей CRM, правило dedupe и alert-канал.

Проблема: лиды Авито приходят не как аккуратная форма сайта. Один покупатель может написать по нескольким объявлениям, вернуться в тот же чат, прислать короткое сообщение без телефона или оставить номер в свободном тексте. Если просто отправлять каждое событие в CRM, отдел продаж получает дубли и теряет контекст объявления.

Решение: интеграция Авито и CRM через n8n должна сохранять item_id, chat_id, message_id, текст сообщения и нормализованный телефон. На их основе workflow собирает dedupe_key, делает upsert лида и передаёт в CRM не “заявку из Авито”, а понятный объект: кто написал, по какому объявлению, с каким вопросом и почему это не дубль.

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

Схема интеграции Авито и CRM в интерфейсе n8n
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_idmessage_idchat_id + item_idphone + 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

  1. Определите источник событий: прямой API, коннектор, парсер входящих сообщений или промежуточный webhook.
  2. Импортируйте workflow JSON в n8n и укажите production URL в источнике событий.
  3. Настройте маппинг CRM: название лида, телефон, сообщение, item_id, item_url, город и dedupe_key.
  4. Создайте в CRM отдельное поле “Внешний ключ Авито”, чтобы повторное событие можно было обновить, а не создать заново.
  5. Добавьте alert/DLQ для ошибок CRM API, чтобы потерянные заявки можно было переотправить.
  6. Прогоните тесты на повторное сообщение и на лид без телефона.
Карточка CRM с заявкой Авито, item_id и dedupe key
В 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:

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

  1. Повторный lead_id или message_id не создаёт новый лид.
  2. item_id, ссылка на объявление и текст сообщения попадают в CRM.
  3. Лид без телефона не теряется, если есть chat/message ID.
  4. CRM API ошибки уходят в retry/DLQ и видны владельцу процесса.
  5. В alert персональные данные замаскированы.
  6. Workflow содержит тестовый payload и описание правила дедупликации.

Нужно связать Авито с CRM?

Nodbot поможет собрать production-интеграцию: webhook, dedupe key, upsert в CRM, DLQ, тесты и мониторинг входящих заявок.

Обсудить Авито → CRM