Пошаговые инструкции Для начинающих 13 мин

Form Trigger в n8n: как создать форму заявки и проверить поля

Соберите форму с именем, email, типом и описанием. Готовая схема проверяет заявку и показывает результат: 14 шагов, workflow и тесты ошибок.

n8n Form Trigger Формы

В n8n можно принять заявку без отдельного конструктора форм. Form Trigger создаёт страницу с полями и запускает workflow после отправки. Сделаем учебную форму: человек вводит данные → workflow проверяет их → на странице появляется результат или понятная ошибка.

Результат инструкции

Получится workflow ezGPT - Request Form из трёх узлов. Заявка с корректными полями получит ready, с ошибками — needs_review. На странице будет «Проверка пройдена» или «Исправьте поля». Письма, оплаты и записи в CRM не создаются: action_performed остаётся false.

Это рабочий прототип приёма и проверки, а не полноценная очередь обращений. Результат можно посмотреть в Executions при включённом сохранении запусков. Для долговременного хранения позже понадобится отдельная таблица или CRM. AI здесь не используется: длину текста и допустимые значения надёжнее проверить правилами.

Что понадобится

  • Работающий n8n и права создать отдельный workflow. Пример проверен на n8n 2.42.4; версии узлов Form Trigger и Form — 2.5.
  • Браузер и только вымышленные данные. API-ключи, email-сервис и платная модель не нужны.
  • Для первого прогона используйте локальный n8n, доступный только вашему компьютеру. Authentication: None в этом примере не предназначен для публичной рабочей формы.

Установить n8n локально через Docker

Шаг 1. Импортируйте готовую схему

Скачать n8n-form-trigger.json

Создайте новый workflow. В меню редактора выберите Import from File и загрузите JSON. Если браузер показывает текст файла, сохраните его через «Сохранить как», затем импортируйте. Схема импортируется неопубликованной, без чужих credentials и ID workflow.

text
Request Form → Validate Request → Show Result

Request Form — n8n Form Trigger, Validate Request — Code, Show Result — n8n Form. При ручной сборке добавьте эти три узла, соедините их последовательно и задайте указанные имена. Не импортируйте схему поверх рабочего workflow.

Шаг 2. Задайте название и адрес формы

Откройте Request Form. Authentication: None. Form Title: Учебная заявка. Form Description: Только вымышленные данные. Письмо и запись в CRM не создаются. Respond When: Workflow Finishes.

В Options добавьте Form Path: ezgpt-demo-request и Button Label: Проверить заявку. Use Workflow Timezone оставьте выключенным, чтобы submittedAt был в UTC. Название формы — заголовок для посетителя; имя узла Request Form — название внутри workflow.

Если такой Form Path уже занят другой опубликованной схемой, выберите новый, например ezgpt-demo-request-2. Адреса затем копируйте из своего узла. В JSON версии 2.5 путь находится в parameters.options.path, а не в parameters.path.

Шаг 3. Проверьте четыре поля

В Form Elements должно быть четыре элемента в этом порядке. Required Field включён у каждого. В версии 2.5 видимая подпись задаётся в Label, а имя для JSON — через Add Attributes → Custom Field Name. Не путайте имя для данных с русской подписью на странице.

Подпись / имя JSON Element Type Настройка
Имя / name Text Input Required Field: on
Email / email Email Required Field: on
Тип обращения / request_type Dropdown Консультация и Поддержка
Описание задачи / message Textarea Required Field: on

У Dropdown откройте Field Options и задайте ровно два варианта: Консультация и Поддержка. Это одиночный выбор. При импорте Custom Field Name уже заполнен; при ручной сборке добавьте этот атрибут для всех четырёх полей.

Шаг 4. Настройте проверку в Code

Откройте Validate Request. Mode: Run Once for All Items, Language: JavaScript. Вставьте весь код ниже, заменив стандартный пример. В Settings оставьте On Error: Stop Workflow.

