Юр. сторона и интеграции

Формы обратной связи на сайте: какие поля нужны и что убивает заявки

Сколько полей оставить, где ставить чекбокс согласия, как не потерять заявки в спаме и куда их доставлять кроме почты.

12 минут чтения 2 Дмитрий Акиндинов
Содержание
  1. Сколько полей выдерживает клиент
  2. Обязательный минимум по закону
  3. Валидация без мучений
  4. Доставка заявок: почему одной почты мало
  5. Спам: honeypot вместо капчи
  6. Что должно происходить после отправки
  7. Чек-лист проверки формы раз в квартал
  8. С чего начать, если форма уже есть
  9. Частые вопросы

Рабочая форма это три-четыре поля, чекбокс согласия со ссылкой на политику и доставка не только на почту. Скрытое поле-ловушка убирает около 95 процентов спама и не мешает живому человеку, в отличие от капчи. Штрафы по 13.11 КоАП для юрлиц измеряются сотнями тысяч.

Формы обратной связи на сайте выглядят как задача, закрытая один раз и навсегда: поставили, поле для имени есть, кнопка нажимается. А потом владелец обнаруживает, что письма с заявками третий месяц падают в спам, чекбокс согласия стоит предустановленной галочкой без ссылки на политику, и половина посетителей бросает заполнение на пятом поле. Эта статья для тех, у кого форма на сайте уже есть и вроде работает. Разберу состав полей, юридический минимум, нативную валидацию, доставку заявок мимо почты, отсечение ботов без капчи и то, что должно происходить после нажатия кнопки.

Компактная форма заявки со стрелкой к иконке сообщения

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

Сколько полей выдерживает клиент

Правило простое: каждое поле должно быть оправдано тем, что без него вы не сможете ответить. Всё остальное спрашивается голосом в первом же разговоре.

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

Цена такая. У клиента с мебельной мастерской была форма на девять полей: имя, фамилия, телефон, email, город, тип изделия, примерный бюджет, срок, комментарий. Срезали до трёх (имя, телефон, комментарий), количество заявок за следующий месяц выросло примерно в полтора раза. Честная оговорка: часть новых заявок оказалась мусорной, потому что раньше поле «бюджет» отпугивало тех, кто не готов платить. Но квалифицировать человека в разговоре дешевле, чем не получить его вовсе.

Что убивает заполнение

  • Обязательные телефон и email одновременно. Человек даёт тот контакт, которым пользуется. Сделайте одно поле «телефон или почта» либо оставьте оба необязательными с проверкой, что заполнено хотя бы одно.
  • Поле «Отчество». В 2026 году оно нужно только если вы готовите договор прямо из формы.
  • Капча перед отправкой. Отдельная боль, про неё ниже.
  • Выпадающий список из пятнадцати услуг. Если посетитель пришёл со страницы услуги, подставьте её значение скрытым полем, а не заставляйте выбирать.
  • Поле «Откуда вы о нас узнали». Это данные для вас, а не для клиента. Их даст Метрика и UTM-метки.

Что стоит добавить, если вы к этому готовы

Одно поле можно позволить себе без потерь, если оно реально ускоряет работу. Для обслуживания сайтов это адрес сайта: без него первый ответ всё равно будет «пришлите ссылку». Для магазина это город доставки. Для юриста это одно предложение о сути вопроса.

Скрытые поля не считаются, потому что посетитель их не заполняет. Полезный набор: страница, с которой отправлена форма, UTM-метки из сессии, идентификатор клиента Метрики, название услуги или тарифа. Всё это должно приезжать вместе с заявкой, иначе через две недели вы не вспомните, откуда пришёл человек.

ПолеОбязательноеЗачем
Имядаобращение в ответе, отсев части ботов
Телефон или emailдабез канала связи заявка бесполезна
Сообщениедапонять контекст до звонка
Адрес сайтапо ситуацииэкономит один круг переписки
Чекбокс согласияда, по закону152-ФЗ
Страница отправкискрытоепонять, какой раздел приносит заявки
UTM-меткискрытоеоценка рекламы
Honeypotскрытоеотсев ботов

Обязательный минимум по закону

Здесь экономить нельзя, и это не запугивание, а арифметика: проверки Роскомнадзора по формам на сайтах в последние два года идут потоком, а штрафы по статье 13.11 КоАП для юрлиц после ужесточения 2025 года измеряются сотнями тысяч рублей. Форма без согласия дешевле не становится.

