КейсыРастИИшка
Разработка

Аналитика форм на сайте: от начала ввода до принятой заявки

В условной компании форма сияет зелёной галочкой, аналитика радуется отправкам, а менеджер сидит перед пустой очередью. Посетитель сделал всё правильно. Кнопка тоже старалась. Только между браузером и местом, где заявку должны разобрать, никто не договорился, что именно означает «успешно». Галочка оказалась самым уверенным участником процесса.

Аналитика форм на сайте — это измерение пути от показа и начала заполнения до подтверждённого приёма обращения. Нужно отдельно учитывать попытку отправки, ошибки, сохранение заявки сервером и передачу в рабочую очередь. Клик по кнопке и событие form_submit не заменяют подтверждение записи. Главный результат — обращение принято и доступно тому, кто должен ответить клиенту.

События формы от начала заполнения до сохранённой записи и подтверждения в рабочей очереди
Редакционная иллюстрация к теме статьи; не фотография клиентского проекта.

Слово «отправлено» нужно разделить на несколько событий

В интерфейсе отправка выглядит как одно действие, но технически состоит из нескольких шагов. Браузер проверяет поля, код собирает запрос, сеть доставляет его серверу, сервер проверяет содержимое и сохраняет запись, затем интеграция переносит её в CRM или иную очередь. Сбой возможен на каждом переходе. Если объединить их одним счётчиком, место потери останется невидимым.

Полезно заранее назвать границы: попытка — клиент попросил отправить; принято — приёмник сохранил обращение и вернул идентификатор; передано — рабочая система подтвердила создание записи; разобрано — сотрудник принял её в работу. Последний этап уже выходит за собственно форму, но помогает не объявлять победу там, где заявка лежит в недоступной папке. Названия должны совпадать в аналитике, интерфейсе и инструкции поддержки.

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

Единицу учёта выбирают раньше графика конверсии

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

Экземпляр формы получает form_instance_id при создании. Попытка отправки — attempt_id. Принятое обращение — lead_id от сервера. Эти коды не должны содержать телефон, email или имя. Их назначение — сопоставить технические события. Они не доказывают, что перед экраном один и тот же человек на всех устройствах. Такую оговорку стоит сохранить прямо в описании отчёта.

СчитаемКлючНа какой вопрос отвечает
Начало конкретной формыform_instance_idКак часто начинают этот интерфейс
Попытку передачиattempt_idГде произошла ошибка отправки
Принятое обращениеlead_idСколько записей попало в приёмник

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

Интерфейс, сеть и рабочая очередь подтверждают разные действия. Один счётчик не заменяет все состояния.
Интерфейс, сеть и рабочая очередь подтверждают разные действия. Один счётчик не заменяет все состояния.

Показ формы и посещение страницы — разные знаменатели

Форма может стоять внизу длинного лендинга или открываться в модальном окне. Посещение страницы не означает, что человек её увидел. Для сравнения двух вариантов интерфейса полезно отдельно учитывать появление формы в видимой области. Внутреннее правило видимости — например, определённая доля блока на экране в течение заданного времени — фиксируют как методику команды, а не общепринятый стандарт.

Событие показа не должно повторяться на каждом небольшом движении прокрутки. Для одного экземпляра достаточно первого подтверждённого показа; повторное открытие модального окна можно учитывать отдельно, если оно нужно для задачи. Иначе нервная прокрутка одного посетителя превратится в десяток возможностей отправить заявку и искусственно ухудшит показатель.

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

Первое взаимодействие полезнее случайного фокуса

Автоматическое измерение удобно для старта. В справке Google Analytics о расширенной статистике form_start относится к первому взаимодействию с формой в сеансе, а form_submit — к отправке формы. Эти события помогают сравнить начало и отправку, но не подтверждают сохранение обращения вашей системой. Особенности конкретной формы всё равно проверяют в отладке.

Собственное событие начала можно определить как первое осмысленное изменение поля. Это полезно там, где autofocus устанавливает курсор автоматически. У выпадающего списка, переключателя и текстового поля разные действия; важно, чтобы выбранное правило охватывало все доступные способы ввода. Клавиатурная навигация не должна исчезать из отчёта только потому, что обработчик слушает мышь.

Автозаполнение тоже учитывают в тестах. Браузер способен подставить данные быстрее привычного сценария ручного ввода. Если команда сравнивает длительность заполнения, нужно знать, что часть быстрых прохождений — нормальное использование сохранённых данных. Не стоит объявлять всякое короткое заполнение ботом и тем более блокировать таких пользователей без других оснований.

Красная рамка — ещё и диагностическое событие

