Интеграция через Google Analytics API

  • Обновлено

Назначение интеграции

При интеграции через Google Analytics API (далее — GA API) рекламодатель собирает данные о совершенных на сайте действиях у себя в счетчике Google Analytics. Далее через специальный API Admitad Affiliate получает номер заказа, сумму заказа и другие данные и загружает в собственную статистику.

Интеграция через Google Analytics API 1

 


Обратите внимание:

  • При обновлении сайта убедитесь, что счетчик Google Analytics не был удален и продолжает работать.
  • Если у вас имеется мобильная версия сайта или мобильное приложение, формы быстрого заказа или заказа в 1 клик, они также должны быть проинтегрированы в Google Analytics.
     

Для начала работы с Admitad Affiliate предоставьте ссылку перехода на ваш сайт. По умолчанию в качестве основной ссылки используется ссылка из заполненного брифа рекламодателя.

Ссылок перехода может быть и несколько, но только одна из них будет основной ссылкой перехода в программе (по умолчанию).

Пример ссылки перехода
https://site.ru/?utm_source=admitad&utm_medium=cpa&utm_campaign={{publisher_id}}&utm_content={{admitad_uid}}

При выборе интеграции через Google Analytics API рекомендуется использовать стандартные utm-метки — utm_source=admitad&utm_medium=cpa&utm_campaign={{publisher_id}}&utm_content={{admitad_uid}}

 

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

Настройка интеграции через Google Analytics API

Обратите внимание:

  • Здесь и далее будет использоваться сокращение GA API вместо Google Analytics API.
  • Мы не рекомендуем использовать интеграцию через GA API, поскольку счетчик посещений Google уязвим для блокировки антирекламными и другими расширениями.
    Если у вас есть возможность, воспользуйтесь стандартным методом интеграции через трекинг-код. Admitad Affiliate не осуществляет техническую поддержку данной платформы и не несет ответственность за программы, которые пострадали в результате использования Google Analytics в качестве инструмента сбора информации о целевых действиях.
  • Данная инструкция описывает шаги, которые нужно совершить для сбора информации о заказах Admitad Affiliate через GA API.
    Инструкция не является законченной реализацией, а лишь служит ее демонстрацией. Все указанные в инструкции переменные, макросы, правила и теги также являются примером.
     

Шаги интеграции

Предоставьте служебному аккаунту Admitad Affiliate доступ к Google Analytics.

1. Войдите в личный кабинет Google Analytics и в левом нижнем левом углу нажмите «Администратор».

Интеграция через Google Analytics API 2

 

2. Далее перейдите в «Пользовательские определения» → «Специальные параметры».

Интеграция через Google Analytics API 3

 

3. С помощью кнопки«+Специальный параметр» добавьте следующие параметры: 

  • suid (область действия — Hit);
  • user_id (область действия — Hit);
  • hit_id (область действия — Hit);
  • session_id (область действия — Сеанс);
  • client_id (область действия — Сеанс);
  • action_code (область действия — Hit);
  • tariff_code (область действия — Hit).

Интеграция через Google Analytics API 4

 

4. Затем перейдите в раздел «Администратор» → «Отслеживание  → «Код отслеживания».

Интеграция через Google Analytics API 5

 

5. Скопируйте свой идентификатор отслеживания. Его нужно будет добавить в код, представленный в следующем пункте. 

Интеграция через Google Analytics API 6

 

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

