Expand my Community achievements bar.

Join us January 15th for an AMA with Champion Achaia Walton, who will be talking about her article on Event-Based Reporting and Measuring Content Groups!
SOLVED

product syntax on purchase Page

Avatar

Level 4

I have the below product string on purchase which currently works fine. I would like to add currency events and merchandising eVars. How can I add a sample event to the below logic?

 

I want to add event 1=2.3 and eVar25=”caps” for example

 

try {

var productString = [], cleanProductString
for (i=0; i<adobeDataLayer.length; i++) {
if (adobeDataLayer[i].event == 'purchase') {
var tmp = i;
for (j=0; j < adobeDataLayer[tmp].transaction.orderItems.length; j++)
{	
productString.push(";"+adobeDataLayer[tmp].transaction.orderItems[j].productSKU+";"+adobeDataLayer[tmp].transaction.orderItems[j].quantity+";"+adobeDataLayer[tmp].transaction.orderItems[j].price.toFixed(2));
}
s.products = productString.toString();

}

}

} catch(e) {}

 

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

First of all please read this documentation: https://experienceleague.adobe.com/docs/analytics/implementation/vars/page-vars/products.html?lang=e...

 

the syntax of s.products is

 

s.products = "category;product name;unit, total price; events;merchandisign eVars"

 

For merchandising eVars you need to first configure the eVar to have correct configuration. https://experienceleague.adobe.com/docs/analytics/implementation/vars/page-vars/evar-merchandising.h...

 

Make sure to choose the product syntax if you want to use as part of s.products

 

Based on your code you just need to add 2 more categories separated by a ";"

 

try {

	var productString = [],
		cleanProductString
	for (i = 0; i < adobeDataLayer.length; i++) {
		if (adobeDataLayer[i].event == 'purchase') {
			var tmp = i;
			for (j = 0; j < adobeDataLayer[tmp].transaction.orderItems.length; j++) {
				productString.push(";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].productSKU + 
				    ";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].quantity + 
				    ";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].price.toFixed(2) +
				    ";" +
				    "event1=2.3" +
				    ";" +
				    "eVar25=caps"
				);
			}
			s.products = productString.toString();

		}

	}

} catch (e) {}

 

Please be aware that you can add more than one event and one more than one eVar but they will need to be separated by a pipe "|".

You can omit event but you will still to keep the placeholder for events using ";;"

 

Also the above logic is only good if event and eVar apply to each individual products, however if you want to use it at the global level like shipping price for all products and not for individual products then you should us the merchandising conversion syntax (you will need to configure evar to use this syntax).

 

Code will look as follow:

try {

	var productString = [],
		cleanProductString
	
	for (i = 0; i < adobeDataLayer.length; i++) {
		if (adobeDataLayer[i].event == 'purchase') {
		    s.events += "event1=2.3"
		    s.eVar25 = "caps"
			var tmp = i;
			for (j = 0; j < adobeDataLayer[tmp].transaction.orderItems.length; j++) {
				productString.push(";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].productSKU + 
				    ";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].quantity + 
				    ";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].price.toFixed(2) 
				);
			}
			s.products = productString.toString();

		}

	}

} catch (e) {}

View solution in original post

3 Replies

Avatar

Community Advisor

Firstly, your code for traversing adobeDataLayer looks cumbersome and possibly incorrect (from an ACDL perspective). I suggest that you use adobeDataLayer's event listener: https://github.com/adobe/adobe-client-data-layer/wiki#addeventlistener

Back to your question:

You didn't mention if your eVar25 and event1 should be fixed to those values. But assuming that you're able to get the correct values, then you would set your s.products string according to the required syntax: https://experienceleague.adobe.com/docs/analytics/implementation/vars/page-vars/products.html?lang=e...

Avatar

Correct answer by
Community Advisor

First of all please read this documentation: https://experienceleague.adobe.com/docs/analytics/implementation/vars/page-vars/products.html?lang=e...

 

the syntax of s.products is

 

s.products = "category;product name;unit, total price; events;merchandisign eVars"

 

For merchandising eVars you need to first configure the eVar to have correct configuration. https://experienceleague.adobe.com/docs/analytics/implementation/vars/page-vars/evar-merchandising.h...

 

Make sure to choose the product syntax if you want to use as part of s.products

 

Based on your code you just need to add 2 more categories separated by a ";"

 

try {

	var productString = [],
		cleanProductString
	for (i = 0; i < adobeDataLayer.length; i++) {
		if (adobeDataLayer[i].event == 'purchase') {
			var tmp = i;
			for (j = 0; j < adobeDataLayer[tmp].transaction.orderItems.length; j++) {
				productString.push(";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].productSKU + 
				    ";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].quantity + 
				    ";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].price.toFixed(2) +
				    ";" +
				    "event1=2.3" +
				    ";" +
				    "eVar25=caps"
				);
			}
			s.products = productString.toString();

		}

	}

} catch (e) {}

 

Please be aware that you can add more than one event and one more than one eVar but they will need to be separated by a pipe "|".

You can omit event but you will still to keep the placeholder for events using ";;"

 

Also the above logic is only good if event and eVar apply to each individual products, however if you want to use it at the global level like shipping price for all products and not for individual products then you should us the merchandising conversion syntax (you will need to configure evar to use this syntax).

 

Code will look as follow:

try {

	var productString = [],
		cleanProductString
	
	for (i = 0; i < adobeDataLayer.length; i++) {
		if (adobeDataLayer[i].event == 'purchase') {
		    s.events += "event1=2.3"
		    s.eVar25 = "caps"
			var tmp = i;
			for (j = 0; j < adobeDataLayer[tmp].transaction.orderItems.length; j++) {
				productString.push(";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].productSKU + 
				    ";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].quantity + 
				    ";" + 
				    adobeDataLayer[tmp].transaction.orderItems[j].price.toFixed(2) 
				);
			}
			s.products = productString.toString();

		}

	}

} catch (e) {}

Avatar

Level 4

Thank you so much.. This is very helpful. This really helped me to get unstuck