<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.growth.agency/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ben.robson</id>
	<title>Growth Agency Wiki - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.growth.agency/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ben.robson"/>
	<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Special:Contributions/Ben.robson"/>
	<updated>2026-04-14T04:28:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=440</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=440"/>
		<updated>2026-04-09T10:30:36Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems !! Other&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]] || [[Arlo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]] || [[Calendly]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Roman Cart]] || [[PureChat]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Shopify]] || [[Tawk]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Squarespace]] || [[Tidio]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Trill]] || [[ZenDesk]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || [[Wix]] || [[Zoho]] || &lt;br /&gt;
|-&lt;br /&gt;
||| [[Yell]] || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== XML HTTP Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form submits using an XML HTTP request,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Depending on the response content of the network request, the logic within addEventListener will need to be swapped to correctly validate the form submission&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function() {&lt;br /&gt;
    var origOpen = XMLHttpRequest.prototype.open;&lt;br /&gt;
    XMLHttpRequest.prototype.open = function() {&lt;br /&gt;
        this.addEventListener(&#039;load&#039;, function() {&lt;br /&gt;
            var response = JSON.parse(this.responseText);&lt;br /&gt;
            if ( typeof response.data != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm.success != &#039;undefined&#039; &amp;amp;&amp;amp;  response.data.submitForm.success) {&lt;br /&gt;
              window.dataLayer = window.dataLayer || [];&lt;br /&gt;
              dataLayer.push({&#039;event&#039;:&#039;contact-form-submitted&#039;})&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        origOpen.apply(this, arguments);&lt;br /&gt;
    };&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generic Fetch Request Listener ==&lt;br /&gt;
&lt;br /&gt;
Gets the response for a fetch request, which can be used to validate form submissions.&lt;br /&gt;
GTM doesn&#039;t allow the JS features that this requires to work, but changing the script type tricks GTM into thinking this isn&#039;t JS &amp;amp; allows it to run anyway.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/gtmscript&amp;quot;&amp;gt;&lt;br /&gt;
if (typeof window.fetch != &#039;undefined&#039;) {&lt;br /&gt;
const { fetch: originalFetch } = window;&lt;br /&gt;
window.fetch = async (...args) =&amp;gt; {&lt;br /&gt;
    let [resource, config ] = args;&lt;br /&gt;
&lt;br /&gt;
    var response = await originalFetch(resource, config);&lt;br /&gt;
&lt;br /&gt;
    if(resource.includes(&#039;/CHANGE-ME&#039;)) {&lt;br /&gt;
        let clone = response.clone();&lt;br /&gt;
        window.dataLayer=window.dataLayer||[];&lt;br /&gt;
        dataLayer.push({&#039;event&#039;:&#039;contact-form-submitted&#039;});&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return response;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
Make sure to swap cookieconsent.js with the location of the js file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;cookieconsent.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional, but to make it look slightly better you could reduce the opacity:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
    #cconsent-bar {&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=439</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=439"/>
		<updated>2026-04-09T10:29:37Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems !! Other&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]] || [[Arlo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]] || [[Calendly]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Roman Cart]] || [[PureChat]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Shopify]] || [[Tawk]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Squarespace]] || [[Tidio]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Trill]] || [[ZenDesk]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || [[Wix]] || [[Zoho]] || &lt;br /&gt;
|-&lt;br /&gt;
||| [[Yell]] || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== XML HTTP Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form submits using an XML HTTP request,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Depending on the response content of the network request, the logic within addEventListener will need to be swapped to correctly validate the form submission&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function() {&lt;br /&gt;
    var origOpen = XMLHttpRequest.prototype.open;&lt;br /&gt;
    XMLHttpRequest.prototype.open = function() {&lt;br /&gt;
        this.addEventListener(&#039;load&#039;, function() {&lt;br /&gt;
            var response = JSON.parse(this.responseText);&lt;br /&gt;
            if ( typeof response.data != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm.success != &#039;undefined&#039; &amp;amp;&amp;amp;  response.data.submitForm.success) {&lt;br /&gt;
              window.dataLayer = window.dataLayer || [];&lt;br /&gt;
              dataLayer.push({&#039;event&#039;:&#039;contact-form-submitted&#039;})&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        origOpen.apply(this, arguments);&lt;br /&gt;
    };&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
Make sure to swap cookieconsent.js with the location of the js file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;cookieconsent.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional, but to make it look slightly better you could reduce the opacity:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
    #cconsent-bar {&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generic Fetch Request Listener ==&lt;br /&gt;
&lt;br /&gt;
Gets the response for a fetch request, which can be used to validate form submissions.&lt;br /&gt;
GTM doesn&#039;t allow the JS features that this requires to work, but changing the script type tricks GTM into thinking this isn&#039;t JS &amp;amp; allows it to run anyway.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/gtmscript&amp;quot;&amp;gt;&lt;br /&gt;
if (typeof window.fetch != &#039;undefined&#039;) {&lt;br /&gt;
const { fetch: originalFetch } = window;&lt;br /&gt;
window.fetch = async (...args) =&amp;gt; {&lt;br /&gt;
    let [resource, config ] = args;&lt;br /&gt;
&lt;br /&gt;
    var response = await originalFetch(resource, config);&lt;br /&gt;
&lt;br /&gt;
    if(resource.includes(&#039;/CHANGE-ME&#039;)) {&lt;br /&gt;
        let clone = response.clone();&lt;br /&gt;
        window.dataLayer=window.dataLayer||[];&lt;br /&gt;
        dataLayer.push({&#039;event&#039;:&#039;contact-form-submitted&#039;});&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return response;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Tag_Manager_Installation_(Wordpress)&amp;diff=438</id>
		<title>Tag Manager Installation (Wordpress)</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Tag_Manager_Installation_(Wordpress)&amp;diff=438"/>
		<updated>2025-12-16T14:06:23Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Tracking Other Wordpress Contact Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
To install on google tag manager it is advised to use the gtm4wp:&lt;br /&gt;
[[Google Tag Manager for WordPress (Plugin)]]&lt;br /&gt;
&lt;br /&gt;
= Tracking Other Wordpress Contact Plugins =&lt;br /&gt;
&lt;br /&gt;
== Caldera Forms ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery( function() {&lt;br /&gt;
	jQuery( document ).on( &#039;cf.form.submit&#039;, function (event, data ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*note, the JS bind will not fire if the form is not set to AJAX submission.&lt;br /&gt;
&lt;br /&gt;
== Contact Form 7 ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	jQuery( function() {&lt;br /&gt;
		jQuery(&#039;.wpcf7&#039;).on(&#039;wpcf7mailsent&#039;, function(e) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			var cF7formid = &#039;(not set)&#039;;&lt;br /&gt;
			var cF7formName = &#039;(not set)&#039;;&lt;br /&gt;
			if ( e &amp;amp;&amp;amp; e.target &amp;amp;&amp;amp; e.target.id ) {&lt;br /&gt;
				cF7formName = e.target.id;&lt;br /&gt;
			}&lt;br /&gt;
			if( cF7formName ) {&lt;br /&gt;
				var nameRegex = cF7formName.match(/-f([0-9]+)-/) || [&#039;&#039;];&lt;br /&gt;
				if( nameRegex &amp;amp;&amp;amp; nameRegex[1] ) {&lt;br /&gt;
					cF7formid = nameRegex[1];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			dataLayer.push({&lt;br /&gt;
				&#039;contact-form-id&#039;: cF7formid,&lt;br /&gt;
				&#039;contact-form-name&#039;: cF7formName,&lt;br /&gt;
				&#039;event&#039;: &#039;contact-form-submitted&#039;&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: CF7 developers love changing their hook names, if this doesn&#039;t work try the below instead:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuery(&#039;.wpcf7&#039;).on(&#039;wpcf7:mailsent&#039;, function(e) {&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion Plus ==&lt;br /&gt;
&lt;br /&gt;
For the popup form, create tag as Custom HTML and use the ajaxSuccess hook below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if( ~settings.url.indexOf(&amp;quot;/wp-admin/admin-ajax.php&amp;quot;) &amp;amp;&amp;amp; ~settings.data.indexOf(&amp;quot;action=cp_add_subscriber&amp;quot;) ) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;cp-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Divi Form Builder ==&lt;br /&gt;
Create tag as Custom HTML and use the ajaxSuccess hook below, the location will need to be changed to the contact page it is submitting the Ajax request to.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
It is also possible to use the field names that are being submitted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.data.indexOf(&amp;quot;et_pb_contact_firstname&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Elementor Form Builder ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery( document ).ready(function( $ ){&lt;br /&gt;
	$( document ).on(&#039;submit_success&#039;, function( event, response ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FluentForms ==&lt;br /&gt;
This can be tracked by creating a custom html tag with the below within in GTM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
   (function($){&lt;br /&gt;
     var fluentForms = $(&#039;.frm-fluent-form&#039;);&lt;br /&gt;
     fluentForms.each(function() {&lt;br /&gt;
       var $form = $(this);&lt;br /&gt;
       var formId = $form.attr(&#039;data-form_id&#039;);&lt;br /&gt;
       dataLayer.push({&lt;br /&gt;
        &#039;event&#039;: &#039;FluentFormActivities&#039;,&lt;br /&gt;
        &#039;eventCategory&#039;: &#039;FluentForm&#039;,&lt;br /&gt;
        &#039;eventAction&#039;: &#039;FormView&#039;,&lt;br /&gt;
        &#039;FluentFormID&#039; : formId&lt;br /&gt;
      });&lt;br /&gt;
   $form.on(&#039;fluentform_submission_success&#039;, function() {&lt;br /&gt;
     dataLayer.push({&lt;br /&gt;
       &#039;event&#039;: &#039;FluentFormActivities&#039;,&lt;br /&gt;
       &#039;eventCategory&#039;: &#039;FluentForm&#039;,&lt;br /&gt;
       &#039;eventAction&#039;: &#039;FormSubmitted&#039;,&lt;br /&gt;
       &#039;FluentFormID&#039; : formId&lt;br /&gt;
     });&lt;br /&gt;
   });&lt;br /&gt;
  });&lt;br /&gt;
 }(jQuery));&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FormCraft ==&lt;br /&gt;
&lt;br /&gt;
This plugin does not strip or encode script tags, so can be done in the back-end&lt;br /&gt;
&lt;br /&gt;
In form options go to options -&amp;gt; Custom Text -&amp;gt; Top Box&lt;br /&gt;
&lt;br /&gt;
In newer versions, the form cannot be saved with the script tag added,&lt;br /&gt;
another method will need to be researched.&lt;br /&gt;
&lt;br /&gt;
== Formidable ==&lt;br /&gt;
Just can copy and paste the dataLayer event script directly to success message in back-end.&lt;br /&gt;
&lt;br /&gt;
Edit form -&amp;gt; Actions &amp;amp; Notifications -&amp;gt; Confirmation&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;var dataLayer = window.dataLayer || []; dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Forminator ==&lt;br /&gt;
&lt;br /&gt;
Create tag as custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	jQuery(&#039;body&#039;).on(&#039;forminator:form:submit:success&#039;, &#039;.forminator-custom-form&#039;, function(e, data) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;forminator-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some other JS triggers:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
forminator:form:added&lt;br /&gt;
before:forminator:form:submit&lt;br /&gt;
after:forminator:form:submit&lt;br /&gt;
forminator:form:submit:success&lt;br /&gt;
forminator:form:submit:failed&lt;br /&gt;
forminator:form:submit:complete&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also change the triggers above from form to either poll and quiz &lt;br /&gt;
&lt;br /&gt;
== Gravity Form ==&lt;br /&gt;
&lt;br /&gt;
Create tag as custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	jQuery(document).ready(function(){&lt;br /&gt;
		jQuery(document).on(&#039;gform_confirmation_loaded&#039;, function(event, form_id) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;gform_id&#039; : form_id, &#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this to work, AJAX is required to be enabled on the form.&lt;br /&gt;
This can be enabled in the short-code[https://codex.wordpress.org/Shortcode_API] when the form is called on the wordpress page:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[gravityform id=&amp;quot;1&amp;quot; ajax=&amp;quot;true&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*note, the JS bind will not fire if the form is set to redirect after success.&lt;br /&gt;
&lt;br /&gt;
== Ninja Forms ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready( function() {&lt;br /&gt;
	jQuery(document).on(&#039;nfFormSubmitResponse&#039;, function(event, response, id) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&lt;br /&gt;
			&#039;event&#039;: &#039;contact-form-submitted&#039;,&lt;br /&gt;
			&#039;NFform_id&#039;: response.id&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pojo Forms ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery( document ).ready(function( $ ){&lt;br /&gt;
	$( document ).on(&#039;pojo_forms_form_submitted&#039;, function( event, response ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QuForm ==&lt;br /&gt;
&lt;br /&gt;
=== 1.x ===&lt;br /&gt;
&lt;br /&gt;
https://support.themecatcher.net/quform-wordpress/guides/basic/adding-custom-javascript/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if( typeof jQuery != &#039;undefined&#039; ) {&lt;br /&gt;
 &lt;br /&gt;
    jQuery(document).ready(function() {&lt;br /&gt;
      jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
        if(&lt;br /&gt;
          ~settings.data.indexOf(&#039;iphorm_id=&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
          ~settings.data.indexOf(&#039;post_id=&#039;)&lt;br /&gt;
        ) {&lt;br /&gt;
          	var idRegex = settings.data.match(/iphorm_id=([0-9]+)/) || [&#039;&#039;];&lt;br /&gt;
			if( idRegex &amp;amp;&amp;amp; idRegex[1] ) {&lt;br /&gt;
				form_id = idRegex[1];&lt;br /&gt;
			}&lt;br /&gt;
          	var pidRegex = settings.data.match(/post_id=([0-9]+)/) || [&#039;&#039;];&lt;br /&gt;
			if( pidRegex &amp;amp;&amp;amp; pidRegex[1] ) {&lt;br /&gt;
				post_id = pidRegex[1];&lt;br /&gt;
			}&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&lt;br /&gt;
              &#039;form_id&#039;: form_id,&lt;br /&gt;
              &#039;post_id&#039;: post_id,&lt;br /&gt;
              &#039;domain&#039;: window.location.hostname,&lt;br /&gt;
              &#039;event&#039; : &#039;qf-form-submitted&#039;&lt;br /&gt;
            });&lt;br /&gt;
		  }&lt;br /&gt;
	  });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.x ===&lt;br /&gt;
&lt;br /&gt;
https://support.themecatcher.net/quform-wordpress-v2/guides/integration/google-analytics/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(function ($) {&lt;br /&gt;
    $(&#039;.quform-form-1&#039;).on(&#039;quform:successStart&#039;, function () {&lt;br /&gt;
        dataLayer.push({&#039;event&#039;: &#039;Contact Form&#039;});&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siteorigin form ==&lt;br /&gt;
this strips out script tags so will need to add custom JS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function () {&lt;br /&gt;
  var success = document.getElementsByClassName(&amp;quot;sow-contact-form-success&amp;quot;);&lt;br /&gt;
  return (typeof success[0] != &amp;quot;undefined&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Subsystic Popup ==&lt;br /&gt;
&lt;br /&gt;
For the popup form, create tag as Custom HTML and use the ajaxSuccess hook below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if( ~settings.url.indexOf(&amp;quot;/wp-admin/admin-ajax.php&amp;quot;) &amp;amp;&amp;amp; ~settings.data.indexOf(&amp;quot;action=subscribe&amp;quot;) &amp;amp;&amp;amp; ~settings.data.indexOf(&amp;quot;pl=pps&amp;quot;) ) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;popup-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The Plus Addons For Elementor (TPAE) == &lt;br /&gt;
&lt;br /&gt;
Forms can be tracked using a slight variation on the generic form listener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/wp-admin/admin-ajax.php&amp;quot;) &amp;amp;&amp;amp; ~settings.data.indexOf(&amp;quot;action=tpae_form_submission&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;tpae-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WP Forms ==&lt;br /&gt;
Using a slightly altered version of the JQuery form listener should work for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).on(&#039;wpformsAjaxSubmitSuccess&#039;, (function( event, json ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;form-submitted&#039;});&lt;br /&gt;
	}));&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternatively:&lt;br /&gt;
The Event can be added directly to the form confirmation message&lt;br /&gt;
Edit the form &amp;amp; go to Settings &amp;gt; Confirmations&lt;br /&gt;
Switch to Text view then add the event code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Or if using GTM4WP&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Add a datalayer variable in GTM with:&amp;lt;br /&amp;gt;&lt;br /&gt;
eventModel.form_id for Form ID&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup a custom event Trigger:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Event: form_submit&lt;br /&gt;
Some Custom Events:&lt;br /&gt;
Form ID contains wpforms-form-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WS Forms ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://wsform.com/knowledgebase/conversion-tracking/&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Go into admin, click to edit the required form.&amp;lt;br /&amp;gt;&lt;br /&gt;
In the form edit view, click the lightning icon (actions).&amp;lt;br /&amp;gt;&lt;br /&gt;
Add a new action for conversion tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
Select Google Tag Manager (DataLayer)&amp;lt;br /&amp;gt;&lt;br /&gt;
Enter &amp;quot;event&amp;quot; in the &amp;quot;Key&amp;quot; field.&amp;lt;br /&amp;gt;&lt;br /&gt;
Enter &amp;quot;ws-form-submitted&amp;quot; in the &amp;quot;Value&amp;quot; field.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Then publish the form.&lt;br /&gt;
&lt;br /&gt;
= Tracking Other Wordpress Newsletter Plugins =&lt;br /&gt;
&lt;br /&gt;
== Mailchimp Forms (mc4wp) ==&lt;br /&gt;
&lt;br /&gt;
if is not AJAX and stays on page when the form submits, add a JS variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function () {&lt;br /&gt;
	var success = document.getElementsByClassName(&amp;quot;mc4wp-success&amp;quot;);&lt;br /&gt;
	return (typeof success[0] != &amp;quot;undefined&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, custom HTML will need to be added as a listener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	mc4wp.forms.on(&#039;submitted&#039;, function() {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;newsletter-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pop-up Builder - Mailchimp ==&lt;br /&gt;
&lt;br /&gt;
Add Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof SgpbMailchimp != &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
	var originalmcsuccess = SgpbMailchimp.prototype.sgpbMailchimpSuccess;&lt;br /&gt;
	SgpbMailchimp.prototype.sgpbMailchimpSuccess = function(data) {&lt;br /&gt;
		originalmcsuccess.call(this, data);&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;mailchimp-form-submitted&#039;});&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Avia Form Builder ==&lt;br /&gt;
Add Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function($) {&lt;br /&gt;
    $(&#039;body&#039;).on(&#039;av_resize_finished&#039;, function() {&lt;br /&gt;
	if(!$(&#039;#ajaxresponse_1&#039;).hasClass(&#039;hidden&#039;)) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;avia-form-submitted&#039;});&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: (Still not 100% on this)&lt;br /&gt;
&lt;br /&gt;
= Tracking Other Wordpress Ecommerce Plugins =&lt;br /&gt;
&lt;br /&gt;
== WooCommerce ==&lt;br /&gt;
&lt;br /&gt;
See Article: [[WooCommerce]]&lt;br /&gt;
&lt;br /&gt;
== Foxy Shop ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://wiki.foxycart.com/v/2.0/receipt#using_custom_tracking_code&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy template from:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/wp-content/plugins/foxyshop/themefiles/foxyshop-receipt.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to theme / child theme root&lt;br /&gt;
&lt;br /&gt;
Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_receipt_display %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;order_id&#039; : &#039;{{ order_id }}&#039;,&lt;br /&gt;
	&#039;order_value&#039; : &#039;{{ total_order }}&#039;,&lt;br /&gt;
	&#039;event&#039; : &#039;order-submitted&#039;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;order_id&#039; : &#039;&amp;lt;?php echo $transaction_id; ?&amp;gt;&#039;,&lt;br /&gt;
	&#039;order_value&#039; : &#039;&amp;lt;?php echo $order_total; ?&amp;gt;&#039;,&lt;br /&gt;
	&#039;event&#039; : &#039;order-submitted&#039;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chauffeur Booking System Plugin ==&lt;br /&gt;
&lt;br /&gt;
The Chauffeur Booking System Plugin is a paid for plug-in with very little documentation and hooks (actions and filters) to use at the time of looking into this.&amp;lt;br /&amp;gt;&lt;br /&gt;
The order ID &amp;amp; order value cannot be tracked without modification of the plugin.&lt;br /&gt;
&lt;br /&gt;
Below is code to track the booking completion.&amp;lt;br /&amp;gt;&lt;br /&gt;
Insert the code as a custom HTML tag in the tag manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	(function ($) {&lt;br /&gt;
		var origCss = $.fn.css;&lt;br /&gt;
		$.fn.css = function(prop, value) {&lt;br /&gt;
			if( prop == &#039;display&#039; &amp;amp;&amp;amp; value == &#039;block&#039; &amp;amp;&amp;amp; this.hasClass(&#039;chbs-main-content-step-5&#039;) ) {&lt;br /&gt;
				var dataLayer = window.dataLayer || [];&lt;br /&gt;
				dataLayer.push({&#039;event&#039; : &#039;chauffeur-booking-form-submitted&#039;});&lt;br /&gt;
			}&lt;br /&gt;
			return origCss.apply(this, arguments);&lt;br /&gt;
		}&lt;br /&gt;
	})(jQuery);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=437</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=437"/>
		<updated>2025-12-12T11:13:24Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Shopify Pixel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then. &amp;lt;/br&amp;gt;&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default. &amp;lt;/br&amp;gt;&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel. &amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://shopify.dev/docs/api/web-pixels-api/pixel-privacy Pixel privacy documentation]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel.&lt;br /&gt;
 - Set the Customer Privacy settings to Not required.&lt;br /&gt;
 - Set Data Sale to Data collected does not qualify as data sale.&lt;br /&gt;
 - Add the below code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-XXXXXX&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: analytics_permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: analytics_permission ,&lt;br /&gt;
    &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Custom events (for example contact form submissions) have to be sent by adding an event to the liquid files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
        document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, function (event) {&lt;br /&gt;
                Shopify.analytics.publish(&#039;EVENT_NAME_HERE&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which can then be accessed within the pixel with the same logic as the standard events:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
analytics.subscribe(&amp;quot;EVENT_NAME_HERE&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    &#039;event&#039;: &#039;EVENT_NAME&#039;&lt;br /&gt;
  });                    &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The below can also be added to have access to the dataLayer in console, which should be useful for debugging/testing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
analytics.subscribe(&amp;quot;check_datalayer&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  console.log(dataLayer);&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can then be called from console with the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Shopify.analytics.publish(&#039;check_datalayer&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File Location ==&lt;br /&gt;
&lt;br /&gt;
The Shopify pixel loads the JS into a JS file which is loaded by the browser.&amp;lt;br /&amp;gt;&lt;br /&gt;
The location of this can be built by using data from the home web page.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://&amp;lt;&amp;lt;domain&amp;gt;&amp;gt;/wpm@&amp;lt;&amp;lt;wpm_id&amp;gt;&amp;gt;/custom/web-pixel-&amp;lt;&amp;lt;pixel_id&amp;gt;&amp;gt;@&amp;lt;&amp;lt;script_version&amp;gt;&amp;gt;/sandbox/modern/&lt;br /&gt;
&lt;br /&gt;
wpm_id - is the version of the wpm (Web Pixel Manager), this is the same across all sites and will change when the wpm is updated by shopify.&lt;br /&gt;
pixel_id - this is found via the JSON below that is on the site&lt;br /&gt;
script_version - this is found via the JSON below that is on the site&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;id&amp;quot;:&amp;quot;&amp;lt;&amp;lt;pixel_id &amp;gt;&amp;gt;&amp;quot;,&amp;quot;eventPayloadVersion&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;runtimeContext&amp;quot;:&amp;quot;LAX&amp;quot;,&amp;quot;scriptVersion&amp;quot;:&amp;quot;&amp;lt;&amp;lt;script_version&amp;gt;&amp;gt;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;CUSTOM&amp;quot;,&amp;quot;privacyPurposes&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;GTM + Value Tracking&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=436</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=436"/>
		<updated>2025-12-10T15:44:07Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then. &amp;lt;/br&amp;gt;&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default. &amp;lt;/br&amp;gt;&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel. &amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://shopify.dev/docs/api/web-pixels-api/pixel-privacy Pixel privacy documentation]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;noscript&amp;gt; section needs to be added to the &amp;lt;body&amp;gt; through theme.liquid via Online Store &amp;gt; Edit.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel.&lt;br /&gt;
 - Set the Customer Privacy settings to Not required.&lt;br /&gt;
 - Set Data Sale to Data collected does not qualify as data sale.&lt;br /&gt;
 - Add the below code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-XXXXXX&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: analytics_permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: analytics_permission ,&lt;br /&gt;
    &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Custom events (for example contact form submissions) have to be sent by adding an event to the liquid files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
        document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, function (event) {&lt;br /&gt;
                Shopify.analytics.publish(&#039;EVENT_NAME_HERE&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which can then be accessed within the pixel with the same logic as the standard events:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
analytics.subscribe(&amp;quot;EVENT_NAME_HERE&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    &#039;event&#039;: &#039;EVENT_NAME&#039;&lt;br /&gt;
  });                    &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The below can also be added to have access to the dataLayer in console, which should be useful for debugging/testing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
analytics.subscribe(&amp;quot;check_datalayer&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  console.log(dataLayer);&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can then be called from console with the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Shopify.analytics.publish(&#039;check_datalayer&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File Location ==&lt;br /&gt;
&lt;br /&gt;
The Shopify pixel loads the JS into a JS file which is loaded by the browser.&amp;lt;br /&amp;gt;&lt;br /&gt;
The location of this can be built by using data from the home web page.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://&amp;lt;&amp;lt;domain&amp;gt;&amp;gt;/wpm@&amp;lt;&amp;lt;wpm_id&amp;gt;&amp;gt;/custom/web-pixel-&amp;lt;&amp;lt;pixel_id&amp;gt;&amp;gt;@&amp;lt;&amp;lt;script_version&amp;gt;&amp;gt;/sandbox/modern/&lt;br /&gt;
&lt;br /&gt;
wpm_id - is the version of the wpm (Web Pixel Manager), this is the same across all sites and will change when the wpm is updated by shopify.&lt;br /&gt;
pixel_id - this is found via the JSON below that is on the site&lt;br /&gt;
script_version - this is found via the JSON below that is on the site&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;id&amp;quot;:&amp;quot;&amp;lt;&amp;lt;pixel_id &amp;gt;&amp;gt;&amp;quot;,&amp;quot;eventPayloadVersion&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;runtimeContext&amp;quot;:&amp;quot;LAX&amp;quot;,&amp;quot;scriptVersion&amp;quot;:&amp;quot;&amp;lt;&amp;lt;script_version&amp;gt;&amp;gt;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;CUSTOM&amp;quot;,&amp;quot;privacyPurposes&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;GTM + Value Tracking&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Tag_Manager_Installation_(Wordpress)&amp;diff=435</id>
		<title>Tag Manager Installation (Wordpress)</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Tag_Manager_Installation_(Wordpress)&amp;diff=435"/>
		<updated>2025-12-10T14:16:02Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Tracking Other Wordpress Contact Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
To install on google tag manager it is advised to use the gtm4wp:&lt;br /&gt;
[[Google Tag Manager for WordPress (Plugin)]]&lt;br /&gt;
&lt;br /&gt;
= Tracking Other Wordpress Contact Plugins =&lt;br /&gt;
&lt;br /&gt;
== Caldera Forms ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery( function() {&lt;br /&gt;
	jQuery( document ).on( &#039;cf.form.submit&#039;, function (event, data ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*note, the JS bind will not fire if the form is not set to AJAX submission.&lt;br /&gt;
&lt;br /&gt;
== Contact Form 7 ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	jQuery( function() {&lt;br /&gt;
		jQuery(&#039;.wpcf7&#039;).on(&#039;wpcf7mailsent&#039;, function(e) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			var cF7formid = &#039;(not set)&#039;;&lt;br /&gt;
			var cF7formName = &#039;(not set)&#039;;&lt;br /&gt;
			if ( e &amp;amp;&amp;amp; e.target &amp;amp;&amp;amp; e.target.id ) {&lt;br /&gt;
				cF7formName = e.target.id;&lt;br /&gt;
			}&lt;br /&gt;
			if( cF7formName ) {&lt;br /&gt;
				var nameRegex = cF7formName.match(/-f([0-9]+)-/) || [&#039;&#039;];&lt;br /&gt;
				if( nameRegex &amp;amp;&amp;amp; nameRegex[1] ) {&lt;br /&gt;
					cF7formid = nameRegex[1];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			dataLayer.push({&lt;br /&gt;
				&#039;contact-form-id&#039;: cF7formid,&lt;br /&gt;
				&#039;contact-form-name&#039;: cF7formName,&lt;br /&gt;
				&#039;event&#039;: &#039;contact-form-submitted&#039;&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: CF7 developers love changing their hook names, if this doesn&#039;t work try the below instead:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuery(&#039;.wpcf7&#039;).on(&#039;wpcf7:mailsent&#039;, function(e) {&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion Plus ==&lt;br /&gt;
&lt;br /&gt;
For the popup form, create tag as Custom HTML and use the ajaxSuccess hook below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if( ~settings.url.indexOf(&amp;quot;/wp-admin/admin-ajax.php&amp;quot;) &amp;amp;&amp;amp; ~settings.data.indexOf(&amp;quot;action=cp_add_subscriber&amp;quot;) ) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;cp-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Divi Form Builder ==&lt;br /&gt;
Create tag as Custom HTML and use the ajaxSuccess hook below, the location will need to be changed to the contact page it is submitting the Ajax request to.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
It is also possible to use the field names that are being submitted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.data.indexOf(&amp;quot;et_pb_contact_firstname&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Elementor Form Builder ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery( document ).ready(function( $ ){&lt;br /&gt;
	$( document ).on(&#039;submit_success&#039;, function( event, response ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FluentForms ==&lt;br /&gt;
This can be tracked by creating a custom html tag with the below within in GTM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
   (function($){&lt;br /&gt;
     var fluentForms = $(&#039;.frm-fluent-form&#039;);&lt;br /&gt;
     fluentForms.each(function() {&lt;br /&gt;
       var $form = $(this);&lt;br /&gt;
       var formId = $form.attr(&#039;data-form_id&#039;);&lt;br /&gt;
       dataLayer.push({&lt;br /&gt;
        &#039;event&#039;: &#039;FluentFormActivities&#039;,&lt;br /&gt;
        &#039;eventCategory&#039;: &#039;FluentForm&#039;,&lt;br /&gt;
        &#039;eventAction&#039;: &#039;FormView&#039;,&lt;br /&gt;
        &#039;FluentFormID&#039; : formId&lt;br /&gt;
      });&lt;br /&gt;
   $form.on(&#039;fluentform_submission_success&#039;, function() {&lt;br /&gt;
     dataLayer.push({&lt;br /&gt;
       &#039;event&#039;: &#039;FluentFormActivities&#039;,&lt;br /&gt;
       &#039;eventCategory&#039;: &#039;FluentForm&#039;,&lt;br /&gt;
       &#039;eventAction&#039;: &#039;FormSubmitted&#039;,&lt;br /&gt;
       &#039;FluentFormID&#039; : formId&lt;br /&gt;
     });&lt;br /&gt;
   });&lt;br /&gt;
  });&lt;br /&gt;
 }(jQuery));&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FormCraft ==&lt;br /&gt;
&lt;br /&gt;
This plugin does not strip or encode script tags, so can be done in the back-end&lt;br /&gt;
&lt;br /&gt;
In form options go to options -&amp;gt; Custom Text -&amp;gt; Top Box&lt;br /&gt;
&lt;br /&gt;
In newer versions, the form cannot be saved with the script tag added,&lt;br /&gt;
another method will need to be researched.&lt;br /&gt;
&lt;br /&gt;
== Formidable ==&lt;br /&gt;
Just can copy and paste the dataLayer event script directly to success message in back-end.&lt;br /&gt;
&lt;br /&gt;
Edit form -&amp;gt; Actions &amp;amp; Notifications -&amp;gt; Confirmation&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;var dataLayer = window.dataLayer || []; dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Forminator ==&lt;br /&gt;
&lt;br /&gt;
Create tag as custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	jQuery(&#039;body&#039;).on(&#039;forminator:form:submit:success&#039;, &#039;.forminator-custom-form&#039;, function(e, data) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;forminator-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some other JS triggers:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
forminator:form:added&lt;br /&gt;
before:forminator:form:submit&lt;br /&gt;
after:forminator:form:submit&lt;br /&gt;
forminator:form:submit:success&lt;br /&gt;
forminator:form:submit:failed&lt;br /&gt;
forminator:form:submit:complete&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also change the triggers above from form to either poll and quiz &lt;br /&gt;
&lt;br /&gt;
== Gravity Form ==&lt;br /&gt;
&lt;br /&gt;
Create tag as custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	jQuery(document).ready(function(){&lt;br /&gt;
		jQuery(document).on(&#039;gform_confirmation_loaded&#039;, function(event, form_id) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;gform_id&#039; : form_id, &#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this to work, AJAX is required to be enabled on the form.&lt;br /&gt;
This can be enabled in the short-code[https://codex.wordpress.org/Shortcode_API] when the form is called on the wordpress page:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[gravityform id=&amp;quot;1&amp;quot; ajax=&amp;quot;true&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*note, the JS bind will not fire if the form is set to redirect after success.&lt;br /&gt;
&lt;br /&gt;
== Ninja Forms ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready( function() {&lt;br /&gt;
	jQuery(document).on(&#039;nfFormSubmitResponse&#039;, function(event, response, id) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&lt;br /&gt;
			&#039;event&#039;: &#039;contact-form-submitted&#039;,&lt;br /&gt;
			&#039;NFform_id&#039;: response.id&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pojo Forms ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery( document ).ready(function( $ ){&lt;br /&gt;
	$( document ).on(&#039;pojo_forms_form_submitted&#039;, function( event, response ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QuForm ==&lt;br /&gt;
&lt;br /&gt;
=== 1.x ===&lt;br /&gt;
&lt;br /&gt;
https://support.themecatcher.net/quform-wordpress/guides/basic/adding-custom-javascript/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if( typeof jQuery != &#039;undefined&#039; ) {&lt;br /&gt;
 &lt;br /&gt;
    jQuery(document).ready(function() {&lt;br /&gt;
      jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
        if(&lt;br /&gt;
          ~settings.data.indexOf(&#039;iphorm_id=&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
          ~settings.data.indexOf(&#039;post_id=&#039;)&lt;br /&gt;
        ) {&lt;br /&gt;
          	var idRegex = settings.data.match(/iphorm_id=([0-9]+)/) || [&#039;&#039;];&lt;br /&gt;
			if( idRegex &amp;amp;&amp;amp; idRegex[1] ) {&lt;br /&gt;
				form_id = idRegex[1];&lt;br /&gt;
			}&lt;br /&gt;
          	var pidRegex = settings.data.match(/post_id=([0-9]+)/) || [&#039;&#039;];&lt;br /&gt;
			if( pidRegex &amp;amp;&amp;amp; pidRegex[1] ) {&lt;br /&gt;
				post_id = pidRegex[1];&lt;br /&gt;
			}&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&lt;br /&gt;
              &#039;form_id&#039;: form_id,&lt;br /&gt;
              &#039;post_id&#039;: post_id,&lt;br /&gt;
              &#039;domain&#039;: window.location.hostname,&lt;br /&gt;
              &#039;event&#039; : &#039;qf-form-submitted&#039;&lt;br /&gt;
            });&lt;br /&gt;
		  }&lt;br /&gt;
	  });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.x ===&lt;br /&gt;
&lt;br /&gt;
https://support.themecatcher.net/quform-wordpress-v2/guides/integration/google-analytics/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(function ($) {&lt;br /&gt;
    $(&#039;.quform-form-1&#039;).on(&#039;quform:successStart&#039;, function () {&lt;br /&gt;
        dataLayer.push({&#039;event&#039;: &#039;Contact Form&#039;});&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siteorigin form ==&lt;br /&gt;
this strips out script tags so will need to add custom JS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function () {&lt;br /&gt;
  var success = document.getElementsByClassName(&amp;quot;sow-contact-form-success&amp;quot;);&lt;br /&gt;
  return (typeof success[0] != &amp;quot;undefined&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Subsystic Popup ==&lt;br /&gt;
&lt;br /&gt;
For the popup form, create tag as Custom HTML and use the ajaxSuccess hook below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if( ~settings.url.indexOf(&amp;quot;/wp-admin/admin-ajax.php&amp;quot;) &amp;amp;&amp;amp; ~settings.data.indexOf(&amp;quot;action=subscribe&amp;quot;) &amp;amp;&amp;amp; ~settings.data.indexOf(&amp;quot;pl=pps&amp;quot;) ) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;popup-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WP Forms ==&lt;br /&gt;
Using a slightly altered version of the JQuery form listener should work for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).on(&#039;wpformsAjaxSubmitSuccess&#039;, (function( event, json ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;form-submitted&#039;});&lt;br /&gt;
	}));&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternatively:&lt;br /&gt;
The Event can be added directly to the form confirmation message&lt;br /&gt;
Edit the form &amp;amp; go to Settings &amp;gt; Confirmations&lt;br /&gt;
Switch to Text view then add the event code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Or if using GTM4WP&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Add a datalayer variable in GTM with:&amp;lt;br /&amp;gt;&lt;br /&gt;
eventModel.form_id for Form ID&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup a custom event Trigger:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Event: form_submit&lt;br /&gt;
Some Custom Events:&lt;br /&gt;
Form ID contains wpforms-form-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WS Forms ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://wsform.com/knowledgebase/conversion-tracking/&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Go into admin, click to edit the required form.&amp;lt;br /&amp;gt;&lt;br /&gt;
In the form edit view, click the lightning icon (actions).&amp;lt;br /&amp;gt;&lt;br /&gt;
Add a new action for conversion tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
Select Google Tag Manager (DataLayer)&amp;lt;br /&amp;gt;&lt;br /&gt;
Enter &amp;quot;event&amp;quot; in the &amp;quot;Key&amp;quot; field.&amp;lt;br /&amp;gt;&lt;br /&gt;
Enter &amp;quot;ws-form-submitted&amp;quot; in the &amp;quot;Value&amp;quot; field.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Then publish the form.&lt;br /&gt;
&lt;br /&gt;
= Tracking Other Wordpress Newsletter Plugins =&lt;br /&gt;
&lt;br /&gt;
== Mailchimp Forms (mc4wp) ==&lt;br /&gt;
&lt;br /&gt;
if is not AJAX and stays on page when the form submits, add a JS variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function () {&lt;br /&gt;
	var success = document.getElementsByClassName(&amp;quot;mc4wp-success&amp;quot;);&lt;br /&gt;
	return (typeof success[0] != &amp;quot;undefined&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, custom HTML will need to be added as a listener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	mc4wp.forms.on(&#039;submitted&#039;, function() {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;newsletter-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pop-up Builder - Mailchimp ==&lt;br /&gt;
&lt;br /&gt;
Add Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof SgpbMailchimp != &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
	var originalmcsuccess = SgpbMailchimp.prototype.sgpbMailchimpSuccess;&lt;br /&gt;
	SgpbMailchimp.prototype.sgpbMailchimpSuccess = function(data) {&lt;br /&gt;
		originalmcsuccess.call(this, data);&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;mailchimp-form-submitted&#039;});&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Avia Form Builder ==&lt;br /&gt;
Add Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function($) {&lt;br /&gt;
    $(&#039;body&#039;).on(&#039;av_resize_finished&#039;, function() {&lt;br /&gt;
	if(!$(&#039;#ajaxresponse_1&#039;).hasClass(&#039;hidden&#039;)) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;avia-form-submitted&#039;});&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: (Still not 100% on this)&lt;br /&gt;
&lt;br /&gt;
= Tracking Other Wordpress Ecommerce Plugins =&lt;br /&gt;
&lt;br /&gt;
== WooCommerce ==&lt;br /&gt;
&lt;br /&gt;
See Article: [[WooCommerce]]&lt;br /&gt;
&lt;br /&gt;
== Foxy Shop ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://wiki.foxycart.com/v/2.0/receipt#using_custom_tracking_code&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy template from:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/wp-content/plugins/foxyshop/themefiles/foxyshop-receipt.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to theme / child theme root&lt;br /&gt;
&lt;br /&gt;
Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_receipt_display %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;order_id&#039; : &#039;{{ order_id }}&#039;,&lt;br /&gt;
	&#039;order_value&#039; : &#039;{{ total_order }}&#039;,&lt;br /&gt;
	&#039;event&#039; : &#039;order-submitted&#039;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;order_id&#039; : &#039;&amp;lt;?php echo $transaction_id; ?&amp;gt;&#039;,&lt;br /&gt;
	&#039;order_value&#039; : &#039;&amp;lt;?php echo $order_total; ?&amp;gt;&#039;,&lt;br /&gt;
	&#039;event&#039; : &#039;order-submitted&#039;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chauffeur Booking System Plugin ==&lt;br /&gt;
&lt;br /&gt;
The Chauffeur Booking System Plugin is a paid for plug-in with very little documentation and hooks (actions and filters) to use at the time of looking into this.&amp;lt;br /&amp;gt;&lt;br /&gt;
The order ID &amp;amp; order value cannot be tracked without modification of the plugin.&lt;br /&gt;
&lt;br /&gt;
Below is code to track the booking completion.&amp;lt;br /&amp;gt;&lt;br /&gt;
Insert the code as a custom HTML tag in the tag manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	(function ($) {&lt;br /&gt;
		var origCss = $.fn.css;&lt;br /&gt;
		$.fn.css = function(prop, value) {&lt;br /&gt;
			if( prop == &#039;display&#039; &amp;amp;&amp;amp; value == &#039;block&#039; &amp;amp;&amp;amp; this.hasClass(&#039;chbs-main-content-step-5&#039;) ) {&lt;br /&gt;
				var dataLayer = window.dataLayer || [];&lt;br /&gt;
				dataLayer.push({&#039;event&#039; : &#039;chauffeur-booking-form-submitted&#039;});&lt;br /&gt;
			}&lt;br /&gt;
			return origCss.apply(this, arguments);&lt;br /&gt;
		}&lt;br /&gt;
	})(jQuery);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=432</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=432"/>
		<updated>2025-07-29T08:46:16Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* XML HTTP Form Listener */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems !! Other&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]] || [[Arlo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]] || [[Calendly]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Roman Cart]] || [[PureChat]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Shopify]] || [[Tawk]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Squarespace]] || [[Tidio]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Trill]] || [[ZenDesk]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || [[Wix]] || [[Zoho]] || &lt;br /&gt;
|-&lt;br /&gt;
||| [[Yell]] || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== XML HTTP Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form submits using an XML HTTP request,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Depending on the response content of the network request, the logic within addEventListener will need to be swapped to correctly validate the form submission&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function() {&lt;br /&gt;
    var origOpen = XMLHttpRequest.prototype.open;&lt;br /&gt;
    XMLHttpRequest.prototype.open = function() {&lt;br /&gt;
        this.addEventListener(&#039;load&#039;, function() {&lt;br /&gt;
            var response = JSON.parse(this.responseText);&lt;br /&gt;
            if ( typeof response.data != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm.success != &#039;undefined&#039; &amp;amp;&amp;amp;  response.data.submitForm.success) {&lt;br /&gt;
              window.dataLayer = window.dataLayer || [];&lt;br /&gt;
              dataLayer.push({&#039;event&#039;:&#039;contact-form-submitted&#039;})&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        origOpen.apply(this, arguments);&lt;br /&gt;
    };&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
Make sure to swap cookieconsent.js with the location of the js file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;cookieconsent.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional, but to make it look slightly better you could reduce the opacity:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
    #cconsent-bar {&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=431</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=431"/>
		<updated>2025-07-29T08:45:39Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Useful Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems !! Other&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]] || [[Arlo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]] || [[Calendly]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Roman Cart]] || [[PureChat]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Shopify]] || [[Tawk]] ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Squarespace]] || [[Tidio]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Trill]] || [[ZenDesk]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || [[Wix]] || [[Zoho]] || &lt;br /&gt;
|-&lt;br /&gt;
||| [[Yell]] || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== XML HTTP Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form submits using an XML HTTP request,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Depending on the response content of the network request, the logic within addEventListener will need to be swapped to correctly validate the form submission&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function() {&lt;br /&gt;
    var origOpen = XMLHttpRequest.prototype.open;&lt;br /&gt;
    XMLHttpRequest.prototype.open = function() {&lt;br /&gt;
        this.addEventListener(&#039;load&#039;, function() {&lt;br /&gt;
            var response = JSON.parse(this.responseText);&lt;br /&gt;
            if ( typeof response.data != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm != &#039;undefined&#039; &amp;amp;&amp;amp; typeof response.data.submitForm.success != &#039;undefined&#039; &amp;amp;&amp;amp;  response.data.submitForm.success) {&lt;br /&gt;
              window.dataLayer = window.dataLayer || [];&lt;br /&gt;
              dataLayer.push({&#039;event&#039;:&#039;contact-form-submitted&#039;})&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        origOpen.apply(this, arguments);&lt;br /&gt;
    };&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
Make sure to swap cookieconsent.js with the location of the js file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;cookieconsent.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional, but to make it look slightly better you could reduce the opacity:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
    #cconsent-bar {&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=423</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=423"/>
		<updated>2025-04-24T11:22:52Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Shopify Pixel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then. &amp;lt;/br&amp;gt;&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default. &amp;lt;/br&amp;gt;&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel. &amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://shopify.dev/docs/api/web-pixels-api/pixel-privacy Pixel privacy documentation]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;noscript&amp;gt; section needs to be added to the &amp;lt;body&amp;gt; through theme.liquid via Online Store &amp;gt; Edit.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel.&lt;br /&gt;
 - Set the Customer Privacy settings to Not required.&lt;br /&gt;
 - Set Data Sale to Data collected does not qualify as data sale.&lt;br /&gt;
 - Add the below code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-XXXXXX&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: analytics_permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: analytics_permission ,&lt;br /&gt;
    &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Custom events (for example contact form submissions) have to be sent by adding an event to the liquid files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
        document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, function (event) {&lt;br /&gt;
                Shopify.analytics.publish(&#039;EVENT_NAME_HERE&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which can then be accessed within the pixel with the same logic as the standard events:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
analytics.subscribe(&amp;quot;EVENT_NAME_HERE&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    &#039;event&#039;: &#039;EVENT_NAME&#039;&lt;br /&gt;
  });                    &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The below can also be added to have access to the dataLayer in console, which should be useful for debugging/testing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
analytics.subscribe(&amp;quot;check_datalayer&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  console.log(dataLayer);&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can then be called from console with the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Shopify.analytics.publish(&#039;check_datalayer&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File Location ==&lt;br /&gt;
&lt;br /&gt;
The Shopify pixel loads the JS into a JS file which is loaded by the browser.&amp;lt;br /&amp;gt;&lt;br /&gt;
The location of this can be built by using data from the home web page.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://&amp;lt;&amp;lt;domain&amp;gt;&amp;gt;/wpm@&amp;lt;&amp;lt;wpm_id&amp;gt;&amp;gt;/custom/web-pixel-&amp;lt;&amp;lt;pixel_id&amp;gt;&amp;gt;@&amp;lt;&amp;lt;script_version&amp;gt;&amp;gt;/sandbox/modern/&lt;br /&gt;
&lt;br /&gt;
wpm_id - is the version of the wpm (Web Pixel Manager), this is the same across all sites and will change when the wpm is updated by shopify.&lt;br /&gt;
pixel_id - this is found via the JSON below that is on the site&lt;br /&gt;
script_version - this is found via the JSON below that is on the site&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;id&amp;quot;:&amp;quot;&amp;lt;&amp;lt;pixel_id &amp;gt;&amp;gt;&amp;quot;,&amp;quot;eventPayloadVersion&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;runtimeContext&amp;quot;:&amp;quot;LAX&amp;quot;,&amp;quot;scriptVersion&amp;quot;:&amp;quot;&amp;lt;&amp;lt;script_version&amp;gt;&amp;gt;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;CUSTOM&amp;quot;,&amp;quot;privacyPurposes&amp;quot;:[],&amp;quot;name&amp;quot;:&amp;quot;GTM + Value Tracking&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager_for_WordPress_(Plugin)&amp;diff=404</id>
		<title>Google Tag Manager for WordPress (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager_for_WordPress_(Plugin)&amp;diff=404"/>
		<updated>2024-10-04T12:56:27Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* New Tracking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Google Tag Manager for WordPress is a plugin that allows easy installation and tracking for the GTM.&lt;br /&gt;
&lt;br /&gt;
https://wordpress.org/plugins/duracelltomi-google-tag-manager/&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
=== New Tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
purchase&lt;br /&gt;
&lt;br /&gt;
Variables:&amp;lt;br /&amp;gt;&lt;br /&gt;
ecommerce.value&amp;lt;br /&amp;gt;&lt;br /&gt;
ecommerce.transaction_id&lt;br /&gt;
&lt;br /&gt;
=== Classic tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
gtm4wp.orderCompleted&lt;br /&gt;
&lt;br /&gt;
transactionProducts.sku&lt;br /&gt;
&lt;br /&gt;
Example Data From GTM4WP Plugin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer = [{&lt;br /&gt;
&amp;quot;event&amp;quot;:&amp;quot;transaction&amp;quot;,&lt;br /&gt;
&amp;quot;transactionId&amp;quot;:&amp;quot;100002486&amp;quot;,&lt;br /&gt;
&amp;quot;transactionDate&amp;quot;:&amp;quot;2015-09-03&amp;quot;,&lt;br /&gt;
&amp;quot;transactionTotal&amp;quot;:295,&lt;br /&gt;
&amp;quot;transactionShipping&amp;quot;:0,&lt;br /&gt;
&amp;quot;transactionTax&amp;quot;:26.82,&lt;br /&gt;
&amp;quot;transactionPaymentType&amp;quot;:&amp;quot;Rechnung&amp;quot;,&lt;br /&gt;
&amp;quot;transactionCurrency&amp;quot;:&amp;quot;EUR&amp;quot;,&lt;br /&gt;
&amp;quot;transactionShippingMethod&amp;quot;:&amp;quot;tablerate&amp;quot;,&lt;br /&gt;
&amp;quot;transactionProducts&amp;quot;:[&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;name&amp;quot;:&amp;quot;Handelsvertretergesetz&amp;quot;,&lt;br /&gt;
&amp;quot;sku&amp;quot;:&amp;quot;9783700760344&amp;quot;,&lt;br /&gt;
&amp;quot;category&amp;quot;:&amp;quot;Buch&amp;quot;,&lt;br /&gt;
&amp;quot;price&amp;quot;:113.64,&lt;br /&gt;
&amp;quot;quantity&amp;quot;:1&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;name&amp;quot;:&amp;quot;Steuerrecht&amp;quot;,&lt;br /&gt;
&amp;quot;sku&amp;quot;:&amp;quot;9783700759294&amp;quot;,&lt;br /&gt;
&amp;quot;category&amp;quot;:&amp;quot;Kodex&amp;quot;,&lt;br /&gt;
&amp;quot;price&amp;quot;:77.27,&lt;br /&gt;
&amp;quot;quantity&amp;quot;:2&lt;br /&gt;
}&lt;br /&gt;
]&lt;br /&gt;
}];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enhanced tracking ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gtm4wp.orderCompletedEEC&lt;br /&gt;
&lt;br /&gt;
ecommerce.purchase.actionField.id&lt;br /&gt;
ecommerce.purchase.actionField.revenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;ecommerce&#039;: {&lt;br /&gt;
	&#039;purchase&#039;: {&lt;br /&gt;
	&#039;actionField&#039;: {&lt;br /&gt;
	&#039;id&#039;: &#039;3546321&#039;,&lt;br /&gt;
	&#039;affiliation&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;transactionTotal&#039;: &#039;540.00&#039;,&lt;br /&gt;
	&#039;transactionTax&#039;: &#039;93.72&#039;,&lt;br /&gt;
	&#039;revenue&#039;: &#039;446.28&#039;,&lt;br /&gt;
	&#039;currency&#039;: &#039;EUR&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;products&#039;: [{&lt;br /&gt;
	&#039;name&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;sku&#039;: &#039;4&#039;,&lt;br /&gt;
	&#039;price&#039;: &#039;446.28&#039;,&lt;br /&gt;
	&#039;category&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;quantity&#039;: 1&lt;br /&gt;
	}]&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CF7 tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
gtm4wp.contactForm7Submitted&lt;br /&gt;
&lt;br /&gt;
=== Analytics 4: Ecommerce Tracking ===&lt;br /&gt;
If Enhanced Ecommerce is enabled, then you can use the below Tag Manager template to setup Analytics 4 Ecommerce tracking for you.&amp;lt;br /&amp;gt;&lt;br /&gt;
Just make sure to test it in case it becomes outdated!&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Gtm4wp-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
Source: https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking-google-analytics-4-ga4-version&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will need to set the configuration tag to the Analytics account you want the information to be sent to, other than that it should all be done for you.&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager_for_WordPress_(Plugin)&amp;diff=403</id>
		<title>Google Tag Manager for WordPress (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager_for_WordPress_(Plugin)&amp;diff=403"/>
		<updated>2024-10-04T12:56:08Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Google Tag Manager for WordPress is a plugin that allows easy installation and tracking for the GTM.&lt;br /&gt;
&lt;br /&gt;
https://wordpress.org/plugins/duracelltomi-google-tag-manager/&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
=== New Tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
purchase&lt;br /&gt;
&lt;br /&gt;
Variables:&amp;lt;br /&amp;gt;&lt;br /&gt;
ecommerce.value&lt;br /&gt;
ecommerce.transaction_id&lt;br /&gt;
&lt;br /&gt;
=== Classic tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
gtm4wp.orderCompleted&lt;br /&gt;
&lt;br /&gt;
transactionProducts.sku&lt;br /&gt;
&lt;br /&gt;
Example Data From GTM4WP Plugin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer = [{&lt;br /&gt;
&amp;quot;event&amp;quot;:&amp;quot;transaction&amp;quot;,&lt;br /&gt;
&amp;quot;transactionId&amp;quot;:&amp;quot;100002486&amp;quot;,&lt;br /&gt;
&amp;quot;transactionDate&amp;quot;:&amp;quot;2015-09-03&amp;quot;,&lt;br /&gt;
&amp;quot;transactionTotal&amp;quot;:295,&lt;br /&gt;
&amp;quot;transactionShipping&amp;quot;:0,&lt;br /&gt;
&amp;quot;transactionTax&amp;quot;:26.82,&lt;br /&gt;
&amp;quot;transactionPaymentType&amp;quot;:&amp;quot;Rechnung&amp;quot;,&lt;br /&gt;
&amp;quot;transactionCurrency&amp;quot;:&amp;quot;EUR&amp;quot;,&lt;br /&gt;
&amp;quot;transactionShippingMethod&amp;quot;:&amp;quot;tablerate&amp;quot;,&lt;br /&gt;
&amp;quot;transactionProducts&amp;quot;:[&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;name&amp;quot;:&amp;quot;Handelsvertretergesetz&amp;quot;,&lt;br /&gt;
&amp;quot;sku&amp;quot;:&amp;quot;9783700760344&amp;quot;,&lt;br /&gt;
&amp;quot;category&amp;quot;:&amp;quot;Buch&amp;quot;,&lt;br /&gt;
&amp;quot;price&amp;quot;:113.64,&lt;br /&gt;
&amp;quot;quantity&amp;quot;:1&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;name&amp;quot;:&amp;quot;Steuerrecht&amp;quot;,&lt;br /&gt;
&amp;quot;sku&amp;quot;:&amp;quot;9783700759294&amp;quot;,&lt;br /&gt;
&amp;quot;category&amp;quot;:&amp;quot;Kodex&amp;quot;,&lt;br /&gt;
&amp;quot;price&amp;quot;:77.27,&lt;br /&gt;
&amp;quot;quantity&amp;quot;:2&lt;br /&gt;
}&lt;br /&gt;
]&lt;br /&gt;
}];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enhanced tracking ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gtm4wp.orderCompletedEEC&lt;br /&gt;
&lt;br /&gt;
ecommerce.purchase.actionField.id&lt;br /&gt;
ecommerce.purchase.actionField.revenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;ecommerce&#039;: {&lt;br /&gt;
	&#039;purchase&#039;: {&lt;br /&gt;
	&#039;actionField&#039;: {&lt;br /&gt;
	&#039;id&#039;: &#039;3546321&#039;,&lt;br /&gt;
	&#039;affiliation&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;transactionTotal&#039;: &#039;540.00&#039;,&lt;br /&gt;
	&#039;transactionTax&#039;: &#039;93.72&#039;,&lt;br /&gt;
	&#039;revenue&#039;: &#039;446.28&#039;,&lt;br /&gt;
	&#039;currency&#039;: &#039;EUR&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;products&#039;: [{&lt;br /&gt;
	&#039;name&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;sku&#039;: &#039;4&#039;,&lt;br /&gt;
	&#039;price&#039;: &#039;446.28&#039;,&lt;br /&gt;
	&#039;category&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;quantity&#039;: 1&lt;br /&gt;
	}]&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CF7 tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
gtm4wp.contactForm7Submitted&lt;br /&gt;
&lt;br /&gt;
=== Analytics 4: Ecommerce Tracking ===&lt;br /&gt;
If Enhanced Ecommerce is enabled, then you can use the below Tag Manager template to setup Analytics 4 Ecommerce tracking for you.&amp;lt;br /&amp;gt;&lt;br /&gt;
Just make sure to test it in case it becomes outdated!&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Gtm4wp-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
Source: https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking-google-analytics-4-ga4-version&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will need to set the configuration tag to the Analytics account you want the information to be sent to, other than that it should all be done for you.&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Roman_Cart&amp;diff=395</id>
		<title>Roman Cart</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Roman_Cart&amp;diff=395"/>
		<updated>2024-07-31T15:59:36Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: Created page with &amp;quot;= Installing GTM / Value Tracking =  Once signed into Roman Cart, go to Marketing &amp;gt; External Sales Tracking &amp;gt; Sales Tracking Scripts Add the below code here, swapping the GTM ID for the relevant one, make sure not to exceed the character limit. &amp;lt;pre&amp;gt; &amp;lt;!-- Google Tag Manager --&amp;gt; &amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&amp;#039;gtm.start&amp;#039;: new Date().getTime(),event:&amp;#039;gtm.js&amp;#039;});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!=&amp;#039;dataLayer&amp;#039;?&amp;#039;&amp;amp;l=&amp;#039;+l:&amp;#039;&amp;#039;;j.asy...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installing GTM / Value Tracking =&lt;br /&gt;
&lt;br /&gt;
Once signed into Roman Cart, go to Marketing &amp;gt; External Sales Tracking &amp;gt; Sales Tracking Scripts&lt;br /&gt;
Add the below code here, swapping the GTM ID for the relevant one, make sure not to exceed the character limit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Google Tag Manager --&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;,&#039;GTM-XXXXXX&#039;);&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&amp;lt;iframe src=&amp;quot;https://www.googletagmanager.com/ns.html?id=GTM-XXXXXX&amp;quot;&lt;br /&gt;
height=&amp;quot;0&amp;quot; width=&amp;quot;0&amp;quot; style=&amp;quot;display:none;visibility:hidden&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Google Tag Manager (noscript) --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_value&#039; : &#039;&amp;lt;totalpricenocurr&amp;gt;&#039;, &#039;order_id&#039; : &#039;&amp;lt;orderid&amp;gt;&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=394</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=394"/>
		<updated>2024-07-31T15:56:28Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Systems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Trill]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Wix]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || [[Yell]] || [[Zoho]]&lt;br /&gt;
|-&lt;br /&gt;
||| [[Roman Cart]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
Make sure to swap cookieconsent.js with the location of the js file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;cookieconsent.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional, but to make it look slightly better you could reduce the opacity:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
    #cconsent-bar {&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=389</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=389"/>
		<updated>2024-06-10T14:19:01Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Shopify Pixel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then. &amp;lt;/br&amp;gt;&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default. &amp;lt;/br&amp;gt;&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel. &amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://shopify.dev/docs/api/web-pixels-api/pixel-privacy Pixel privacy documentation]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;noscript&amp;gt; section needs to be added to the &amp;lt;body&amp;gt; through theme.liquid via Online Store &amp;gt; Edit.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel.&lt;br /&gt;
 - Set the Customer Privacy settings to Not required.&lt;br /&gt;
 - Set Data Sale to Data collected does not qualify as data sale.&lt;br /&gt;
 - Add the below code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-XXXXXX&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: analytics_permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: analytics_permission ,&lt;br /&gt;
    &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=388</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=388"/>
		<updated>2024-06-10T14:18:09Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Shopify Pixel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then. &amp;lt;/br&amp;gt;&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default. &amp;lt;/br&amp;gt;&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel. &amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://shopify.dev/docs/api/web-pixels-api/pixel-privacy Pixel privacy documentation]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;noscript&amp;gt; section needs to be added to the &amp;lt;body&amp;gt; through theme.liquid via Online Store &amp;gt; Edit.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 - Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel.&amp;lt;/br&amp;gt;&lt;br /&gt;
 - Set the Customer Privacy settings to Not required.&amp;lt;/br&amp;gt;&lt;br /&gt;
 - Set Data Sale to Data collected does not qualify as data sale.&amp;lt;/br&amp;gt;&lt;br /&gt;
 - Add the below code.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-XXXXXX&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: analytics_permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: analytics_permission ,&lt;br /&gt;
    &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=387</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=387"/>
		<updated>2024-06-10T14:16:57Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Shopify Pixel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then. &amp;lt;/br&amp;gt;&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default. &amp;lt;/br&amp;gt;&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel. &amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://shopify.dev/docs/api/web-pixels-api/pixel-privacy Pixel privacy documentation]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;noscript&amp;gt; section needs to be added to the &amp;lt;body&amp;gt; through theme.liquid via Online Store &amp;gt; Edit.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel.&amp;lt;/br&amp;gt;&lt;br /&gt;
Set the Customer Privacy settings to Not required.&amp;lt;/br&amp;gt;&lt;br /&gt;
Set Data Sale to Data collected does not qualify as data sale.&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-XXXXXX&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: analytics_permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: analytics_permission ,&lt;br /&gt;
    &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=386</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=386"/>
		<updated>2024-06-10T13:54:50Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Shopify Pixel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then. &amp;lt;/br&amp;gt;&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default. &amp;lt;/br&amp;gt;&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel. &amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://shopify.dev/docs/api/web-pixels-api/pixel-privacy Pixel privacy documentation]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;noscript&amp;gt; section needs to be added to the &amp;lt;body&amp;gt; through theme.liquid via Online Store &amp;gt; Edit.&lt;br /&gt;
&lt;br /&gt;
Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel&lt;br /&gt;
Set the Customer Privacy settings to Not required&lt;br /&gt;
Set Data Sale to Data collected does not qualify as data sale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-XXXXXX&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: analytics_permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let ad_permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  let analytics_permission = ( customerPrivacyStatus.analyticsProcessingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: ad_permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: analytics_permission ,&lt;br /&gt;
    &#039;ad_user_data&#039;: ad_permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: ad_permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=385</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=385"/>
		<updated>2024-06-10T13:51:09Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then. &amp;lt;/br&amp;gt;&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default. &amp;lt;/br&amp;gt;&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel. &amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://shopify.dev/docs/api/web-pixels-api/pixel-privacy Pixel privacy documentation]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;noscript&amp;gt; section needs to be added to the &amp;lt;body&amp;gt; through theme.liquid via Online Store &amp;gt; Edit.&lt;br /&gt;
&lt;br /&gt;
Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel&lt;br /&gt;
Set the Customer Privacy settings to Not required&lt;br /&gt;
Set Data Sale to Data collected does not qualify as data sale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-XXXXXX&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: permission,&lt;br /&gt;
    &#039;ad_user_data&#039;: permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=384</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=384"/>
		<updated>2024-06-10T13:48:11Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then.&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default.&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel:&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://shopify.dev/docs/api/web-pixels-api/pixel-privacy Pixel privacy documentation]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;noscript&amp;gt; section needs to be added to the &amp;lt;body&amp;gt; through theme.liquid via Online Store &amp;gt; Edit.&lt;br /&gt;
&lt;br /&gt;
Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel&lt;br /&gt;
Set the Customer Privacy settings to Not required&lt;br /&gt;
Set Data Sale to Data collected does not qualify as data sale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-XXXXXX&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: permission,&lt;br /&gt;
    &#039;ad_user_data&#039;: permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=383</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=383"/>
		<updated>2024-06-10T13:43:55Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then.&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default.&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel:&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&amp;lt;/br&amp;gt;&lt;br /&gt;
[https://shopify.dev/docs/api/web-pixels-api/pixel-privacy Pixel privacy documentation]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel&lt;br /&gt;
Set the Customer Privacy settings to Not required&lt;br /&gt;
Set Data Sale to Data collected does not qualify as data sale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-WQLMVPPC&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: permission,&lt;br /&gt;
    &#039;ad_user_data&#039;: permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=382</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=382"/>
		<updated>2024-06-10T13:43:07Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then.&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default.&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel:&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&lt;br /&gt;
[https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial Creating a GTM pixel]&lt;br /&gt;
&amp;lt;a href=&amp;quot;https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Creating a GTM pixel&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;https://shopify.dev/docs/api/web-pixels-api/pixel-privacy&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Pixel privacy&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel&lt;br /&gt;
Set the Customer Privacy settings to Not required&lt;br /&gt;
Set Data Sale to Data collected does not qualify as data sale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-WQLMVPPC&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: permission,&lt;br /&gt;
    &#039;ad_user_data&#039;: permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=381</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=381"/>
		<updated>2024-06-10T13:40:17Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then.&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default.&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel:&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&lt;br /&gt;
[Creating a GTM pixel](https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial)&lt;br /&gt;
&amp;lt;a href=&amp;quot;https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Creating a GTM pixel&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;https://shopify.dev/docs/api/web-pixels-api/pixel-privacy&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Pixel privacy&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel&lt;br /&gt;
Set the Customer Privacy settings to Not required&lt;br /&gt;
Set Data Sale to Data collected does not qualify as data sale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-WQLMVPPC&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: permission,&lt;br /&gt;
    &#039;ad_user_data&#039;: permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=380</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=380"/>
		<updated>2024-06-10T13:38:05Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Shopify Pixel =&lt;br /&gt;
&lt;br /&gt;
The old method is due to be deprecated in Dec-24, so this will only be available until then.&lt;br /&gt;
New Shopify sites also appear to have checkout scripts disabled by default.&lt;br /&gt;
The new method for adding tracking to Shopify sites is through a Custom Pixel:&lt;br /&gt;
&lt;br /&gt;
Based on Shopifys documentation:&lt;br /&gt;
&amp;lt;a href=&amp;quot;https://help.shopify.com/en/manual/promoting-marketing/pixels/custom-pixels/gtm-tutorial&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Creating a GTM pixel&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;https://shopify.dev/docs/api/web-pixels-api/pixel-privacy&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Pixel privacy&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Go to Settings &amp;gt; Customer Events &amp;gt; Add Custom Pixel&lt;br /&gt;
Set the Customer Privacy settings to Not required&lt;br /&gt;
Set Data Sale to Data collected does not qualify as data sale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Define dataLayer and the gtag function.&lt;br /&gt;
window.dataLayer = window.dataLayer || [];&lt;br /&gt;
function gtag(){dataLayer.push(arguments);}&lt;br /&gt;
&lt;br /&gt;
//Initialize GTM tag&lt;br /&gt;
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({&#039;gtm.start&#039;:&lt;br /&gt;
new Date().getTime(),event:&#039;gtm.js&#039;});var f=d.getElementsByTagName(s)[0],&lt;br /&gt;
j=d.createElement(s),dl=l!=&#039;dataLayer&#039;?&#039;&amp;amp;l=&#039;+l:&#039;&#039;;j.async=true;j.src=&lt;br /&gt;
&#039;https://www.googletagmanager.com/gtm.js?id=&#039;+i+dl;f.parentNode.insertBefore(j,f);&lt;br /&gt;
})(window,document,&#039;script&#039;,&#039;dataLayer&#039;, &#039;GTM-WQLMVPPC&#039;);&lt;br /&gt;
&lt;br /&gt;
let customerPrivacyStatus = init.customerPrivacy;&lt;br /&gt;
let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
&lt;br /&gt;
//Google Consent Mode v2&lt;br /&gt;
gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
  &#039;ad_storage&#039;: permission,&lt;br /&gt;
  &#039;analytics_storage&#039;: permission,&lt;br /&gt;
  &#039;ad_user_data&#039;: permission,&lt;br /&gt;
  &#039;ad_personalization&#039;: permission,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// Use the customerPrivacy Standard API to subscribe to consent collected events and update the status&lt;br /&gt;
api.customerPrivacy.subscribe(&#039;visitorConsentCollected&#039;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  let customerPrivacyStatus = event.customerPrivacy;&lt;br /&gt;
  let permission = ( customerPrivacyStatus.marketingAllowed ? &#039;granted&#039; : &#039;denied&#039; );&lt;br /&gt;
  gtag(&#039;consent&#039;, &#039;update&#039;, {&lt;br /&gt;
    &#039;ad_storage&#039;: permission,&lt;br /&gt;
    &#039;analytics_storage&#039;: permission,&lt;br /&gt;
    &#039;ad_user_data&#039;: permission,&lt;br /&gt;
    &#039;ad_personalization&#039;: permission,&lt;br /&gt;
  });  &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//subscribe to events&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_completed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_completed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other Ecommerce events that could be useful:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;payment_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;payment_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_shipping_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_shipping_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_address_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_address_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_contact_info_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_contact_info_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;checkout_started&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;checkout_started&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    token: event.data?.checkout?.token,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    email: event.data?.checkout?.email,&lt;br /&gt;
    phone: event.data?.checkout?.phone,&lt;br /&gt;
    first_name: event.data?.checkout?.shippingAddress?.firstName,&lt;br /&gt;
    last_name: event.data?.checkout?.shippingAddress?.lastName,&lt;br /&gt;
    address1: event.data?.checkout?.shippingAddress?.address1,&lt;br /&gt;
    address2: event.data?.checkout?.shippingAddress?.address2,&lt;br /&gt;
    city: event.data?.checkout?.shippingAddress?.city,&lt;br /&gt;
    country: event.data?.checkout?.shippingAddress?.country,&lt;br /&gt;
    countryCode: event.data?.checkout?.shippingAddress?.countryCode,&lt;br /&gt;
    province: event.data?.checkout?.shippingAddress?.province,&lt;br /&gt;
    provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,&lt;br /&gt;
    zip: event.data?.checkout?.shippingAddress?.zip,&lt;br /&gt;
    orderId: event.data?.checkout?.order?.id,&lt;br /&gt;
    currency: event.data?.checkout?.currencyCode,&lt;br /&gt;
    subtotal: event.data?.checkout?.subtotalPrice?.amount,&lt;br /&gt;
    shipping: event.data?.checkout?.shippingLine?.price?.amount,&lt;br /&gt;
    value: event.data?.checkout?.totalPrice?.amount,&lt;br /&gt;
    tax: event.data?.checkout?.totalTax?.amount,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_added_to_cart&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_added_to_cart&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    price: event.data?.cartLine?.merchandise?.price?.amount,&lt;br /&gt;
    currency:  event.data?.cartLine?.cost?.totalAmount?.currencyCode,&lt;br /&gt;
    product_id: event.data?.cartLine?.merchandise?.product?.id + &#039;_&#039; + event.data?.cartLine?.merchandise?.id,&lt;br /&gt;
    product_title: event.data?.cartLine?.merchandise?.product?.title,&lt;br /&gt;
    quantity: event.data?.cartLine?.quantity,&lt;br /&gt;
    total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,&lt;br /&gt;
    test: event.data,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;cart_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;cart_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    total_cost: event.data?.cart?.cost?.totalAmount?.amount,&lt;br /&gt;
    quantity: event.data?.cart?.totalQuantity,&lt;br /&gt;
    cart_id: event.data?.cart?.id,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;page_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;page_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    page_title: event.context.document.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;product_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;product_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    product_id: event.data?.productVariant?.product?.id + &#039;_&#039; + event.data?.productVariant?.id,&lt;br /&gt;
    product_title: event.data?.productVariant?.title,&lt;br /&gt;
    product_sku: event.data?.productVariant?.sku,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;search_submitted&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;search_submitted&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    query: event.data?.searchResult?.query,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
analytics.subscribe(&amp;quot;collection_viewed&amp;quot;, (event) =&amp;gt; {&lt;br /&gt;
  window.dataLayer.push({&lt;br /&gt;
    event: &amp;quot;collection_viewed&amp;quot;,&lt;br /&gt;
    timestamp: event.timestamp,&lt;br /&gt;
    id: event.id,&lt;br /&gt;
    client_id: event.clientId,&lt;br /&gt;
    url: event.context.document.location.href,&lt;br /&gt;
    collection_id: event.data?.collection?.id,&lt;br /&gt;
    collection_title: event.data?.collection?.title,&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot; or &amp;quot;contact.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is for Reference, Do not use!&amp;lt;br /&amp;gt;&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=377</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=377"/>
		<updated>2024-03-07T09:49:37Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Cookie Consent Banner &amp;amp; Consent Mode V2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
Make sure to swap cookieconsent.js with the location of the js file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;cookieconsent.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional, but to make it look slightly better you could reduce the opacity:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
    #cconsent-bar {&lt;br /&gt;
      opacity: 0.9;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=376</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=376"/>
		<updated>2024-03-07T09:18:05Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Cookie Consent Banner &amp;amp; Consent Mode V2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
Make sure to swap cookieconsent.js with the location of the js file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;cookieconsent.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=375</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=375"/>
		<updated>2024-03-07T09:13:06Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Cookie Consent Banner &amp;amp; Consent Mode V2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
Make sure to swap \{\{cookieconsent.js\}\} with the location of the js file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;{{cookieconsent.js}}&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=374</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=374"/>
		<updated>2024-03-07T09:12:52Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Cookie Consent Banner &amp;amp; Consent Mode V2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
Make sure to swap &amp;quot;{{cookieconsent.js}}&amp;quot; with the location of the js file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;{{cookieconsent.js}}&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=373</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=373"/>
		<updated>2024-03-07T09:12:33Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Cookie Consent Banner &amp;amp; Consent Mode V2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
Make sure to swap {{cookieconsent.js}} with the location of the js file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;{{cookieconsent.js}}&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=372</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=372"/>
		<updated>2024-03-07T09:11:45Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Cookie Consent Banner &amp;amp; Consent Mode V2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;{{cookieconsent.js}}&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=371</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=371"/>
		<updated>2024-03-07T09:11:27Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Cookie Consent Banner &amp;amp; Consent Mode V2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;{{cookieconsent.js}}&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Cookies used by Google &amp;amp; other 3rd party analytics services&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=370</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=370"/>
		<updated>2024-03-07T09:11:07Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Cookie Consent Banner &amp;amp; Consent Mode V2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;{{cookieconsent.js}}&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Used by Google &amp;amp; other 3rd party analytics services&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=369</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=369"/>
		<updated>2024-03-06T16:56:22Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
Within the .zip, the file is /build/cookieconsent.js&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
This file will need to be hosted somewhere that is accessible for the client site.&lt;br /&gt;
Once this has been done the below script will need to be added to the site, before GTM is loaded.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;{{cookieconsent.js}}&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Used by Google &amp;amp; other 3rd party Analytics services&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=368</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=368"/>
		<updated>2024-03-06T16:54:39Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
&lt;br /&gt;
[[Media:Cookieconsent-master.zip|Cookieconsent-master.zip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;{{cookieconsent.js}}&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Used by Google &amp;amp; other 3rd party Analytics services&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=File:Cookieconsent-master.zip&amp;diff=367</id>
		<title>File:Cookieconsent-master.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=File:Cookieconsent-master.zip&amp;diff=367"/>
		<updated>2024-03-06T16:50:46Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=366</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=366"/>
		<updated>2024-03-06T16:50:04Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[PureChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || || [[Zoho]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cookie Consent Banner &amp;amp; Consent Mode V2 ==&lt;br /&gt;
&lt;br /&gt;
For clients that don&#039;t have this setup &amp;amp; functioning already, its possible to setup a consent mode friendly cookie banner using the below JS:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;{{cookieconsent.js}}&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // Define dataLayer and the gtag function.&lt;br /&gt;
    window.dataLayer = window.dataLayer || [];&lt;br /&gt;
    function gtag() { dataLayer.push(arguments); }&lt;br /&gt;
    window.CookieConsent.init({&lt;br /&gt;
        categories: {&lt;br /&gt;
            // Unique name.&lt;br /&gt;
            necessary: {&lt;br /&gt;
                needed: true,&lt;br /&gt;
                wanted: true,&lt;br /&gt;
                checked: true,&lt;br /&gt;
                // Language settings for categories.&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Strictly Necessary Cookies&#039;,&lt;br /&gt;
                            description: &#039;Cookies Required for the site to function as intended.&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            analytics: {&lt;br /&gt;
                needed: false,&lt;br /&gt;
                wanted: false,&lt;br /&gt;
                checked: false,&lt;br /&gt;
                language: {&lt;br /&gt;
                    locale: {&lt;br /&gt;
                        en: {&lt;br /&gt;
                            name: &#039;Analytics&#039;,&lt;br /&gt;
                            description: &#039;Used by Google &amp;amp; other 3rd party Analytics services&#039;,&lt;br /&gt;
                        },&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        consentModeControls: {&lt;br /&gt;
            ad_storage: &#039;analytics&#039;,&lt;br /&gt;
            ad_user_data: &#039;analytics&#039;,&lt;br /&gt;
            ad_personalization: &#039;analytics&#039;,&lt;br /&gt;
            analytics_storage: &#039;analytics&#039;&lt;br /&gt;
        },&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    if (localStorage.getItem(&#039;consentMode&#039;) === null) {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, {&lt;br /&gt;
            &#039;ad_storage&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_user_data&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;ad_personalization&#039;: &#039;denied&#039;,&lt;br /&gt;
            &#039;analytics_storage&#039;: &#039;denied&#039;&lt;br /&gt;
        });&lt;br /&gt;
    } else {&lt;br /&gt;
        gtag(&#039;consent&#039;, &#039;default&#039;, JSON.parse(localStorage.getItem(&#039;consentMode&#039;)));&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=File:Gtm-2x.ocmod.zip&amp;diff=365</id>
		<title>File:Gtm-2x.ocmod.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=File:Gtm-2x.ocmod.zip&amp;diff=365"/>
		<updated>2024-02-16T15:43:40Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: Ben.robson uploaded a new version of File:Gtm-2x.ocmod.zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=OpenCart&amp;diff=364</id>
		<title>OpenCart</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=OpenCart&amp;diff=364"/>
		<updated>2024-02-09T14:51:55Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* OCmod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Google Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Install Tag Manager.&lt;br /&gt;
*Note, the OCmod &amp;amp; VQmod scripts below insert the Tag Manager.&lt;br /&gt;
&lt;br /&gt;
Main Template file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/catalog/view/theme/&amp;lt;&amp;lt;Theme Folder&amp;gt;&amp;gt;/template/common/header.tpl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion URLS ==&lt;br /&gt;
Contact Thank-you URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=information/contact/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sale Thank-you URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=checkout/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Account Creation URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=account/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion Value ==&lt;br /&gt;
&lt;br /&gt;
The easiest and most reliable way to install the Conversion value tracking is via extensions that inject the code directly into core files.&amp;lt;br /&amp;gt;&lt;br /&gt;
These are upgrade safe! (The worst that can happen is that a reference can change and the code is not injected)&amp;lt;br /&amp;gt;&lt;br /&gt;
Before using these, it is best to check that the references are the same.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Change the GTM ID&#039;s in the scripts!&amp;lt;/b&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
OpenCart 2.x uses .tpl files&amp;lt;br /&amp;gt;&lt;br /&gt;
OpenCart 3.x uses .twig files&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VQmod ===&lt;br /&gt;
An OpenCart extension called VQmod is required to insert it into the code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vqmod/xml/get_total_to_success.xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Get total to success.xml|Get_total_to_success.xml]]&lt;br /&gt;
&lt;br /&gt;
=== OCmod ===&lt;br /&gt;
&lt;br /&gt;
An OpenCart extension called OCmod is required to insert it into the code.&lt;br /&gt;
&lt;br /&gt;
Opencart v3.0 Onwards:&lt;br /&gt;
[[Media:Gtm.ocmod.zip|Gtm.ocmod.zip]]&lt;br /&gt;
&lt;br /&gt;
Opencart v2.0:&lt;br /&gt;
[[Media:Gtm-2x.ocmod.zip|Gtm-2x.ocmod.zip]]&lt;br /&gt;
&lt;br /&gt;
= Feeds =&lt;br /&gt;
&lt;br /&gt;
The Google Base extension will need to be installed and activated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://docs.opencart.com/en-gb/extension/feed/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The URL for the generated Feed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/index.php?route=feed/google_base&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=OpenCart&amp;diff=363</id>
		<title>OpenCart</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=OpenCart&amp;diff=363"/>
		<updated>2024-02-09T14:51:47Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* OCmod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Google Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Install Tag Manager.&lt;br /&gt;
*Note, the OCmod &amp;amp; VQmod scripts below insert the Tag Manager.&lt;br /&gt;
&lt;br /&gt;
Main Template file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/catalog/view/theme/&amp;lt;&amp;lt;Theme Folder&amp;gt;&amp;gt;/template/common/header.tpl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion URLS ==&lt;br /&gt;
Contact Thank-you URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=information/contact/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sale Thank-you URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=checkout/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Account Creation URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=account/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion Value ==&lt;br /&gt;
&lt;br /&gt;
The easiest and most reliable way to install the Conversion value tracking is via extensions that inject the code directly into core files.&amp;lt;br /&amp;gt;&lt;br /&gt;
These are upgrade safe! (The worst that can happen is that a reference can change and the code is not injected)&amp;lt;br /&amp;gt;&lt;br /&gt;
Before using these, it is best to check that the references are the same.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Change the GTM ID&#039;s in the scripts!&amp;lt;/b&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
OpenCart 2.x uses .tpl files&amp;lt;br /&amp;gt;&lt;br /&gt;
OpenCart 3.x uses .twig files&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VQmod ===&lt;br /&gt;
An OpenCart extension called VQmod is required to insert it into the code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vqmod/xml/get_total_to_success.xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Get total to success.xml|Get_total_to_success.xml]]&lt;br /&gt;
&lt;br /&gt;
=== OCmod ===&lt;br /&gt;
&lt;br /&gt;
An OpenCart extension called OCmod is required to insert it into the code.&lt;br /&gt;
&lt;br /&gt;
Opencart v3.0 Onwards:&lt;br /&gt;
[[Media:Gtm.ocmod.zip|Gtm.ocmod.zip]]&lt;br /&gt;
&lt;br /&gt;
Opencart 2.0:&lt;br /&gt;
[[Media:Gtm-2x.ocmod.zip|Gtm-2x.ocmod.zip]]&lt;br /&gt;
&lt;br /&gt;
= Feeds =&lt;br /&gt;
&lt;br /&gt;
The Google Base extension will need to be installed and activated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://docs.opencart.com/en-gb/extension/feed/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The URL for the generated Feed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/index.php?route=feed/google_base&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=OpenCart&amp;diff=362</id>
		<title>OpenCart</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=OpenCart&amp;diff=362"/>
		<updated>2024-02-09T14:51:20Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* OCmod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Google Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Install Tag Manager.&lt;br /&gt;
*Note, the OCmod &amp;amp; VQmod scripts below insert the Tag Manager.&lt;br /&gt;
&lt;br /&gt;
Main Template file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/catalog/view/theme/&amp;lt;&amp;lt;Theme Folder&amp;gt;&amp;gt;/template/common/header.tpl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion URLS ==&lt;br /&gt;
Contact Thank-you URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=information/contact/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sale Thank-you URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=checkout/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Account Creation URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=account/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion Value ==&lt;br /&gt;
&lt;br /&gt;
The easiest and most reliable way to install the Conversion value tracking is via extensions that inject the code directly into core files.&amp;lt;br /&amp;gt;&lt;br /&gt;
These are upgrade safe! (The worst that can happen is that a reference can change and the code is not injected)&amp;lt;br /&amp;gt;&lt;br /&gt;
Before using these, it is best to check that the references are the same.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Change the GTM ID&#039;s in the scripts!&amp;lt;/b&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
OpenCart 2.x uses .tpl files&amp;lt;br /&amp;gt;&lt;br /&gt;
OpenCart 3.x uses .twig files&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VQmod ===&lt;br /&gt;
An OpenCart extension called VQmod is required to insert it into the code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vqmod/xml/get_total_to_success.xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Get total to success.xml|Get_total_to_success.xml]]&lt;br /&gt;
&lt;br /&gt;
=== OCmod ===&lt;br /&gt;
&lt;br /&gt;
An OpenCart extension called OCmod is required to insert it into the code.&lt;br /&gt;
&lt;br /&gt;
Opencart 3.0 onwards:&lt;br /&gt;
[[Media:Gtm.ocmod.zip|Gtm.ocmod.zip]]&lt;br /&gt;
&lt;br /&gt;
Opencart 2.0:&lt;br /&gt;
[[Media:Gtm-2x.ocmod.zip|Gtm-2x.ocmod.zip]]&lt;br /&gt;
&lt;br /&gt;
= Feeds =&lt;br /&gt;
&lt;br /&gt;
The Google Base extension will need to be installed and activated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://docs.opencart.com/en-gb/extension/feed/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The URL for the generated Feed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/index.php?route=feed/google_base&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=File:Gtm-2x.ocmod.zip&amp;diff=361</id>
		<title>File:Gtm-2x.ocmod.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=File:Gtm-2x.ocmod.zip&amp;diff=361"/>
		<updated>2024-02-09T14:50:55Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=OpenCart&amp;diff=360</id>
		<title>OpenCart</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=OpenCart&amp;diff=360"/>
		<updated>2024-02-09T14:50:38Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* OCmod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Google Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Install Tag Manager.&lt;br /&gt;
*Note, the OCmod &amp;amp; VQmod scripts below insert the Tag Manager.&lt;br /&gt;
&lt;br /&gt;
Main Template file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/catalog/view/theme/&amp;lt;&amp;lt;Theme Folder&amp;gt;&amp;gt;/template/common/header.tpl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion URLS ==&lt;br /&gt;
Contact Thank-you URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=information/contact/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sale Thank-you URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=checkout/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Account Creation URL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
index.php?route=account/success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion Value ==&lt;br /&gt;
&lt;br /&gt;
The easiest and most reliable way to install the Conversion value tracking is via extensions that inject the code directly into core files.&amp;lt;br /&amp;gt;&lt;br /&gt;
These are upgrade safe! (The worst that can happen is that a reference can change and the code is not injected)&amp;lt;br /&amp;gt;&lt;br /&gt;
Before using these, it is best to check that the references are the same.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Change the GTM ID&#039;s in the scripts!&amp;lt;/b&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
OpenCart 2.x uses .tpl files&amp;lt;br /&amp;gt;&lt;br /&gt;
OpenCart 3.x uses .twig files&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== VQmod ===&lt;br /&gt;
An OpenCart extension called VQmod is required to insert it into the code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vqmod/xml/get_total_to_success.xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Media:Get total to success.xml|Get_total_to_success.xml]]&lt;br /&gt;
&lt;br /&gt;
=== OCmod ===&lt;br /&gt;
&lt;br /&gt;
An OpenCart extension called OCmod is required to insert it into the code.&lt;br /&gt;
&lt;br /&gt;
Opencart 3.0 onwards:&lt;br /&gt;
[[Media:Gtm.ocmod.zip|Gtm.ocmod.zip]]&lt;br /&gt;
&lt;br /&gt;
Opencart 2.0:&lt;br /&gt;
&lt;br /&gt;
= Feeds =&lt;br /&gt;
&lt;br /&gt;
The Google Base extension will need to be installed and activated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://docs.opencart.com/en-gb/extension/feed/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
The URL for the generated Feed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/index.php?route=feed/google_base&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=File:Gtm.ocmod.zip&amp;diff=358</id>
		<title>File:Gtm.ocmod.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=File:Gtm.ocmod.zip&amp;diff=358"/>
		<updated>2024-02-09T14:32:21Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: Ben.robson uploaded a new version of File:Gtm.ocmod.zip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
GTM OCmod install script&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager_for_WordPress_(Plugin)&amp;diff=349</id>
		<title>Google Tag Manager for WordPress (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager_for_WordPress_(Plugin)&amp;diff=349"/>
		<updated>2023-11-22T17:08:04Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Google Tag Manager for WordPress is a plugin that allows easy installation and tracking for the GTM.&lt;br /&gt;
&lt;br /&gt;
https://wordpress.org/plugins/duracelltomi-google-tag-manager/&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
=== Classic tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
gtm4wp.orderCompleted&lt;br /&gt;
&lt;br /&gt;
transactionProducts.sku&lt;br /&gt;
&lt;br /&gt;
Example Data From GTM4WP Plugin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer = [{&lt;br /&gt;
&amp;quot;event&amp;quot;:&amp;quot;transaction&amp;quot;,&lt;br /&gt;
&amp;quot;transactionId&amp;quot;:&amp;quot;100002486&amp;quot;,&lt;br /&gt;
&amp;quot;transactionDate&amp;quot;:&amp;quot;2015-09-03&amp;quot;,&lt;br /&gt;
&amp;quot;transactionTotal&amp;quot;:295,&lt;br /&gt;
&amp;quot;transactionShipping&amp;quot;:0,&lt;br /&gt;
&amp;quot;transactionTax&amp;quot;:26.82,&lt;br /&gt;
&amp;quot;transactionPaymentType&amp;quot;:&amp;quot;Rechnung&amp;quot;,&lt;br /&gt;
&amp;quot;transactionCurrency&amp;quot;:&amp;quot;EUR&amp;quot;,&lt;br /&gt;
&amp;quot;transactionShippingMethod&amp;quot;:&amp;quot;tablerate&amp;quot;,&lt;br /&gt;
&amp;quot;transactionProducts&amp;quot;:[&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;name&amp;quot;:&amp;quot;Handelsvertretergesetz&amp;quot;,&lt;br /&gt;
&amp;quot;sku&amp;quot;:&amp;quot;9783700760344&amp;quot;,&lt;br /&gt;
&amp;quot;category&amp;quot;:&amp;quot;Buch&amp;quot;,&lt;br /&gt;
&amp;quot;price&amp;quot;:113.64,&lt;br /&gt;
&amp;quot;quantity&amp;quot;:1&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;name&amp;quot;:&amp;quot;Steuerrecht&amp;quot;,&lt;br /&gt;
&amp;quot;sku&amp;quot;:&amp;quot;9783700759294&amp;quot;,&lt;br /&gt;
&amp;quot;category&amp;quot;:&amp;quot;Kodex&amp;quot;,&lt;br /&gt;
&amp;quot;price&amp;quot;:77.27,&lt;br /&gt;
&amp;quot;quantity&amp;quot;:2&lt;br /&gt;
}&lt;br /&gt;
]&lt;br /&gt;
}];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enhanced tracking ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gtm4wp.orderCompletedEEC&lt;br /&gt;
&lt;br /&gt;
ecommerce.purchase.actionField.id&lt;br /&gt;
ecommerce.purchase.actionField.revenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;ecommerce&#039;: {&lt;br /&gt;
	&#039;purchase&#039;: {&lt;br /&gt;
	&#039;actionField&#039;: {&lt;br /&gt;
	&#039;id&#039;: &#039;3546321&#039;,&lt;br /&gt;
	&#039;affiliation&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;transactionTotal&#039;: &#039;540.00&#039;,&lt;br /&gt;
	&#039;transactionTax&#039;: &#039;93.72&#039;,&lt;br /&gt;
	&#039;revenue&#039;: &#039;446.28&#039;,&lt;br /&gt;
	&#039;currency&#039;: &#039;EUR&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;products&#039;: [{&lt;br /&gt;
	&#039;name&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;sku&#039;: &#039;4&#039;,&lt;br /&gt;
	&#039;price&#039;: &#039;446.28&#039;,&lt;br /&gt;
	&#039;category&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;quantity&#039;: 1&lt;br /&gt;
	}]&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CF7 tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
gtm4wp.contactForm7Submitted&lt;br /&gt;
&lt;br /&gt;
=== Analytics 4: Ecommerce Tracking ===&lt;br /&gt;
If Enhanced Ecommerce is enabled, then you can use the below Tag Manager template to setup Analytics 4 Ecommerce tracking for you.&amp;lt;br /&amp;gt;&lt;br /&gt;
Just make sure to test it in case it becomes outdated!&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Gtm4wp-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
Source: https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking-google-analytics-4-ga4-version&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will need to set the configuration tag to the Analytics account you want the information to be sent to, other than that it should all be done for you.&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager_for_WordPress_(Plugin)&amp;diff=348</id>
		<title>Google Tag Manager for WordPress (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager_for_WordPress_(Plugin)&amp;diff=348"/>
		<updated>2023-11-22T16:22:36Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Enhanced tracking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Google Tag Manager for WordPress is a plugin that allows easy installation and tracking for the GTM.&lt;br /&gt;
&lt;br /&gt;
https://wordpress.org/plugins/duracelltomi-google-tag-manager/&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
=== Classic tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
gtm4wp.orderCompleted&lt;br /&gt;
&lt;br /&gt;
transactionProducts.sku&lt;br /&gt;
&lt;br /&gt;
Example Data From GTM4WP Plugin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer = [{&lt;br /&gt;
&amp;quot;event&amp;quot;:&amp;quot;transaction&amp;quot;,&lt;br /&gt;
&amp;quot;transactionId&amp;quot;:&amp;quot;100002486&amp;quot;,&lt;br /&gt;
&amp;quot;transactionDate&amp;quot;:&amp;quot;2015-09-03&amp;quot;,&lt;br /&gt;
&amp;quot;transactionTotal&amp;quot;:295,&lt;br /&gt;
&amp;quot;transactionShipping&amp;quot;:0,&lt;br /&gt;
&amp;quot;transactionTax&amp;quot;:26.82,&lt;br /&gt;
&amp;quot;transactionPaymentType&amp;quot;:&amp;quot;Rechnung&amp;quot;,&lt;br /&gt;
&amp;quot;transactionCurrency&amp;quot;:&amp;quot;EUR&amp;quot;,&lt;br /&gt;
&amp;quot;transactionShippingMethod&amp;quot;:&amp;quot;tablerate&amp;quot;,&lt;br /&gt;
&amp;quot;transactionProducts&amp;quot;:[&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;name&amp;quot;:&amp;quot;Handelsvertretergesetz&amp;quot;,&lt;br /&gt;
&amp;quot;sku&amp;quot;:&amp;quot;9783700760344&amp;quot;,&lt;br /&gt;
&amp;quot;category&amp;quot;:&amp;quot;Buch&amp;quot;,&lt;br /&gt;
&amp;quot;price&amp;quot;:113.64,&lt;br /&gt;
&amp;quot;quantity&amp;quot;:1&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;name&amp;quot;:&amp;quot;Steuerrecht&amp;quot;,&lt;br /&gt;
&amp;quot;sku&amp;quot;:&amp;quot;9783700759294&amp;quot;,&lt;br /&gt;
&amp;quot;category&amp;quot;:&amp;quot;Kodex&amp;quot;,&lt;br /&gt;
&amp;quot;price&amp;quot;:77.27,&lt;br /&gt;
&amp;quot;quantity&amp;quot;:2&lt;br /&gt;
}&lt;br /&gt;
]&lt;br /&gt;
}];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enhanced tracking ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Events:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
purchase&lt;br /&gt;
&lt;br /&gt;
eventModel.transaction_id&lt;br /&gt;
eventModel.value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Legacy events (these should, in most cases still work):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gtm4wp.orderCompletedEEC&lt;br /&gt;
&lt;br /&gt;
ecommerce.purchase.actionField.id&lt;br /&gt;
ecommerce.purchase.actionField.revenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;ecommerce&#039;: {&lt;br /&gt;
	&#039;purchase&#039;: {&lt;br /&gt;
	&#039;actionField&#039;: {&lt;br /&gt;
	&#039;id&#039;: &#039;3546321&#039;,&lt;br /&gt;
	&#039;affiliation&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;transactionTotal&#039;: &#039;540.00&#039;,&lt;br /&gt;
	&#039;transactionTax&#039;: &#039;93.72&#039;,&lt;br /&gt;
	&#039;revenue&#039;: &#039;446.28&#039;,&lt;br /&gt;
	&#039;currency&#039;: &#039;EUR&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;products&#039;: [{&lt;br /&gt;
	&#039;name&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;sku&#039;: &#039;4&#039;,&lt;br /&gt;
	&#039;price&#039;: &#039;446.28&#039;,&lt;br /&gt;
	&#039;category&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;quantity&#039;: 1&lt;br /&gt;
	}]&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CF7 tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
gtm4wp.contactForm7Submitted&lt;br /&gt;
&lt;br /&gt;
=== Analytics 4: Ecommerce Tracking ===&lt;br /&gt;
If Enhanced Ecommerce is enabled, then you can use the below Tag Manager template to setup Analytics 4 Ecommerce tracking for you.&amp;lt;br /&amp;gt;&lt;br /&gt;
Just make sure to test it in case it becomes outdated!&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Gtm4wp-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
Source: https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking-google-analytics-4-ga4-version&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will need to set the configuration tag to the Analytics account you want the information to be sent to, other than that it should all be done for you.&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager_for_WordPress_(Plugin)&amp;diff=347</id>
		<title>Google Tag Manager for WordPress (Plugin)</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager_for_WordPress_(Plugin)&amp;diff=347"/>
		<updated>2023-11-22T16:22:22Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Enhanced tracking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Google Tag Manager for WordPress is a plugin that allows easy installation and tracking for the GTM.&lt;br /&gt;
&lt;br /&gt;
https://wordpress.org/plugins/duracelltomi-google-tag-manager/&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
=== Classic tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
gtm4wp.orderCompleted&lt;br /&gt;
&lt;br /&gt;
transactionProducts.sku&lt;br /&gt;
&lt;br /&gt;
Example Data From GTM4WP Plugin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer = [{&lt;br /&gt;
&amp;quot;event&amp;quot;:&amp;quot;transaction&amp;quot;,&lt;br /&gt;
&amp;quot;transactionId&amp;quot;:&amp;quot;100002486&amp;quot;,&lt;br /&gt;
&amp;quot;transactionDate&amp;quot;:&amp;quot;2015-09-03&amp;quot;,&lt;br /&gt;
&amp;quot;transactionTotal&amp;quot;:295,&lt;br /&gt;
&amp;quot;transactionShipping&amp;quot;:0,&lt;br /&gt;
&amp;quot;transactionTax&amp;quot;:26.82,&lt;br /&gt;
&amp;quot;transactionPaymentType&amp;quot;:&amp;quot;Rechnung&amp;quot;,&lt;br /&gt;
&amp;quot;transactionCurrency&amp;quot;:&amp;quot;EUR&amp;quot;,&lt;br /&gt;
&amp;quot;transactionShippingMethod&amp;quot;:&amp;quot;tablerate&amp;quot;,&lt;br /&gt;
&amp;quot;transactionProducts&amp;quot;:[&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;name&amp;quot;:&amp;quot;Handelsvertretergesetz&amp;quot;,&lt;br /&gt;
&amp;quot;sku&amp;quot;:&amp;quot;9783700760344&amp;quot;,&lt;br /&gt;
&amp;quot;category&amp;quot;:&amp;quot;Buch&amp;quot;,&lt;br /&gt;
&amp;quot;price&amp;quot;:113.64,&lt;br /&gt;
&amp;quot;quantity&amp;quot;:1&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
&amp;quot;name&amp;quot;:&amp;quot;Steuerrecht&amp;quot;,&lt;br /&gt;
&amp;quot;sku&amp;quot;:&amp;quot;9783700759294&amp;quot;,&lt;br /&gt;
&amp;quot;category&amp;quot;:&amp;quot;Kodex&amp;quot;,&lt;br /&gt;
&amp;quot;price&amp;quot;:77.27,&lt;br /&gt;
&amp;quot;quantity&amp;quot;:2&lt;br /&gt;
}&lt;br /&gt;
]&lt;br /&gt;
}];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enhanced tracking ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The GA4 version of EEC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
purchase&lt;br /&gt;
&lt;br /&gt;
eventModel.transaction_id&lt;br /&gt;
eventModel.value&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Legacy events (these should, in most cases still work):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gtm4wp.orderCompletedEEC&lt;br /&gt;
&lt;br /&gt;
ecommerce.purchase.actionField.id&lt;br /&gt;
ecommerce.purchase.actionField.revenue&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;ecommerce&#039;: {&lt;br /&gt;
	&#039;purchase&#039;: {&lt;br /&gt;
	&#039;actionField&#039;: {&lt;br /&gt;
	&#039;id&#039;: &#039;3546321&#039;,&lt;br /&gt;
	&#039;affiliation&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;transactionTotal&#039;: &#039;540.00&#039;,&lt;br /&gt;
	&#039;transactionTax&#039;: &#039;93.72&#039;,&lt;br /&gt;
	&#039;revenue&#039;: &#039;446.28&#039;,&lt;br /&gt;
	&#039;currency&#039;: &#039;EUR&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&#039;products&#039;: [{&lt;br /&gt;
	&#039;name&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;sku&#039;: &#039;4&#039;,&lt;br /&gt;
	&#039;price&#039;: &#039;446.28&#039;,&lt;br /&gt;
	&#039;category&#039;: &#039;test&#039;,&lt;br /&gt;
	&#039;quantity&#039;: 1&lt;br /&gt;
	}]&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CF7 tracking ===&lt;br /&gt;
event:&amp;lt;br /&amp;gt;&lt;br /&gt;
gtm4wp.contactForm7Submitted&lt;br /&gt;
&lt;br /&gt;
=== Analytics 4: Ecommerce Tracking ===&lt;br /&gt;
If Enhanced Ecommerce is enabled, then you can use the below Tag Manager template to setup Analytics 4 Ecommerce tracking for you.&amp;lt;br /&amp;gt;&lt;br /&gt;
Just make sure to test it in case it becomes outdated!&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Gtm4wp-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
Source: https://gtm4wp.com/how-to-articles/how-to-setup-enhanced-ecommerce-tracking-google-analytics-4-ga4-version&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will need to set the configuration tag to the Analytics account you want the information to be sent to, other than that it should all be done for you.&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=336</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=336"/>
		<updated>2023-06-12T13:59:19Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Unique Page Views */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[Zoho]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g, &#039;F_SLASH&#039;);&lt;br /&gt;
  if (sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage[page_path]) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(page_path, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 var page_path = &amp;quot;{{Page Path}}&amp;quot;.replace(/\//g,&amp;quot;F_SLASH&amp;quot;);&lt;br /&gt;
 return parseInt(window.sessionStorage[page_path]); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=335</id>
		<title>Google Tag Manager</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Google_Tag_Manager&amp;diff=335"/>
		<updated>2023-06-09T14:30:55Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Useful Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= GTM =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://tagmanager.google.com/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Google Tag Manager is a site container used for storing and triggering scripts.&amp;lt;br /&amp;gt;&lt;br /&gt;
These then can be used for tracking.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Systems =&lt;br /&gt;
&lt;br /&gt;
Below are links to pages for different systems.&lt;br /&gt;
These pages will include the methods used for installing the Tag Manager and the Conversion Value tracking.&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Self-Host System !! On-site Builder Systems !! Chat Systems&lt;br /&gt;
|-&lt;br /&gt;
| [[CS-Cart]] || [[Bigcommerce]] || [[CollectChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Joomla]] || [[Ecwid]] || [[HubSpot Chat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 1.x]] || [[EKMPowershop]] || [[Jivo]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Magento 2.x]] || [[MyshopBlocks]] || [[LiveChat]]&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenCart]] || [[Shopify]] || [[Tawk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Prestashop]] || [[Squarespace]] || [[Tidio]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Tag Manager Installation (Wordpress)|Wordpress]] || [[Wix]] || [[ZenDesk]]&lt;br /&gt;
|-&lt;br /&gt;
| [[X-Cart]] || [[Yell]] || [[Zoho]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Zen Cart]] || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Useful Info =&lt;br /&gt;
&lt;br /&gt;
== Generic jQuery Form Listener ==&lt;br /&gt;
&lt;br /&gt;
If there is no instructions in the wiki for a particular system and/or plugin and the form uses Ajax to submit,&lt;br /&gt;
It may be worth trying this generic form listener.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
depending on what the jQuery is called when initialized you may need to change &amp;quot;jQuery&amp;quot; to &amp;quot;$&amp;quot; in the code below.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
create a custom HTML tag and change the index URL to what the URL is submitting to in the Ajax form.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/form/process/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
note: the form must be using the actual jQuery&#039;s Ajax method to perform the request for this to work&lt;br /&gt;
&lt;br /&gt;
== Unique Page Views ==&lt;br /&gt;
&lt;br /&gt;
You can track unique page views by storing a value in the sessionStorage variable.&lt;br /&gt;
This can be useful for tracking forms where only a thank you page is available track.&lt;br /&gt;
&lt;br /&gt;
Create a tag that only fires on the page you want to track&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  var gtm_fs_count = 1;&lt;br /&gt;
  if (sessionStorage.gtm_fs_count) {&lt;br /&gt;
    &lt;br /&gt;
     gtm_fs_count = gtm_fs_count+1;&lt;br /&gt;
     sessionStorage.setItem(&amp;quot;gtm_fs_count&amp;quot;, gtm_fs_count);&lt;br /&gt;
    &lt;br /&gt;
  } else if(!sessionStorage.gtm_fs_count) {&lt;br /&gt;
    &lt;br /&gt;
     sessionStorage.setItem(&amp;quot;gtm_fs_count&amp;quot;, gtm_fs_count) ;&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a custom JS variable to retrieve the value:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function() {&lt;br /&gt;
 return parseInt(window.sessionStorage.gtm_fs_count) &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then update the trigger to the variable is less than 2 as well as its existing conditions&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Tag_Manager_Installation_(Wordpress)&amp;diff=290</id>
		<title>Tag Manager Installation (Wordpress)</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Tag_Manager_Installation_(Wordpress)&amp;diff=290"/>
		<updated>2022-11-04T14:29:10Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* WP Forms */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
To install on google tag manager it is advised to use the Duracell Tomi Plugin:&lt;br /&gt;
[[Google Tag Manager for WordPress (Plugin)]]&lt;br /&gt;
&lt;br /&gt;
= Tracking Other Wordpress Contact Plugins =&lt;br /&gt;
&lt;br /&gt;
== Formidable ==&lt;br /&gt;
Just can copy and paste the dataLayer event script directly to success message in back-end.&lt;br /&gt;
&lt;br /&gt;
== Siteorigin form ==&lt;br /&gt;
this strips out script tags so will need to add custom JS:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function () {&lt;br /&gt;
  var success = document.getElementsByClassName(&amp;quot;sow-contact-form-success&amp;quot;);&lt;br /&gt;
  return (typeof success[0] != &amp;quot;undefined&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FormCraft ==&lt;br /&gt;
&lt;br /&gt;
This plugin does not strip or encode script tags, so can be done in the back-end&lt;br /&gt;
&lt;br /&gt;
In form options go to options -&amp;gt; Custom Text -&amp;gt; Top Box&lt;br /&gt;
&lt;br /&gt;
In newer versions, the form cannot be saved with the script tag added,&lt;br /&gt;
another method will need to be researched.&lt;br /&gt;
&lt;br /&gt;
== Gravity Form ==&lt;br /&gt;
&lt;br /&gt;
Create tag as custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	jQuery(document).ready(function(){&lt;br /&gt;
		jQuery(document).on(&#039;gform_confirmation_loaded&#039;, function(event, form_id) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;gform_id&#039; : form_id, &#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For this to work, AJAX is required to be enabled on the form.&lt;br /&gt;
This can be enabled in the short-code[https://codex.wordpress.org/Shortcode_API] when the form is called on the wordpress page:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[gravityform id=&amp;quot;1&amp;quot; ajax=&amp;quot;true&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*note, the JS bind will not fire if the form is set to redirect after success.&lt;br /&gt;
&lt;br /&gt;
== Elementor Form Builder ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery( document ).ready(function( $ ){&lt;br /&gt;
	$( document ).on(&#039;submit_success&#039;, function( event, response ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pojo Forms ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery( document ).ready(function( $ ){&lt;br /&gt;
	$( document ).on(&#039;pojo_forms_form_submitted&#039;, function( event, response ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Caldera Forms ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery( function() {&lt;br /&gt;
	jQuery( document ).on( &#039;cf.form.submit&#039;, function (event, data ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*note, the JS bind will not fire if the form is not set to AJAX submission.&lt;br /&gt;
&lt;br /&gt;
== Contact Form 7 ==&lt;br /&gt;
&lt;br /&gt;
Create tag as Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	jQuery( function() {&lt;br /&gt;
		jQuery(&#039;.wpcf7&#039;).on(&#039;wpcf7mailsent&#039;, function(e) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			var cF7formid = &#039;(not set)&#039;;&lt;br /&gt;
			var cF7formName = &#039;(not set)&#039;;&lt;br /&gt;
			if ( e &amp;amp;&amp;amp; e.target &amp;amp;&amp;amp; e.target.id ) {&lt;br /&gt;
				cF7formName = e.target.id;&lt;br /&gt;
			}&lt;br /&gt;
			if( cF7formName ) {&lt;br /&gt;
				var nameRegex = cF7formName.match(/-f([0-9]+)-/) || [&#039;&#039;];&lt;br /&gt;
				if( nameRegex &amp;amp;&amp;amp; nameRegex[1] ) {&lt;br /&gt;
					cF7formid = nameRegex[1];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			dataLayer.push({&lt;br /&gt;
				&#039;contact-form-id&#039;: cF7formid,&lt;br /&gt;
				&#039;contact-form-name&#039;: cF7formName,&lt;br /&gt;
				&#039;event&#039;: &#039;contact-form-submitted&#039;&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: CF7 developers love changing their hook names, if this doesn&#039;t work try the below instead:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuery(&#039;.wpcf7&#039;).on(&#039;wpcf7:mailsent&#039;, function(e) {&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Divi Form Builder ==&lt;br /&gt;
Create tag as Custom HTML and use the ajaxSuccess hook below, the location will need to be changed to the contact page it is submitting the Ajax request to.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/contact/&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
It is also possible to use the field names that are being submitted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if (~settings.data.indexOf(&amp;quot;et_pb_contact_firstname&amp;quot;)) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WP Forms ==&lt;br /&gt;
Using a slightly altered version of the JQuery form listener should work for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).on(&#039;wpformsAjaxSubmitSuccess&#039;, (function( event, xhr, settings ) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;form-submitted&#039;});&lt;br /&gt;
	}));&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternatively:&lt;br /&gt;
The Event can be added directly to the form confirmation message&lt;br /&gt;
Edit the form &amp;amp; go to Settings &amp;gt; Confirmations&lt;br /&gt;
Switch to Text view then add the event code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Or if using GTM4WP&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Add a datalayer variable in GTM with:&amp;lt;br /&amp;gt;&lt;br /&gt;
eventModel.form_id for Form ID&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setup a custom event Trigger:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Event: form_submit&lt;br /&gt;
Some Custom Events:&lt;br /&gt;
Form ID contains wpforms-form-&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversion Plus ==&lt;br /&gt;
&lt;br /&gt;
For the poppup form, create tag as Custom HTML and use the ajaxSuccess hook below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings ) {&lt;br /&gt;
		if( ~settings.url.indexOf(&amp;quot;/wp-admin/admin-ajax.php&amp;quot;) &amp;amp;&amp;amp; ~settings.data.indexOf(&amp;quot;action=cp_add_subscriber&amp;quot;) ) {&lt;br /&gt;
			var dataLayer = window.dataLayer || [];&lt;br /&gt;
			dataLayer.push({&#039;event&#039; : &#039;cp-form-submitted&#039;});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tracking Other Wordpress Newsletter Plugins =&lt;br /&gt;
&lt;br /&gt;
== Mailchimp Forms (mc4wp) ==&lt;br /&gt;
&lt;br /&gt;
if is not AJAX and stays on page when the form submits, add a JS variable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function () {&lt;br /&gt;
	var success = document.getElementsByClassName(&amp;quot;mc4wp-success&amp;quot;);&lt;br /&gt;
	return (typeof success[0] != &amp;quot;undefined&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, custom HTML will need to be added as a listener:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	mc4wp.forms.on(&#039;submitted&#039;, function() {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;newsletter-form-submitted&#039;});&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pop-up Builder - Mailchimp ==&lt;br /&gt;
&lt;br /&gt;
Add Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof SgpbMailchimp != &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
	var originalmcsuccess = SgpbMailchimp.prototype.sgpbMailchimpSuccess;&lt;br /&gt;
	SgpbMailchimp.prototype.sgpbMailchimpSuccess = function(data) {&lt;br /&gt;
		originalmcsuccess.call(this, data);&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;mailchimp-form-submitted&#039;});&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Avia Form Builder ==&lt;br /&gt;
Add Custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function($) {&lt;br /&gt;
    $(&#039;body&#039;).on(&#039;av_resize_finished&#039;, function() {&lt;br /&gt;
	if(!$(&#039;#ajaxresponse_1&#039;).hasClass(&#039;hidden&#039;)) {&lt;br /&gt;
		var dataLayer = window.dataLayer || [];&lt;br /&gt;
		dataLayer.push({&#039;event&#039; : &#039;avia-form-submitted&#039;});&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: (Still not 100% on this)&lt;br /&gt;
&lt;br /&gt;
= Tracking Other Wordpress Ecommerce Plugins =&lt;br /&gt;
&lt;br /&gt;
== WooCommerce ==&lt;br /&gt;
&lt;br /&gt;
See Article: [[WooCommerce]]&lt;br /&gt;
&lt;br /&gt;
== Foxy Shop ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://wiki.foxycart.com/v/2.0/receipt#using_custom_tracking_code&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy template from:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/wp-content/plugins/foxyshop/themefiles/foxyshop-receipt.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to theme / child theme root&lt;br /&gt;
&lt;br /&gt;
Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_receipt_display %}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;order_id&#039; : &#039;{{ order_id }}&#039;,&lt;br /&gt;
	&#039;order_value&#039; : &#039;{{ total_order }}&#039;,&lt;br /&gt;
	&#039;event&#039; : &#039;order-submitted&#039;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&lt;br /&gt;
	&#039;order_id&#039; : &#039;&amp;lt;?php echo $transaction_id; ?&amp;gt;&#039;,&lt;br /&gt;
	&#039;order_value&#039; : &#039;&amp;lt;?php echo $order_total; ?&amp;gt;&#039;,&lt;br /&gt;
	&#039;event&#039; : &#039;order-submitted&#039;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chauffeur Booking System Plugin ==&lt;br /&gt;
&lt;br /&gt;
The Chauffeur Booking System Plugin is a paid for plug-in with very little documentation and hooks (actions and filters) to use.&amp;lt;br /&amp;gt;&lt;br /&gt;
The order ID &amp;amp; order value cannot be tracked without modification of the plugin.&lt;br /&gt;
&lt;br /&gt;
Below is code to track the booking completion.&lt;br /&gt;
Insert the code as a custom HTML tag in the tag manager:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
if (typeof jQuery != &#039;undefined&#039;) {&lt;br /&gt;
	(function ($) {&lt;br /&gt;
		var origCss = $.fn.css;&lt;br /&gt;
		$.fn.css = function(prop, value) {&lt;br /&gt;
			if( prop == &#039;display&#039; &amp;amp;&amp;amp; value == &#039;block&#039; &amp;amp;&amp;amp; this.hasClass(&#039;chbs-main-content-step-5&#039;) ) {&lt;br /&gt;
				var dataLayer = window.dataLayer || [];&lt;br /&gt;
				dataLayer.push({&#039;event&#039; : &#039;chauffeur-booking-form-submitted&#039;});&lt;br /&gt;
			}&lt;br /&gt;
			return origCss.apply(this, arguments);&lt;br /&gt;
		}&lt;br /&gt;
	})(jQuery);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Shopify&amp;diff=254</id>
		<title>Shopify</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Shopify&amp;diff=254"/>
		<updated>2022-05-25T08:33:14Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Tracking Contact Page */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tag Manager =&lt;br /&gt;
&lt;br /&gt;
Add Tag Manager to theme:&lt;br /&gt;
Modify Theme&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;online store&amp;quot; -&amp;gt; &amp;quot;...&amp;quot; or &amp;quot;Actions&amp;quot; -&amp;gt; &amp;quot;edit HTML / CSS&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modify theme.liquid&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
== Conversion Tracking Code ==&lt;br /&gt;
&lt;br /&gt;
Google Tag Manager will also need to be added to Checkout&#039;s additional settings to track conversions&lt;br /&gt;
&lt;br /&gt;
In &amp;quot;settings&amp;quot; -&amp;gt; &amp;quot;checkout&amp;quot; -&amp;gt; &amp;quot;additional settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;order_id&#039; : &#039;{{ order_number }}&#039;, &#039;order_value&#039; : &#039;{{ total_price | money_without_currency }}&#039;, &#039;event&#039; : &#039;order-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: if testing without &amp;quot;{% if first_time_accessed %}&amp;quot; on a order that has already converted, the order ID will not show&lt;br /&gt;
&lt;br /&gt;
to add product ids add within the code above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataLayer.push({ &#039;product_ids&#039; : [{% for line_item in line_items %}{{ line_item.product_id }}{% unless forloop.last == true %}, {% endunless %}{% endfor %}] });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Note: This was made for dynamic re-marketing, for analytics 4 go to the section below&lt;br /&gt;
&lt;br /&gt;
=== Tracking Contact Page  ===&lt;br /&gt;
&lt;br /&gt;
In the snippets section, go to &amp;quot;form-status.liquid&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Find the snippet that shows the success text ( in-between {%- if form.posted_successfully? -%}{%- endif -%} ),&lt;br /&gt;
Then add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var dataLayer = window.dataLayer || [];&lt;br /&gt;
dataLayer.push({&#039;event&#039; : &#039;contact-form-submitted&#039;});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Product Feed =&lt;br /&gt;
&lt;br /&gt;
The below App is free to use &amp;amp; should do most of the setup for you:&amp;lt;br /&amp;gt;&lt;br /&gt;
https://apps.shopify.com/google&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After installing the App a Google account with access to the Merchant Centre needs to sign in.&amp;lt;br /&amp;gt;&lt;br /&gt;
DO NOT sign in using one of our Master email addresses, instead you can either:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Ask the client to do this, if they don&#039;t have access to Merchant Center we can try to add them.&lt;br /&gt;
 - Create a new email address that only has access to this Merchant Center &amp;amp; sign in with this instead.&lt;br /&gt;
&lt;br /&gt;
Then the below needs to be done, in this order otherwise it won&#039;t send the products through &amp;amp; you&#039;ll have to start from scratch:&amp;lt;br /&amp;gt;&lt;br /&gt;
 - Make sure the Store requirements are met &amp;amp; confirm these, if they aren&#039;t then send this back to the client so they can add whats necessary.&lt;br /&gt;
 - Under Product Feed, start the setup process.&lt;br /&gt;
 - Connect the Merchant Centre on the settings tab.&lt;br /&gt;
 - Specify the Target Market &amp;amp; set the Shipping settings to Manual (These will need to be added to Merchant Center by someone afterwards).&lt;br /&gt;
If this has been done correctly then the products should now be available within the Merchant Center account.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternatively, Shopify does provide you with the Product feed URL for your store.&amp;lt;br /&amp;gt;&lt;br /&gt;
To access this, you will need to append .atom to either all of your collections or to a specific collection URL.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/all.atom&amp;quot;&lt;br /&gt;
&amp;quot;yourstorename.com/collections/collectionname.atom&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Events for Analytics 4 =&lt;br /&gt;
&lt;br /&gt;
View Item: &amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to product-template.liquid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
  window.dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
    event: &amp;quot;view_item&amp;quot;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
      currency: &amp;quot;GBP&amp;quot;,&lt;br /&gt;
      items: [&lt;br /&gt;
        {&lt;br /&gt;
          item_id: {{ product.id }},&lt;br /&gt;
          item_name: &amp;quot;{{ product.title }}&amp;quot;,&lt;br /&gt;
         {% if product.vendor %} item_brand: &amp;quot;{{ product.vendor }}&amp;quot;, {% endif %}&lt;br /&gt;
          price: {{ product.price | money_without_currency }},&lt;br /&gt;
         {% if product.type %} item_category: &amp;quot;{{ product.type }}&amp;quot;, {% endif %}&lt;br /&gt;
          google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
          id: &amp;quot;{{ product.id }}&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add To Cart:&amp;lt;br /&amp;gt;&lt;br /&gt;
The below listener can be added to GTM, this should send add_to_cart events to GTM for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
	jQuery( document ).ajaxSuccess(function( event, xhr, settings, data ) {&lt;br /&gt;
		if (~settings.url.indexOf(&amp;quot;/cart/add&amp;quot;)) {          &lt;br /&gt;
          &lt;br /&gt;
          var items = [];&lt;br /&gt;
          items.push({&lt;br /&gt;
            item_id: data.product_id,&lt;br /&gt;
            item_name: data.title,&lt;br /&gt;
            item_category: data.product_type,&lt;br /&gt;
            price: ( data.price / 100 ),&lt;br /&gt;
            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
            id: data.product_id&lt;br /&gt;
          });&lt;br /&gt;
          &lt;br /&gt;
          if (typeof data.brand != &amp;quot;undefined&amp;quot;) items[0][&#039;item_brand&#039;] = data.brand;&lt;br /&gt;
          &lt;br /&gt;
          var dataLayer = window.dataLayer || [];&lt;br /&gt;
          dataLayer.push({&lt;br /&gt;
            event: &#039;add_to_cart&#039;,&lt;br /&gt;
            ecommerce: {&lt;br /&gt;
              currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
              items: items&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Purchases:&amp;lt;br /&amp;gt;&lt;br /&gt;
Add this to the Settings &amp;gt; Checkout &amp;gt; Additional Scripts section.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% if first_time_accessed %}&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var items = [];&lt;br /&gt;
	var temp = {};&lt;br /&gt;
&lt;br /&gt;
	{% for line_item in line_items %}&lt;br /&gt;
		temp = {&lt;br /&gt;
		            item_id: {{ line_item.product.id }},&lt;br /&gt;
		            item_name: &amp;quot;{{ line_item.title }}&amp;quot;,&lt;br /&gt;
		            price: {{ line_item.final_line_price | money_without_currency }},&lt;br /&gt;
		            google_business_vertical: &amp;quot;retail&amp;quot;,&lt;br /&gt;
		            id: {{ line_item.product.id }},&lt;br /&gt;
                            quantity: {{ line_item.quantity }}&lt;br /&gt;
&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.type %} &lt;br /&gt;
			temp[&#039;item_category&#039;] = &amp;quot;{{ line_item.product.type }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		{% if line_item.product.vendor %} &lt;br /&gt;
			temp[&#039;item_brand&#039;] = &amp;quot;{{ line_item.product.vendor }}&amp;quot;;&lt;br /&gt;
		{% endif %}&lt;br /&gt;
&lt;br /&gt;
		items.push(temp);&lt;br /&gt;
		&lt;br /&gt;
	{% endfor %}&lt;br /&gt;
&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
  dataLayer.push({&lt;br /&gt;
  	event: &#039;purchase&#039;,&lt;br /&gt;
    ecommerce: {&lt;br /&gt;
    	affiliation: &#039;Online Store&#039;,&lt;br /&gt;
    	transaction_id: &#039;{{ order_number }}&#039;,&lt;br /&gt;
    	value: &#039;{{ total_price | money_without_currency }}&#039;,&lt;br /&gt;
    	tax: &#039;{{ tax_price | money_without_currency }}&#039;,&lt;br /&gt;
    	shipping: &#039;{{ shipping_price | money_without_currency}}&#039;,&lt;br /&gt;
    	currency: &amp;quot;GBP&amp;quot;, &lt;br /&gt;
      items: items&lt;br /&gt;
    }&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
{% endif %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Event Tag &amp;amp; Variables can be setup with the below template:&amp;lt;br /&amp;gt;&lt;br /&gt;
[[File:Shopify-ga4-container-elements.json]]&lt;br /&gt;
&lt;br /&gt;
= Shopify Links =&lt;br /&gt;
Cheat sheet for Variables: &amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.shopify.co.uk/partners/shopify-cheat-sheet&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
	<entry>
		<id>https://wiki.growth.agency/index.php?title=Jivo&amp;diff=253</id>
		<title>Jivo</title>
		<link rel="alternate" type="text/html" href="https://wiki.growth.agency/index.php?title=Jivo&amp;diff=253"/>
		<updated>2022-05-03T15:11:35Z</updated>

		<summary type="html">&lt;p&gt;Ben.robson: /* Tracking In Tag Manager */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tracking In Tag Manager ==&lt;br /&gt;
&lt;br /&gt;
Jivohas an API for tracking.&lt;br /&gt;
&lt;br /&gt;
https://www.jivochat.com/api/&lt;br /&gt;
&lt;br /&gt;
To use this, create a custom HTML tag In tag manager and trigger it on any pages the Jivochat runs on.&lt;br /&gt;
&lt;br /&gt;
Add this script to the custom HTML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
function jivoDataLayerEvent( eventName ) {&lt;br /&gt;
	var dataLayer = window.dataLayer || [];&lt;br /&gt;
	dataLayer.push({&#039;event&#039; : &#039;jivo-&#039; + eventName});&lt;br /&gt;
}&lt;br /&gt;
function jivo_onOpen() { jivoDataLayerEvent( &#039;chat-opened&#039; ); }&lt;br /&gt;
function jivo_onMessageSent() { jivoDataLayerEvent( &#039;message-sent&#039; ); }&lt;br /&gt;
function jivo_onIntroduction() { jivoDataLayerEvent( &#039;contact-sent&#039; ); }&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ben.robson</name></author>
	</entry>
</feed>