В коде после знака // представлены комментарии с подсказками.

  • <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXXX-X"></script> 
    // вместо UA-XXXXXXXXX-X укажите идентификатор отслеживания для вашей GA
      
    <!-- Google Analytics custom dimensions for Admitad -->
      
    <script>
      function clientid() {
          var match = document.cookie.match('(?:^|;)\\s*_ga=([^;]*)');
          var raw = (match) ? decodeURIComponent(match[1]) : null;
          if (raw) {
              match = raw.match(/(\d+\.\d+)$/);
          }
          var gacid = (match) ? match[1] : null;
          if (gacid) {
              return gacid;
          }
      }
    
      function getTimeStamp() {
          var now = new Date();
          var tzo = -now.getTimezoneOffset();
          var dif = tzo >= 0 ? '+' : '-';
          var pad = function(num) {
              var norm = Math.abs(Math.floor(num));
              return (norm < 10 ? '0' : '') + norm;
          };
          return now.getFullYear() +
              '-' + pad(now.getMonth() + 1) +
              '-' + pad(now.getDate()) +
              'T' + pad(now.getHours()) +
              ':' + pad(now.getMinutes()) +
              ':' + pad(now.getSeconds()) +
              '.' + pad(now.getMilliseconds()) +
              dif + pad(tzo / 60) +
              ':' + pad(tzo % 60);
      }
    
      function getSessionId() {
          return new Date().getTime() +
              '.' + Math.random().toString(36).substring(5);
      }
    
      function uuidv4() {
        return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function(c) {return (c ^ (window.crypto || window.msCrypto).getRandomValues(new Uint8Array(1))[0] & 15 >> c /   4).toString(16)});
      }
    
    
      function referrer() {
          if (document.referrer === "") {
              return "direct none"
          } else return document.referrer
      }
    
      window.dataLayer = window.dataLayer || [];
    
      function gtag() {
          dataLayer.push(arguments);
      }
      gtag('js', new Date());
    
      gtag('config', 'UA-XXXXXXXXX-X'); // вместо UA-XXXXXXXXX-X здесь и в следующей строке укажите идентификатор отслеживания для вашей GA
      gtag('config', 'UA-XXXXXXXXX-X', {
          'custom_map': {
              'dimensionX': 'suid',
              'dimensionX': 'client_id',
              'dimensionX': 'user_id',
              'dimensionX': 'session_id',
              'dimensionX': 'hit_id'
          } // для dimensionX вместо Х вставьте соответствующие индексы параметров, которые вы создали в пункте 3
      });
      gtag('event', 'apv', {
          'suid': uuidv4(),
          'client_id': clientid(),
          'user_id': 'id пользователя в вашей системе', // если ID неизвестен, нужно передавать пустую строку. Подробнее о настройках User ID
          'session_id': getSessionId(),
          'hit_id': getTimeStamp(),
      });
    </script>
    


7. Включите отслеживание электронной торговли (Ecommerce Tracking) в интерфейсе GA, если не сделали это ранее.

Статьи с информацией по настройке электронной торговли (Ecommerce).

Настройка Ecommerce — обязательный элемент, без него интеграция невозможна.

8. Скопируйте код, представленный ниже, и добавьте его на страницу «Спасибо за покупку».

В коде после знака // представлены комментарии с подсказками.
{{ value }} — так обозначены места, в которых вы должны передавать необходимые значения переменных. 

  • <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXXX-X"></script>
    // вместо UA-XXXXXXXXX-X укажите идентификатор отслеживания для вашей GA
    
    <!-- Google Analytics Ecommerce with custom dimensions for Admitad -->
    <script> 
    window.dataLayer = window.dataLayer || [];
    
    function gtag() {
        dataLayer.push(arguments);
    }
    gtag('js', new Date());
    
    gtag('config', 'UA-XXXXXXXXX-X'); // вместо UA-XXXXXXXXX-X здесь и в следующей строке укажите идентификатор отслеживания для вашей GA
    gtag('config', 'UA-XXXXXXXXX-X', {
        'custom_map': {
            'dimensionX': 'suid',
            'dimensionX': 'client_id',
            'dimensionX': 'user_id',
            'dimensionX': 'hit_id',
            'dimensionX': 'action_code',
            'dimensionX': 'tariff_code'
        } // для dimensionX вместо Х вставьте соответствующие индексы параметров, которые вы создали в пункте 3
    
    });
    
    ga_items = [];
    
    var list_position = 1; 
    
    // этот фрагмент кода нужно повторить для каждой позиции в корзине
    ga_items.push({
        "id": "{{ item.product_id }}",
        "name": "{{ item.product_title }}",
        "quantity": "{{ item.quantity }}",
        "price": "{{ item.price }}",
        "category": "{{ item.product_type }}",
        "list_position": list_position,
        "variant": "{{ item.variant }}",
        "brand": "{{ item.brand }}",
    });
    list_position = list_position + 1; 
    // конец фрагмента кода, который нужно повторить
    
    function getTimeStamp() {
        var now = new Date();
        var tzo = -now.getTimezoneOffset();
        var dif = tzo >= 0 ? '+' : '-';
        var pad = function(num) {
            var norm = Math.abs(Math.floor(num));
            return (norm < 10 ? '0' : '') + norm;
        };
        return now.getFullYear() + '-' + pad(now.getMonth() + 1) + '-' + pad(now.getDate()) + 'T' + pad(now.getHours()) + ':' + pad(now.getMinutes()) + ':' + pad(now.getSeconds()) + '.' + pad(now.getMilliseconds()) + dif + pad(tzo / 60) + ':' + pad(tzo % 60);
    }
    
    function clientid() {
        var match = document.cookie.match('(?:^|;)\\s*_ga=([^;]*)');
        var raw = (match) ? decodeURIComponent(match[1]) : null;
        if (raw) {
            match = raw.match(/(\d+.\d+)$/);
        }
        var gacid = (match) ? match[1] : null;
        if (gacid) {
            return gacid;
        }
    }
    
    function getSessionId() {
        return new Date().getTime() +
            '.' + Math.random().toString(36).substring(5);
    }
    
    function uuidv4() {
        return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function(c) {return (c ^ (window.crypto || window.msCrypto).getRandomValues(new Uint8Array(1))[0] & 15 >> c /   4).toString(16)});
      }
    
    gtag('event', 'purchase', {
        "transaction_id": "{{ order_number }}",
        "affiliation": "",
        "currency": "{{ shop.currency }}",
        "shipping": "{{ shipping_price }}",
        "items": ga_items,
        "action_code": "{{ action_code }}", // нужно передавать значения, заданные при интеграции
        "tariff_code": "{{ tariff_code }}", // нужно передавать значения, заданные при интеграции
        "suid": uuidv4(),
        "client_id": clientid(),
        "user_id": "id пользователя в вашей системе", // если ID неизвестен, нужно передавать пустую строку. Подробнее о настройках User ID
        "session_id": getSessionId(),
        "hit_id": getTimeStamp(),
    });
    </script>


