websitelytics

Menu

GTM и dataLayer– модификация ecommerce объекта расширенной торговли Google Analytics и электронной коммерции Яндекс Метрики

Опубликовано: 08 авг 2020

Предположим, что вы внедрили тегирование расширенной торговли (enhanced ecommere) стандартной Google Analytic через GTM и dataLayer для сбора данных о воронке покупок. Разработчики, потратив n-ое количество дней, настроили передачу данных в dataLayer о стоимости, названии, id товаров и т. п. и закрыли задачу. Однако через некоторое время вы понимаете, что вам нужно в этой существующей модели что-то изменить, либо протестировать какое-либо изменение, и сделать это нужно без нагрузки беклога разработчиков.

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

В моем примере выяснилось, что один из товаров на сайте продается через механизм комиссии, т. е. выручка, отправляемая при событии покупки, не соответствует действительной, а сильно завешена, т. к. по факту компания получает лишь какой-то небольшой процент при продаже этого конкретного товара. Соответственно возникает вопрос качества данных.

В статье мы разберем, как можно скорректировать ecommerce данные из dataLayer с помощью GTM, и только потом отправить их в Google Analytics и Яндекс Метрику. В данном случае это позволит решить проблему качества данных и как следствие, например, правильно оценивать показатель ROAS в Google Analytics и Яндекс Метрике.

1. Ecommerce объект в dataLayer

В начале самое простое — нам нужно поместить весь 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, модифицировать их, как нам нам нужно и поместить их в переменную, которую мы уже и будет использовать в тегах отправки данных.

2. Javascript переменная для ecommerce объекта

Создадим функцию, которая вначале прочитывает нетронутый 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" в транзакции или нет, и буду использовать ее для двух триггеров двух отличных тегов транзакций.

3. Javascript переменная определяющая, есть ли нужный товар в транзакции

Функция 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;
}

4. Теги и триггеры

Таким образом, для события покупки 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) на два зачастую не обязательно, но иногда помогает, и на мой взгляд где-то немного более прозрачно.

5. Тестирование

В GTM активируйте режим Preview откройте тестовый сайт и в javascript консоли запуште тестовые транзакции - dataLayer.push({...}). С включенным режимом debug для Google Analytics мы должны увидеть нечто подобное:

Проверьте, что ecommerce объект изменился нужным образом, в нашем случае значение выручки и стоимости товара с нужным id изменились согласно поставленной задаче.

6. Яндекс Метрика

В Яндекс Метрике, как известно, также можно собирать 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}}))
})();

6. Тестирование

С включенным режимом debug для Яндекс Метрики вы должны видеть в консоли нечто подобное:

Мы можем видеть, что данные отправляются, и что значения для товара "certificate" были изменены нашей функцией, согласно условию. Таким образом, в Яндекс Метрике будут те же основные данные электронной коммерции, что и в Google Analytics. Проверить это еще раз мы естественно можем в интерфейсе Метрики в отчете Электронная коммерция >> Содержимое заказов.