Из-за ограничений мессенджеров в России многим приходится возвращаться к SMS-рассылкам. При этом в привычной воронке можно убрать целый этап: номер получателя уже есть в базе, поэтому незачем ждать, пока юзер повторно оставит его в форме на сайте.
Каждому номеру можно назначить персональную ссылку, чтобы по переходу определять, кто заинтересовался предложением, и передавать данные в CRM. Юзер продолжит изучать страницу, а его интерес уже будет зафиксирован. Даже если он закроет сайт, не заполнив заявку, лид не потеряется.
Обычная рассылка ведёт юзера через всю воронку:
SMS → сайт → форма → ввод телефона → CRM
С персональной ссылкой форма для получения номера больше не нужна:
SMS → проверка перехода → данные в CRM ↘ страница предложения
Для такой схемы достаточно внутреннего микросервиса, который создаёт ссылки, хранит их связь с номерами и обрабатывает переходы. В SMS получатель видит короткий адрес:
https://{domain}/Ab7k
За кодом Ab7k стоит запись на сервере с телефоном, кампанией и адресом целевой страницы:
{ "code": "Ab7k", "url": "https://example.com/offer", "meta": { "phone": "+7XXXXXXXXXX", "campaign": "september_offer", "handler": "crm" } }
Телефон в URL не передаётся. При подготовке рассылки сервис нормализует номера, удаляет дубликаты и создаёт для каждого получателя свою ссылку. Ниже упрощённый пример; названия функций обозначают соответствующие операции:
foreach ($phones as $phone) { $link = createShortLink([ 'phone' => $phone, 'campaign' => $campaign, 'target' => $target ]); createSms($phone, $message . ' ' . $link); }
Здесь createSms() готовит запись для загрузки в сервис рассылки. Сам микросервис SMS не отправляет: он готовит персональные ссылки, а затем обрабатывает запросы по ним.
На первый взгляд обработчик перехода помещается в три строки: найти номер по коду, создать лид и перенаправить юзера на сайт.
$record = findByCode($code); createLead($record['meta']['phone']); redirect($record['url']);
Но такой код будет создавать лиды и без участия получателя. Сокращатель может открыть адрес для проверки ещё при создании ссылки, антивирус загружает страницу, чтобы проверить её содержимое. Приложения сообщений на iOS и Android тоже могут обращаться к ссылкам для загрузки превью.
На сервер приходит HTTP-запрос, хотя юзер ничего не нажимал. Если создавать лид по каждому такому запросу, в CRM попадут ложные обращения. Поэтому готовую персональную ссылку нельзя бездумно пропускать через сторонний сокращатель, а первый запрос нельзя считать лидом.
Проверка начинается с User-Agent. Часть автоматических клиентов можно отсеять по характерным строкам:
$suspiciousPatterns = [ 'AndroidDownloadManager', 'iPhonePreview', 'bot', 'crawler', 'spider', 'curl', 'Wget', 'python-requests' ];
Если User-Agent попадает под фильтр и проверочной cookie нет, сервер отвечает кодом 403 и не передаёт данные в CRM. Остальные клиенты без cookie получают промежуточную страницу с JavaScript:
document.cookie = "real_visitor=1; path=/; max-age=3600"; setTimeout(function () { window.location.reload(); }, 100);
Браузер сохраняет cookie и повторно запрашивает тот же адрес. Загрузчик превью, который не выполняет JavaScript, останавливается на первом запросе. Юзер видит короткую загрузку перед открытием целевой страницы.
Это не гарантирует, что ссылку открыл юзер: бот с полноценным браузером тоже умеет выполнять JavaScript и сохранять cookie. Но проверка отсекает часть технических загрузок, которые иначе попали бы в CRM как лиды. Первые запросы остаются в журнале отдельно от событий, переданных в CRM.
После проверки сервис берёт данные из записи ссылки и формирует лид:
$lead = [ 'phone' => $record['meta']['phone'], 'source' => 'sms', 'campaign' => $record['meta']['campaign'], 'target' => $record['url'] ];
Браузер получает редирект на целевую страницу, а отправка webhook продолжается отдельно, поэтому юзеру не приходится ждать ответа CRM. Нужна и защита от дублей: повторные клики одного контакта в одной кампании не должны создавать новые лиды. С пересылкой ссылки другой нюанс: даже если её откроет кто-то ещё, она останется связана с первоначальным получателем.
Переход показывает интерес к предложению, но сам по себе не означает, что получатель ждёт звонка. Рост конверсии до десяти раз здесь относится к зафиксированным лидам, а не к продажам. Из воронки исчезает форма, на которой раньше терялась часть конверсий. Дальше результат зависит от предложения и работы с лидами. Задача сервиса здесь простая: передать данные и не заполнить CRM автоматическими запросами.