Руководитель группы веб-аналитики eLama Антон Леонтьев — о том, какие сервисы помогут составить график динамики активности пользователей.
Любому сервису, будь то система автоматизации работы для маркетологов, образов…
Руководитель группы веб-аналитики eLama Антон Леонтьев — о том, какие сервисы помогут составить график динамики активности пользователей.
Любому сервису, будь то система автоматизации работы для маркетологов, образов…
User_id пользователя мы в этот момент не передаём, так как его значение определяется при загрузке страницы благодаря настройке из первого пункта.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"В отладчике Google Tag Manager это событие будет выглядеть следующим образом:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"e55ae82a-9afa-0384-5103-9d6570806d7a","width":618,"height":300,"size":32067,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"3. Аналогичным образом реализуем событие «пришли рекомендации»:
"}},{"type":"rawhtml","cover":false,"hidden":false,"anchor":"","data":{"raw":"\n"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["где event — название события;","recommendationsCount — количество пришедших рекомендаций;","recommendationsList — идентификаторы рекомендаций, разделённые запятыми."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"User_id пользователя, recommendationsExternalCid и recommendationsAdSystem в этот момент мы не передаём, так как они уже определены в первом и втором пунктах.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Количество событий «запросил рекомендации» и «пришли рекомендации» в отчёте отличается, так как системе нужно несколько секунд на анализ кампании — не все пользователи дожидаются, пока придут рекомендации, иногда происходят ошибки, бывает недостаточно баллов API «Яндекс.Директа». Кроме того, рекомендации приходят после другого события — «обновить рекомендации».
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"4. Аналогично настраиваем событие «переход на ссылку — статью» (переход в Справочный центр eLama из описания рекомендации):
"}},{"type":"rawhtml","cover":false,"hidden":false,"anchor":"","data":{"raw":"\n"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["где event — название события;","recommendationType — идентификатор рекомендации, с которой пользователь взаимодействовал (может быть только одна)."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Так же реализуем остальные события в «Рекомендаторе»: «кликнул на подробнее», «переход на ссылку — кнопку», «переход на ссылку — объявление», «обновил список», «закончились баллы API «Яндекс.Директа», «попросил новую». Вот как эти опции выглядят в интерфейсе инструмента:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"9daf1180-6fd0-a7e3-44a2-7894da957bfd","width":973,"height":671,"size":90597,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"0a8e8677-c33f-e63b-b47c-9289066b25b9","width":971,"height":240,"size":17736,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"5. Теперь нужно создать переменные в Google Tag Manager, соответствующие каждой переменной из dataLayer (кроме event). Например, для recommendationsExternalCid:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"00990807-7629-092d-7e38-dabdee3b164a","width":564,"height":404,"size":25686,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"6. Для каждого события (event в dataLayer) создадим триггер и тег в Google Tag Manager, чтобы отправлять события в Google Analytics. Например, «пришли рекомендации»:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"d6d4d223-2f12-3d79-2e2d-99379a474066","width":979,"height":605,"size":48517,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"618c66f6-b06b-a190-7c1b-5fb1e51015db","width":648,"height":955,"size":58504,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"В категории «события» Google Analytics мы указываем название инструмента, то есть «Рекомендатор». «События» — это тип взаимодействия с инструментом, например, «пришли рекомендации».
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"В ярлык события нам нужно передать остальные параметры: название рекламной системы, id кампании, количество пришедших рекомендаций и их идентификаторы. Поэтому будем передавать их в формате JSON, чтобы можно было обрабатывать в дальнейшем, то есть для нашего примера: {\"adSystem\":\"direct\",\"externalCid\":\"29833481\", \"count\":\"5\",\"list\":\"r03 r04 r05 r08 r20\"}.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"В Google Tag Manager при настройке тега в ярлыке нужно указывать названия переменных в двойных фигурных скобках: {\"adSystem\":\"{{recommendationsAdSystem}}\",\"externalCid\":\"{{recommendationsExternalCid}}\", \"count\":\"{{recommendationsCount}}\",\"list\":\"{{recommendationsList}}\"}
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"User_id пользователя, воспользовавшегося инструментом, тоже можно передавать в ярлыке, но мы сделали иначе, передаём через поле userId и специальный параметр при вызове Google Analytics на странице:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"8871d15d-6d45-a00a-2ca3-fb32a0fa9d87","width":978,"height":754,"size":50680,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"7. Если всё настроили правильно, то в Google Analytics станет доступна статистика по событиям:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"817d3648-5842-eeb7-baf6-5655b7c4324b","width":1039,"height":494,"size":85393,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"fddb58f2-0f3c-c1f5-61da-e2b9ccfd1eb8","width":1126,"height":299,"size":46403,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Если необходимо посмотреть user_id пользователя, то нужно добавить дополнительным параметром в отчёте специальный параметр с индексом четыре, который настроили в шестом пункте.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"8. В простом виде у нас уже есть вся статистика по инструменту. Все события можно выгрузить из Google Analytics в файле Excel и вручную обработать. Но, конечно, этот вариант нас не устроит, поэтому мы будем обрабатывать данные автоматически, используя стриминг несэмплированных данных Google Analytics OWOX BI Pipeline в BigQuery.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Создадим в BigQuery view виртуальную таблицу tools_web.recommender, которая будет содержать все события в инструменте. Дальнейшие отчёты будем строить на её основе. Эта таблица будет выглядеть следующим образом:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"908f2c31-1396-83d5-20bc-9ba8d150863a","width":1072,"height":337,"size":15421,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Например, пользователь 184145 сначала запросил рекомендации, потом ему пришло три рекомендации, в том числе r03 и ещё две, которые не поместились на скриншоте. Затем он кликнул на «подробнее» в рекомендации r03 и перешёл в справку к статье по этой же рекомендации и так далее.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Ниже пример нашего SQL-запроса для создания view:
"}},{"type":"rawhtml","cover":false,"hidden":false,"anchor":"","data":{"raw":"\n"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Сохранение view в интерфейсе BigQuery выглядит следующим образом:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"991d5bf4-751a-d2ca-2276-9b53a2d8c78a","width":849,"height":514,"size":50866,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"9. Построим первый отчёт со статистикой по всем событиям:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"99872b1a-160a-c630-c3a9-f34d8339c58e","width":901,"height":467,"size":23853,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["где eventAction — название события;","adSystem — рекламная система;","count — сколько событий всего было;","campaigns — количество разных кампаний, в которых происходило событие;","users — количество юзеров;","count_r — суммарное количество пришедших рекомендаций;","count_r_avg — среднее количество рекомендаций, которое приходит за один раз;","count_r_median — медианное количество рекомендаций, которое приходит за один раз;","r03, r04, r05 — количество событий, которые произошли с конкретной рекомендацией, например рекомендация r05 пришла всего 5098 раз, в то время, как r03 приходила гораздо чаще — 41294 раза."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"SQL-запрос для получения отчёта будет иметь следующий вид:
"}},{"type":"rawhtml","cover":false,"hidden":false,"anchor":"","data":{"raw":"\n"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"С этим отчётом можно работать не только в интерфейсе Google BigQuery, но и сохранить его в Google Sheets или скачать в CSV. Можно поступить другим образом — создать Google Sheets с доступом коллегам, а в него данные подтягивать через OWOX BI BigQuery Reports, там же можно настроить ежедневное обновление по расписанию.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"10. Построим второй отчёт с динамикой использования «Рекомендатора» по месяцам. В табличном виде он будет выглядеть так:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"808116cb-b7c2-e8c2-104f-02bb24f3631c","width":239,"height":492,"size":45452,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Если же подключить инструмент визуализации, например, Redash, можно получить отчёт в графическом виде:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"b142977e-8c7e-891e-cf68-35d167a9b884","width":1255,"height":259,"size":16738,"type":"png","color":"","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"В нашем случае SQL-запрос выглядит так:
"}},{"type":"rawhtml","cover":false,"hidden":false,"anchor":"","data":{"raw":"\n"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"11. Используя таблицу tools_web.recommender, содержащую все события, можно построить множество других отчётов: возвращаемость пользователей, частоту использования, найти самые проблемные кампании с точки зрения «Рекомендатора», или наоборот. Данные можно сегментировать по географии клиентов (регион определять по Google Analytics), по различным сегментам пользователей, например, по средним чекам, если в BigQuery хранятся транзакции клиентов и так далее.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"12. Так как все события отправляются через Tag Manager, то без проблем можно добавить события «Яндекс.Метрики», Facebook, «ВКонтакте» для сбора рекламных аудиторий для ремаркетинга. А для Google AdWords можно сразу настраивать аудитории по описанным событиям Google Analytics.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Мы разметили события в инструменте, они сохраняются в облачной базе данных, мы научились строить различные отчёты. И всё это собственными руками, практически не отвлекая разработчиков. Если вы не знаете SQL, вам должно хватить скриптов, которые прилагаются к статье.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Недостатки описанного метода:
"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["события не будут срабатывать, если у пользователя не подгрузился Google Analytics или система мобильной аналитики (включён анонимайзер или сама система веб-аналитики заглючила) — будут некоторые потери данных;","стриминг несэмплированных данных в BigQuery платный; или бесплатен в платных версиях систем веб-аналитики;","чтобы разместить события на сайте (в приложении), нужно привлечь разработчиков, но всё равно это гораздо менее трудозатратно, чем полностью отдать всю аналитику на их сторону;","за сбор статистики отвечает не внутренняя система, поэтому возможна подделка событий (спам)."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"#кейсы
"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":7,"favorites":16,"reposts":0,"views":5,"hits":3630,"reads":null,"online":0},"dateFavorite":0,"hitsCount":3630,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":true,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/flood/30439-razrabotka-instrumenta-dlya-analitiki-servisa-bez-pomoshi-programmistov","author":{"id":126010,"name":"Антон Леонтьев","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"7682c757-58be-3cec-af7a-95062b9dfd84","width":0,"height":0,"size":1,"type":"jpg","color":"","hash":"","external_service":[]}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":5295770,"userId":126010,"count":0,"shareImage":"https://api.vc.ru/achievements/share/5295770"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1671683,"userId":126010,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1671683"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":444975,"userId":126010,"count":0,"shareImage":"https://api.vc.ru/achievements/share/444975"}],"lastModificationDate":1765033913,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":199791,"name":"Офтоп","description":"Всё, что не поместилось в другие подсайты, но всё равно может быть интересно посетителям vc.ru.","uri":"/flood","avatar":{"type":"image","data":{"uuid":"42328f5f-b62f-541e-b4e0-2029f8489d47","width":1200,"height":1200,"size":14734,"type":"png","color":"3c3c3c","hash":"406020346c486c64","external_service":[]}},"cover":{"type":"image","data":{"uuid":"ea4f90c7-7ebb-57f7-b3ec-9d7890cad203","width":960,"height":280,"size":177,"type":"png","color":"fcdcfc","hash":"","external_service":[]}},"lastModificationDate":1612968637,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":false,"isDisabledAd":false,"nickname":"flood","isUnsubscribable":true,"badge":null,"badgeId":null,"isDonationsEnabled":false,"isOnline":false,"isPlus":false,"isUnverifiedBlogForCompanyWithoutPro":false,"isVerified":false,"isRemovedByUserRequest":false,"isFrozen":false,"isPro":false,"type":2,"subtype":"community"},"reactions":{"counters":[{"id":1,"count":5}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}}],"cursor":"PuR2GsZKFTvhhGlRAY3r9NSbRrA0Zzqp8pO3vI3Iw0/OL+jFMLKszkRa62JE2A==","isAnonymized":true}};