Тильда сама предлагает интеграцию с amoCRM в настройках формы, но там всего четыре поля: имя, телефон, email и комментарий. Как только в форме появляется что-то сверх этого - выбор тарифа, промокод, город доставки, дата визита, стандартная интеграция начинает терять данные, и менеджер видит в CRM пустую карточку вместо конкретных ответов клиента. Чтобы сопоставить поля формы Тильды с amoCRM без потерь, приходится либо вручную создавать дополнительные поля в CRM и связывать их через вебхук, либо подключать промежуточный сервис вроде n8n. В статье разбираю оба варианта: через нативный коннектор amoCRM в Тильде и через кастомный скрипт с прямым обращением к API amoCRM v4.
По теме статьи
Готовое решение
Подарочные сертификаты Тильда без процента с продаж
Покупатель оплачивает сертификат как обычный товар, получает код на почту и гасит его в корзине. Работает на вашем хостинге, без процента с продаж.
от30 000 ₽
Кастомный скрипт
Когда стандартных блоков не хватает
Доработка сайтов на Тильде: скрипты для корзины, промокоды, зоны доставки, интеграции с CRM и Telegram. Простой скрипт от 3 000
от3 000 ₽
Как Тильда передаёт данные формы в amoCRM по умолчанию
В настройках блока с формой на вкладке «Контент» есть пункт «Отправлять данные в CRM» и там amoCRM. Подключение идёт через ввод поддомена аккаунта и ключа интеграции (или через OAuth, если интеграция уже стоит в маркетплейсе amoCRM). После подключения Тильда показывает таблицу сопоставления: слева поля из формы, справа стандартные поля CRM - Имя, Телефон, E‑mail, Комментарий.
Проблема в том, что в это сопоставление попадают только поля, у которых в форме явно выставлен «Тип поля»: Имя, Телефон или E‑mail. Если поле сделано через конструктор как select, radio или обычный текстовый инпут с типом «Другое», Тильда не знает, куда его отправлять, и либо не передаёт вовсе, либо сваливает текстом в комментарий вместе с остальными такими полями. На практике это выглядит так: в форме пять полей (имя, телефон, тариф, промокод, комментарий), а в сделке amoCRM в поле «Основное» одной строкой лежит «Тариф: Стандарт, Промокод: SALE20, Хочу перезвон после 18:00» - разобрать это руками потом дороже, чем сделать нормальное сопоставление сразу.
Разбор полей формы: что реально долетает до карточки в amoCRM
Если смотреть по умолчанию, без доработок, схема такая:
- Поле с типом «Имя» уходит в поле «Имя» контакта.
- Поле с типом «Телефон» уходит в основной телефон контакта, и только оно попадает в номер, по которому потом можно позвонить прямо из CRM. Обычный текстовый инпут с цифрами телефоном не считается.
- Поле с типом «E‑mail» уходит в основной email контакта.
- Textarea или поле «Другое» без явного назначения уходит в примечание к сделке одним блоком текста.
- Скрытые поля Тильды (tranid, formname, servicetype) в стандартную интеграцию не попадают вообще.
Если форма ограничена именем, телефоном и комментарием, штатной интеграции достаточно. Как только добавляются select с тарифами, чекбоксы согласия, поле города доставки для СДЭК или дата записи, нужно either вручную заводить дополнительные поля в CRM, либо переходить на вебхук.
Кастомные поля: как связать доп.поля формы с полями сделки и контакта
Создание полей в amoCRM
В настройках аккаунта amoCRM, в разделе «Поля сделки» и «Поля контакта», создаю поле того же типа, что и в форме: текстовое для промокода, список для тарифа, мультисписок для чекбоксов с несколькими вариантами ответа. Тип поля в CRM обязан соответствовать типу в форме - если в Тильде это select с тремя вариантами, а в amoCRM завести текстовое поле, придётся либо терять валидацию, либо городить дополнительную логику на приёме данных.
Получение field_id и enum_id через API
Чтобы сопоставить конкретное поле формы с конкретным полем CRM, нужен числовой идентификатор поля, а для списков ещё и идентификатор каждого варианта значения (enum_id). Получаю их запросом к API:
curl -X GET "https://ваш-поддомен.amocrm.ru/api/v4/leads/custom_fields" \
-H "Authorization: Bearer ВАШ_ACCESS_TOKEN"
В ответе для каждого поля будет id и, если это список, массив enums с id и value каждого варианта. Эти значения дальше используются в запросе на создание сделки. Без них API просто откажет с ошибкой валидации, если отправить строку там, где ждёт enum_id.
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Передача через вебхук: структура запроса от Тильды и отправка в amoCRM
Вместо готового CRM-коннектора в настройках формы можно выбрать «Вебхук» и указать адрес своего скрипта. Тильда отправит POST с JSON, где каждое поле формы придёт отдельным объектом с именем и значением:
{
"Name": "Иван Петров",
"Phone": "+79261234567",
"Email": "ivan@example.com",
"tariff": "Стандарт",
"promocode": "SALE20",
"formname": "Заявка с лендинга",
"tranid": "638219009"
}
На своей стороне скрипт разбирает эти пары ключ-значение и собирает запрос к amoCRM уже с правильными field_id и enum_id, а не с сырыми названиями полей формы:
curl -X POST "https://ваш-поддомен.amocrm.ru/api/v4/leads/complex" \
-H "Authorization: Bearer ВАШ_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '[{
"name": "Заявка с лендинга",
"custom_fields_values": [
{"field_id": 123456, "values": [{"enum_id": 654321}]},
{"field_id": 123457, "values": [{"value": "SALE20"}]}
],
"_embedded": {
"contacts": [{
"name": "Иван Петров",
"custom_fields_values": [
{"field_code": "PHONE", "values": [{"value": "+79261234567"}]},
{"field_code": "EMAIL", "values": [{"value": "ivan@example.com"}]}
]
}]
}
}]'
Плюс такой схемы в том, что поле «Тариф» приходит в CRM не текстом, а выбранным значением из списка, по которому потом можно фильтровать сделки и строить воронку. За разработку такой связки обычно берусь как за кастомную интеграцию формы Тильды с CRM, потому что структура полей у каждого клиента своя и типовой шаблон тут не подходит.
Скрытые поля, UTM-метки и служебные параметры Тильды
UTM-метки Тильда собирает автоматически, если в форме добавлены скрытые поля с именами utm_source, utm_medium, utm_campaign, utm_content, utm_term - тип поля при добавлении нужно выставить «Скрытое поле», тогда значения подтянутся из адресной строки без участия посетителя. В amoCRM для UTM есть отдельные системные поля сделки, но их нужно включить в разделе «Настройки» -> «Интеграции» -> сквозная аналитика, иначе метки так и останутся в теле вебхука и никуда не запишутся.
Отдельно советую передавать в вебхуке служебное поле tranid (уникальный идентификатор отправки формы в Тильде) в скрытое поле сделки в amoCRM. Оно пригождается для защиты от дублей: если форма отправляется повторно из-за медленного интернета или пользователь два раза жмёт кнопку, скрипт может проверить, есть ли уже сделка с таким tranid, и не плодить вторую карточку с теми же данными.
Какой способ выбрать: сравнение и типичные ошибки
| Способ | Кастомные поля и списки | Устойчивость при изменении формы | Время на настройку |
|---|---|---|---|
| Нативная интеграция Тильда - amoCRM | Нет, только имя/телефон/email/комментарий | Ломается при добавлении новых полей без типа | 10-15 минут |
| No-code сервис (n8n, Albato) | Есть, поля сопоставляются вручную в визуальном редакторе | Требует правки сценария при каждом новом поле формы | 1-3 часа |
| Кастомный скрипт на вебхуке | Есть, включая enum_id, мультисписки, вложенные сущности | Меняется вместе с формой, можно добавить логику проверки дублей | от 1-2 дней разработки |
Из частых ошибок, с которыми сталкиваюсь при настройке:
- Поле телефона в форме сделано как обычный текстовый инпут вместо типа «Телефон» - номер уходит текстом и не попадает в кликабельный номер для звонка.
- Значения select в форме не совпадают буквально с вариантами списка в amoCRM («Стандарт» в форме и «стандарт» в CRM) - API либо создаёт новый вариант списка, либо отклоняет запрос.
- Нет проверки на дубли по телефону или email - при повторной отправке формы или ретрае вебхука создаётся вторая сделка вместо обновления первой.
- Забыли включить сквозную аналитику в amoCRM - UTM-метки долетают до вебхука, но не сохраняются в самой сделке.
Частые вопросы
Почему не все поля из формы Тильды попадают в amoCRM?
Потому что нативная интеграция сопоставляет только поля с явно выставленным типом «Имя», «Телефон» и «E‑mail». Остальные поля - select, чекбоксы, обычные текстовые инпуты - в таблицу сопоставления не попадают и либо теряются, либо сваливаются одним текстом в комментарий к сделке.
Можно ли сопоставить поля без разработчика, через no-code сервис?
Да, через n8n или Albato можно построить сценарий, где каждое поле формы вручную привязывается к полю сделки или контакта в amoCRM, включая списки и мультисписки. Это медленнее кастомного скрипта в плане гибкости, но не требует написания кода, только доступ к API amoCRM и настройку триггера на вебхук от Тильды.
Как передать UTM-метки из Тильды в amoCRM?
В форму добавляются скрытые поля с именами utm_source, utm_medium, utm_campaign и так далее, Тильда заполняет их значениями из адресной строки автоматически. В amoCRM нужно включить сквозную аналитику в настройках интеграций, иначе метки долетят до вебхука, но не отобразятся в карточке сделки.
Что делать, если amoCRM создаёт дубли лидов при повторной отправке формы?
Нужна проверка на стороне скрипта перед созданием сделки: искать существующий контакт по телефону или email через API и, если он уже есть, добавлять новую сделку к нему или обновлять текущую вместо создания дубля. Дополнительно можно использовать служебное поле tranid из Тильды как признак уже обработанной отправки.