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

Интеграция Tilda и amoCRM через n8n: защита от дублей и передача UTM

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

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

Импортируйте JSON в n8n, замените amoCRM base URL, OAuth credential, pipeline/status и ID custom fields для UTM.

Проблема: стандартная передача данных из формы Tilda в amoCRM через webhook часто создаёт дубли: пользователь отправил заявку дважды, менеджер попросил заполнить форму повторно, рекламная метка изменилась, а CRM получила ещё одну сделку.

Решение: надежная интеграция Тильды и amoCRM через n8n должна не просто делать Create lead, а принимать webhook формы, нормализовать телефон и email, искать существующий контакт или сделку через API amoCRM, сохранять UTM в отдельные поля и только после этого создавать или обновлять contact+lead.

Этот мануал — практический скрипт n8n для автоматизации продаж: готовый JSON workflow можно скачать, импортировать в n8n и адаптировать под свой pipeline, ответственного менеджера и поля amoCRM.

Схема интеграции Tilda и amoCRM в интерфейсе n8n
Workflow принимает webhook Tilda, нормализует контактные данные, ищет дубль в amoCRM и создаёт или обновляет lead без повторных сделок.

Проблема: почему стандартная отправка webhook из Тильды создает дубли

Настройка вебхука в Tilda выглядит простой: указали URL, получили POST, отправили его дальше. Но в реальном отделе продаж это ломается на повторных заявках, разных форматах телефона и неполных UTM. Если workflow каждый раз создаёт новую сделку, менеджеры видят несколько карточек одного клиента, реклама теряет атрибуцию, а CRM-отчёты начинают считать один интерес как несколько лидов.

Для лендингов на российском рынке телефон часто важнее email: клиент может оставить пустую почту, рабочую почту или адрес с ошибкой, но номер нужен для звонка, WhatsApp, Telegram и дальнейшей квалификации. Поэтому в этом решении lookup строится вокруг нормализованного телефона, а email используется как дополнительный сигнал.

Формально это интеграция Tilda и amoCRM, но по сути — контроль качества входящего потока лидов. n8n здесь работает как слой бизнес-логики между формой и CRM: валидирует payload, решает, что считать дублем, и не отдаёт сырые данные напрямую в amoCRM.

Архитектура workflow для интеграции

В ручной схеме мы не полагаемся на один универсальный upsert. Сначала workflow явно нормализует данные, затем делает поиск дубля, затем выбирает действие. Такой подход легче диагностировать: в executions видно, на каком шаге сломалась интеграция амо срм с формой Tilda.

НодаРольЧто проверить перед production
Webhook inputПринимает POST от TildaProduction URL, метод POST, секрет в query/header, формат JSON
Normalize Tilda payloadОчищает телефон, email, UTM и form_id+7 вместо 8, lowercase email, пустые обязательные поля
Find amoCRM duplicateИщет contact или lead по телефону/emailBase URL amoCRM, OAuth, rate limits, открытая сделка в нужной воронке
Create or update contact+leadСоздаёт новую связку или обновляет найденнуюpipeline_id, status_id, responsible_user_id, custom fields UTM
Respond to WebhookВозвращает ответ TildaКороткий ответ без токенов, телефонов и служебных ошибок

Если в amoCRM уже есть исторические дубли, заранее определите правило победителя: обновлять последнюю открытую сделку в нужной воронке, создавать новую сделку при закрытом статусе или отправлять конфликт в ручную проверку.

Контракт входных данных (JSON Payload)

Контракт payload фиксирует, какие поля Tilda обязана передать в n8n. Не называйте UTM произвольно: если сегодня поле называется utmCampaign, а завтра utm_campaign, скрипт n8n начнёт терять источник заявки.