Что должно быть рядом с кнопкой:

  1. Отдельный чекбокс согласия на обработку персональных данных. Не предустановленный. Галочка, проставленная по умолчанию, юридически согласием не является, потому что согласие должно быть конкретным и осознанным.
  2. Текст рядом с чекбоксом с двумя живыми ссылками: на политику конфиденциальности и на текст согласия (обычно PDF).
  3. Политика конфиденциальности, доступная с любой страницы, где есть форма. В ней должны быть оператор с реквизитами, цели обработки, перечень собираемых данных, сроки хранения и порядок отзыва согласия.
  4. Хранение факта согласия. Не самого чекбокса в базе, а метаданных: когда, с какого IP, какая версия текста согласия была на странице.

Последний пункт пропускают почти все. А это ровно то, что вы предъявите, если человек напишет «я вам ничего не разрешал». Пишу в отдельный лог одной строкой на заявку:

{"ts":"2026-09-27T10:14:22+03:00","ip":"77.88.55.77","name":"Андрей","channel":"phone","page":"/uslugi/tehpodderzhka/","consent":true,"consent_version":"2026-01-15","consent_hash":"9f2c41d8e5"}

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

Формулировка рядом с чекбоксом должна быть короткой и без юридического тумана. Рабочий вариант: «Я согласен на обработку персональных данных и принимаю политику конфиденциальности». Два слова в этой фразе ссылки. Подробный разбор того, что писать в самом тексте согласия и чем оно отличается от политики, есть в статье про согласие на обработку персональных данных.

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

Валидация без мучений

Самая частая поломка формы, которую я вижу, это самописная валидация. Кто-то когда-то написал скрипт с масками телефона, кастомными подсказками и переключением классов, потом плагин обновился, скрипт отвалился, и форма молча не отправляется. Владелец узнаёт об этом через месяц по отсутствию заявок.

Браузер умеет проверять поля сам, и это работает лучше самоделок: подсказки локализованы, доступны с клавиатуры, читаются скринридером и не ломаются при обновлении темы.

<form action="/mail.php" method="post" novalidate>
  <label for="lead-name">Имя</label>
  <input id="lead-name" name="name" type="text" required
         autocomplete="name" minlength="2" maxlength="60">

  <label for="lead-phone">Телефон</label>
  <input id="lead-phone" name="phone" type="tel" required
         autocomplete="tel" inputmode="tel"
         pattern="[0-9+()s-]{10,20}">

  <label for="lead-message">Что случилось с сайтом</label>
  <textarea id="lead-message" name="message" required
            minlength="10" maxlength="2000" rows="4"></textarea>

  <label class="consent">
    <input type="checkbox" name="consent" value="1" required>
    Я согласен на <a href="/privacy/">обработку персональных данных</a>
  </label>

  <input type="text" name="company_website" tabindex="-1"
         autocomplete="off" aria-hidden="true" class="hp">

  <button type="submit">Отправить</button>
</form>

Атрибут novalidate на форме нужен не для отключения проверки, а для того, чтобы браузер не показывал подсказки в момент, который выбрал сам. Дальше в обработчике отправки вызываете checkValidity() и, если не прошло, reportValidity(). Получаете нативные сообщения ровно тогда, когда человек нажал кнопку.

Про телефон отдельно. Жёсткие маски вида +7 (___) ___-__-__ регулярно ломают ввод: человек вставляет номер из буфера в формате 8 (812) 555 12 34 и получает кашу или отказ. Мой выбор: свободный ввод с широким pattern, нормализация уже на сервере. Пусть лучше приедет номер в неудобном формате, чем не приедет никакой.

autocomplete не украшение. С правильными значениями (name, tel, email) мобильный браузер подставляет данные в одно касание, и это заметно поднимает долю дошедших до кнопки.

Доставка заявок: почему одной почты мало

Сценарий, который я разбирал десятки раз. Форма отправляется, на экране «спасибо», в почте ничего. Причины по частоте:

  1. Письмо уходит через mail() с адреса вида noreply@сайт.ru, но у домена нет SPF и DKIM. Почтовый сервер получателя кладёт письмо в спам или отбрасывает молча.
  2. Отправитель подставлен как адрес клиента (From: klient@mail.ru). Для принимающего сервера это подделка адреса, письмо режется на входе.
  3. Хостер отключил mail() из-за жалоб на спам с соседних аккаунтов на shared.
  4. Почтовый ящик переполнен или правило в почтовике раскладывает всё в папку, куда никто не смотрит.

