Офтоп Антон Леонтьев
3 117

Разработка инструмента для аналитики сервиса без помощи программистов

Руководитель группы веб-аналитики eLama Антон Леонтьев — о том, какие сервисы помогут составить график динамики активности пользователей.

В закладки

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

В eLama есть ряд инструментов для контекстной рекламы: кроссминусация ключевых слов, комбинатор ключевых слов, загрузка расходов «Яндекс.Директа» в Google Analytics, «Рекомендатор», автоматическое управление ставками и другие. Коллег интересуют простые данные: сколько людей пользуются инструментами, какими опциями, насколько часто. Как получить ответы, особенно если ты работаешь в маркетинге, как я?

Первая мысль — поставить задачу разработчикам инструментов. Но у этого варианта есть ряд минусов:

  1. Чтобы получать отчёты, аналитика должна быть встроена в инструмент изначально; если её нет, то придётся дописывать инструмент.
  2. Все действия пользователей нужно логировать в базу, что создаст дополнительную нагрузку на неё. Это может сильно не понравиться программистам.
  3. Задачи от маркетинга обычно не являются приоритетными для команд разработки, поэтому их могут откладывать.
  4. Даже если отдел разработки и сделает аналитику и отчётность, то затем её нужно будет постоянно поддерживать, что-то менять, добавлять новые возможности — а это означает новые задачи и согласования с продакт-менеджерами и постоянное ожидание.
  5. Разные инструменты создают разные команды разработки, используя свой инструментарий. Следовательно, каждый отчёт будет выглядеть иначе — нужно будет самостоятельно приводить их к единому стандарту.
  6. Если логгировать действия в базу данных, то возникнут затруднения с созданием аудиторий для ремаркетинга в рекламных системах (как правило, нужно отправлять события с фронтенда сайта в их пиксели и счётчики). И аудитории можно будет создавать только вручную по email-адресам и другим данным о пользователях.

Хорошим решением задачи может быть введение отдельной должности аналитика в отделе разработки в подчинении у технического директора. Но мы рассмотрим вариант, когда веб-аналитик работает в маркетинге, и сделаем всё сами.

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

  • Google Analytics, если у вас сайт. Все действия пользователей внутри инструментов будем передавать как события;
  • Google BigQuery;
  • сбор несэмплированных данных Google Analytics в BigQuery (если у вас Google Analytics 360, то это будет бесплатно, иначе можно использовать платное решение OWOX BI Pipeline, как делаем мы);
  • для мобильного приложения подойдут стриминги событий в BigQuery из Firebase или AppsFlyer OWOX Pipeline.

Разработку аналитики рассмотрим на примере инструмента «Рекомендатор», который проверяет соответствие кампаний в «Яндекс.Директе» и Google AdWords рекомендациям рекламных систем. Мы построим два отчёта, которые будут ежедневно автоматически обновляться:

1. Какие рекомендации показывались и как с ними взаимодействовали пользователи:

Обозначения полей разберём ниже, когда будем строить этот отчёт.

2. Динамика использования по месяцам: количество пользователей, кампаний, заходов.

1. С каждым действием внутри инструмента нам нужно передавать в Google Analytics user_id пользователя в eLama. Для этого попросим программистов передавать его на фронтенд сайта при каждой загрузке страницы через JavaScript в глобальный массив dataLayer. Например, для пользователя с user_id равным 53300 это будет такая команда:

window.dataLayer = [{ 'user_id': '53300' }];

Её нужно разместить в самом начале исходного кода HTML-страницы:

2. Каждое событие в инструменте будем отправлять в dataLayer. Например, «запросил рекомендации» — когда пользователь заходит в «Рекомендатор»:

В этот момент нужно отправить в dataLayer следующую команду:

  • где event — название события;
  • recommendationsExternalCid — ID кампании в рекламной системе;
  • recommendationsAdSystem — название рекламной системы.

User_id пользователя мы в этот момент не передаём, так как его значение определяется при загрузке страницы благодаря настройке из первого пункта.

В отладчике Google Tag Manager это событие будет выглядеть следующим образом:

3. Аналогичным образом реализуем событие «пришли рекомендации»:

  • где event — название события;
  • recommendationsCount — количество пришедших рекомендаций;
  • recommendationsList — идентификаторы рекомендаций, разделённые запятыми.

User_id пользователя, recommendationsExternalCid и recommendationsAdSystem в этот момент мы не передаём, так как они уже определены в первом и втором пунктах.

