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_nowsnippet 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