Лечится связкой из двух решений. Первое: отправлять письма по SMTP с настоящего почтового ящика на своём домене, а адрес клиента ставить в Reply-To. Второе, более важное: не полагаться на почту как на единственный канал.

КаналСтоимостьРиск потериКогда включать
Почта по SMTP на доменевходит в хостинг или от 300 руб. в месяцсредний, зависит от репутации доменавсегда, как архив
Telegram-ботбесплатнонизкийвсегда, как основной сигнал
Запись в файл или БД на серверебесплатнопочти нулевойвсегда, как последний рубеж
amoCRM или Битрикс24от 600 руб. за пользователя в месяцнизкийкогда заявок больше 20 в месяц
SMS-уведомлениеоколо 4 руб. за сообщениенизкийесли заявки срочные

Telegram-бот делается за двадцать минут и в моей практике оказался самым надёжным каналом: сообщение приходит на телефон мгновенно, не теряется и не требует подписки на сервис.

# создать бота у @BotFather, получить токен, узнать chat_id
curl -s "https://api.telegram.org/bot<TOKEN>/getUpdates"

# отправка заявки из обработчика формы
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" 
  -d "chat_id=<CHAT_ID>" 
  -d "parse_mode=HTML" 
  --data-urlencode "text=<b>Заявка с сайта</b>
Имя: Андрей
Телефон: +7 921 555-12-34
Страница: /uslugi/tehpodderzhka/
Источник: yandex / cpc / remont-sayta"

Токен бота держите в конфиге вне корня сайта, а не в коде страницы. Подробнее про настройку связки, лимиты API и что делать, если Telegram недоступен, писал в статье про интеграцию формы с Telegram-ботом.

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

Спам: honeypot вместо капчи

Первое, что предлагают на форумах при спаме через форму, это поставить reCAPTCHA. Я против, и вот почему.

Скрипт грузится с домена Google, это сторонний JavaScript весом в несколько сотен килобайт, замедляющий страницу. Он собирает данные о посетителе и передаёт их за границу, что для российского сайта с формой сбора персональных данных создаёт отдельную юридическую задачу. Плюс v2 с картинками стабильно теряет часть посетителей, особенно на мобильных и на медленном интернете.

Работающая замена на типовом сайте малого бизнеса стоит из трёх недорогих приёмов.

Honeypot. Скрытое поле, которое живой человек не видит и не заполняет, а бот заполняет автоматически. Прятать надо не через display: none (продвинутые парсеры это понимают), а уводом за пределы экрана, плюс tabindex="-1", autocomplete="off" и aria-hidden="true", чтобы поле не поймал ни таб, ни скринридер.

.hp {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}
// обработчик: заполненный honeypot = бот
if (!empty($_POST['company_website'])) {
    http_response_code(200); // отвечаем как при успехе, чтобы бот не подбирал
    exit;
}

// форма заполнена быстрее трёх секунд = бот
$elapsed = time() - (int) ($_POST['ts'] ?? 0);
if ($elapsed < 3 || $elapsed > 7200) {
    exit;
}

// больше двух ссылок в сообщении = почти всегда спам
if (preg_match_all('~https?://~i', $_POST['message'] ?? '', $m) > 2) {
    exit;
}

Отвечать боту кодом 200 важно: если возвращать ошибку, скрипт понимает, что попал в фильтр, и подбирает обход. Молчаливый успех он засчитывает и уходит.

Третий приём это ограничение частоты по IP: не больше трёх отправок за десять минут. Хранить можно в файле, база для этого не нужна.

Такая связка на моих проектах убирает порядка 95 процентов спама, при этом посетитель вообще ничего не замечает. Оставшиеся единичные письма проще удалять руками, чем ставить капчу. Более детальный разбор с готовыми правилами есть в статье про защиту формы от спама без reCAPTCHA.

Что должно происходить после отправки

Момент после нажатия кнопки проваливают чаще, чем саму форму.

Худший вариант: страница перезагружается, и посетитель видит белый экран с текстом «Спасибо, ваша заявка отправлена». Человек не понимает, куда делся сайт, что дальше и когда ему ответят.

Как надо. Сообщение об успехе показывается на месте формы, без ухода со страницы. В нём сказано, что произошло и когда ждать ответа: «Заявка принята. Отвечу в рабочее время в течение часа, обычно быстрее». Кнопка формы на время отправки блокируется, чтобы не улетело три одинаковых заявки от одного нетерпеливого посетителя.

Автоответ на почту клиенту имеет смысл, если человек оставил email: короткое письмо с тем, что заявка получена, сроком ответа и вашим телефоном. Заодно это проверка адреса на опечатку.

