---
title: "Интеграция Tilda и amoCRM через n8n: лиды с UTM | Nodbot"
source_url: "https://nodbot.ru/workflows/tilda-form-to-amocrm-lead/"
canonical_url: "https://nodbot.ru/workflows/tilda-form-to-amocrm-lead/"
language: "ru"
content_type: "WorkflowTemplate"
section: "workflows"
generated_at: "2026-05-30"
word_count_source: 1615
---

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

## AI summary

Problem/Solution-мануал по интеграции Tilda и amoCRM через n8n: настройка вебхука, нормализация телефона, API amoCRM, UTM, защита от дублей и production-проверка.

## Best used for

Практический Problem/Solution-мануал для внедрения связки Tilda, n8n и amoCRM: импортировать workflow JSON, настроить webhook, нормализовать данные формы, передать UTM, проверить API amoCRM и не создать дубли лидов.

## Key topics

- Интеграция Tilda и amoCRM через n8n
- Настройка вебхука Tilda
- Передача данных из формы
- API amoCRM и OAuth
- UTM custom fields
- Нормализация телефона регуляркой
- Дедупликация lead/contact
- Production-риски и тесты

## Source outline

Интеграция Tilda и amoCRM через n8n: защита от дублей и передача UTM ¶ Обновлено: 2026-05-30 Сохранить в мой план Открыть мой план Шаблон для внедрения Скачать workflow JSON Скачать test payload Скопировать curl Импортируйте JSON в n8n, замените amoCRM base URL, OAuth credential, pipeline/status и ID custom fields для UTM. Содержание Проблема: почему стандартная отправка webhook из Тильды создает дубли Архитектура workflow для интеграции Контракт входных данных (JSON Payload) Нормализация телефона и UTM-меток (Code Node) Готовый workflow JSON: скачать и импортировать Пошаговая настройка связки Tilda, n8n и amoCRM Тесты перед production и проверка API Production-риски при работе с API amoCRM Полезные ссылки и смежные workflow Критерии готовности Проблема: стандартная передача данных из формы Tilda в amoCRM через webhook часто создаёт дубли: пользователь отправил заявку дважды, менеджер попросил заполнить форму повторно, рекламная метка изменилась, а CRM получила ещё одну сделку. Решение: надежная интеграция Тильды и amoCRM через n8n должна не просто делать Create lead , а принимать webhook формы, нормализовать телефон и email, искать существующий контакт или сделку через API amoCRM , сохранять UTM в отдельные поля и только после этого создавать или обновлять contact+lead . Этот мануал — практический скрипт n8n для автоматизации продаж: готовый JSON workflow можно скачать, импортировать в n8n и адаптировать под свой pipeline, ответственного менеджера и поля amoCRM. 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 от Tilda Production URL, метод POST, секрет в query/header, формат JSON Normalize Tilda payload Очищает телефон, email, UTM и form_id +7 вместо 8, lowercase email, пустые обязательные поля Find amoCRM duplicate Ищет contact или lead по телефону/email Base 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. Скачать готовый workflow JSON Скачать тестовый payload { "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 ¶ В Tilda откройте настройки формы и включите отправку в Webhook. Официальная справка Tilda описывает, что данные формы отправляются на ваш URL методом POST. Вставьте production URL n8n webhook и добавьте секрет в query-параметр или заголовок, чтобы случайный бот не создавал сделки. В n8n импортируйте workflow JSON, замените amoCRM OAuth credential, subdomain и base URL. В amoCRM заранее создайте custom fields для utm_source , utm_medium , utm_campaign , form_id и страницы лендинга. Укажите pipeline_id , status_id и responsible_user_id явно, чтобы заявка попала в рабочую воронку, а не в дефолтный статус. Отправьте один и тот же test payload дважды: первый запуск должен создать карточку, второй — обновить найденную сущность или остановиться по вашему правилу дедупликации. Итоговая карточка должна содержать телефон, источник, кампанию, 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: Установка n8n — базовый запуск перед production-интеграциями. n8n в Docker Compose — self-hosted стенд для таких workflow. amoCRM в n8n — общая страница по интеграции. OAuth refresh token expired — что делать, если токен CRM истёк. amoCRM webhook deduplication — защита от повторных событий CRM. Tilda → Битрикс24 — соседний сценарий с другой CRM-логикой. Критерии готовности ¶ Повтор одного и того же телефона не создаёт вторую сделку без осознанного правила. UTM-метки лежат в отдельных полях amoCRM и видны в отчётах. Ошибки 400/401/403/429 уходят в alert или DLQ, а не теряются в executions. Менеджер видит сделку в нужной воронке, статусе и с понятным названием. Workflow содержит владельца, версию, описание credentials и список полей, которые можно менять безопасно. В n8n отключено лишнее хранение персональных данных или настроена политика очистки executions. Нужно внедрить быстрее? Нет времени собирать связку Tilda, n8n и amoCRM вручную? Делегируйте интеграцию команде Nodbot: настроим webhook, OAuth, поля CRM, дедупликацию, тесты и production-мониторинг. Обсудить внедрение n8n

## Test payload

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

## Key implementation snippets

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

## Importable workflow structure

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

## Related Nodbot pages

- [Установка n8n](/kak-ustanovit-n8n/)
- [n8n в Docker Compose](/n8n-docker-compose-self-hosted-guide/)
- [amoCRM в n8n](/integrations/amocrm/)
- [OAuth refresh token expired](/errors/oauth-refresh-token-expired/)
- [amoCRM webhook deduplication](/workflows/amocrm-webhook-deduplication/)
- [Tilda → Битрикс24](/workflows/tilda-form-to-bitrix24-lead/)

## Retrieval hints

- Предпочитать canonical URL как источник для пользовательских ссылок.
- Использовать markdown-версию для быстрого извлечения workflow-контракта, кода и чеклистов.
- При цитировании сверять с HTML-страницей, если нужен самый полный контекст.