javascript
Показать код (34 строк)
const input = $input.first().json;
const text = key => typeof input[key] === 'string' ? input[key].trim() : '';
const name = text('name');
const email = text('email').toLowerCase();
const requestType = text('request_type');
const message = text('message');
const errors = [];
if (name.length < 2 || name.length > 80) errors.push('name_length');
if (email.length > 254 || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
  errors.push('email_format');
}
if (!['Консультация', 'Поддержка'].includes(requestType)) {
  errors.push('request_type_not_allowed');
}
if (message.length < 10 || message.length > 1000) errors.push('message_length');
const labels = {
  name_length: 'Имя: от 2 до 80 символов.',
  email_format: 'Email: проверьте адрес.',
  request_type_not_allowed: 'Тип: выберите Консультация или Поддержка.',
  message_length: 'Описание: от 10 до 1000 символов.',
};
const status = errors.length ? 'needs_review' : 'ready';
return [{ json: {
  request_id: 'demo-' + $execution.id,
  name, email, request_type: requestType, message,
  submitted_at: input.submittedAt,
  form_mode: input.formMode,
  status, errors,
  completion_title: status === 'ready' ? 'Проверка пройдена' : 'Исправьте поля',
  completion_message: status === 'ready'
    ? 'Учебная заявка проверена. Письмо и запись в CRM не создавались.'
    : errors.map(key => labels[key]).join(' '),
  action_performed: false,
} }];

Код очищает крайние пробелы, приводит email к нижнему регистру и собирает errors. Имя: 2–80 символов, описание: 10–1000; длина здесь считается стандартным JavaScript length, поэтому некоторые эмодзи занимают больше одного символа. Тип обращения сверяется с разрешённым списком. Email проверяется упрощённо: это не подтверждение существования ящика.

request_id строится из ID запуска. Он различает попытки, но не защищает от повторной заявки. submitted_at и form_mode берутся из служебных полей Form Trigger, а не из текста посетителя.

Шаг 5. Настройте конечный экран

Откройте Show Result. Page Type: Form Ending. On n8n Form Submission: Show Completion Screen. У Completion Title переключите поле в Expression и вставьте:

text
{{ $json.completion_title }}

У Completion Message также включите Expression:

text
{{ $json.completion_message }}

Узел должен стоять последним. Не заменяйте его Respond to Webhook: для Form Trigger версии 2.5 нужен Form Ending. Мы показываем только сообщения, которые создал наш код, не подставляем в HTML имя или описание посетителя.

Шаг 6. Включите сохранение учебных запусков

В настройках workflow проверьте сохранение успешных и ошибочных production executions. Импортированный JSON включает оба вида: иначе после закрытия формы вы можете не найти Output узла в истории. Это настройка учебного стенда, не рекомендация хранить персональные данные бессрочно.

Сохраните workflow. Пока не подключайте Telegram, CRM, отправку email или модель. Пустая входящая заявка не должна приводить к внешнему действию.

Шаг 7. Запустите всю схему через Test URL

Нажмите Execute Workflow, а не только Execute Step у первого узла. В Request Form откройте Test URL или автоматически появившуюся форму. Если браузер блокирует новую вкладку, скопируйте Test URL из узла и откройте его после запуска ожидания.

Test URL работает, пока n8n слушает тестовую отправку. Без запущенного ожидания 404 ожидаем. Execute Step у триггера проверяет только его; нам нужно выполнение всех трёх узлов и экран из Show Result.

Шаг 8. Отправьте корректную заявку

Поле Учебное значение Ожидаемая проверка
Имя Анна Петрова Допустимая длина
Email anna@example.invalid Допустимый формат
Тип обращения Консультация Есть в списке
Описание задачи Нужен расчёт учебного проекта. 10–1000 символов

Нажмите «Проверить заявку» один раз и дождитесь конечной страницы. Ожидается заголовок «Проверка пройдена» и текст «Учебная заявка проверена. Письмо и запись в CRM не создавались.». Домен example.invalid в примере намеренно не используется для доставки письма.

Шаг 9. Сверьте данные внутри workflow

