ГлавнаяИнструментыМаркетингГенератор формы обратной связи
Генератор формы обратной связи для сайта
Отметьте поля, выберите, куда уходит заявка, укажите оператора и ссылку на политику — и заберите готовый код: разметку с подписями и aria, стили без библиотек и скрипт валидации, который показывает ошибку рядом с полем, а не в системном пузыре. Согласие на обработку персональных данных собрано так, как этого требует 152-ФЗ: отдельный чекбокс, названный оператор, цель и перечень данных.
—
Живая форма
Форма в рамке настоящая: нажмите «Отправить» с пустыми полями и посмотрите, как ведут себя ошибки и фокус. Отправка в предпросмотре никуда не уходит.
Правила проверки
| Поле | Правило | Сообщение |
|---|
Что уже сделано за вас
Как это устроено. Атрибут novalidate выключает системные подсказки браузера, а проверка идёт на отправке: сообщение попадает в абзац, на который ссылается aria-describedby поля, поле получает aria-invalid, фокус уходит на первое неверное. Результат отправки объявляется в блоке с role="status".
Расчёт идёт в вашем браузере — введённые данные никуда не отправляются.
Как пользоваться
- Оставьте только нужные поляИмя, почта и сообщение закрывают почти все обращения. Телефон, компанию и тему включайте, если с ними действительно работают: каждое лишнее обязательное поле стоит части заявок.
- Выберите способ отправкиОбычный POST — если на сайте есть PHP или другой обработчик. fetch — если заявка уходит в вебхук CRM или чат-бота и страницу перезагружать не нужно. Почтовый сервис — когда бэкенда нет вообще.
- Заполните блок согласияВпишите оператора так, как он назван в уставе, и дайте ссылку на политику. Текст согласия соберётся сам: оператор, перечень данных, цель и возможность отозвать.
- Проверьте форму в рамке и заберите кодНажмите «Отправить» с пустыми полями и посмотрите на ошибки. Дальше — три блока: HTML в страницу, CSS в стили, JS перед закрывающим тегом body.
Сколько полей ставить
Форма обратной связи конкурирует не с другой формой, а с желанием закрыть вкладку. Каждое поле — это решение, которое человек принимает на ходу, и обязательное поле, смысл которого непонятен, читается как повод уйти.
Рабочий минимум — имя, способ связи и сообщение. Всё остальное добавляют, когда на это есть процесс:
- Телефон — только если вы перезваниваете. Иначе это поле, которое заполняют неохотно и с ошибками.
- Компания — в B2B, где заявку маршрутизируют по сегменту.
- Тема обращения — когда обращения правда разъезжаются по разным людям. Список из трёх-четырёх понятных вариантов, без «Другое» первым пунктом.
- Файл — в поддержке и в работе с документами. Требует обработчика с
multipart/form-data: в вебхук через fetch файл не уйдёт.
Телефон здесь проверяется по количеству цифр, а не маской. Маска выглядит аккуратно ровно до первого человека с зарубежным номером или добавочным: он не может ввести свой телефон и уходит.
Валидация: что показывать и когда
Браузер умеет проверять поля сам, но его подсказки — системный пузырь, который исчезает по клику, не переводится под ваш текст и плохо дружит со скринридером. Поэтому в сгенерированном коде у формы стоит novalidate, а проверку делает скрипт.
Порядок, который не раздражает:
- Во время первого ввода — молчим. Красный текст под полем, которое человек ещё заполняет, — это претензия на пустом месте.
- При уходе из поля — проверяем. Поле потеряло фокус, значит, человек считает его заполненным.
- На отправке — проверяем всё, показываем все ошибки сразу и переводим фокус на первое неверное поле.
- Дальше — на каждый ввод: ошибка исчезает в тот момент, когда её исправили, а не после второй попытки отправить.
Текст ошибки говорит, что сделать: «Проверьте адрес: он должен быть вида имя@домен.ru» вместо «Некорректное значение». Проверка почты — одно простое правило «есть что-то, собака, домен с точкой»: формально верный адрес всё равно ничего не доказывает, а сложные регулярные выражения регулярно отбрасывают живые адреса.
Согласие на обработку персональных данных
Имя, телефон, почта и текст обращения — персональные данные. Их обработка по закону № 152-ФЗ «О персональных данных» требует согласия, и оно должно быть конкретным и осознанным: человек понимает, кому и зачем даёт данные.
На практике это значит вот что:
- Отдельный чекбокс, не отмеченный заранее. Галочка по умолчанию — не действие человека, а действие разработчика. Роскомнадзор и суды исходят из того, что согласие выражается активно.
- Назван оператор. «ООО „Ромашка“», а не «мы». Название должно совпадать с тем, что написано в политике.
- Названы данные и цель. «Персональных данных, указанных в этой форме, для ответа на обращение» — цель узкая. Согласие на ответ по обращению не даёт права на рассылку; для неё нужна отдельная галочка со своей формулировкой.
- Ссылка на политику. Политика обработки персональных данных должна быть опубликована и доступна — это отдельное требование статьи 18.1, независимо от формы.
- Упомянут отзыв. Право отозвать согласие есть по закону; строчка об этом снимает половину вопросов.
Отправку по-хорошему стоит блокировать до отметки — что и делает сгенерированный скрипт, с отдельным сообщением об ошибке. Кнопку при этом не блокируют: недоступная кнопка без объяснения выглядит как сломанный сайт.
Текст в генераторе — рабочая заготовка для обычной формы обратной связи, а не юридическое заключение. Если вы передаёте данные в CRM стороннего вендора, собираете данные детей или используете обращения для маркетинга, формулировку нужно править вместе с юристом.
Доступность формы: шесть вещей, которые решают всё
- Настоящий
<label for>у каждого поля. Плейсхолдер вместо подписи исчезает при вводе, и человек забывает, что он заполняет; скринридер плейсхолдер может и не прочитать. - Ошибка связана с полем через
aria-describedby: при переходе в поле озвучивается и подпись, и текст ошибки. aria-invalid="true"ставится и снимается. Атрибут, повешенный навсегда, делает форму бесконечно ошибочной для скринридера.- Фокус виден.
:focus-visibleс отступом;outline: noneбез замены — самый частый способ сломать клавиатуру. - Результат отправки объявляется. Абзац с
role="status"иaria-live="polite": иначе зрячий видит «Спасибо», а незрячий — тишину. - Проставлен
autocomplete:name,email,tel,organization. Это и удобство, и критерий WCAG 1.3.5.
Проверить всё это можно за минуту: пройдите форму Tab'ом от начала до конца, не трогая мышь, и отправьте её пустой. Если фокус виден на каждом шаге, ошибки читаются и после отправки фокус попал в нужное поле — форма в порядке.
Цвета ошибок и кнопки должны проходить контраст: рамку поля с ошибкой видно только при 3:1 к фону, текст ошибки — при 4,5:1. Подобрать их можно в палитре интерфейса, а проверить отдельную пару — в проверке контраста.
Куда уходит заявка
Три варианта закрывают почти все случаи:
- Обычный POST на обработчик. Форма отправляется браузером, страница перезагружается ответом. Проще всего, работает без JavaScript. Обработчику нужно проверить данные ещё раз: клиентская валидация защищает от опечаток, а не от подделанного запроса.
- fetch в вебхук. Данные уходят JSON-ом, страница не перезагружается, ответ показывается под кнопкой. Подходит для вебхуков CRM, Telegram-ботов и бессерверных функций. Учтите CORS: принимающая сторона должна разрешить запрос с вашего домена.
- Почтовый сервис. Formspree и аналоги принимают форму на свой адрес и пересылают письмо. Бэкенд не нужен, но данные проходят через третью сторону — это стоит отразить в политике.
Что бы вы ни выбрали, спам приезжает. Ловушка для ботов — скрытое поле, которое человек не видит и не заполняет, а простой бот заполняет всегда — отсекает основную массу. Обработчику остаётся правило в одну строку: поле не пустое — молча выбросить. Капча нужна, когда вас начинают долбить прицельно, и до этого момента она только мешает.
Источники
- Федеральный закон от 27.07.2006 № 152-ФЗ «О персональных данных» — статьи 9 (согласие), 18.1 (политика оператора).
- W3C. Web Content Accessibility Guidelines (WCAG) 2.2 — критерии 1.3.5 (назначение полей), 3.3.1 (определение ошибки), 3.3.2 (подписи), 2.4.7 (видимый фокус).
- W3C. WAI-ARIA Authoring Practices — сообщения об ошибках, aria-describedby, живые области.
- HTML Living Standard — атрибуты novalidate, autocomplete, inputmode.
Частые вопросы
Нужен ли чекбокс согласия на обработку персональных данных?
Если форма собирает имя, телефон или почту — да. Закон № 152-ФЗ требует конкретного и осознанного согласия, а «конкретное» означает названного оператора, перечень данных и цель. Отдельный чекбокс, не отмеченный заранее, со ссылкой на опубликованную политику — рабочая форма такого согласия.
Можно ли отметить галочку согласия по умолчанию?
Нет. Заранее отмеченная галочка — это действие разработчика, а не человека, и как согласие она не засчитывается. Сгенерированный скрипт блокирует отправку без отметки и показывает отдельное сообщение об ошибке.
Форма работает без JavaScript?
При отправке обычным POST — да: браузер отправит форму на обработчик, и проверить данные должен он. Режим fetch без JavaScript не работает, поэтому серверная проверка нужна в любом случае: клиентская валидация ловит опечатки, а не злой умысел.
Как защититься от спама без капчи?
Ловушкой: скрытое поле, которое человек не видит, а простой бот заполняет. Обработчик выбрасывает такие заявки молча. Этого хватает для обычного трафика; капчу добавляют, когда сайт начинают долбить прицельно, — она заметно снижает конверсию.
Подойдёт ли код для Тильды, WordPress или конструктора?
Да: это чистый HTML, CSS и JS без зависимостей. В WordPress блок кода вставляют через HTML-блок или в шаблон темы, в Тильде — через блок T123 «HTML-код». Важно, чтобы идентификаторы полей не пересекались с другими формами на странице.
Как принимать файлы?
Включите поле «Файл» и отправляйте форму обычным POST: браузер сам переключит кодировку на multipart/form-data. В режиме fetch файл не уедет — там передаётся JSON. Ограничьте размер и типы файлов на стороне обработчика: атрибут accept в разметке это только подсказка.
Что делать с заявкой после отправки?
Как минимум — показать понятный ответ на той же странице и продублировать письмом на указанный адрес. Отдельная страница «спасибо» удобна для целей в аналитике, но сообщение в области role="status" получают и те, кто пользуется скринридером.
Ещё в разделе «Маркетинг»
- Генератор UTM-меток
Как собрать единообразные UTM-ссылки для каждой кампании и канала?
- UTM-метки для Яндекс Директа
Какие макросы Директа поставить в метки и что из них испортит отчёт Метрики?
- UTM-метки для Тильды
Как разметить ссылку на лендинг Тильды и довести метку до заявки из формы?
- UTM-метки для Яндекс Метрики
Как эта ссылка ляжет в отчёт «Метки UTM» и что в ней ломает склейку источников?
- Генератор Open Graph
Какие теги Open Graph нужны странице и как будет выглядеть превью ссылки?
- Проверка сниппета
Как заголовок и описание будут выглядеть в поиске и не обрежутся ли они?
- Проверка темы письма
Поместятся ли тема письма и прехедер во входящих на телефоне и компьютере?
- Транслитерация и генератор ЧПУ
Как превратить заголовок на кириллице в чистый адрес страницы?
- QR-коды с UTM-метками
Какое место на выставке или какая листовка привели посетителей — и как пометить каждый QR-код?
- Генератор QR-кодов
Как сделать QR-код для ссылки, Wi-Fi или визитки, который никогда не истечёт?
- Калькулятор юнит-экономики
Зарабатываете вы на каждом клиенте или заказе — или доплачиваете за него?
- Калькулятор окупаемости CAC
За сколько месяцев новый клиент окупит стоимость привлечения?
- Калькулятор LTV и CAC
Окупает ли клиент затраты на своё привлечение?
- Калькулятор конверсии триала в оплату
Сколько выручки добавит рост конверсии из триала в оплату?
- Калькулятор вирусного коэффициента
Приводит ли каждый пользователь достаточно новых для вирусного роста?
- Калькулятор A/B-тестов
Значима ли разница между A и B и сколько пользователей нужно для теста?
- Проверка читаемости текста
Насколько текст сложен для чтения и какие предложения слишком длинные?
- Калькулятор NPS, CSAT и CES
Какой NPS у этих ответов и какова погрешность?
- Генератор всплывающего окна
Какой код всплывающего окна поставить на сайт, чтобы он показывался вовремя, не повторялся и работал с клавиатуры?