{
  "name": "Анна",
  "phone": "+7 (916) 123-45-67",
  "email": "anna@example.ru",
  "comment": "Хочу обсудить внедрение n8n",
  "utm_source": "yandex",
  "utm_medium": "cpc",
  "utm_campaign": "n8n_integrator_msk",
  "utm_content": "lead_button_header",
  "utm_term": "интеграция тильды и амо срм",
  "formid": "landing-main",
  "page": "https://example.ru/n8n"
}

Минимально обязательным полем в этом сценарии является телефон. Если телефон пустой или не проходит регулярку, workflow должен остановиться до обращения к amoCRM, а не создавать “мусорную” сделку без ключа дедупликации.

Нормализация телефона и UTM-меток (Code Node)

Этот Code Node превращает разные варианты ввода из формы в стабильный объект для поиска дубля и записи в amoCRM. В нём есть нормализация телефона, lowercase email, сбор UTM-меток и dedupe_key для логов и повторных проверок.

const src = $json.body ?? $json;
const rawPhone = String(src.phone ?? src.Phone ?? '').trim();
let digits = rawPhone.replace(/\D/g, '');

if (digits.length === 11 && digits.startsWith('8')) {
  digits = `7${digits.slice(1)}`;
}

if (digits.length === 10) {
  digits = `7${digits}`;
}

if (!/^7\d{10}$/.test(digits)) {
  throw new Error(`Invalid phone for amoCRM lead: ${rawPhone}`);
}

const email = String(src.email ?? src.Email ?? '').trim().toLowerCase();
const formId = String(src.formid ?? src.form_id ?? '').trim();

return [{
  json: {
    name: String(src.name ?? src.Name ?? 'Новый лид из Tilda').trim(),
    phone_raw: rawPhone,
    phone_normalized: `+${digits}`,
    email,
    comment: String(src.comment ?? src.message ?? '').trim(),
    utm_source: src.utm_source ?? '',
    utm_medium: src.utm_medium ?? '',
    utm_campaign: src.utm_campaign ?? '',
    utm_content: src.utm_content ?? '',
    utm_term: src.utm_term ?? '',
    tilda_form_id: formId,
    page: src.page ?? src.referer ?? '',
    dedupe_key: `tilda:${digits}:${email || formId || 'no-email'}`,
    received_at: new Date().toISOString()
  }
}];

Для другой страны лучше заменить правило телефона целиком, а не накапливать исключения внутри workflow. Для России регулярка ^7\d{10}$ делает ключ поиска предсказуемым: 8 916 123-45-67 и +7 (916) 123-45-67 попадут в одну карточку.

Готовый workflow JSON: скачать и импортировать

Полный JSON лежит в архиве и доступен по кнопке «Скачать workflow JSON» в начале статьи. Импорт: n8n → Workflows → Import from File → выбрать файл → заменить credentials и параметры amoCRM.

{
  "name": "Nodbot - Tilda to amoCRM lead with UTM",
  "nodes": [
    {
      "name": "Webhook input",
      "type": "n8n-nodes-base.webhook",
      "purpose": "Принять POST формы Tilda и вернуть Tilda короткий 200 OK"
    },
    {
      "name": "Normalize Tilda payload",
      "type": "n8n-nodes-base.code",
      "purpose": "Очистить телефон, email, UTM и собрать dedupe_key"
    },
    {
      "name": "Find contact or lead in amoCRM",
      "type": "n8n-nodes-base.httpRequest",
      "purpose": "Найти дубль через API amoCRM по телефону или email"
    },
    {
      "name": "Create or update contact+lead",
      "type": "n8n-nodes-base.httpRequest",
      "purpose": "Создать или обновить contact+lead, custom fields UTM и статус воронки"
    },
    {
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "purpose": "Вернуть безопасный ответ без токенов и персональных данных"
    }
  ],
  "connections": "Webhook input → Normalize Tilda payload → Find contact or lead in amoCRM → Create or update contact+lead → Respond to Webhook"
}

Если ваша версия n8n и node для amoCRM поддерживают встроенный upsert, его можно использовать для простого справочника контактов. В этой инструкции ручная схема оставлена намеренно: она лучше подходит для сделок, UTM, выбора воронки, конфликтов дублей и отдельной обработки ошибок API.