9. Вернитесь в раздел «Администратор» и в колонке «Представление» выберите сайт со статистикой по покупкам и нажмите «Настройки представления».

Интеграция через Google Analytics API 7

 

10. Сообщите идентификатор представления сотруднику Admitad Affiliate.

Интеграция через Google Analytics API 8

 

11. Вернитесь в раздел «Администратор». Если у вас несколько сайтов, в колонке «Представление» в выпадающем списке выберите сайт с нужной статистикой и нажмите «Управление доступом к представлению».

Интеграция через Google Analytics API 9

 

12. В правом верхнем углу нажмите Интеграция через Google Analytics API 13 и выберите «Добавить пользователей».

Интеграция через Google Analytics API 10

 

13. Введите сервисный email пользователя, который вы получили в сопроводительном письме по интеграции.
Выдайте ему права на просмотр и анализ данных и для доступа к API.

Интеграция через Google Analytics API 11

 

 

14. Сообщите сотруднику Admitad Affiliate, что вы предоставили доступ и настроили специальные параметры (Custom dimensions).
После этого технические специалисты Admitad Affiliate подготовят специальный обработчик для сбора заказов. 
В нем будут использоваться следующие значения:

dimensions:

  • ga:transactionId — номер заказа;
  • ga:productSku — номер продукта (может использоваться для определения тарифа);
  • ga:adContent — содержимое метки utm_content (используется для хранения сервисного значения admitad_uid);
  • ga:dateHourMinute — дата и время заказа;
  • ga:currencyCode — код валюты;
     

metrics:

  • ga:itemRevenue — сумма заказа;
  • ga:couponCode — промокод.
     

Дедупликация заказов

Дедупликация заказов в этом методе интеграции включена по умолчанию и определяется на основании последнего платного источника в значении utm_source. Если значение равно admitad, мы считаем заказ своим.

Исключение составляет функция «Уникальный промокод» (подключается по согласованию).
 

Настройка передачи уникальных промокодов

Уникальные промокоды — промокоды, закрепленные за конкретным веб-мастером. Подробнее о них здесь. Если вы намерены работать с уникальными промокодами:

  1. Убедитесь, что в форме оформления заказа на сайте присутствует поле «Промокод».
  2. Убедитесь, что в Google Analytics подключена и настроена передача тегов Enhanced Ecommerce
  3. Передайте уникальный промокод из формы оформления заказа в параметр coupon в GA.
    Примеры: analytics.js / gtag.js

При поступлении заказа со значением coupon, которое соответствует созданному в системе уникальному промокоду, заказ будет присвоен тому веб-мастеру, которому принадлежит этот промокод.

 

Передача данных о заказах в Google Analytics

Заказ может быть не зафиксирован в Google Analytics, если инструмент был заблокирован антирекламным расширением в браузере пользователя (или из-за любой другой ошибки со скриптом Google Analytics).
Чтобы пропущенное целевое действие корректно подгрузилось в статистику Admitad Affiliate, передайте информацию о нем в Google Analytics из своей базы данных. Для этого используется Google Measurement Protocol.

