Форма обратной связи и персональные данные: почему мы сняли её с сайта целиком
Форма на сайте — не поле ввода, а обязательство. Разбор: чего она стоила, почему её удалили вместе с эндпоинтом, и как сделать так, чтобы «мы не собираем данные» можно было проверить снаружи.
Форма обратной связи стоит на почти каждом сайте студии, агентства и подрядчика. Её ставят не потому, что посчитали, а потому, что так принято: сайт без формы выглядит недоделанным.
Мы посчитали. За полгода наша форма приняла ноль заявок — не «мало», а ровно ноль. При этом она никуда не делась из обязательств: пока на странице есть поля «имя», «телефон» и «почта», сайт собирает персональные данные, и всё, что из этого следует, следует независимо от того, пришла хоть одна заявка или нет.
Мы сняли форму целиком. Ниже — что именно она стоила, почему удалить компонент недостаточно, и как мы сделали заявление «сайт не собирает персональные данные» проверяемым снаружи, а не обещанием в тексте политики.
Форма — это не поле ввода, а хвост из семи вещей
Когда форму считают «одним компонентом», её цена недооценивается в разы. Вот что на самом деле висело у нас на ней:
- сам компонент с валидацией и состояниями;
- серверный обработчик, принимающий отправку;
- reCAPTCHA — ключи, скрипт на клиенте, проверка на сервере;
- ограничитель частоты запросов, чтобы обработчик не завалили;
- захват UTM-меток, чтобы понимать источник заявки;
- цепочка доставки: обработчик → внешний процесс → CRM, с описанием формата;
- тесты на всё перечисленное.
Плюс восьмое, которое обычно не считают вовсе: политика конфиденциальности должна описывать то, что происходит на самом деле. Наша описывала неверно — и это, честно говоря, было главным аргументом. Текст, который расходится с поведением сайта, хуже отсутствующего текста: он создаёт ложную уверенность у читателя и у самого владельца.
Когда мы всё это сложили, вопрос перестал звучать как «убрать ли форму». Он зазвучал как: что из этого окупается нулём заявок?
Решение: снять поверхность, а не спрятать компонент
Разница принципиальная. «Спрятать» — это убрать форму со страницы. «Снять поверхность» — это чтобы её больше не существовало ни в каком виде.
Мы удалили не только компонент, но и серверный эндпоинт, reCAPTCHA, ограничитель частоты, захват UTM и все относящиеся к ним тесты. Набор проверок у нас похудел с 57 до 34 — и это правильное направление: тесты, охраняющие удалённую функциональность, только создают ощущение покрытия.
Причина не в чистоте кода. Спрятанная форма оставляет живым эндпоинт, а живой эндпоинт принимает персональные данные от любого, кто знает адрес — независимо от того, что нарисовано на странице. Убрать поле ввода и оставить приёмник — значит не закрыть проблему, а перестать её видеть.
Заявление, которое нельзя проверить, ничего не стоит
Дальше начинается интересное. Допустим, вы всё удалили и написали в политике: «сайт не запрашивает имя, телефон и почту». Чем это отличается от той самой неверной политики, которая у нас была до этого?
Ничем — пока это только текст. Через полгода кто-нибудь вернёт форму «на пару дней потестить», политика останется прежней, и вы снова там же, откуда ушли. Причём заметить это будет некому.
Поэтому утверждение мы сделали проверяемым. Три вещи проверяются на живом проде при каждой выкатке:
- на странице контактов нет ни одного поля ввода;
- скрипт reCAPTCHA не грузится ни на одной странице;
- прежний адрес обработчика отвечает
404, а не принимает данные.
И четвёртая — автотест, который открывает страницу контактов в настоящем браузере и падает, если форма вернулась.
Смысл не в паранойе, а в том, что обязательство теперь охраняется машиной, а не памятью. Вернуть форму по-прежнему можно — но не тихо: сборка покраснеет и заставит переписать политику осознанно, а не задним числом.
Мелочь, которая едва не обманула проверку
Проверять исчезнувший эндпоинт мы сначала стали запросом GET. Он отвечал 405 Method Not Allowed — «метод не разрешён». Выглядит как «адреса нет», а на самом
деле это ответ веб-сервера, который до приложения запрос даже не донёс.
Реальный ответ виден только тем методом, которым форма и отправлялась. Правило отсюда простое: проверяйте удалённый эндпоинт тем же методом, которым к нему обращались, иначе вы измеряете конфигурацию прокси, а не своё приложение.
Самое неочевидное: сайт чист, а приёмник жив
Форма отправляла данные не прямо в CRM, а через внешний процесс-посредник с адресом-вебхуком. Сняв форму с сайта, мы пошли гасить этот процесс — и здесь нас ждали две вещи подряд.
Первая. У вебхука не было проверки секрета. Сайт исправно слал служебный заголовок с токеном, но принимающая сторона его не смотрела вовсе. То есть всё это время адрес принял бы что угодно от кого угодно, кто его знает. Пока форма работала, это было почти незаметно; после её снятия это стало единственной оставшейся дырой.
Вторая, и она дороже. Штатная команда деактивации отработала без ошибок: флаг «активен» переключился в «нет», служебный интерфейс подтвердил деактивацию. А вебхук продолжил принимать запросы. И после перезапуска контейнера — тоже.
Причина в том, что регистрация вебхука живёт отдельной записью, и переключение флага её не трогает. Сработал только полный цикл: включить заново — и выключить через тот же интерфейс, которым включали. После этого адрес наконец начал отвечать «такой вебхук не зарегистрирован».
Обобщение, за которое и стоит держаться: признак «выключено» и факт «не отвечает» — разные вещи, и проверять надо второе. Мы бы этого не увидели, если бы поверили ответу служебного интерфейса и не постучались по адресу руками.
И ещё одно, про порядок: сначала выкатывается сайт без формы, потом гасится приёмник. Обратный порядок оставляет окно, в котором живая форма на проде шлёт заявку в уже мёртвый приёмник — и заявка исчезает молча.
Что осталось вместо формы
Три канала, у каждого свой смысл:
- Telegram — быстрее всего, и там же сразу видно, кто отвечает;
- телефон — для тех, кому проще голосом;
- почта — для тех, кому нужен письменный след.
Разница с формой не только в обязательствах. Форма — это ящик, в который человек опускает письмо и не знает, дошло ли. Любой из трёх каналов — это разговор, в котором сразу видно, что вас услышали.
Что из этого стоит забрать себе
- Посчитайте форму, а не предположите. Если за полгода отправок ноль, вы платите обязательствами за пустой ящик.
- Считайте не компонент, а хвост. reCAPTCHA, лимиты, доставка, CRM, тесты и — главное — политика, которая обязана быть правдой.
- Снимайте поверхность, а не вид. Живой эндпоинт при исчезнувшей форме — это спрятанная проблема, а не решённая.
- Сделайте утверждение проверяемым. Заявление в политике, которое ничем не охраняется, живёт до первой «временной» правки.
- Не верьте признаку «выключено». Стучитесь по адресу и смотрите ответ.
Ничего из этого не является юридической консультацией: мы описываем инженерное решение и его причины, а не даём оценку вашей ситуации.
Что делаем мы сами, если это нужно посчитать и убрать у вас — это автоматизация процессов, и начинается она ровно с такого же вопроса: что здесь окупается, а что просто стоит на месте, потому что так принято.
Как всё устроено у нас теперь — написано в политике. Она короткая и, что важнее, верная.
А как мы после этого разбирались, чему верить в отчётах аналитики, и нашли событие, которое не доходило вообще, — в соседнем разборе.