Obecnie 153 forumowiczów jest online
Obecnie 153 forumowiczów jest online
Jeśli jesteś nowy i zaczynasz korzystanie z AdWords w tej kategorii możesz zadawać pytania na temat ustawień kampanii i budżetu, zasad reklamowych, zarządzania kontem czy zatwierdzania reklam.
Poprowadź mnie
star_border
Odpowiedz

Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

B
Student ✭ ✭

Hej,

 

Chciałbym się dowiedzieć, czy ktoś ma może doświadczenie tworzeniu zmiennych w GTM z wartości podstawionych w dataLayer przy eksportowaniu danych do modułu ecommerce w GA.

 

Dokładnie chodzi o dane o produktach, które zostały sprzedane. 
Z tego przykładowego kodu chciałbym wyciągnąć takie dane jak sku, price, quantity i przekazać do innego skryptu w GTM.

<script>
dataLayer = [{
    'transactionId': '1234',
    'transactionAffiliation': 'Ubrania Acme',
    'transactionTotal': 38.26,
    'transactionTax': 1.29,
    'transactionShipping': 5,
    'transactionProducts': [{
        'sku': 'DD44',
        'name': 'Koszulka',
        'category': 'Odzież',
        'price': 11.99,
        'quantity': 1
    },{
        'sku': 'AA1243544',
        'name': 'Skarpetki',
        'category': 'Odzież',
        'price': 9.99,
        'quantity': 2
    }]
}];
</script>

W tym momencie sytuacja wygląda tak, że gdy tworze zmienne w oparci o te dane pojawia się informacja w trybie debugowania: undefined.
Może ktoś miał podobną zagwozdkę i jakoś sobie poradził?

Z góry dzięki za jakąkolwiek pomoc. 

 

Pozdrawiam

Odpowiedź eksperta 1verified_user

Zaakceptowane rozwiązania
Zaakceptowane rozwiązanie.
Rozwiązanie
Zaakceptowane przez autora tematu: B
września 2015

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Profesjonalista ✭

Czyli problem leży w sposobie pobierania danych.
transactionId jest dostępny ale już cena, ilość i sku są przechowywane w zagnieżdżonej tablicy więc trzeba to pobrać przez

transactionProducts.i.sku
transactionProducts.i.price
transactionProducts.i.quantity

Zamiast i musisz wstawić indeks od 0 do ilość produktów - 1

Wyświetl rozwiązanie w oryginalnym poście

Zaakceptowane rozwiązanie.
Rozwiązanie
Zaakceptowane przez autora tematu: B
września 2015

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Wschodząca Gwiazda

Rozwiązanie które zaproponował Marcin byłoby super, jakbyśmy mieli zawsze tą samą ilość obiektów w tablicy.

A ponieważ nie wiemy (i nie możemy z góry założyć) ile produktów ktoś kupi rozwiązanie może być nieefektywne, ze względu na konieczność tworzenia bardzo wielu zmiennych.

 

Moja propozycja jest taka, żeby stworzyć zmienną warstwy danych o nazwie np. Products której przypiszesz wartość całej tablicy transactionProducts.

 

datalayerarray.png

 

Następnie we własnym tagu HTML możesz przypisać zawartość tej tablicy do zmiennej i w zależności od ilości elementów w tablicy w pętli zrobić z nimi, co tam dalej potrzebujesz.

 

Kod może wyglądać np. tak:

 

<script>
var products = {{Products}};

for(var i=0; i<products.length; i++){
  var price = products[i].price;

  var sku = products[i].sku;

  var quantity = products[i].quantity;

}
</script>

 

Jedyne o co musisz zadbać, to by tag był uruchamiany regułą gtm.dom na stronie podziękowania.

 

Chyba że musisz mieć konkretne nazwy zmiennych do wstawienia w jakieś pola, wówczas może być problem.

Tomasz Ciepłucha

Wyświetl rozwiązanie w oryginalnym poście

Zaakceptowane rozwiązanie.
Rozwiązanie
Zaakceptowane przez autora tematu: B
września 2015

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Profesjonalista ✭

tworzysz makro na zmienną dataLayer tak jak pisał Tomek. Powiedzmy, że nazywa się Products.

zmieniasz Twój obecny skrypt na:

<script>
window._oiT = window._oiT || [];
var p = {{Products}};
var products = [];

for(var i = 0; i < p.length; i++) {
products.push({
'sku': p[i].sku,
'price': p[i].price,
'quantity': p[i].quantity
});
}

_oiT.push(['oiKey', 'XXX']); _oiT.push(['eOrder',
{
'mail' : '{{mail}}',
'orderId' : '{{transactionId}}',
'orderAmount' : '{{transactionTotal}}',
'products' : products }
]);
})();
</script>

 

Wyświetl rozwiązanie w oryginalnym poście

Zaakceptowane rozwiązanie.
Rozwiązanie
Zaakceptowane przez autora tematu: B
września 2015

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