Цель в Метрике ставится не на клик по кнопке, а на фактически успешный ответ сервера. Клик по кнопке засчитается даже если форма не прошла валидацию, и вы будете месяцами смотреть на красивую конверсию, которой нет.

// вызывать только после успешного ответа обработчика
if (typeof ym === 'function') {
  ym(108769363, 'reachGoal', 'lead_submit');
}

Идентификатор счётчика подставьте свой. Как правильно завести такие цели, чем JS-цель отличается от цели на посещение страницы и что реально стоит считать конверсией на сайте услуг, разбирал в материале про цели Яндекс Метрики.

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

Чек-лист проверки формы раз в квартал

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

  • Отправить тестовую заявку с телефона, не из офисного Wi-Fi. Проверить, что письмо пришло не в спам.
  • Проверить дублирование в Telegram или CRM: заявка должна быть в обоих каналах.
  • Открыть лог на сервере и убедиться, что запись легла.
  • Попробовать отправить форму с пустыми полями. Браузер должен показать подсказки, а не молча ничего не делать.
  • Проверить чекбокс согласия: снять галочку, форма не должна отправляться.
  • Кликнуть обе ссылки рядом с чекбоксом. Ссылки на политику и текст согласия отваливаются после переездов и правок меню чаще всего.
  • Проверить, что галочка согласия не предустановлена после обновления темы или плагина.
  • Убедиться, что honeypot на месте и не стал видимым после смены стилей.
  • Посмотреть в Метрике, растёт ли счётчик цели lead_submit вместе с реальными заявками. Расхождение вдвое означает, что цель считает не то.
  • Проверить срок действия SSL и то, что форма отправляется на HTTPS-адрес. Смешанный контент блокируется браузером без предупреждения для посетителя.
  • Просмотреть заявки за квартал: какие поля люди заполняют мусором. Это кандидаты на удаление.
  • Проверить, что почтовый ящик, куда падают заявки, не переполнен и не перекинут на уволившегося сотрудника.

Пятнадцать минут работы. За шесть лет я ни разу не прошёл этот список без единого замечания на чужом сайте.

С чего начать, если форма уже есть

Порядок действий, который даст результат быстрее всего.

Сначала доставка: подключите Telegram-бота и запись в лог, не трогая ничего другого. Это самая частая причина исчезнувших заявок и самый дешёвый в починке пункт.

Потом юридическая часть: чекбокс без предустановленной галочки, две рабочие ссылки, лог согласий. Здесь риск измеряется деньгами, а работы на пару часов.

Затем поля: выбросьте всё, без чего вы можете ответить. Смотрите на конверсию месяц, а не неделю.

Валидацию и антиспам оставьте на конец, если форма отправляется и заявки доходят. Это улучшение, а не аварийный ремонт.

Если разбираться самому некогда, а заявки нужны вчера, напишите через форму на главной с адресом сайта: посмотрю, что у вас с доставкой и согласием, и скажу, что чинить в первую очередь. Аудит и починка формы обычно входят в абонентское обслуживание, посмотреть состав и цены можно в тарифах. Разработка нового сайта и дизайн в это не входят, я занимаюсь тем, что уже работает.

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

Сколько полей должно быть в форме

Три-четыре. Имя, способ связи, короткое описание задачи. Каждое лишнее поле снижает число отправок, а телефон и почту одновременно требовать почти никогда не нужно.

Что обязательно по закону

Чекбокс согласия, который не проставлен заранее, отдельная ссылка на политику конфиденциальности и блокировка отправки без согласия. Это минимум, за отсутствие которого и штрафуют.

Как защититься от спама без капчи

Скрытым полем-ловушкой, которое человек не видит, а бот заполняет. В связке с проверкой времени заполнения убирает около 95 процентов мусора и никак не мешает посетителю.

Почему нельзя полагаться только на почту

Письмо с заявкой уходит в спам, и владелец узнаёт об этом через месяц. Дублируйте заявки в мессенджер или в CRM. И раз в квартал отправляйте тестовую заявку сами.

Передайте техническую часть в надёжные руки.

Слежу за хостингом, бэкапами и обновлениями. Когда что-то пойдёт не так – звоните мне, не своему программисту, не в спортзал и не маме.

Короткие вопросы по теме

Все вопросы по теме "Юр. сторона и интеграции"

Заявка

Обсудим задачу

Напишите имя и телефон, выберите удобный канал. Перезвоню или напишу в течение часа в рабочее время.

Куда удобнее ответить?