Ошибки полей лучше измерять по коду причины, а не по тексту, который набрал человек. Достаточно form_id, field_name, error_code и версии формы. Значение телефона или комментария не нужно отправлять в аналитику ради выяснения, что маска не приняла допустимый ввод. Такой сбор создаёт дополнительные риски и почти не помогает решению.

Различайте ошибки до отправки и ответ сервера. В описании submit на MDN указано: если встроенная проверка браузера не пройдена, возникает invalid, а submit не происходит. Прямой вызов метода form.submit() также отличается от пользовательской отправки. Поэтому наблюдение только за submit не покажет все попытки и все причины остановки.

Практическая группировка может включать required_missing, format_invalid, consent_missing, server_rejected, rate_limited. Сами названия произвольны; важны стабильность и расшифровка. Если разработчик заменил маску, а код ошибки остался тем же, динамику можно сравнивать. Если каждая версия отправляет новый русский текст, одна причина размазывается по десяткам строк.

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

Кнопку можно нажать, не отправив ни байта

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

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

Отдельная ситуация — несколько кнопок одной формы: «Заказать звонок» и «Получить расчёт». Для анализа сохраняют выбранное действие, а не только название страницы. Если действие меняет обязательные поля или маршрут обработки, это фактически разные сценарии приёмки. Сравнивать их одной общей конверсией можно, но искать причину потерь удобнее по отдельности.

Сценарий сдачи: подтверждение клиенту связано с состоянием приёмника, а доставка в очередь проверяется отдельно.
Сценарий сдачи: подтверждение клиенту связано с состоянием приёмника, а доставка в очередь проверяется отдельно.

Серверное «принято» начинается с сохранённой записи

HTTP-ответ сам по себе не объясняет бизнес-результат. Свойство Response.ok сообщает, что код ответа находится в диапазоне 200–299. Но смысл конкретного успешного ответа определяет ваш API: запись сохранена, задача поставлена в очередь или только принята к дальнейшей проверке. Аналитика должна опираться на этот контракт, а не на зелёный цвет статуса.

Для обычной заявки удобен ответ с lead_id и явным состоянием accepted после надёжного сохранения. Браузер получает идентификатор и показывает подтверждение. Если сервер лишь запустил процесс, интерфейс не обещает того, чего ещё нет. В фоновом журнале можно отдельно отслеживать delivery_pending и delivered_to_queue, не заставляя клиента ждать завершения всех вторичных уведомлений.

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

Здесь важна честность текста. «Заявка принята, мы свяжемся с вами» допустимо только при соответствующем принятии. «Менеджер уже получил» требует отдельного основания. Нет необходимости рассказывать покупателю о каждой внутренней очереди, но нельзя скрывать неудачу за неизменной страницей благодарности. Она должна зависеть от реального ответа приёмника.

При тайм-ауте неизвестность нельзя превратить в дубль

Самый неприятный вариант: сервер сохранил запись, а ответ потерялся по дороге. Браузер видит ошибку и предлагает повтор. Если каждый повтор создаёт новую заявку, менеджер получает две карточки, а клиент — два звонка. Для защиты используется ключ повторной отправки: один намеренный запрос имеет устойчивый ключ, по которому приёмник узнаёт уже принятую попытку.

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

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

Веб-аналитика и очередь сверяются по идентификаторам

Блокировщики, настройки приватности, отсутствие согласия, закрытие вкладки и технические ошибки способны уменьшить число браузерных событий. Поэтому веб-аналитика не является бухгалтерским реестром принятых заявок. Для операционной полноты опираются на серверный журнал, а для поведения пользователей — на доступные браузерные события. Разницу объясняют, не подгоняют.

Минимальная сверка: сколько уникальных lead_id создано приёмником, сколько передано в рабочую очередь, сколько имеют допустимое аналитическое событие. Из неё исключают тесты, спам и подтверждённые технические дубли по заранее заданным правилам. Если исключения меняются каждый месяц ради красивой конверсии, сравнение теряет смысл. У отчёта должна быть версия правил.

НаблюдениеВероятная область проверкиЧего не утверждаем
Приёмник знает заявку, аналитика нетБраузерные события и разрешенияЧто клиент не отправлял форму
Аналитика знает успех, приёмник нетМомент отправки события successЧто потеря точно в CRM
Приёмник знает, очередь не знаетДоставка после сохраненияЧто форма работает полностью

Такая сверка не заменяет постоянный контроль пути заявки. Для него полезен отдельный мониторинг сайта и доставки обращений. Аналитика формы отвечает, где пользователи и попытки выпадают; мониторинг проверяет, способен ли путь сейчас работать вообще. Это разные инструменты одной аккуратной эксплуатации.