Количество событий «запросил рекомендации» и «пришли рекомендации» в отчёте отличается, так как системе нужно несколько секунд на анализ кампании — не все пользователи дожидаются, пока придут рекомендации, иногда происходят ошибки, бывает недостаточно баллов API «Яндекс.Директа». Кроме того, рекомендации приходят после другого события — «обновить рекомендации».

4. Аналогично настраиваем событие «переход на ссылку — статью» (переход в Справочный центр eLama из описания рекомендации):

  • где event — название события;
  • recommendationType — идентификатор рекомендации, с которой пользователь взаимодействовал (может быть только одна).

Так же реализуем остальные события в «Рекомендаторе»: «кликнул на подробнее», «переход на ссылку — кнопку», «переход на ссылку — объявление», «обновил список», «закончились баллы API «Яндекс.Директа», «попросил новую». Вот как эти опции выглядят в интерфейсе инструмента:

5. Теперь нужно создать переменные в Google Tag Manager, соответствующие каждой переменной из dataLayer (кроме event). Например, для recommendationsExternalCid:

6. Для каждого события (event в dataLayer) создадим триггер и тег в Google Tag Manager, чтобы отправлять события в Google Analytics. Например, «пришли рекомендации»:

В категории «события» Google Analytics мы указываем название инструмента, то есть «Рекомендатор». «События» — это тип взаимодействия с инструментом, например, «пришли рекомендации».

В ярлык события нам нужно передать остальные параметры: название рекламной системы, id кампании, количество пришедших рекомендаций и их идентификаторы. Поэтому будем передавать их в формате JSON, чтобы можно было обрабатывать в дальнейшем, то есть для нашего примера: {"adSystem":"direct","externalCid":"29833481", "count":"5","list":"r03 r04 r05 r08 r20"}.

В Google Tag Manager при настройке тега в ярлыке нужно указывать названия переменных в двойных фигурных скобках: {"adSystem":"{{recommendationsAdSystem}}","externalCid":"{{recommendationsExternalCid}}", "count":"{{recommendationsCount}}","list":"{{recommendationsList}}"}

User_id пользователя, воспользовавшегося инструментом, тоже можно передавать в ярлыке, но мы сделали иначе, передаём через поле userId и специальный параметр при вызове Google Analytics на странице:

7. Если всё настроили правильно, то в Google Analytics станет доступна статистика по событиям:

Если необходимо посмотреть user_id пользователя, то нужно добавить дополнительным параметром в отчёте специальный параметр с индексом четыре, который настроили в шестом пункте.

8. В простом виде у нас уже есть вся статистика по инструменту. Все события можно выгрузить из Google Analytics в файле Excel и вручную обработать. Но, конечно, этот вариант нас не устроит, поэтому мы будем обрабатывать данные автоматически, используя стриминг несэмплированных данных Google Analytics OWOX BI Pipeline в BigQuery.

Создадим в BigQuery view виртуальную таблицу tools_web.recommender, которая будет содержать все события в инструменте. Дальнейшие отчёты будем строить на её основе. Эта таблица будет выглядеть следующим образом:

Например, пользователь 184145 сначала запросил рекомендации, потом ему пришло три рекомендации, в том числе r03 и ещё две, которые не поместились на скриншоте. Затем он кликнул на «подробнее» в рекомендации r03 и перешёл в справку к статье по этой же рекомендации и так далее.

Ниже пример нашего SQL-запроса для создания view:

Сохранение view в интерфейсе BigQuery выглядит следующим образом:

9. Построим первый отчёт со статистикой по всем событиям:

  • где eventAction — название события;
  • adSystem — рекламная система;
  • count — сколько событий всего было;
  • campaigns — количество разных кампаний, в которых происходило событие;
  • users — количество юзеров;
  • count_r — суммарное количество пришедших рекомендаций;
  • count_r_avg — среднее количество рекомендаций, которое приходит за один раз;
  • count_r_median — медианное количество рекомендаций, которое приходит за один раз;
  • r03, r04, r05 — количество событий, которые произошли с конкретной рекомендацией, например рекомендация r05 пришла всего 5098 раз, в то время, как r03 приходила гораздо чаще — 41294 раза.

SQL-запрос для получения отчёта будет иметь следующий вид:

С этим отчётом можно работать не только в интерфейсе Google BigQuery, но и сохранить его в Google Sheets или скачать в CSV. Можно поступить другим образом — создать Google Sheets с доступом коллегам, а в него данные подтягивать через OWOX BI BigQuery Reports, там же можно настроить ежедневное обновление по расписанию.

