Setup eCommerce Events in Pixfizz CMS
Only required if you are not using the Shopper Managed Storefront
Setup eCommerce Events
view_item
Event
view_item
EventThis script should be placed on a snippet or page that will be rendered for all products. For the Shopper storefront template, the product/design_now
snippet has the script.
<script>
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: "view_item",
ecommerce: {
currency: "{{ website.currency_code }}",
value: {{ product.price }},
items: [
{
item_id: "{{ product.code }}",
item_name: "{{ product.name }}",
index: 0,
item_brand: "{% snippet 'website/brand' %}",
item_category: "{% if product.custom.google_category != blank %}{{ product.custom.google_category | escape_json }}{% else %}{{ product.category | escape_json }}{% endif %}"
}
]
}
});
</script>
add_to_cart
Event
add_to_cart
EventThis is one of the more challenging scripts to deal with as there are multiple places where an end user can add a product to the cart. On the Shopper storefront template, there are 3 locations to manage:
product/design_now
snippet for static products or design products that can be added straight to cart
Design Tool
The below script needs to be in a dedicated editor-scripts.js
page that has no Layout assigned to it, needs to be referenced in the Custom JS field on any Design Tool Configuration(s) that is/are live and need to be tracked. Be sure to also have the correct GTM ID on the Design Tool Configurations.
Be sure to change the currency, if it is not a USD storefront.
window.addEventListener("DOMContentLoaded", () => {
mobx.when(() => editor.store.project.loaded, async () => {
const product = await fetch(`/v1/products/${editor.store.project.product_id}.json`).then(r => r.json());
const theme = await fetch(`/v1/themes/${editor.store.theme_id}.json`).then(r => r.json());
document.querySelector(".px-cart-button").addEventListener("click", function () {
dataLayer.push({
event: "add_to_cart",
ecommerce: {
currency: "USD",
value: product.starting_price,
items: [
{
item_id: `${theme.code}:${product.code}`,
item_name: `${theme.name} ${product.name}`,
index: 0,
item_category: product.custom.google_category || product.category,
price: editor.store.price,
quantity: 1
}
]
}
});
});
});
});
account-saved-projects
Page
account-saved-projects
PageThe icon to add a project to the cart needs the following parameter code:
onclick="dataLayer.push({ event: 'add_to_cart', ecommerce: { currency: '{{ website.currency_code }}', value: '{{ product.price | escape }}', items: [{ item_id: '{{ product.code | escape }}', item_name: '{{ product.name | escape_json }}', index: 0, item_brand: '{{ website.title }}', item_category: '{% if product.custom.google_category != blank %}{{ product.custom.google_category | escape_json }}{% else %}{{ product.category | escape_json }}{% endif %}', price: '{{ product.price | escape }}', quantity: '{{ product.min_quantity }}' }] } });"
design_now
Snippet
design_now
SnippetThe button to submit the project_create
form on the product/design_now
snippet requires the following parameter code:
onclick="dataLayer.push({ event: 'add_to_cart', ecommerce: { currency: '{{ website.currency_code }}', value: '{{ product.price | escape }}', items: [{ item_id: '{{ product.code | escape }}', item_name: '{{ product.name | escape_json }}', index: 0, item_brand: '{{ website.title }}', item_category: '{% if product.custom.google_category != blank %}{{ product.custom.google_category | escape_json }}{% else %}{{ product.category | escape_json }}{% endif %}', price: '{{ product.price | escape }}', quantity: '{{ product.min_quantity }}' }] } });"
view_cart
Event
view_cart
EventAdd the following script to the cart
Page.
{% assign line_item_count = 0 %}
<script>
dataLayer.push({ ecommerce: null }); // Clear the previous ecommerce object.
dataLayer.push({
event: "view_cart",
ecommerce: {
currency: "{{ website.currency_code }}",
value: {{ cart.total | minus: cart.shipping }},
items: [
{%- for orderline in cart.orderlines %}
{
item_id: "{{ orderline.product.code | escape }}",
item_name: "{{ orderline.product.name | escape}}",
coupon: "{{ cart.promocode_code | escape }}",
discount: {{ cart.discount }},
index: {{ line_item_count }},
item_brand: "{% snippet 'website/brand' %}",
item_category: "{%- if orderline.product.custom.google_category != blank %}{{ orderline.product.custom.google_category | escape_json }}{% else %}{{ orderline.product.category | escape_json }}{%- endif %}",
price: {{ orderline.price }},
quantity: {{ orderline.quantity }}
}{%- if forloop.last == false %},{%- endif %}
{%- assign line_item_count = line_item_count | plus: 1 %}{%- endfor %}
]
}
});
</script>
begin_checkout
Event
begin_checkout
EventJust above the Proceed to Checkout button add this code:
{% assign item_count = 0 %}
Add the following code as a parameter on the Proceed to Checkout button:
onclick="dataLayer.push({ event: 'begin_checkout', ecommerce: { currency: '{{ website.currency_code }}', value: '{{ cart.total | minus: cart.shipping }}', items: [{%- for orderline in cart.orderlines %}{ item_id: '{{ orderline.product.code | escape }}', item_name: '{{ orderline.product.name | escape_json }}', coupon: '{{ cart.promocode_code | escape }}', discount: {{ cart.discount }}, index: {{ item_count }}, item_brand: '{% snippet 'website/brand'%}', item_category: '{% if orderline.product.custom.google_category != blank %}{{ orderline.product.custom.google_category | escape_json }}{% else %}{{ orderline.product.category | escape_json }}{% endif %}', price: '{{ orderline.price | escape }}', quantity: '{{ orderline.quantity }}' }{%- if forloop.last == false %},{%- endif %}{% assign item_count = item_count | plus: 1 %}{%- endfor %}] } });"
purchase
Event
purchase
EventAdd the following code to the payment_success page, or the page the end user will land on when successfully completing an order.
<script>
dataLayer.push({ ecommerce: null }); // Clear the previous ecommerce object.
dataLayer.push({
event: "purchase",
ecommerce: {
transaction_id: "{{ order.code }}",
value: {{ order.total }},
tax: {{ order.tax }},
shipping: {{ order.shipping }},
currency: "{{ website.currency_code }}",
coupon: "{{ order.promocode_code }}",
items: [
{%- assign item_count = 0 %}
{%- for orderline in order.orderlines %}
{
item_id: "{{ orderline.product.code }}",
item_name: "{{ orderline.product.name }}",
{%- if order.discount != 0 %}discount: {{ order.discount }},{% endif %}
index: {{ item_count }},
item_brand: "{{ website.title }}",
item_category: "{% if orderline.product.custom.google_category != blank %}{{ orderline.product.custom.google_category | escape_json }}{% else %}{{ orderline.product.category | escape_json }}{% endif %}",
price: {{ orderline.price }},
quantity: {{ orderline.quantity }}
}{%- assign item_count = item_count | plus: 1 %}{%- if forloop.last == false %},{%- endif %}
{%- endfor %}
]
}
});
</script>
Please note for the tax object. If you are a non-US storefront you want to replace the {{ order.tax }} code above with the following code and ensuring that you update the 1.15 with the correct VAT rate. 1.15 would be 15%.
{{ order.total | divided_by: 1.15 | minus: order.total | times: -1 | round: 2 }}
Last updated