Radar Leads — защита бизнеса от потери заявок и лидов на сайте
SaaS · Laravel 13 · JavaScript-трекер · Потерянные заявки
Разработал IdeaRadar Leads — сервис, который показывает владельцу сайта заявки, потерянные до отправки формы: посетитель начал вводить имя, телефон или email, но закрыл страницу раньше, чем нажал «Отправить». Обычная CRM и веб-аналитика такую сессию не видят вовсе — событие отправки просто не произошло.
Проект и задача
У сайтов с формами обратной связи есть слепая зона: человек заинтересовался, начал заполнять форму — и не отправил её. Причины разные: отвлёкся, испугался количества полей, потерял связь, засомневался. Для CRM и аналитики этой сессии не существует, потому что событие отправки не произошло.
Задача — сделать сервис, который подключается одним JS-сниппетом к любому сайту, сам находит формы, фиксирует разрешённые поля по мере ввода и показывает такие сессии владельцу сайта отдельно от обычных заявок — без переписывания существующих форм и без доступа к паролям и платёжным данным.
Как это устроено
Трекер на сайте клиента
Один <script defer> с data-site. Скрипт сам находит формы на странице, слушает фокус, изменение полей и отправку и передаёт события через sendBeacon, не блокируя обычную отправку формы.
Приём событий на сервере
Три публичных эндпоинта — начало сессии, пакет событий поля и подтверждение отправки. Отдельный CORS-слой отражает Origin любого подключённого сайта, а реальная проверка «этому сайту разрешено писать эти данные» выполняется внутри контроллера по site_key.
Потерянная заявка
Если сессия долго не проявляла активности и не дошла до отправки — плановая команда переводит её в статус «потеряна». Возврат посетителя к форме снова делает сессию активной.
Чувствительные данные
Поля с паролями, картами и похожими признаками исключаются из записи на уровне трекера и повторно проверяются на сервере — значение не попадает в базу, даже если фронтенд ошибся.
Что я сделал
1. Вход без пароля
Аутентификация только по одноразовому коду на email. В базе нет столбца с паролем — его не может ни утечь, ни забыть пользователь.
2. Проверка подключения без ожидания события
Кнопка «Проверить подключение» не ждёт первого визита реального посетителя: сервер сам запрашивает главную страницу сайта и ищет в HTML тег трекера с нужным ключом. Домен — пользовательский ввод, поэтому перед запросом резолвится IP и отбрасываются приватные и служебные адреса, а сам запрос закрепляется за проверенным IP, чтобы DNS не подменил адрес между проверкой и запросом.
3. Лимит сайтов с обходом для админа
Обычный пользователь подключает ограниченное число сайтов; проверка идёт транзакцией с блокировкой строк, чтобы двойной клик не пробил лимит. Администратору лимит не применяется — ни в форме, ни на сервере.
4. Имперсонация для поддержки
Админ может войти от имени пользователя, чтобы разобраться в вопросе поддержки — каждый вход пишется в отдельный журнал с админом, целью и временем. Войти от своего имени или от имени другого админа нельзя, вложенная имперсонация невозможна по конструкции.
5. Автоматические статусы
Плановые команды переводят активную сессию без действий в «потерянную», а сайт без событий трекера долгое время — в «неактивный». Оба перехода обратимы: любая новая активность возвращает статус «активен».
6. CORS отдельно от остального приложения
Публичный API трекера обслуживает произвольные чужие домены, поэтому у него свой CORS-слой, который не трогает конфигурацию остального приложения. CORS здесь — не граница безопасности: она проходит внутри контроллера, по совпадению домена и ключа сайта.
Безопасность и приватность
- паролей пользователей не существует как сущности — только код на email
- владелец видит только свои сайты и свои заявки: проверка — на уровне политики доступа, а не только интерфейса
- чувствительные поля форм исключаются из записи на стороне трекера и повторно на сервере
- серверная проверка подключения резолвит домен и отбрасывает приватные, петлевые и служебные адреса — защита от SSRF при запросе произвольного пользовательского домена
- каждый вход администратора от имени пользователя фиксируется в журнале имперсонации
Стек
Backend
Laravel 13, PHP 8.3, MySQL. Политики доступа на каждую модель, транзакции с блокировкой строк для лимитов, плановые команды для смены статусов.
Трекер и фронтенд
Собственный JavaScript-трекер без зависимостей, sendBeacon для доставки событий, Blade-интерфейс личного кабинета без отдельной SPA-сборки.
Дальше
Сейчас лимит сайтов — простая плоская величина без тарифов. Следующий шаг — тарифные планы вместо одного порога и более точные правила «потерянной» сессии: не только тайм-аут, но и вес введённых данных.
Частые вопросы
Чем это отличается от обычной CRM?
CRM получает заявку после успешной отправки формы. IdeaRadar Leads работает раньше — на этапе заполнения — и показывает часть обращений, которые до отправки не дошли. Это дополнение к CRM, а не замена.
Замедляет ли трекер сайт клиента?
Скрипт подключается с атрибутом defer и не блокирует загрузку страницы. События отправляются через sendBeacon в фоне, поэтому не задерживают обычную отправку формы.
Что видит владелец сайта из введённых данных?
Только значения разрешённых полей той формы, которую он подключил. Поля, похожие на пароль, платёжные данные и подобные, исключаются из записи и на трекере, и повторно на сервере.
Хранит ли сервис пароли пользователей?
Нет. Вход выполняется только по одноразовому коду на email, в базе нет столбца для пароля.
Как проверяется, что код трекера действительно установлен?
По кнопке в кабинете сервер сам запрашивает главную страницу сайта и ищет тег трекера с ключом этого сайта в HTML — без ожидания визита живого посетителя. Перед запросом проверяется, что домен не указывает на приватный или служебный адрес.
Что делает администратор при имперсонации?
Временно входит от имени пользователя, чтобы разобраться в вопросе поддержки. Действие фиксируется в журнале имперсонации с указанием, кто и когда вошёл от чьего имени.
Нужен похожий сервис или интеграция?
Помогу спроектировать и собрать SaaS-продукт или трекер под конкретную задачу — от аутентификации и политик доступа до защищённых серверных интеграций.