10. Построим второй отчёт с динамикой использования «Рекомендатора» по месяцам. В табличном виде он будет выглядеть так:

Если же подключить инструмент визуализации, например, Redash, можно получить отчёт в графическом виде:

В нашем случае SQL-запрос выглядит так:

11. Используя таблицу tools_web.recommender, содержащую все события, можно построить множество других отчётов: возвращаемость пользователей, частоту использования, найти самые проблемные кампании с точки зрения «Рекомендатора», или наоборот. Данные можно сегментировать по географии клиентов (регион определять по Google Analytics), по различным сегментам пользователей, например, по средним чекам, если в BigQuery хранятся транзакции клиентов и так далее.

12. Так как все события отправляются через Tag Manager, то без проблем можно добавить события «Яндекс.Метрики», Facebook, «ВКонтакте» для сбора рекламных аудиторий для ремаркетинга. А для Google AdWords можно сразу настраивать аудитории по описанным событиям Google Analytics.

Мы разметили события в инструменте, они сохраняются в облачной базе данных, мы научились строить различные отчёты. И всё это собственными руками, практически не отвлекая разработчиков. Если вы не знаете SQL, вам должно хватить скриптов, которые прилагаются к статье.

Недостатки описанного метода:

  • события не будут срабатывать, если у пользователя не подгрузился Google Analytics или система мобильной аналитики (включён анонимайзер или сама система веб-аналитики заглючила) — будут некоторые потери данных;
  • стриминг несэмплированных данных в BigQuery платный; или бесплатен в платных версиях систем веб-аналитики;
  • чтобы разместить события на сайте (в приложении), нужно привлечь разработчиков, но всё равно это гораздо менее трудозатратно, чем полностью отдать всю аналитику на их сторону;
  • за сбор статистики отвечает не внутренняя система, поэтому возможна подделка событий (спам).

#кейсы

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
Статьи по теме
Разработка инструмента для аналитики сервиса без помощи программистов
{ "author_name": "Антон Леонтьев", "author_type": "self", "tags": ["\u043a\u0435\u0439\u0441\u044b"], "comments": 9, "likes": 16, "favorites": 1, "is_advertisement": false, "subsite_label": "flood", "id": 30439, "is_wide": false, "is_ugc": true, "date": "Mon, 11 Dec 2017 14:33:00 +0300" }
{ "id": 30439, "author_id": 126010, "diff_limit": 1000, "urls": {"diff":"\/comments\/30439\/get","add":"\/comments\/30439\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/30439"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199791, "possessions": [] }

9 комментариев 9 комм.

Популярные

По порядку

Написать комментарий...

1

Александр, спасибо за комментарий. Действительно у GA есть лимиты на 10 млн. обращений в месяц. https://developers.google.com/analytics/devguides/collection/analyticsjs/limits-quotas?hl=ru
Но мы не используем данные GA, мы используем данные OWOX стриминга, у них свои сервера. Я почти уверен, там не будет ограничения на 10 млн (завтра напишу в саппорт и отпишусь здесь. нам самим очень далеко до 10 млн).

Касательно языка запросов к БД - это в том числе образовательная статья, и все примеры приведены. Не обязательно быть программистом, чтобы разобраться с SQL.

Касательно пушей событий на сайте и заголовка статьи. Окончательное название статьи остается за редакцией (не автор материала).

Ответить
1

Ответили из саппорта. Лимита не будет.

Ответить
0

Для сбора данных в BigQuery еще есть https://www.ddmanager.ru/streaming/ , если интересны все альтернативы

Ответить
1

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

Ответить
0

кстати, там еще вторая описанная проблема решается, связанная с тем, что всем системам нужны данные и события в разных форматах. Продукт позволяет один раз разметить все события унифицированными данными, а затем автоматически замэпить их на форматы других систем, типа GA, VK, FB, Yandex и т.п. Т.е. нет необходимости каждую систему настраивать по отдельности, достаточно только один раз какое-либо событие отправить, и оно уйдет во все нужные системы.

Ответить
0

Молодцы, круто!
Самое полезное, что видел на VC за последнее время (кроме новостей про Грефа ofc)!

Ответить
0

Спасибо за статью. Power Bi по нашему опыту оказался более мощным в чем-то, именно по части сбора данных. Больше возможных источников, если не ошибаюсь.

Ответить

0
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Команда калифорнийского проекта
оказалась нейронной сетью
Подписаться на push-уведомления
{ "page_type": "default" }