{"id":14275,"url":"\/distributions\/14275\/click?bit=1&hash=bccbaeb320d3784aa2d1badbee38ca8d11406e8938daaca7e74be177682eb28b","title":"\u041d\u0430 \u0447\u0451\u043c \u0437\u0430\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u044b \u0430\u0432\u0442\u043e?","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"f72066c6-8459-501b-aea6-770cd3ac60a6"}

Как в AppMetrica отследить рекламные переходы с сайта в приложение

Антон Черниговский
Digital Marketing Lead // Цифровая HR Платформа

Предисловие

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

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

Что вы теряете при таком подходе?

В двух словах: много денег и аналитики.
Немного раскрою. Человек приходит на ваш сайт с рекламными UTM-параметрами в адресной строке и уходит в магазины приложений: App Store, Google Play, App Gallery и пр. Скачивает приложение и теряется в статистике, поскольку вы не можете отслеживать какой рекламный канал его принес. А, следовательно, не можете принять решение об оптимизации рекламы исходя из приоритетности событий, которые он совершает.

Беда...

Изучая проблему, я не нашел конкурентов, которые используют что-то сложнее банальной трекинг-ссылки AppMetrica. А такая ссылка не дает ничего, кроме информации, что человек пришел с сайта. Какая рекламная система привела конкретного пользователя и какие in-app действия он совершил – остается загадкой. Но ещё хуже: давать прямые ссылки в сторы.

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

У нас напрямую нет готового решения по передаче меток из адресной строки через кнопки, или того хуже QR, которые никак их не ловят, а просто ведут на какой-то стор, или трекер AppMetrica, который уже ведет в стор.

А теперь перейдём к конкретике.
В этой статье мы реализуем механизм подмены уникальных UTM на кнопках и QR кодах.

Дальше буду расписывать систему отслеживания, применимую к AppMetrica. На отечественном рынке это наиболее доступное, понятное, и, самое главное – бесплатное решение (Яндекс за рекламу не платил, а жаль).

Суть решения

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

Вырисовывается таких 3 штуки:

  • Кнопки на сторы
  • QR-код
  • Форма обратной связи, куда можно забить телефон и получить SMS-ку для скачивания

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

Немного про концепцию наших будущих затей:
Нам нужно с вами передавать данные о UTM-метках через трекер AppMetrica в магазины приложений. Скачивая оттуда наш продукт, пользователь будет атрибутироваться как пришедший с рекламным параметром UTM, который у него был в адресной строке. Для кнопок нам нужно, чтобы сайт ловил эти UTM из адресной строки и подвязывал их в ссылку. Для QR — чтобы генерировался каждый раз разный QR-код, содержащий ссылку + параметры UTM.
Какого-то готового сервиса или решения на данный момент я не нашел, так что напишем сами.

Про органический трафик тоже важно не забывать, поэтому у нас с вами будет 2 трекера — один для органики, другой для PPC-каналов.

1. Подготовка AppMetrica к нашей новой аналитической системе.

1.1. Зайдем в раздел Партнёры и создадим нового кастомного партнера, щелкнув по желтой кнопке с плюсом «Добавить партнера» в правом верхнем углу экрана.
1.2. После того как нажали на «Добавить партнера», создайте партнера, дайте ему имя. Можно сделать 2 партнера для каждого трекера — органики и платного трафика. Вашего партнера никто не увидит, так что можете дать любое имя.
1.3. Перейдите на ваших партнеров, потом нажмите на «Создать трекер». Не обращайте внимания, что у меня указано 2 трекера возле названия, у вас будет 0.
1.4. Введите название вашего трекера, выберите ранее добавленное приложение из выпадающего списка, убедитесь, что партнер выбран ваш, которого мы создавали на прошлом шаге. 
  • Обязательно подключите SmartLink. Это система, которая позволит вам не создавать трекер под каждый магазин приложений. При переходе с разных ОС по вашей ссылке, открываться будет именно нужный магазин приложений для этой ОС. С помощью кнопки "+добавить" вы можете выбрать все магазины приложений, в которых присутствует ваш продукт.
  • Выберите целевую ссылку (добавляются в Настройках — Целевые ссылки)
  • Пункт необязательный. Можете поставить Deeplink и Post-click лендинг. Диплинк — это раздел приложения, который будет открываться у юзера с уже установленным приложением, пост-клик лендинг ведет на страничку, которую вы укажете после клика по ссылке трекера.
1.5. Создайте трекер, сразу после этого вы увидите свою трекинг ссылку. Постбэки мы не трогаем, настройки атрибуции можете оставить по умолчанию.

Обязательно создайте по такой же схеме еще одного партнера и трекер для органического трафика.

2. Скрипт для кнопок на магазины приложений

2.1. Для начала нам нужно добавить HTML-элемент к себе на страницу, который будет содержать в себе ссылку на стор. Сделаем на примере обычной ссылки с картинкой.
Вы можете создать себе локально HTML-файл и там все тестировать перед тем как лить на свой прод.

<a href="" class="button"><img src="https://i.imgur.com/qVfxCkX.png" width="150"></a> <a href="" class="button"><img src="https://i.imgur.com/fxUE40J.png" width="150"></a>

Назначили class ссылкам, ведущим на App Store и Google Play. Естественно, тут ссылки и сам элемент дан для примера, вы можете использовать любой элемент HTML, по нажатию на который можно перейти по ссылке.

2.2. Добавим скрипт в <head>, или загрузите его куда-то как *.js и сошлитесь в ссылке подключения скрипта (script src) в том же <head>

<script> document.addEventListener("DOMContentLoaded", function() { var queryString = window.location.search; var urlParams = new URLSearchParams(queryString); var buttons = document.querySelectorAll('.button'); var storedUTM = sessionStorage.getItem("utm"); if (storedUTM) { buttons.forEach(function(button) { button.href = "https://redirect.appmetrica.yandex.com/serve/123456789/?type=buttons&" + storedUTM; }); } else { var utmParams = ""; var utmParamsArray = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"]; for (const [key, value] of urlParams.entries()) { if (utmParamsArray.includes(key) && value) { utmParams += (utmParams ? "&" : "") + key + "=" + value; } } if (utmParams) { sessionStorage.setItem("utm", utmParams); buttons.forEach(function(button) { button.href = "https://redirect.appmetrica.yandex.com/serve/123456789/?type=buttons&" + utmParams; }); } else { buttons.forEach(function(button) { button.href = "https://redirect.appmetrica.yandex.com/serve/987654321/?utm_source=buttons"; }); } } }); </script>

Подставьте свои ссылки трекеров.
Вместо /987654321/ подставьте свой номер органического трекера.
Вместо /123456789/ подставьте свой PPC трекер.

Остановимся тут поподробнее. Нам важно понимать структуру:

  • Если в адресной строке посетителя сайта нет рекламных UTM (utm_source, utm_medium, utm_campaign, utm_term, utm_content), наш скрипт подставит ссылку органического трекера с utm_source=buttons в параметре, чтобы потом в отчетах мы могли разделить органик трафик на QR, Buttons и SMS.
  • Если в адресной строке есть рекламные UTM, то скрипт подставит ссылку рекламного трекера с параметрами UTM из адресной строки + параметром type, зашитым в ссылку (это тоже нужно для удобных отчетов). Прочие параметры кроме указанных UTM в адресной строке будут атрибутироваться как органический трафик, т. к. мы отслеживаем именно переходы по рекламе, но если вам что-то нужно, можете добавить через запятую в код где идет перечисление UTM.

Посмотрим, как это работает:

Органик ссылка подставилась корректно
PPC трекер тоже подставился корректно, добавился параметр type и UTM, который нашелся в адресной строке. При этом другой параметр "y" он в ссылку не принял, чтобы у вас не захламлялась AppMetrica всякими параметрами реферралок, колтрэкингов и прочим.

Более того, чтобы не возникло ситуации, когда человек зашел на ваш многостраничный сайт с UTM параметрами, и в процессе навигации по сайту их потерял, в итоге решил скачать приложение перейдя по ссылке, а у него параметров уже никаких и в помине нет, и он атрибутируется у вас как органический трафик, я добавил сохранение их в sessionStorage. Параметры будут подставляться в ссылки даже если посетитель их потерял в адресной строке и сохраняться до закрытия вашего сайта.

P.S. у кнопок обязательно должен быть одинаковый class. Если вам нужно отслеживать нажатия на эти кнопки в Яндекс Метрике по отдельности, в GTM создайте события с Click ID, предварительно назначив уникальный ID для каждой кнопки.

3. Скрипт для генерации QR

С кнопками разобрались, давайте ту же ситуацию провернем для QR. В случае с ним нам нужно чтобы он каждый раз генерировался новый, уникальный, вплоть до ключевого слова.

3.1. Для начала в <body> добавим <div>

<div id="qr-code"></div>

3.2. Теперь в head разместим два скрипта. Один скрипт будет ссылаться на библиотеку qrcode.js (полностью бесплатная), и второй скрипт как раз для наших целей. Вы можете также наш основной скрипт загрузить к себе в файловое хранилище и ссылаться таким же script src

<script src="https://cdn.jsdelivr.net/npm/[email protected]/qrcode.js"></script>
<script> document.addEventListener("DOMContentLoaded", function(event) { var currentUrl = new URL(window.location.href); var params = new URLSearchParams(currentUrl.search); var storedParams = sessionStorage.getItem("utmParams") || new URLSearchParams(); var utmParams = new URLSearchParams(storedParams); for (const param of ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"]) { if (params.get(param)) { utmParams.set(param, params.get(param)); } } sessionStorage.setItem("utmParams", utmParams.toString()); var url = utmParams.toString().length > 0 ? "https://redirect.appmetrica.yandex.com/serve/123456789/?type=qr&" + utmParams.toString() : "https://redirect.appmetrica.yandex.com/serve/987654321/?utm_source=qr"; var qr = qrcode(0, 'L'); qr.addData(url); qr.make(); var imgTag = qr.createImgTag(5, 8, 'qr-code-img'); imgTag = imgTag.slice(0, -1) + ' style="width: 125px; height: 125px;">'; document.getElementById("qr-code").innerHTML = imgTag; }); </script>

QR-код будет вести на идентичную кнопкам ссылку и работать по такому же принципу с хранением меток в sessionStorage, пока посетитель не закроет ваш сайт.

Обратите внимание, размеры задаются в:

imgTag = imgTag.slice(0, -1) + ' style="width: 125px; height: 125px;">';

Если удалить эту строку, размер будет захардкоден и будет изменяться только здесь, стили на него не сработают:

var imgTag = qr.createImgTag(5, 8, 'qr-code-img');

Первые две цифры — размер, параметр в кавычках — класс изображения, которое будет создаваться в вашем div "qr-code"
imgTag.slice масштабирует уже сгенерированный код из qr.createImgTag

Если вам нужно увеличить размер QR-кода не теряя качество, измените параметры width и height, а также увеличьте значения qr.createImgTag(5, 8, ...)

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

Проверим:

Для начала зайдем на сайт (заблюрил, личный сайт). И посмотрим какой QR генерируется без UTM. Видим органический трекер и utm_source=qr, чтобы в отчетах было красиво.
Теперь забьем UTM и иной параметр, прям как на кнопках. Ссылка поменялась в QR коде на рекламный трекер и добавила найденный UTM в параметрах
А это как раз работа sessionStorage. Я стер UTM из параметров, но ссылка осталась на рекламный трекер + UTM, т.к. изначально переход был с ними.

Будьте осторожны! Учитывайте длину принимаемых параметров. Многие в utm_content ставят все динамические параметры на свете, такие как {addphrases}.{addphrasestext}.{campaign_type}, ну вы поняли. Если в случае с кнопками в этом ничего страшного нет, они просто передадутся в текстовом значении в AppMetrica, то в случае с QR-кодом если в параметрах будет слишком много текста, вы рискуете получить вот такой QR-код:

Если он мелкий, то есть риск того, что устройство просто не сможет его сосканировать. Поэтому учитывайте этот момент, и либо делайте его крупным, либо ограничивайте количество параметров, которые могут передаваться в UTM, оставляйте нужные.

P.S. для тестов использовал расширение QR Code Reader для Chrome.

3. Схема отслеживания формы телефона / e-mail

UPD: Нашел способ отправки сокращенной ссылки с подменными UTM. Дальше опишу оба способа, первый - банальный, с костылем. И второй с подменой ссылки и попаданием пользователя напрямую в AppMetrica.

UPD Метод 1. Подменная сокращенная ссылка.

Здесь я опишу процесс отправки e-mail, который будет взаимодействовать с API сервиса сокращения ссылок clck.ru

Давайте для теста создадим самую простую форму и <div> для отображения ссылки, которая будет подменяться и отправляться по e-mail.

В <body> напишем следующее:

<form action="send_email.php" method="post"> <input type="hidden" name="shortened-link" id="shortened-link"> <input type="text" name="email" placeholder="Enter your email"> <input type="submit" value="Submit"> </form> <div id="display-link"></div>

Теперь в <head> вставим следующий скрипт:

<script> window.onload = function() { var currentUrl = window.location.search, baseUrl = "https://redirect.appmetrica.yandex.com/serve/987654321/?utm_source=form"; var params = new URLSearchParams(currentUrl); var validUtms = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"]; var utmParams = []; for (const param of validUtms) { if (params.has(param)) { utmParams.push(param + "=" + params.get(param)); } } if (utmParams.length > 0) { baseUrl = "https://redirect.appmetrica.yandex.com/serve/123456789/?type=form&" + utmParams.join("&"); } var shortenedLink = sessionStorage.getItem("shortened-link") || ''; if (!shortenedLink) { var encodedUrl = encodeURIComponent(baseUrl), clckUrl = "https://clck.ru/--?url=" + encodedUrl, xhr = new XMLHttpRequest(); xhr.open("GET", clckUrl, true); xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE) { shortenedLink = xhr.responseText; document.getElementById("shortened-link").value = shortenedLink; document.getElementById("display-link").innerHTML = shortenedLink; sessionStorage.setItem("shortened-link", shortenedLink); } }; xhr.send(); } else { document.getElementById("shortened-link").value = shortenedLink; document.getElementById("display-link").innerHTML = shortenedLink; } }; </script>

Скрипт обращается к API clck.ru, оборачивает ссылку на наш трекер вместе с параметрами utm из адресной строки. Таким образом, логика все та же. Если нет utm в строке, то оборачиваться и отправляться будет ссылка на органический трекер, а если есть, то отправляет на рекламный с соответствующими параметрами из адресной строки.

У нас все так же работает sessionStorage, надежно сохраняя utm до закрытия вкладки, даже если посетитель сайта их потерял во время навигации по нему.

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

Без utm-меток ссылка выглядит так. Давайте развернем и посмотрим, что внутри. Для разворачивания я использую сервис 2ip.ru
Развернутая ссылка выглядит таким образом, именно то что нам нужно без рекламных utm. Органический трекер.
С utm-метками видим уже другую короткую ссылку.

Давайте еще добавим простейший php-код отправки письма на почту и проверим как это работает.
Код должен быть прописан в файле send_email.php в том же каталоге, что и основной ваш файл главной страницы (это в нашем случае, если что разместите где хотите, только подправьте путь в коде <form action="send_email.php" method="post">)

<?php $shortenedLink = $_POST["shortened-link"]; $email = $_POST["email"]; $to = $email; $subject = "Ваша ссылка на скачивание приложения"; $message = "Ссылка на скачивание приложения: $shortenedLink"; $headers = "From: [email protected]"; if(mail($to, $subject, $message, $headers)){ echo "Ссылка на скачивание отправлена Вам на почту!"; } else{ echo "Ошибка отправки ссылки"; } ?>

Код банальный, но для проверки сгодится. Вы естественно отправку делаете под себя, со всеми нужными полями и прочими вещами.

Ссылка пришла, все работает корректно.

Для того чтобы убрать со страницы и из скрипта отображение отправляемой ссылки, уберите из скрипта все строчки:

document.getElementById("display-link").innerHTML = shortenedLink;

и наш <div>

<div id="display-link"></div>

Естественно, для SMS сервиса понадобится код допиливать, у всех сервисов методы разные, но общую суть я передал, теперь важно настроить все под ваши нужды.

Метод 2. Костыль с приемом данных в бэк/CRM

Нам понадобятся:

  • Форма, которая принимает поле телефона/e-mail
  • Сервис SMS-рассылок/отправок эл. писем.
  • Ваш бэк или CRM, которые могут принимать данные по тому, что в эту форму вводят + UTM из адресной строки.
  • Нужно чтобы у вас была регистрация в приложении с использованием телефона/e-mail, чтобы присваивался user_id

Если с CRM все понятно, есть куча готовых решений по ловле таких параметров, у amoCRM, например, то с бэком это очень индивидуально. Ставьте ТЗ вашим разработчикам, чтобы такой функционал они реализовали.

Что мы имеем у каждого пользователя:

  • AppMetrica: User_id, которые присваиваются новым юзерам в приложении
  • База данных/бэк мобилки: Телефон/e-mail, которые можно смэтчить с user_id
  • Результаты сабмита формы CRM/Бэк: UTM + телефон/e-mail

Сама схема:

  • Нам нужно добавить к ссылке органического трекера (или можно создать отдельный для этого канала) utm_source таким образом:
    https://redirect.appmetrica.yandex.com/serve/987654321/?utm_source=sms
  • Оберните эту некрасивую ссылку в какой-нибудь сервис для сокращения ссылок, и отправляйте ее в сокращенном виде при сабмите формы.
  • Выгружайте из AppMetrica все user_id с параметром utm_source=sms
В отчетах: Сегментировать по пользователям, у которых -> Установка -> Параметры трекера
  • Выгружайте из бэка (CRM) телефон/e-mail + UTM
  • Выгружайте из бэка телефон/e-mail + user_id
  • Мэтч!

4. Аналитика

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

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

Здесь мы встречаем созданные нами параметры.
В отчете User Acquisition в органическом трекере я захожу в utm_source и наблюдаю какой трафик чаще всего идет с органики
По трекеру рекламного трафика я захожу сначала в utm_source - это как раз рекламный канал, что нам лида принес. Потом смотрю разделение на type, можем проанализировать разделение на кнопки и QR. Это только платный трафик с сайта!

В отчете событий вы можете выбрать по параметрам сегментации пользователей utm_source или type и выгрузить их user_id, а также посмотреть, какие события совершаются по какому PPC каналу чаще. Такого рода аналитика является незаменимой при перераспределении бюджетов в рамках рекламной активности!

Впрочем, думаю, что если вы пользователь AppMetrica, то разберетесь, что со всем этим делать :)

Подведем итог

Мы с вами сделали автоматизированное отслеживание платного трафика, который идет на сайт и потом скачивает приложение.
Теперь не будем терять его в пучине органики, которая так всех раздражает.
Все скрипты, приведенные в статье собственные, дарю их вам, пользуйтесь на здоровье: )

qrcode.js библиотека бесплатная, к вам никто не постучится.

Успехов вам!

Антон Черниговский

Digital Marketing Lead // Цифровая HR Платформа

Для консультаций:
Telegram: @olgsson

0
12 комментариев
Написать комментарий...
Zheka Sechin

А что, так можно было что ли?)))
Даже не задумывался о том, что это реально отследить, просто замерял органику до и после запуска кампаний. Но это конечно такое себе.
Спасибо, попробуем!

Ответить
Развернуть ветку
Anton Chernigovsky
Автор

Да, органику замерять — дело неблагодарное. Разделить по каналам и кампаниям не получится.
Пожалуйста :)

Ответить
Развернуть ветку
Sveta Artamonova

Антон, спасибо за идею и за скрипт!

Ответить
Развернуть ветку
Anton Chernigovsky
Автор

Пожалуйста! :)

Ответить
Развернуть ветку
Роман Добронравов

Просто супер полезная тема! Спасибо автору за труды.
Gut gemacht!

Ответить
Развернуть ветку
Anton Chernigovsky
Автор

Danke Herr Roman

Ответить
Развернуть ветку
EDGOR Veabilem

Добрый день, а как забирать ссылку трекера с UTM себе в црм?

Ответить
Развернуть ветку
Anton Chernigovsky
Автор

Добрый день. Не очень понял, о чем вы. Можете немного раскрыть вопрос?

Ответить
Развернуть ветку
EDGOR Veabilem

Разные партнеры льют трафик на мое приложение и льют его с разных источников, я у себя на стороне в ЦРМ анализирую эффективность источников, для этого мне нужно получать все utm метки которые в трекере, Яндекс ими делится только по Post API, но мне типо офлайн загрузок не нужно. Может есть решение кроме пост апи?

Ответить
Развернуть ветку
Anton Chernigovsky
Автор

Какая СРМ?

Ответить
Развернуть ветку
EDGOR Veabilem

Самописная, решение написали свой трекер) по фингерпринтам определяем пользователя, теперь проблема интеграции трекера с in app сетками

Ответить
Развернуть ветку
Анастасия Гречановская

А можно совсем чайнику - если я просто для рекламы в ВК делаю трекинг и вставляю его в рекламную кампанию - все, все будет считаться, или в код все равно нужно лезть?

Ответить
Развернуть ветку
9 комментариев
Раскрывать всегда