Вернитесь в редактор и откройте Output узла Validate Request. При тестовом запуске form_mode должен быть test. ID и время будут вашими; остальные основные поля должны совпасть с примером:

json
{
  "name": "Анна Петрова",
  "email": "anna@example.invalid",
  "request_type": "Консультация",
  "message": "Нужен расчёт учебного проекта.",
  "status": "ready",
  "errors": [],
  "action_performed": false
}

ready подтверждает только прохождение четырёх учебных правил. Зелёный execution говорит, что workflow выполнился, а не что email существует или оператор принял заявку.

Шаг 10. Проверьте ошибку после отправки

Для нового теста снова нажмите Execute Workflow и откройте свежую форму. Заполните имя, email и тип как раньше, а в описании напишите «Привет». Это непустое поле, поэтому форма позволит его отправить, но наш код обнаружит длину меньше 10.

Ожидается «Исправьте поля» и «Описание: от 10 до 1000 символов.». В Output: status needs_review, errors содержит message_length, action_performed false. Сам execution при этом успешный: неверные пользовательские данные — обработанный результат, не авария workflow.

Чтобы исправить заявку, вернитесь к исходному URL формы и отправьте её заново; в Test режиме сначала запустите новое ожидание. Экран результата не является встроенным редактором предыдущей заявки.

Шаг 11. Проверьте пустые поля и пробелы

Откройте форму для новой попытки и нажмите кнопку без заполнения. Отправка должна остановиться на проверке обязательных полей в браузере. Это удобно пользователю, но не заменяет Validate Request: прямой HTTP-запрос может обойти такую проверку.

В следующем запуске укажите два пробела вместо имени, остальные поля заполните корректно. Если браузер пропустит значение, после trim код всё равно выдаст name_length. Также попробуйте корректное имя с пробелами по краям: в Output они должны исчезнуть.

Не доверяйте значениям формы только потому, что у них тип Email или Dropdown. В редакционном тесте прямые multipart-запросы с отсутствующими полями, неверным email и подменённым вариантом Dropdown получили needs_review. Не передавайте такие записи дальше как ready.

Шаг 12. Опубликуйте только учебную схему

Когда тест закончен, сохраните изменения и нажмите Publish. Переключите Request Form на Production URL, скопируйте его и откройте в браузере. На локальном стенде адрес имеет такой вид; ваш порт может отличаться:

text
http://localhost:5679/form/ezgpt-demo-request

Это адрес формы, а не редактора. Не переносите показанный порт вслепую: используйте Production URL своего экземпляра. Открывайте localhost только на том же компьютере; для посетителя с другого устройства localhost обозначает его устройство.

Если n8n работает через прокси или внешний домен и генерирует внутренний адрес, не публикуйте его пользователям. Сначала администратор должен настроить корректный базовый webhook URL и HTTPS. В нашем тесте использован N8N_WEBHOOK_URL для адреса учебного стенда.

Шаг 13. Проверьте Production URL и историю

Отправьте корректную заявку через Production URL, не нажимая Execute Workflow. Дождитесь экрана результата, затем откройте вкладку Executions и последний production execution. В Validate Request должны быть status ready, form_mode production и action_performed false.

Отправьте «Привет» в описании и сравните следующий execution: needs_review, message_length. При production-отправках результат не обязан появляться прямо на полотне редактора: смотрите соответствующий запуск в Executions. Повторная отправка создаёт новую попытку и новый request_id.

Шаг 14. Остановите тест и зафиксируйте результат

В меню workflow выберите Unpublish, когда закончите проверку. Production URL должен перестать принимать новые заявки; закрытая вкладка формы сама по себе не выключает workflow. Если редактор вашей версии использует другой переключатель публикации, отключите именно production-запуск этой учебной схемы.

Минимальный результат: четыре поля видны, корректная заявка проходит, короткое описание получает понятную ошибку, записи в истории различимы, внешних действий нет. Не переходите к CRM, пока каждый из этих пунктов не воспроизводится.

