Продуктовая аналитика в одностраничном веб-приложении (SPA). Часть 1

В этой статье я расскажу о базовой аналитике в связке GTM – Amplitude на SPA (Angular), в т.ч WebView на Android и iOS.

Что такое SPA коротко и доступно написано тут:

Про аналитику в Amplitude рекомендую максимально полезные статьи от Тимура Тукаева

Вероятно, какие-то вещи я повторю снова – т.к сложно избежать желания давать советы.

Важно! Предполагается, что читатель обладает базовыми знаниями и уже пробовал работать с Amplitude и Google Tag Manager

Проблемы аналитики одностраничных веб-приложений

Некоторые продуктовые менеджеры или аналитики привыкли к тому, что по веб-сайтам базовая аналитика собирается из коробки. В первую очередь речь идет про переходы между страницами. Всё, что вы увидите в Google Analytics для страниц на Angular или React – это будет название вашего сайта (как правило это и будет заголовком первой страницы).

Увы, из коробки ничего полезного собираться не будет. Но если вы когда-либо работали с нативными мобильными приложениями, то сложностей с понимаем основных принципов не будет. Хотите получить данные – их нужно разметить (с командой разработки).

Т.к нам все равно все размечать руками, то мой выбор в пользу Amplitude. В следующий раз попробую описать, что можно сделать и с GA4.

Зачем GTM и почему бы не использовать его вместо разработки?

Google Tag Manager полезный инструмент, даже не смотря на ограничения в работе на SPA. Сложность в том, что если проект живой и в разработке, то гарантированно разметить триггеры в GTM (для SPA) не получится - не буду лукавить, есть теги, которые за 6 месяцев жизни проекта действительно не менялись.

За полгода из работающих событий в Amplitude созданных с помощью обычных механизмов GTM (когда вы размечаете триггеры самостоятельно, например, по селекторам - без разработки) осталось не более 30%

Да, селекторы в Angular (и любом другом SPA) тоже часто меняются. Даже название поля ввода - mat-input-0 завтра может стать mat-input-1, если в проекте появились новые поля ввода. SPA вообще не гарантирует нейминг селекторов - хотя тут скорее всего со мной кто-то может поспорить.

Тогда зачем GTM?

- С его помощью я запускаю разные конфигурации Amplitude на разных контурах для теста и для боя (нет смысла заставлять разработчиков решать такую задачу)

- Добавляю свойства событий и пользователей (например, браузер пользователя или размеры разрешения браузера). Много всего, у всех задачи разные

- Проверяю локальные проблемы добавляя временно новые события с помощью селекторов или других идентификаторов

и т.д

Т.е GTM передает события в Amplitude и это удобно, потому что данные можно модифицировать.

Подробнее про GTM почитать тут:

Что под капотом?

Конфигурация Amplitude в GTM

Продуктовая аналитика в одностраничном веб-приложении (SPA). Часть 1

Код в поле HTML для тега конфигурации взять из кабинета Amplitude - JavaScript SDK.

Из необычного в проекте сделан кастомный триггер, который по доменному имени запускает разные конфигурации проектов в Амплитуде.

Саму проверку делаю в переменной

Продуктовая аналитика в одностраничном веб-приложении (SPA). Часть 1

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

С этой переменной работает Триггер на инициализацию с условием активации тега на значение переменной выше (триггера 3 - на 3 разных контура).

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

"window.dataLayer.push({'event':'<название ивента из таблички>', 'property1':'<название свойства события из таблички>', 'property2':'<значения свойства события из таблички>'})

Свойства property1 и property2 из примера вы можете назвать как угодно, но именно с этими именами вам нужно будет создать переменные в GTM чтобы передать их в события. Их может быть столько, сколько вам нужно.

Если разработка все сделала правильно, то в консоли GTM появятся события с неймингом из поля event, свойства этих событий можно посмотреть переключившись на вкладку Data Layer

Продуктовая аналитика в одностраничном веб-приложении (SPA). Часть 1

Подробнее про дата слой тут:

Подключили GTM, настроили конфигурацию Amplitude, шлем пуш события в дата слой - что дальше?

Дальше в GTM создаем Тег с типом Пользовательский HTML

Продуктовая аналитика в одностраничном веб-приложении (SPA). Часть 1

В теге будет примерно следующий код для каждого тэга для события:

<script> var eventProperties = {}; eventProperties.data = {{Data}}; eventProperties.device = {{Device Type}}; eventProperties.platform = {{Platform}}; eventProperties.screen = {{Screen Size}}; eventProperties.timeZone = {{TimeZone}}; eventProperties.touch = {{Touch screen}}; eventProperties.userAgent = {{User Agent}}; eventProperties.parametr1 = {{Parametr1}}; eventProperties.parametr2 = {{Parametr1}}; amplitude.getInstance().setUserProperties({'data': eventProperties.data}); amplitude.getInstance().logEvent('MOE_SOBITIE_DLYA_AMPLITUDE', eventProperties); </script>

В фигурных скобках ссылки на созданные переменные в GTM.

Если вам не нужна кастомизация под разные события, то вместо имени события 'MOE_SOBITIE_DLYA_AMPLITUDE' можно написать {{Event}} (так же заведите его, как переменную) - тогда нейминг ваших событий от разработки сразу будет прокидываться в Амплитуду.

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

Ну и наш Тег (теги) с пользовательским HTML должны запускаться по Триггеру "Специальные события"

Продуктовая аналитика в одностраничном веб-приложении (SPA). Часть 1

Где в поле "Название события" указано значение поле Event от разработки, т.е то значение, что отображает консоль GTM.

Если у вас один Тег с именем {{Event}}, которое передается в Amplitude для всех событий, как я писал выше, то у него будет множество Триггеров под каждое событие. Не забывайте добавлять новые Триггеры с появлением новых ивентов от разработки.

Строчка с amplitude.getInstance().setUserProperties({'data': eventProperties.data}); скорее всего в рамках этой статьи вам не нужна - она присваивает свойства пользователю. Я думаю расскажу об этих особенностях в другой раз.

Полезные переменные

К сожалению, авторство указать сейчас для меня крайне сложно, но думаю кому важно загуглит. Точно помню, что много взял, например, тут:

Название переменных должно быть доступным и легко читаемым - именно к нему вы будете обращаться в Тегах в фигурных скобках.

Тип устройства по ширине экрана

function () { var width = window.innerWidth, screenType; if (width <= 768) { screenType = "mobile"; } else if (width > 768 && width <= 992) { screenType = "tablet"; } else { screenType = "desktop"; } return screenType; }

Платформа

function () {return navigator.platform;}

Размер экрана

function() { var width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); var screenSize = width + 'x' + height; return screenSize; }

Временная зона

function() { var timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; return timeZone; }

Проверка на Touch Screen

function isTouch() { try{ document.createEvent("TouchEvent"); return true; } catch(e){ return false; } }

Юзер Агент

function () {return navigator.userAgent;}

Например, так выглядит парсинг ЮТМ меток (чтобы так же записать)

Продуктовая аналитика в одностраничном веб-приложении (SPA). Часть 1

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

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

Продуктовая аналитика в одностраничном веб-приложении (SPA). Часть 1
44
3 комментария

Комментарий недоступен

GTM по идее увольняет разработку, вашей магии я так до конца и не понял. Первую переменную лучше обернуть в switch case

При конвертации сайта в ПВА приложение, плагины и компоненты встраиваемые в ходе разработки сохраняют работоспособность?