Назначение интеграции
При интеграции через Google Analytics API (далее — GA API) рекламодатель собирает данные о совершенных на сайте действиях у себя в счетчике Google Analytics. Далее через специальный API Admitad Affiliate получает номер заказа, сумму заказа и другие данные и загружает в собственную статистику.
Обратите внимание:
- При обновлении сайта убедитесь, что счетчик Google Analytics не был удален и продолжает работать.
- Если у вас имеется мобильная версия сайта или мобильное приложение, формы быстрого заказа или заказа в 1 клик, они также должны быть проинтегрированы в Google Analytics.
Ссылка перехода Admitad Affiliate
Для начала работы с 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 и в левом нижнем левом углу нажмите «Администратор».
2. Далее перейдите в «Пользовательские определения» → «Специальные параметры».
3. С помощью кнопки «+Специальный параметр» добавьте следующие параметры:
- suid (область действия — Hit);
- user_id (область действия — Hit);
- hit_id (область действия — Hit);
- session_id (область действия — Сеанс);
- client_id (область действия — Сеанс);
- action_code (область действия — Hit);
- tariff_code (область действия — Hit).
4. Затем перейдите в раздел «Администратор» → «Отслеживание → «Код отслеживания».
5. Скопируйте свой идентификатор отслеживания. Его нужно будет добавить в код, представленный в следующем пункте.
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).
- Инструкция от Google по добавлению Ecommerce Tracking на сайт.
- Настройка Ecommerce для gtag.js (новый тип GA).
- Настройка Ecommerce для analytics.js (старый тип GA).
Настройка 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. Вернитесь в раздел «Администратор» и в колонке «Представление» выберите сайт со статистикой по покупкам и нажмите «Настройки представления».
10. Сообщите идентификатор представления сотруднику Admitad Affiliate.
11. Вернитесь в раздел «Администратор». Если у вас несколько сайтов, в колонке «Представление» в выпадающем списке выберите сайт с нужной статистикой и нажмите «Управление доступом к представлению».
12. В правом верхнем углу нажмите и выберите «Добавить пользователей».
13. Введите сервисный email пользователя, который вы получили в сопроводительном письме по интеграции.
Выдайте ему права на просмотр и анализ данных и для доступа к API.
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, мы считаем заказ своим.
Исключение составляет функция «Уникальный промокод» (подключается по согласованию).
Настройка передачи уникальных промокодов
Уникальные промокоды — промокоды, закрепленные за конкретным веб-мастером. Подробнее о них здесь. Если вы намерены работать с уникальными промокодами:
- Убедитесь, что в форме оформления заказа на сайте присутствует поле «Промокод».
- Убедитесь, что в Google Analytics подключена и настроена передача тегов Enhanced Ecommerce
- Передайте уникальный промокод из формы оформления заказа в параметр coupon в GA.
Примеры: analytics.js / gtag.js
При поступлении заказа со значением coupon, которое соответствует созданному в системе уникальному промокоду, заказ будет присвоен тому веб-мастеру, которому принадлежит этот промокод.
Передача данных о заказах в Google Analytics
Заказ может быть не зафиксирован в Google Analytics, если инструмент был заблокирован антирекламным расширением в браузере пользователя (или из-за любой другой ошибки со скриптом Google Analytics).
Чтобы пропущенное целевое действие корректно подгрузилось в статистику Admitad Affiliate, передайте информацию о нем в Google Analytics из своей базы данных. Для этого используется Google Measurement Protocol.
Чтобы резервная передача данных о заказе работала, вам нужно:
- Извлекать utm-метки при визите пользователя;
- Передавать utm-метки вместе с информацией о заказе в базу данных;
- Передавать из базы данных информацию о заказе в 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>