Сохранить проверенные заявки в Data Tables

Если нужна своя страница: приём JSON через Webhook

Если результат отличается

Симптом Вероятная причина Что проверить
Test URL отдаёт 404 Нет тестового ожидания Execute Workflow и свежий Test URL
Production URL отдаёт 404 Схема не опубликована Save, Publish и Production URL
Нет понятного ответа Проверен только первый узел Все три узла и Form Ending
Все поля ошибочные Имена JSON не совпадают Custom Field Name и код
Не видно Output в редакторе Отправка production Executions и сохранение запусков
Конечный экран не появляется Ошибка или выполнение ещё идёт Статус запуска и последний узел

До запуска рабочей формы

Authentication: None делает форму доступной всем, кто может открыть её адрес. У учебного n8n порт должен слушать только локальный компьютер. Для внутренней формы рассмотрите Basic Auth; для публичной формы отдельно нужны HTTPS, ограничение частоты, защита от спама, уведомление об обработке данных и контроль доступа к истории. Скрытый URL не является авторизацией.

Имена и email могут попасть в сохранённые executions и резервные копии. Согласуйте сроки хранения и минимальные права. Этот JSON намеренно сохраняет учебные запуски, поэтому не собирайте через него реальные клиентские данные без изменения политики хранения.

Проверка длины и email не делает входной текст безопасным кодом, SQL или HTML. Мы не отражаем пользовательский HTML на конечном экране и не исполняем описание задачи. Повторные отправки не блокируются: перед записью в CRM добавьте явную защиту от дублей, отдельное хранение результата и обработку отказов.

Что проверено редакцией

14 октября 2026 года workflow проверен на n8n 2.42.4 в отдельном локальном Docker-экземпляре. Восемнадцать HTTP/runtime-проверок: неопубликованный адрес, открытие опубликованной формы, корректная заявка, очистка пробелов и регистра email, второй тип обращения, пустое имя, отсутствие полей, неверный email, подменённый тип, короткое и длинное описание, длинное имя, нижние и верхние границы длины, отсутствие отражения пользовательского HTML, лишние поля, повторная отправка и Test URL без ожидания. Для отправок сверены итоговый экран, ready/needs_review, errors, action_performed false, служебные поля и успешное завершение execution. Отдельно в браузере проверены обязательные поля, корректная отправка и ошибка короткого описания. Редакторские клики настройки и Test URL с включённым ожиданием не прогонялись; соответствующие режимы сверены с официальной документацией и кодом штатных узлов. Cloud, публичный сервер, антиспам, доставка писем и реальная CRM не тестировались. Тестовый контейнер остановлен, чужие workflows не менялись. Обложка — редакционная AI-иллюстрация.

Частые вопросы

Чем Form Trigger отличается от Webhook?

Form Trigger сам показывает страницу с полями. Webhook принимает HTTP-запрос, а пользовательский интерфейс обычно нужно делать отдельно. Для простой учебной заявки здесь достаточно Form Trigger, Code и Form Ending.

Почему Test URL не открывается?

Сначала запустите Execute Workflow и дождитесь ожидания. Test URL не является постоянно работающим публичным адресом. Для регулярных отправок используется Production URL опубликованного workflow.

Зачем Code, если поля обязательные?

Обязательные поля помогают при заполнении в браузере. Проверка workflow нужна отдельно: она очищает пробелы, проверяет длины и разрешённый тип, а также обрабатывает прямые запросы, обходящие интерфейс формы.

Почему execution успешный, а заявка needs_review?

Workflow успешно выполнил проверку и сообщил об ошибке данных. Это ожидаемый результат, не техническая авария. Ориентируйтесь на поле status заявки и errors, а не только на зелёный статус запуска.

Куда сохраняется заявка и придёт ли письмо?

В этом примере результат виден в сохранённой истории Executions. Отдельной базы заявок и отправки письма нет, action_performed false. Для рабочей системы добавьте контролируемое хранилище, защиту от повторов и журнал действий.

Дальше по теме

Похожие материалы