Tilda · 6 мин чтения

Как сопоставить поля формы Тильды с amoCRM

Тильда сама предлагает интеграцию с amoCRM в настройках формы, но там всего четыре поля: имя, телефон, email и комментарий. Как только в форме появляется что-то сверх этого - выбор тарифа, промокод, город доставки, дата визита, стандартная интеграция начинает терять данные, и менеджер видит в CRM пустую карточку вместо конкретных ответов клиента. Чтобы сопоставить поля формы Тильды с amoCRM без потерь, приходится либо вручную создавать дополнительные поля в CRM и связывать их через вебхук, либо подключать промежуточный сервис вроде n8n. В статье разбираю оба варианта: через нативный коннектор amoCRM в Тильде и через кастомный скрипт с прямым обращением к API amoCRM v4.

Как Тильда передаёт данные формы в 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 из Тильды как признак уже обработанной отправки.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно