Сергей Макаров

Загрузка сегментов в GA с помощью googleAnalyticsR

Расскажу, как передавать сегменты клиентов в Google Analytics, чтобы использовать в списках ремаркетинга AdWords.

Требования:
— У вас настроен сбор client id. Если нет, то Simo Ahava описал хороший способ.
— Вы настроили кастомный параметр, в который хотите передавать сегмент. В данном примере это dimension18.
— Вы можете связать cid и реальные покупки клиента. У меня  id транзакции в GA совпадает с id транзакции CRM, поэтому я смогу сделать связку.
— Нужны данные о продажах. Ограничусь минимальным набором: дата покупки, id клиента, сумма покупки.
— R и RStudio. Как установить googleAnalyticsR.

Получаем данные из CRM. В моем случае это продакшн база сайта.


library(DBI)
library(RMySQL)
proddb = dbConnect(MySQL(), user="ваш_логин", password="ваш_пароль",
                   dbname="название_бд", host="ваш_хост", port="номер_порта")

mysql_data = dbGetQuery(proddb, "SELECT orderId, date, phone, price from table")

Получили данные. Проверим на выбросы.


boxplot(mysql_data$price)$out

Нашли аутлаеров и скорректировали запрос к бд. Идем дальше.

Делаем сегментацию. Можно начать с простой RFM.


library(easyRFM)
result = rfm_auto(mysql_data,id="phone",payment="price",
                   date="date")
rfm_data = result$rfm
rfm_data$rfm = paste(rfm_data$RecencyClass,rfm_data$FrequencyClass,rfm_data$MonetaryClass,sep = "")

Теперь сдожойним данные сегментации с cid.


# Подключаем библиотеки
library(googleAuthR)
library(googleAnalyticsR)

service_token = gar_auth_service("ваш_service_token.json")

# id представления GA
ga_view = 'id_представления'

# Указываем диапазон дат.
start_date = "2016-01-01"
end_date  = as.character.Date(Sys.Date() - 1)

# Выгружаем данные по транзакциям
ga_transactions = google_analytics_4(ga_view, 
                                     date_range = c(start_date,end_date),
                                     dimensions=c('transactionId','dimension1'), 
                                     metrics = c('transactionRevenue'),
                                     anti_sample = TRUE)

# Формируем таблицу для отправки в Google Analytics
library(sqldf)
get_rfm = sqldf("SELECT DISTINCT merge_data.dimension1 AS dimension1, rfm_data.rfm AS dimension18 FROM 
(SELECT * FROM mysql_data JOIN ga_transactions ON mysql_data.orderId = ga_transactions.transactionId) AS merge_data JOIN rfm_data ON merge_data.phone = rfm_data.phone")

head(get_rfm)
             dimension1 dimension18
1 1414965770.1485039352         455
2  273724521.1480928137         355
3  778576015.1471948435         555
4 1038165458.1456421858         555
5 1534727395.1487304449         555
6  882453544.1469718993         555

Получили сегмент для каждого cid. Теперь загрузим в GA. Есть 2 пути:
— Передать данные с помощью Custom Data import и Management API
— Передать с помощью Measurement Protocol

Custom Data import

Суть метода: формируем файл из нашего датафрейма и отправляем в GA с помощью Management API.


ga_import = ga_custom_upload_file(id_представления, 
                                  "id_ресурса", 
                                  "id_импорта", 
                                  get_rfm)
ga_custom_upload(upload_object = ga_import)

У этого метода серьезные ограничения.

  1. Нельзя загрузить больше 10 GB на ресурс. Для больших проектов этот лимит исчерпается быстро. Выход: удалять старые загрузки.
  2. Из справки: Users, who didn’t visit the site in the 10 days prior to the data upload, will be added to remarking lists upon their next visit to the site. На практике это означает, что списки ремаркетинга получатся урезанными. Если для вас это критично, то посмотрим следующий способ.

Measurement Protocol

Можно отправить данные с помощью Measurement Protocol. Имейте в виду, при отправке запросов в Google Analytics генерируется новая сессия.


library(googleMeasureR)
library(stringi)

for (row in 1:nrow(get_rfm)){
  random = stri_rand_strings(n=1, length=18, pattern="[A-Za-z0-9]")
  gmr_post(list(v=1,t="event",tid="id_ресурса",cid=get_rfm$dimension1[row],ec="rfm_send",ea="rfm_v1",cd18=get_rfm$dimension18[row],z=random))
}
Поделиться
Отправить