Сейчас в сети: 1.5K
Настройка целей, отслеживание электронной торговли, многоканальные последовательности и тд
Подсказки
star_border
Ответить
Highlighted

Большие заказы и ограниченяи

Студент ✭

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

В итоге на этапе purchase GA не отправляет заказ Печальный из-за ограничений.

 

При попытке делать несколько purchase событий с одинаковым id транзакций, данные игнорируются после первой порции.

Если дробить заказы на подказы (ID_ЗАКАЗА_1/10, ID_ЗАКАЗА_2/10... ID_ЗАКАЗА_10/10), то вроде работает... Но статистика размытая.

Как быть в таком случае?

1 Ответ экспертаverified_user

Большие заказы и ограниченяи

Ведущий участник

Добрый день

Воспользуйтесь этим решением:
http://www.lunametrics.com/blog/2017/02/16/tracking-large-transactions-w-google-analytics-google-tag...

Большие заказы и ограниченяи

Студент ✭

Андрей, а вы уже пробовали его? У нас что-то не завелось... Вполне возможно что мы не так что-то сделали.

 

В этом решении на сколько я понимаю посылаются новые транзакции с одинаковым id но разными купонами. Пробовали у себя в коде реализовать такой подход и результат нулевой.

Re: Большие заказы и ограниченяи

Ведущий участник

да, пробовал, работает, но что-то изменял. 
Ниже код из рабочего проекта:

 

<script id="gtm-chtml-transaction-chunker">
(function() {
var dlvEcom = {{DLV - Ecommerce - v1}};
// Short-circuit here if nothing doing
if (!dlvEcom || !dlvEcom.purchase) return;
var ecom = cloneEcommTrans_(dlvEcom);
var chunkActionField = clone_(ecom.purchase.actionField);
var products = ecom.purchase.products;
var getUTF8Length = {{JS - getUTF8Length Function}};
var prodParams = {{JS - prodParams Function}};
var payloadLimit = 5000;
var len = products.length;
var counter = 0;
var hitProducts = [];
var transChunkNum = 1;
var prodCounter = 1;
var product, prodLen, i;
// Remove possible duplicate values and zero totals
chunkActionField.revenue = '0.00';
chunkActionField.shipping = '0.00';
chunkActionField.tax = '0.00';
delete chunkActionField.impressions;
for (i = 0; i < len; i++) {
product = products[i];
prodLen = getUTF8Length(prodParams(product, prodCounter));
if (counter + prodLen < payloadLimit) {
prodCounter++;
counter += prodLen;
hitProducts.push(product);
} else {
fireDataLayerEvent(hitProducts, transChunkNum);
hitProducts = [product];
prodCounter = 1;
counter = 0;
transChunkNum++;
}
if (i === len - 1 && hitProducts.length) fireDataLayerEvent(hitProducts, transChunkNum);
}
function fireDataLayerEvent(hitProducts, chunkNum) {
var hitEcom = chunkNum === 1 ? ecom : {
'purchase': {
actionField: clone_(chunkActionField)
}
};
hitEcom.purchase.products = hitProducts;
hitEcom.purchase.actionField.coupon = chunkNum;
dataLayer.push({
'event': 'transChunk',
'ecommerce': hitEcom
});
}
function cloneEcommTrans_(obj) {
var clone = {
purchase: {
actionField: {},
products: []
}
};
var prodsLen = obj.purchase.products.length;
var val, key, prod, prodClone;
var i;
for (i = 0; i < prodsLen; i++) {
prod = obj.purchase.products[i];
prodClone = {};
for (key in prod) {
val = prod[key];
// If we're not at a primative, clone for safety
if (isObject_(val) || isArray_(val)) {
prodClone[key] = clone_(val);
} else {
prodClone[key] = val;
}
}
clone.purchase.products.push(prodClone);
}
for (key in obj.purchase.actionField) {
val = obj.purchase.actionField[key];
// If we're not at a primative, clone for safety
if (isObject_(val) || isArray_(val)) {
clone.purchase.actionField[key] = clone_(val);
} else {
clone.purchase.actionField[key] = val;
}
}
return clone;
}
// Deep cloning utility
function clone_(obj) {
var clone = {};
var newArr;
var arrVal;
var val;
var key;
var i;
if (isArray_(obj)) {
var wrapper = {
val: obj
};
return clone_(wrapper).val;
}
for (key in obj) {
val = obj[key];
if (isObject_(val)) {
clone[key] = clone_(val);
} else if (isArray_(val)) {
newArr = [];
for (i = 0; i < val.length; i++) {
arrVal = val[i];
if (isObject_(arrVal) || isArray_(arrVal)) {
newArr.push(clone_(arrVal));
} else {
newArr.push(arrVal);
}
}
clone[key] = newArr;
} else {
clone[key] = val;
}
}
return clone;
}
function isObject_(obj) {
return typeof obj === 'object' && !isArray_(obj) && !isNull_(obj);
}
function isArray_(obj) {
return obj instanceof Array;
}
function isNull_(obj) {
return null === obj;
}
})();
</script>



На триггер transChunk вешается тег события UA : 

 

2017-09-12_15-10-47.png

 

 

Переменные:
2017-09-12_15-13-19.png

2017-09-12_15-13-36.png

 



Большие заказы и ограниченяи

Ведущий участник

там еще переменные 

JS - Ecommerce Object Custom JavaScript LunaMetrics Transaction Chunker 5 months ago
JS - getUTF8Length Function Custom JavaScript LunaMetrics Transaction Chunker 5 months ago
JS - prodParams Function Custom JavaScript LunaMetrics Transaction Chunker 5 months ago

в них кажется ничего не трогал - это вспомогательные функции

Большие заказы и ограниченяи

Студент ✭

Спасибо. Будем пробовать работать в этом направлении.

 

А в Я.Метрике боролись с этим ограничением? Там похоже работает только способ разбиения одного заказа на несколько подзаказов.

Большие заказы и ограниченяи

Ведущий участник

не пробовал, но вы можете переназначить параметр метрики ecommerce:"dataLayer" на свою переменную и слать через неё, чтобы метрика не перехватывала не обработанные данные

Большие заказы и ограниченяи

Бакалавр ✭ ✭ ✭

Вы можете попробовать выгружать через API - id транзакции в свою CRM, собирать данные и отправлять обратно в GA.

Эксперты темы
Андрей Москалец