[ Edytowane ]
Profesjonalista ✭

ok okazje.info te produkty mają mieć jako array więc poprawiony kod:

<script>
(function() {
window._oiT = window._oiT || [];
var p = {{Products}};
var products = [];

for(var i = 0; i < p.length; i++) {
products.push([
p[i].sku,
p[i].quantity
]);
}

_oiT.push(['oiKey', 'XXX']); _oiT.push(['eOrder',
{
'mail' : '{{mail}}',
'orderId' : '{{transactionId}}',
'orderAmount' : '{{transactionTotal}}',
'products' : products }
]);
})();
</script>

Wyświetl rozwiązanie w oryginalnym poście

Zaakceptowane rozwiązanie.
Rozwiązanie
Zaakceptowane przez autora tematu: B
września 2015

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Wschodząca Gwiazda
To akurat, że w trybie debugowania w Twoim tagu pokazuje się coś takiego:
for(var b=google_tag_manager["GTM-XXXXXX"].macro(\'gtmXXXXXX\')...
wcale nie oznacza, że masz błąd.

Spróbuj wstawić do pętli kod, który Ci wyrzuci na konsolę JavaScript jakieś dane, albo jeszcze lepiej, jeszcze przed pętlą wstaw:
console.log("ilość elementów w tablicy: "+p.length);

Powinno Ci wypisać ilość elementów w tablicy {{Products}}

Tomasz Ciepłucha

Wyświetl rozwiązanie w oryginalnym poście


Wszystkie odpowiedzi

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Profesjonalista ✭
A jak próbujesz pobrać te dane? I w którym momencie? Zakładając, że prawidłowo odwołujesz się do elementów tej tablicy undefined może oznaczać, że próbujesz pobrać jakiś element dataLayer wcześniej niż został on przypisany.

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

B
Student ✭ ✭
Stworzyłem w GTM zmienne odpowiadające wartościom podanych w wyżej wymienionym przykładzie i np. oprócz sku, price i quantity generuje również transactionId.

Wszystkie ze zmienne dodaje do GTM.
Następnie dodaje tag w którym daje skrypt do którego mają zostać dodane zmienne.
wszystkie nazwy są takie jak w dataLayer i wstawiam je w formie:
{{sku}}
{{price}}
{{quantity}}
{{transactionId}}

I dla takiego skryptu dane dotyczące np. transactionId pobierają się prawidłowo, a dla sku, price i quantity nie.

A czy nie ma może tutaj znaczenie struktura, że dane jak sku, price i quantity są tak jakby w drugim poziomie parametru transactionProducts?
Zaakceptowane rozwiązanie.
Rozwiązanie
Zaakceptowane przez autora tematu: B
września 2015

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Profesjonalista ✭

Czyli problem leży w sposobie pobierania danych.
transactionId jest dostępny ale już cena, ilość i sku są przechowywane w zagnieżdżonej tablicy więc trzeba to pobrać przez

transactionProducts.i.sku
transactionProducts.i.price
transactionProducts.i.quantity

Zamiast i musisz wstawić indeks od 0 do ilość produktów - 1

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

[ Edytowane ]
B
Student ✭ ✭

Super właśnie takiego rozwiązania poszukiwałem!

Jeszcze tylko mi powiedz taką rzecz jeszcze. Emotikon: Szczęśliwy
Rozumiem, że definiuję w GTM zmienne jako:
transactionProducts.i.sku
transactionProducts.i.price
transactionProducts.i.quantity

Gdzie za i podstawiam kolejny numer produktu.
I w skrypcie w którym chce to umieścić wstawiam te zmienne w {{...}}, tak?

Przy założeniu że np. w zamówieniu mam 8 produktów muszę zdefiniować 8 zmiennych dla każdego produktu?

Zaakceptowane rozwiązanie.
Rozwiązanie
Zaakceptowane przez autora tematu: B
września 2015

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Wschodząca Gwiazda

Rozwiązanie które zaproponował Marcin byłoby super, jakbyśmy mieli zawsze tą samą ilość obiektów w tablicy.

A ponieważ nie wiemy (i nie możemy z góry założyć) ile produktów ktoś kupi rozwiązanie może być nieefektywne, ze względu na konieczność tworzenia bardzo wielu zmiennych.

 

Moja propozycja jest taka, żeby stworzyć zmienną warstwy danych o nazwie np. Products której przypiszesz wartość całej tablicy transactionProducts.

 

datalayerarray.png

 

Następnie we własnym tagu HTML możesz przypisać zawartość tej tablicy do zmiennej i w zależności od ilości elementów w tablicy w pętli zrobić z nimi, co tam dalej potrzebujesz.

 

Kod może wyglądać np. tak:

 

<script>
var products = {{Products}};

for(var i=0; i<products.length; i++){
  var price = products[i].price;

  var sku = products[i].sku;

  var quantity = products[i].quantity;

}
</script>

 

Jedyne o co musisz zadbać, to by tag był uruchamiany regułą gtm.dom na stronie podziękowania.

 

Chyba że musisz mieć konkretne nazwy zmiennych do wstawienia w jakieś pola, wówczas może być problem.

Tomasz Ciepłucha

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

[ Edytowane ]
Profesjonalista ✭

Nie wiem konkretnie jak chcesz to zaimplementować więc postaram się zgadywać. Jeśli mówimy o wykorzystaniu danych z dataLayer w GTM w niestandardowym tagu html to np:

<script>
var products = {{transactionProducts}};
for(var i=0; i<products.length; i++) {
// tutaj robisz coś z danymi kolejnego produktu np
alert(products[i].sku);
}
</script>

 

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Wschodząca Gwiazda
Marcin - zmienna {{transactionProducts}} będzie tablicą obiektów więc we własnym kodzie HTML do poszczególnych elementów tablicy trzeba się odwoływać normalnie używając nawiasów kwadratowych [ ].
Tylko definiując zmienną warstwy danych jako element tablicy stosuje się kropkę zamiast nawiasów odwołując się do elementu tablicy, tak jak to podałeś we wcześniejszym wpisie.
Tomasz Ciepłucha

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Profesjonalista ✭
tak wiem dlatego poprawiłem jeszcze przed Twoją odpowiedzią Emotikon: Szczęśliwy

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Wschodząca Gwiazda
A to przepraszam, się pospieszyłem w takim razie.
Wychodzi na to, że napisaliśmy dokładnie to samo - co oznacza, że powinno zadziałać Emotikon: Szczęśliwy
Tomasz Ciepłucha

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

B
Student ✭ ✭
Rewelacja. Tylko powiedzcie mi Panowie w takim razie tylko jeszcze jedną rzecz, bo z tego co zrozumiałem, to trzeba zrobić tak.

1. Definiuję zmienną w oparciu o transactionProducts
2. Generuję nowy tag w GTM, który zawiera wyżej wymieniony skrypt, który generuję wartości sku, quantity i price.

I teraz pytanie jak w takim razie przekazać z tego tagu z wartościami sku itp. informacje do innego tagu, który już wcześniej zdefiniowałem w GTM do którego chce by wartości trafiły?

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Profesjonalista ✭
Jeżeli ten inny tag to niestandardowy tag html to po prostu w nim sobie pobierz te zmienne takim właśnie skryptem bez żadnego przekazywania z tagu do tagu.

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

[ Edytowane ]
B
Student ✭ ✭

Hm, to może inaczej. Emotikon: Szczęśliwy Delikatnie mówiąc nie jestem za bardzo biegły w skryptach, więc może na przykładzie.
Mam taki skrypt:

<script type="text/javascript"> (function ()
{
window._oiT = window._oiT || [];
_oiT.push(['oiKey', 'XXX']); _oiT.push(['eOrder',
{
'mail' : '{{mail}}',
'orderId' : '{{transactionId}}',
'orderAmount' : '{{transactionTotal}}',
'products' : '[ // tutaj chciałbym mieć dane sku itp. // ]' }
]);
})();
</script>

Powyżej zaznaczyłem, w którym miejscu chciałbym mieć dane. Czy mógłbym prosić o wskazówkę jak mógłbym dodać ten skrypt?

Zaakceptowane rozwiązanie.
Rozwiązanie
Zaakceptowane przez autora tematu: B
września 2015

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

Profesjonalista ✭

tworzysz makro na zmienną dataLayer tak jak pisał Tomek. Powiedzmy, że nazywa się Products.

zmieniasz Twój obecny skrypt na:

<script>
window._oiT = window._oiT || [];
var p = {{Products}};
var products = [];

for(var i = 0; i < p.length; i++) {
products.push({
'sku': p[i].sku,
'price': p[i].price,
'quantity': p[i].quantity
});
}

_oiT.push(['oiKey', 'XXX']); _oiT.push(['eOrder',
{
'mail' : '{{mail}}',
'orderId' : '{{transactionId}}',
'orderAmount' : '{{transactionTotal}}',
'products' : products }
]);
})();
</script>

 

Zaakceptowane rozwiązanie.
Rozwiązanie
Zaakceptowane przez autora tematu: B
września 2015

Dot.: Tworzenie zmiennych z dataLayer modułu ecommerce w GTM

[ Edytowane ]
Profesjonalista ✭

ok okazje.info te produkty mają mieć jako array więc poprawiony kod:

<script>
(function() {
window._oiT = window._oiT || [];
var p = {{Products}};
var products = [];

for(var i = 0; i < p.length; i++) {
products.push([
p[i].sku,
p[i].quantity
]);
}

_oiT.push(['oiKey', 'XXX']); _oiT.push(['eOrder',
{
'mail' : '{{mail}}',
'orderId' : '{{transactionId}}',
'orderAmount' : '{{transactionTotal}}',
'products' : products }
]);
})();
</script>