В 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. Импортируйте готовую схему
Создайте новый workflow. В меню редактора выберите Import from File и загрузите JSON. Если браузер показывает текст файла, сохраните его через «Сохранить как», затем импортируйте. Схема импортируется неопубликованной, без чужих credentials и ID workflow.
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 | 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.
Показать код (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 и вставьте:
{{ $json.completion_title }}
У Completion Message также включите Expression:
{{ $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. Отправьте корректную заявку
| Поле | Учебное значение | Ожидаемая проверка |
|---|---|---|
| Имя | Анна Петрова | Допустимая длина |
| anna@example.invalid | Допустимый формат | |
| Тип обращения | Консультация | Есть в списке |
| Описание задачи | Нужен расчёт учебного проекта. | 10–1000 символов |
Нажмите «Проверить заявку» один раз и дождитесь конечной страницы. Ожидается заголовок «Проверка пройдена» и текст «Учебная заявка проверена. Письмо и запись в CRM не создавались.». Домен example.invalid в примере намеренно не используется для доставки письма.
Шаг 9. Сверьте данные внутри workflow
Вернитесь в редактор и откройте Output узла Validate Request. При тестовом запуске form_mode должен быть test. ID и время будут вашими; остальные основные поля должны совпасть с примером:
{
"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, скопируйте его и откройте в браузере. На локальном стенде адрес имеет такой вид; ваш порт может отличаться:
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. Для рабочей системы добавьте контролируемое хранилище, защиту от повторов и журнал действий.