Курс Google Analytics → Как определить мошенничество CPA-сетей с помощью GA API и R
Если ваш бизнес привлекает трафик на сайт с помощью CPA-сетей — обязательно прочтите историю о том, какие технические хитрости могут использовать недобросовестные партнерские сети:
И вот еще одно сообщение:
От себя добавлю, что я лично встречал такое на одном из украинских интернет магазинов.
Компания OWOX вместе с Райффайзенбанком уже успела сделать отдельный кейс по этой теме и рассказала, как можно обезопасить себя от такого мошенничества используя стриминг сырых данных о посещениях сайта в Google BigQuery.
Для тех, кто не использует BigQuery в качество хранилища данных сайта я решил сделать решение на R, которое позволяет проверить свои Google Analytics данные на наличие такой проблемы. Сразу хочу сказать, что решение можно использовать, если в custom dimensions Google Analytics хранятся ClientID, SessionID, Hit Timestamp и Referrer — эти поля являются необходимыми для решения задачи. Если у вас таких данных нет — самое время настроить сбор таких данных по инструкции от Simo Ahava — Improve Data Collection With Four Custom Dimensions. Это поможет вам в будущем обрабатывать GA данные во внешних системах и строить более сложные отчеты, в том числе по атрибуции.
Если вы никогда не использовали язык программирования R, то стоит для начала установить R (Windows/Mac) и R Studio. Так же, не забудьте установить все используемые библиотеки — команды для их установки находятся в конструкциях «#install.package». Чтобы установить библиотеку достаточно выделить команду (без знака решетки) и нажать Ctrl+Enter (для Mac — Cmd+Enter). Чтобы запустить весь скрипт — можно выделить весь код и нажать Ctrl+Enter (для Mac — Cmd+Enter). Впрочем, изучение вопроса выгрузки данных из GA можно из этой статьи в блоге Burger Data.
Версия скрипта на R для Google Analytics
#install.package("googleAnalyticsR", dependencies = TRUE)
#install.packages("googleAuthR")
library(googleAnalyticsR)#Подключаем библиотеку googleAnalyticsR
library(googleAuthR)#Подключаем библиотеку googleAuthR
ga_auth()
dateFrom <- '2018-03-01' #С какого дня выгружать данные из GA
dateTo <- '2018-03-15' #По какой день выгружать данные из GA
segment_def_for_call <- "users::condition::ga:medium=~cpa" #сегмент пользователей, которые хоть раз были по каналу СРA
seg_obj <- segment_ga4("CPA", segment_id = segment_def_for_call) #задаем сегмент в формат запроса к API
GAData <- google_analytics_4(123456789,
date_range = c(dateFrom,dateTo),
metrics = c("pageviews","sessions"),
dimensions = c("dimension1", "dimension5","sourceMedium", "dimension6","pagePath","dimension3"),
segments = seg_obj,
anti_sample = TRUE) # Запрос к API Google Analytics
GAData <- GAData[order(GAData$dimension1, GAData$dimension6),] #Сортируем данные сначала по ClientID и по HitTimestamp
GAData$timestamp <-substr(GAData$dimension6, 1, 19) #Удаляем из HitTimestamp лишние данные
GAData$timestamp <- gsub("T", " ", GAData$timestamp) # Заменяем "Т" на пробел (нужно для преобразования даты в Timestamp формат)
GAData$timestamp <-as.numeric(as.POSIXct(GAData$timestamp)+7200) #Преобразовываем дату в Timestamp формат и записываем в новую колонку
#install.packages("dplyr")
library(dplyr) #Подключаем библиотеку dplyr для дополнительной обработки дата фрейма
GAData$timeFromLastHit <-GAData$timestamp - lag(GAData$timestamp)#Считаем время с последнего хита и записываем в новую колонку
GAData$timeFromLastHit <- ifelse((GAData$dimension1==lag(GAData$dimension1)), GAData$timeFromLastHit, "0") #Ставим 0 для первого хита пользователя
GAData$lastPagePath <-lag(GAData$pagePath) #
GAData$lastPagePath <- ifelse((GAData$dimension1==lag(GAData$dimension1)), GAData$lastPagePath, "-") #
GAData$sourceLastHit<- lag(GAData$sourceMedium) #Записываем в новую колонку источник предыдущего хита
GAData$sourceLastHit <- ifelse((GAData$dimension1==lag(GAData$dimension1)), GAData$sourceLastHit, "-") #
GAData$NewSession <- ifelse(((GAData$sourceLastHit==GAData$sourceMedium)&(GAData$dimension1==lag(GAData$dimension1))), "No", "Yes") #Записываем в новую колонку признак новой сессии
subGAData <- GAData[!grepl("No", GAData$NewSession),] #Создаем новый датафрейм с хитами, которые спровоцировали новую сессию
subGAData$timeFromLastHit <- as.numeric(as.character(subGAData$timeFromLastHit)) #Конвертируем timeFromLastHit в числовой формат
subGAData <-subset(subGAData, ((timeFromLastHit<60)&(timeFromLastHit>0)&(pagePath==lastPagePath))) #Оставляем в датафрейме только те данные, в которых предыдущая страница равна текущей и время с предыдущего хита < 60
subGAData <- subGAData[,c("dimension1","sourceMedium","dimension6", "pagePath", "dimension3", "timeFromLastHit", "lastPagePath", "sourceLastHit")]
names(subGAData)[1]<-"ClientID" #меняем название колонок
names(subGAData)[3]<-"Hit Timestamp"
names(subGAData)[5]<-"Referrer"
write.csv(subGAData, file = "cpa_cheating.csv") # записываем данные в csv
#install.packages("googlesheets")
library("googlesheets")
gs_upload("cpa_cheating.csv") #записываем данные в гугл таблицу
Дальше перейдем к конфигурациям скрипта. Обязательно перед запуском нужно:
- в 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:
- ClientID — уникальный идентификатор пользователя;
- sourceMedium — перезаписанный источник сеанса пользователя;
- Hit Timestamp — пользовательское время на момент перезаписи источника;
- pagePath — страница, на которой был перезаписан источник трафика;
- Referrer — URI страницы, с которой был совершен переход на текущую;
- timeFromLastHit —столько секунд назад для этого пользователя был зафиксирован хит с другим (предыдущим) источником трафика;
- lastPagePath —предыдущая страница пользователя, которую просмотрел этот пользователь перед перезаписью источника трафика;
- sourceLastHit — источник трафика для предыдущей страницы пользователя, которая была не раньше чем 60 секунд назад.
В таблице Google Analytics нет случаев, когда явно видно подозрительную перезапись источника трафика, о которой написано в начале статьи, поскольку сейчас там видно случаи, когда один и тот же пользователь из одной поисковой выдачи Google в пределах 1 минуты кликал по платным и органическим объявлениям одного сайта. Скорее всего, если в такой таблице у вас в Referrer будут отображаться ссылки вашего сайта — это будет свидетельствовать о том, что у вас замечена подозрительная активность CPA-сетей.
Если вы тоже изучали этот вопрос (мошенничества СРА-сетей) — пишите в комментариях, какие случаи встречали и помогло ли мое решение в выявлении такой проблемы.
Источник: https://iosiuk.blogspot.com/2018/03/cpa-google-analytics-r.html