Интеграция через Google Analytics API 12

 

Чтобы резервная передача данных о заказе работала, вам нужно:

  1. Извлекать utm-метки при визите пользователя;
  2. Передавать utm-метки вместе с информацией о заказе в базу данных;
  3. Передавать из базы данных информацию о заказе в Google Analytics через Google Measurement Protocol.
     

Извлечение utm-меток

Извлекать метки нужно для того, чтобы передавать информацию о веб-мастере и источнике перехода — для соответствия атрибуции Last Paid Click.

  • <?php
    
    $cookie_name = 'utm_cookie';
    $expires_days = 90;
    
    foreach ($_GET as $param_name => $param_value) {
        if (substr($param_name, 0, 4) === 'utm_') {
            $cookie_string = $cookie_string . $param_name . '=' . $param_value . ';';
        }
    }
    
    if (isset($cookie_string)) {
        setcookie($cookie_name, $cookie_string, time() + $expires_days * 24 * 60 * 60, '/');
    }
    ?>
 


Скрипт должен извлекать значения utm-меток и перезаписывать их, если приходят новые.
 

Передача utm-меток и данных о заказе

Передача данных о заказе в базу данных о заказе настраивается индивидуально для каждого рекламодателя. Важно вместе с данными о заказе отправлять значения utm-меток из utm_cookie. Уточните у вашего веб-разработчика, передаются ли эти параметры и, если нет, добавьте эту передачу.
 

Передача данных о заказе через Google Measurement Protocol

Настройте передачу данных через Google Measurement Protocol согласно документации Google.

  • <script>
    function send(method, url, data, callback) {
    
        let xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    
        xhr.onreadystatechange = function () {
            if (xhr.readyState === xhr.DONE && xhr.status === 200) {
                if (callback && typeof callback === 'function') {
                    callback(xhr.responseText);
                }
            }
        };
    
        xhr.open(method, url);
        xhr.send(data);
    }
    
    function getProductKey(lp, key) {
        return 'pr' + lp + key;
    }
    
    let url = 'https://www.google-analytics.com/collect';
    let paramsList = [];
    let payload;
    
    let lp = 1;
    
    let item_price;
    {% for item in checkout.line_items %}
    item_price = '' + {{ item.final_price }};
    item_price = insert(item_price, item_price.length - 2, '.');
    
    /*
    ga measurement protocol params
    https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters
    */
    params = {
        'v': 1,
        'tid': 'UA-{{ adv_GA_id }}-1',     // Your GA id
        'cid': ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function(c) {return (c ^ (window.crypto || window.msCrypto).getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)}),
        't': 'pageview',
        'pa': 'purchase',            // event type
        'dh': document.location.hostname,
        'dp': document.location.pathname,
        'dt': document.title,
        'z': '' + Date.now(),
    }
    
    /* purchase fields
    {
      "transaction_id": '{{ order_number }}',
      "affiliation": "{{ utm_source }}",
      "currency": "{{ shop.currency }}",
      "action_code": ""
    }
    */
    
    params['ti'] = '{{ order_number }}';
    params['ta'] = "";
    params['cu'] = "{{ shop.currency }}";
    params['cd1'] = "";
    
    /* product fields
    {
        "id": {{ item.product_id }},
        "name": "{{ item.product.title }}",
        "quantity": {{ item.quantity }},
        "price": '' + item_price,
        "category": "{{ item.product.type }}",
        "list_position": list_position,
        "variant": "{{ item.product.selected_variant.title }}",
        "brand": "{{ item.product.vendor }}"
    }
    */
    
    params[getProductKey(lp, 'id')] =  {{ item.product_id }};
    params[getProductKey(lp, 'nm')] =  "{{ item.product.title }}";
    params[getProductKey(lp, 'qt')] = {{ item.quantity }};
    params[getProductKey(lp, 'pr')] = '' + item_price;
    params[getProductKey(lp, 'ca')] = "{{ item.product.type }}";
    params[getProductKey(lp, 'ps')] = lp;
    params[getProductKey(lp, 'va')] = "{{ item.product.selected_variant.title }}";
    params[getProductKey(lp, 'br')] = "{{ item.product.vendor }}";
    
    paramsList = [];
    for (let p in params) {
        paramsList.push(encodeURIComponent(p.toString()) + "=" + encodeURIComponent(params[p].toString()));
    }
    
    payload = paramsList.join("&");
    send('POST', url, payload);
    
    lp = lp + 1;
    {% endfor %}
    </script>

Была ли эта статья полезной?