01 / 03 screenshot-2026-09-15-at-16.01.31-2.png
Экран 1 из 3 Экран 2 из 3 Экран 3 из 3

Radar Leads — защита бизнеса от потери заявок и лидов на сайте

SaaS · Laravel 13 · JavaScript-трекер · Потерянные заявки

Разработал IdeaRadar Leads — сервис, который показывает владельцу сайта заявки, потерянные до отправки формы: посетитель начал вводить имя, телефон или email, но закрыл страницу раньше, чем нажал «Отправить». Обычная CRM и веб-аналитика такую сессию не видят вовсе — событие отправки просто не произошло.

0паролей у пользователей
3статуса подключения сайта
SSRF-guardв проверке кода на странице
Laravel 13+ PHP 8.3

Проект и задача

У сайтов с формами обратной связи есть слепая зона: человек заинтересовался, начал заполнять форму — и не отправил её. Причины разные: отвлёкся, испугался количества полей, потерял связь, засомневался. Для 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-продукт или трекер под конкретную задачу — от аутентификации и политик доступа до защищённых серверных интеграций.

Обсудить проект в Telegram