Опубликовано: 08 авг 2020
Предположим, что вы внедрили тегирование расширенной торговли (enhanced ecommere) стандартной Google Analytic через GTM и dataLayer
для сбора данных о воронке покупок. Разработчики, потратив n-ое количество дней, настроили передачу данных в dataLayer о стоимости, названии, id товаров и т. п. и закрыли задачу. Однако через некоторое время вы понимаете, что вам нужно в этой существующей модели что-то изменить, либо протестировать какое-либо изменение, и сделать это нужно без нагрузки беклога разработчиков.
Юзкейсы могут быть разные, в данной статье я разберу специфический пример, который возник у меня на практике, но алгоритм действий можно легко адаптировать под другие подобные задачи.
В моем примере выяснилось, что один из товаров на сайте продается через механизм комиссии, т. е. выручка, отправляемая при событии покупки, не соответствует действительной, а сильно завешена, т. к. по факту компания получает лишь какой-то небольшой процент при продаже этого конкретного товара. Соответственно возникает вопрос качества данных.
В статье мы разберем, как можно скорректировать ecommerce данные из dataLayer
с помощью GTM, и только потом отправить их в Google Analytics и Яндекс Метрику. В данном случае это позволит решить проблему качества данных и как следствие, например, правильно оценивать показатель ROAS в Google Analytics и Яндекс Метрике.
В начале самое простое — нам нужно поместить весь ecommerce объект из dataLayer
в переменную в GTM. Переменную можно создать таким образом:
Как видно из скриншота, мы используем переменную типа Data Layer Variable
с параметром Data Layer Version 1
. Версия "1" в данном случае гарантирует, что предыдущее значение ecommerce переменной будет перезаписано каждый раз новым текущим значением.
Соответственно здесь мы предполагаем, что вы отправляете данные в dataLayer по схеме аналогичной, как на примере:
dataLayer.push(
{
"event": "ecomm",
"eventCategory": "ecomm",
"eventAction": "purchase",
"ecommerce": {
"purchase": {
"actionField": {
"id": 123,
"revenue": 5890
},
"products": [
{
"category": "clothes",
"name": "Рубашка",
"id": "shirt_57",
"price": 890,
"quantity": 1
},
{
"category": "promos",
"name": "Сертификат",
"id": "certificate",
"price": 5000,
"quantity": 1
}
]
}
}
}
)
И мы будем предполагать, что стоит задача изменить выручку от второго товара ("Сертификат") так, чтобы мы брали от нее только 5% в тех транзакциях, в которых он присутствует. Продукт "Сертификат" может присутствовать, может не присутствовать в транзакциях.
Примечание:
Мы имеем возможность модифицировать данные ecommerce объекта перед отправкой в GTM благодаря тому, что данные ecommerce можно подтягивать двумя способами: как из dataLayer
напрямую, так и из переменной. Мы можем прочесть данные из dataLayer
, модифицировать их, как нам нам нужно и поместить их в переменную, которую мы уже и будет использовать в тегах отправки данных.
Создадим функцию, которая вначале прочитывает нетронутый ecommerce объект из dataLayer
в копию объекта, чтобы не модифицировать оригинальный объект. Затем, согласно задаче, просматривает список товаров и если в нем обнаруживает id = "certificate"
, то модифицирует, как цену самого товара, так и значение общей выручки в транзакции. Пусть комиссия от продажи сертификатов равна 5% - это и есть наша выручка по данному товару.
function() {
var ecom = JSON.parse(JSON.stringify({{DLV ecommerce}}));
try {
ecom.purchase.products.forEach(function(prod) {
if (prod.id == "certificate") {
ecom.purchase.actionField.revenue = ecom.purchase.actionField.revenue - prod.price*prod.quantity + prod.quantity*prod.price*0.05;
prod.price = prod.price*0.05;
}
});
} catch(e) {console.log(e)}
return {ecommerce: ecom};
}
В принципе после этого достаточно заменить в соответствующих тегах транзакций источник ecommerce данных (dataLayer) на данную переменную и пропустить следующий шаг, но мне хочется оставить теги транзакций, в которых не присутствует "certificate" нетронутыми, т. е. по прежнему использующими dataLayer
. Просто предпочтение автора, а также возможность вносить дополнительные изменения в соответствующие теги. Поэтому далее, я создам переменную, которая будет узнавать присутствует ли товар "certificate" в транзакции или нет, и буду использовать ее для двух триггеров двух отличных тегов транзакций.
Функция javascript по аналогии с предыдущим шагом просматривает список товаров в транзакции и если находит id = "certificate"
, то возвращает 1
, иначе возвращает 0
. Назовем переменную "JSV isCertificate".
function() {
var isCertificate = 0;
var ecom = JSON.parse(JSON.stringify({{DLV ecommerce}}));
try {
ecom.purchase.products.forEach(function(prod) {
if (prod.id == "certificate") {
isCertificate = 1
}
});
} catch(e) {console.log(e)}
return isCertificate;
}
Таким образом, для события покупки event = "ecomm"
, когда в транзакции отсутствует товар "certificate" зададим следующие тег и триггер:
А когда товар "certificate" присутствует следующие:
На данный момент Workspace Changes в GTM будут следующие:
DLV ecommerce Variable Added JSV ecommerce Variable Added JSV isCertificate Variable Added DLE purchase Trigger Added DLE purchase 2 Trigger Added GA purchase Tag Added GA purchase 2 Tag Added
Примечание:
Еще раз подчеркну, что для решения задачи разделение тегов транзакций (GA purchase) на два зачастую не обязательно, но иногда помогает, и на мой взгляд где-то немного более прозрачно.
В GTM активируйте режим Preview откройте тестовый сайт и в javascript консоли запуште тестовые транзакции - dataLayer.push({...})
. С включенным режимом debug для Google Analytics мы должны увидеть нечто подобное:
Проверьте, что ecommerce объект изменился нужным образом, в нашем случае значение выручки и стоимости товара с нужным id
изменились согласно поставленной задаче.
В Яндекс Метрике, как известно, также можно собирать ecommerce данные и получать отчеты электронной торговли по аналогии с Google Analytics. При этом структуру данных Метрика использует почти ту же, и ecommerce объект также берется из слоя данных, по умолчанию это "dataLayer". Если мы можем модифицировать данные для Google Analytics с помощью забирания данных не из dataLayer
, а из переменной, как быть с Яндекс Метрикой?
Вот тут, как оказывается, и возникает юзкейс, который говорит нам о том, что для Яндекс Метрики мы воспользуемся опцией настройки счетчика, в котором укажем другое имя слоя данных (не "dataLayer") для отправки ecommerce объекта. Тогда мы сможем брать данные из dataLayer
, модифицировать их по аналогии с вышеописанным и затем отправлять уже скорректированные данные в Метрику через указанный для нее слой данных. Назовем его "ymEcom", сделать это нужно естественно в настройках счетчика:
По аналогии с переменной "JSV ecommerce" для Google Analytics нам нужно создать переменную, которая будет корректировать ecommerce объект, но уже для Яндекс Метрики. Назовем ее "JSV ecommerce_ym":
function() {
return function(ecomm) {
var ecom = JSON.parse(JSON.stringify(ecomm));
try {
ecom.purchase.products.forEach(function(prod) {
if (prod.id == "certificate") {
ecom.purchase.actionField.revenue = ecom.purchase.actionField.revenue - prod.price*prod.quantity + prod.quantity*prod.price*0.05;
prod.price = prod.price*0.05;
}
});
} catch(e) {console.log(e)}
return {ecommerce: ecom};
}
}
Единственное отличие данной переменой от ее аналога для GA в том, что функция возвращает не сам ecommerce объект, а функцию, которую мы применим в соответствующем теге, как описано ниже.
Тег отправки данных в Яндекс метрику, прочитывает dataLayer
, видоизменяет некоторые значения согласно задаче с помощью функции описанной выше и затем пушит данные в созданный нами для Метрики слой данных ymEcom
. Поскольку параметр affiliation
не входит в модель данных электронной коммерции в Яндекс Метрике, мы при необходимости отправляем его как параметр визита.
(function(){
var sessionParams = {
affiliation: {{DLV ecommerce}}.purchase.actionField.affiliation,
};
if (typeof window.yaCounter50000000 !== "undefined") {
yaCounter50000000.params(sessionParams);
}
window.ymEcom = window.ymEcom || [];
window.ymEcom.push({{JSV ecommerce_ym}}({{DLV ecommerce}}))
})();
С включенным режимом debug для Яндекс Метрики вы должны видеть в консоли нечто подобное:
Мы можем видеть, что данные отправляются, и что значения для товара "certificate" были изменены нашей функцией, согласно условию. Таким образом, в Яндекс Метрике будут те же основные данные электронной коммерции, что и в Google Analytics. Проверить это еще раз мы естественно можем в интерфейсе Метрики в отчете Электронная коммерция >> Содержимое заказов.