«Магическая» SMS-рассылка: как превратить клик в лид

от автора

Из-за ограничений мессенджеров в России многим приходится возвращаться к 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 автоматическими запросами.

ссылка на оригинал статьи https://habr.com/ru/articles/1080298/