Как определить мошенничество CPA-сетей с помощью API Google Analytics и R

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

 

И вот еще одно сообщение:



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

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

Для тех, кто не использует BigQuery в качество хранилища данных сайта я решил сделать решение на R, которое позволяет проверить свои Google Analytics (так же есть версия скрипта для Yandex.Metrika) данные на наличие такой проблемы. Сразу хочу сказать, что решение можно использовать, если в custom dimensions Google Analytics хранятся ClientID, SessionID, Hit Timestamp и Referrer (или использовать версию скрипта для Yandex.Metrika) — эти поля являются необходимыми для решения задачи. Если у вас таких данных нет — самое время настроить сбор таких данных по инструкции от Simo Ahava — Improve Data Collection With Four Custom Dimensions. Это поможет вам в будущем обрабатывать GA данные во внешних системах и строить более сложные отчеты, в том числе по атрибуции. Для Yandex.Metrika решение будет работать для всех аккаунтов — там все необходимые поля являются стандартными.

Если вы никогда не использовали язык программирования R, то стоит для начала установить R (Windows/Mac) и R Studio. Так же, не забудьте установить все используемые библиотеки — команды для их установки находятся в конструкциях "#install.package". Чтобы установить библиотеку достаточно выделить комадну (без знака решетки) и нажать Ctrl+Enter (для Mac — Cmd+Enter). Чтобы запустить весь скрипт — можно выделить весь код и нажать Ctrl+Enter (для Mac — Cmd+Enter). Врочем, изучение вопроса выгрузки данных из GA можно из этой статьи в блоге Burger Data.

Дальше перейдем к конфигурациям скрипта, полный код которого находится внизу этой страницы. Обязательно перед запуском нужно:
  • в 8 и 9 строке нужно указать даты, за которые вы хотите выгрузить данные из Google Analytics;
  • в 11 строке нужно указать канал (utm_medium), по которому будет происходить проверка на перезапись источников трафика;
  • в 14 строке нужно указать View ID Google Analytics, из которого будут выгружаться данные. Это значение можно найти в настройках представления;
  • в 17 строке указаны параметры Google Analytics. В dimension1 — ClientID, dimension5 — SessionID, dimension6 —HitTimestamp, dimension3 — Referrer. Скорее всего, у вас эти даные будут находится под другими индексами, потому здесь и ниже в скрипте нужно поменять индексы custom dimensions на свои.
В каждой строчке кода находятся комментарии, потому можно разобраться в моей логике обработки данных и по необходимости усовершенствовать скрипт. Напомню, скрипт позволяет получить таблицу в Google Sheets, которая показывает список всех пользователей (ClientID), для которых на одной и той же странице в пределах 60 секунд была зафиксирована смена источника трафика.

Пример таблицы для данных Google Analytics:

Подробнее о полях таблицы Google Analytics:
  • ClientID — уникальный идентификатор пользователя;
  • sourceMedium — перезаписанный источник сеанса пользователя;
  • Hit Timestamp — пользовательское время на момент перезаписи источника;
  • pagePath — страница, на которой был перезаписан источник трафика;
  • Referrer — URI страницы, с которой был совершен переход на текущую;
  • timeFromLastHit —столько секунд назад для этого пользователя был зафиксирован хит с другим (предыдущим) источником трафика;
  • lastPagePath —предыдущая страница пользователя, которую просмотрел этот пользователь перед перезаписью источника трафика;
  • sourceLastHit — источник трафика для предыдущей страницы пользователя, которая была не раньше чем 60 секунд назад.
В таблице Google Analytics нет случаев, когда явно видно подозрительную перезапись источника трафика, о которой написано в начале статьи, поскольку сейчас там видно случаи, когда один и тот же пользователь из одной поисковой выдачи Google в пределах 1 минуты кликал по платным и органическим объявлениям одного сайта. Скорее всего, если в такой таблице у вас в Referrer будут отображаться ссылки вашего сайта — это будет свидетельствовать о том, что у вас замечена подозрительная активность CPA-сетей.

Если вы тоже изучали этот вопрос (мошенничества СРА-сетей) — пишите в комментариях, какие случаи встречали и помогло ли мое решение в выявлении такой проблемы.

UPD: версия скрипта для Yandex.Metrika находится по этой ссылке.

Версия скрипта на R для Google Analytics:

Комментарии

  1. Отличная статья, спасибо, будем пробовать!

    От себя ещё добавлю, что через GTM можно задать свои условия, при которых CPA коды зажигать, а при каких нет. Это позволит избежать подмены источника.

    ОтветитьУдалить
    Ответы
    1. Спасибо большое! Рад, что понравилась!

      Удалить
    2. Большое спасибо за статью, есть только одно небольшое замечание, `dplyr` можно использовать гораздо более эффективно, чем просто вызывать функцию `lag`. Например, вторую часть скрипта можно переписать в таком (гораздо более компактном) виде:
      ```
      subGAData <- GAData %>% group_by(dimension1) %>%
      mutate(timeFromLastHit = coalesce(timestamp - lag(timestamp), 0),
      lastPagePath = lag(pagePath, "-"),
      sourceLastHit = lag(sourceMedium, "-")) %>%
      filter(sourceLastHit != sourceMedium) %>%
      filter(pagePath == lastPagePath & timeFromLastHit < 60 & timeFromLastHit > 0) %>%
      select(dimension1, sourceMedium, dimension6, pagePath, dimension3, timeFromLastHit, lastPagePath, sourceLastHit) %>%
      rename(clienID = dimension1, HitTimestamp = dimension6, Referrer = dimension3)
      ```

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

      Удалить
    3. Круто, спасибо за комментарий! Ознакомлюсь.

      Удалить
  2. Технически да, но с точки зрения поведения пользователя упустили один очень важный момент.

    Как с точки зрения пользователя работает схема «зашёл по typein > добавились utm от CPA» ? Действительно ли это просто подстава в JS коде от CPA сетей? Скорее нет! Вот пример: веб-мастер работающий с CPA предлагает пользователю "плюху" за переход по его ссылке и последующую покупку.

    Возможный сценарий:
    1) я знаю, что мне дадут плюху если я куплю именно в магазине Х
    2) я пойду на магазин Х посмотрю цены
    3) вау, да тут акция, цена классная, товар заканчивается (нужное подчеркнуть), куплю прям сейчас
    4) ой... а как мне плюху-то получить от веб-мастера
    5) о! вот заветная ссылочка, надо на неё кликнуть :)

    Несколько вопросов для самих ИМ:

    Если смотреть не на всю CPA, а на веб-мастеров, то все ли этим грешат? Может это веб-мастер, а не вся CPA-сеть

    Если веб-мастер даёт "плюшку" за покупку, то из всех покупок, сколько от новых покупателей? какой % привлечения?

    И самый главный вопрос: купил бы потребитель у вас без «плюхи» или пошёл бы в соседний магазин с «плюхой» от веб-мастера? :)

    ОтветитьУдалить
    Ответы
    1. Сережа, все так. Со всеми вопросами и гипотезами согласен, их нужно проверять на следующем этапе. В статье пытался показать как сделать первый шаг, чтобы понять стоит ли копать в этом направлении (т.е. есть ли прецеденты).

      Удалить

Отправить комментарий

Популярные сообщения из этого блога

Настройка Conversions API (Server-Side API) для Facebook Pixel

Как стримить Google Analytics данные в Facebook Analytics через Pixel

Как незаметно поломать систему аналитики для сайта на базе SPA