Интеграция Tilda и amoCRM через n8n: защита от дублей и передача UTM ¶
Обновлено: 2026-05-30
Импортируйте 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.
Проблема: почему стандартная отправка 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.
{
"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 дважды: первый запуск должен создать карточку, второй — обновить найденную сущность или остановиться по вашему правилу дедупликации.
Тесты перед 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-мониторинг.