Различие систем объясняют по идентификаторам: отсутствие браузерного события ещё не означает потерю обращения.
Различие систем объясняют по идентификаторам: отсутствие браузерного события ещё не означает потерю обращения.

Процент без знаменателя — декорация

Рассмотрим учебный набор: 500 подтверждённых показов формы, 200 начатых экземпляров, 120 попыток отправки, 110 принятых заявок, 108 записей в рабочей очереди. Доля начавших среди увидевших — 200 / 500 = 40%. Доля принятых среди начавших — 110 / 200 = 55%. Доставка принятых в очередь — 108 / 110, около 98,2%. Это условные числа для объяснения, не норматив и не результат клиента.

У трёх процентов разные владельцы решения. Первый связан с предложением и размещением формы. Второй — с составом полей, понятностью и техническими сбоями. Третий — с интеграцией после приёма. Нельзя исправить третий показатель сменой цвета кнопки. Также нельзя объявить низкий первый показатель дефектом, если форма для узкой аудитории стоит в справочном материале.

Сравнение ведут за согласованное окно и по сопоставимым устройствам. Две принятые заявки могут попасть в очередь на следующей границе периода. Для диагностики доставки лучше сопоставлять состояние конкретных lead_id спустя разумное время, чем вычитать итоги двух календарных суток. Опоздавшая доставка и потерянная доставка требуют разных действий.

Маленькие сегменты легко производят большие выводы

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

Для каждой гипотезы записывают наблюдение, предполагаемый механизм и альтернативное объяснение. «На мобильных чаще invalid_phone» — наблюдение. «Маска не допускает вставку номера с пробелами» — механизм для воспроизведения. «Изменился состав трафика» — альтернативная версия. До изменения интерфейса достаточно проверить реальные допустимые форматы на тестовых данных, а не объявлять всякий разрыв статистически значимым.

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

Содержание заявки не нужно для измерения поля

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

Нужно проверить не только свои события, но и адрес страницы, название события, служебные сообщения и инструменты записи сессий. Иногда данные незаметно попадают в URL страницы благодарности или в текст кнопки. Маскирование полей на одном экране не доказывает отсутствия копии в другом месте. Разработчик и ответственный за данные согласуют перечень передаваемых параметров до включения расширенного сбора.

Отказ от аналитического сбора не должен отключать обязательную отправку самой формы. Это отдельные цели обработки и отдельные механизмы. В реальном внедрении требования согласуют с ответственным за данные компании; статья не заменяет правовую оценку. Для технической приёмки достаточно убедиться, что отсутствие аналитического события не приводит к исчезновению принятого обращения.

Матрица приёмки должна содержать неприятные сценарии

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

Тестовые обращения помечают понятным признаком, согласуют с отделом продаж и удаляют либо переводят в специальный статус по правилам компании. Серия контрольных отправок не должна запускать реальные обзвоны и уведомления покупателей. Приёмка в живой системе требует маленького объёма и явной маркировки, а не заливания очереди сотней одинаковых «тест тест».

Показательная проверка проходит один маршрут:

  1. Начать заполнение на телефоне и проверить допустимые форматы.
  2. Исправить ошибку и отправить форму.
  3. Получить lead_id и найти ту же запись в рабочей очереди.
  4. Повторить путь с потерей ответа сервера и проверить отсутствие дубля.

Успешная ветка подтверждает возможность работы; неудачная показывает поведение системы при сбое. Для формы это часть приёмки, а не второстепенная роскошь.

За форму отвечает тот, кто видит принятый результат

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

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

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

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

Что считать успешной отправкой формы?

Согласованное подтверждение приёмника после сохранения обращения с идентификатором. Передачу в CRM или рабочую очередь учитывают отдельным состоянием.

Почему form_submit не равен принятой заявке?

Событие описывает отправку формы, но не подтверждает сохранение данных сервером и дальнейшую доставку. Требуется отдельное подтверждение вашего API.

Какие события нужны для начала аналитики форм?

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

Почему в CRM заявок больше, чем в веб-аналитике?

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

Как избежать дублей при повторе после тайм-аута?

Использовать устойчивый ключ повторной отправки в согласованной области действия. Приёмник узнаёт ранее сохранённую попытку и возвращает её результат вместо создания новой записи.

Проверить ключевую операцию до разработки

Опишите одну операцию пользователя, системы-участники и подтверждение успешного результата. На разборе определим прототип и критерии приёмки, включая ошибки и повторы.

Посмотреть подход к разработке ↗

Разобрать интеграцию ↗

Сравниваете несколько направлений? Соберите бриф по задаче.