Пошаговая настройка связки Tilda, n8n и amoCRM

  1. В Tilda откройте настройки формы и включите отправку в Webhook. Официальная справка Tilda описывает, что данные формы отправляются на ваш URL методом POST.
  2. Вставьте production URL n8n webhook и добавьте секрет в query-параметр или заголовок, чтобы случайный бот не создавал сделки.
  3. В n8n импортируйте workflow JSON, замените amoCRM OAuth credential, subdomain и base URL.
  4. В amoCRM заранее создайте custom fields для utm_source, utm_medium, utm_campaign, form_id и страницы лендинга.
  5. Укажите pipeline_id, status_id и responsible_user_id явно, чтобы заявка попала в рабочую воронку, а не в дефолтный статус.
  6. Отправьте один и тот же test payload дважды: первый запуск должен создать карточку, второй — обновить найденную сущность или остановиться по вашему правилу дедупликации.
Карточка лида amoCRM с заполненными UTM-метками после интеграции Tilda и n8n
Итоговая карточка должна содержать телефон, источник, кампанию, form_id и страницу заявки в отдельных полях, а не только в примечании.

Тесты перед production и проверка API

Проверяйте не только 200 OK. Смотрите execution data: нормализованный телефон, найденный дубль, body запроса к amoCRM и итоговую карточку в нужной воронке. Для API amoCRM особенно важны ответы 400, 401, 403 и 429.

curl -X POST "https://YOUR-N8N-DOMAIN/webhook/tilda-form-to-amocrm-lead" \
  -H "Content-Type: application/json" \
  --data @tilda-form-to-amocrm-lead-payload.json

Отдельно проверьте три сценария: повтор того же телефона, тот же телефон в формате 8... вместо +7..., и заявка без email. Если все три случая создают одну логичную карточку, передача данных из формы настроена корректно.

Production-риски при работе с API amoCRM

  • UTM записаны только в примечание. Маркетинг не сможет строить отчёты. Используйте отдельные custom fields amoCRM.
  • Дубль ищется только по email. Для российских лидов телефон часто надежнее, а email может быть пустым, техническим или ошибочным.
  • OAuth истёк в production. Добавьте alert на 401/403 и runbook для перевыпуска токена; документация amoCRM отдельно описывает OAuth 2.0.
  • Неверный pipeline или status. Сделка создаётся, но менеджеры её не видят, поэтому автоматизация продаж выглядит “неработающей”.
  • Гонка при одновременных заявках. Два события с одним телефоном могут одновременно не найти дубль. Для жёсткой гарантии используйте отдельную идемпотентность в Postgres.
  • Сырые персональные данные в логах. Не отправляйте полный payload в Telegram/Slack alert без маскирования телефона и email.

Полезные ссылки и смежные workflow

Официальные документы, которые стоит держать рядом при внедрении: Tilda Webhook для приёма форм, API Reference amoCRM и OAuth 2.0 amoCRM.

Смотрите также внутри Nodbot:

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

  1. Повтор одного и того же телефона не создаёт вторую сделку без осознанного правила.
  2. UTM-метки лежат в отдельных полях amoCRM и видны в отчётах.
  3. Ошибки 400/401/403/429 уходят в alert или DLQ, а не теряются в executions.
  4. Менеджер видит сделку в нужной воронке, статусе и с понятным названием.
  5. Workflow содержит владельца, версию, описание credentials и список полей, которые можно менять безопасно.
  6. В n8n отключено лишнее хранение персональных данных или настроена политика очистки executions.

Нужно внедрить быстрее?

Нет времени собирать связку Tilda, n8n и amoCRM вручную? Делегируйте интеграцию команде Nodbot: настроим webhook, OAuth, поля CRM, дедупликацию, тесты и production-мониторинг.

Обсудить внедрение n8n