SlideShare una empresa de Scribd logo
1 de 36
Simo Ahava | NetBooster
GTM For Nerds 
MeasureCamp V – 20 September 2014 
function MeasureCampV() { this.awesome = awesome; }
GTM For Nerds 
MeasureCamp V – 20 September 2014 
@SimoAhava 
function MeasureCampV() { this.awesome = awesome; } 
http://google.me/+SimoAhava 
simo@simoahava.com 
www.simoahava.com
MASTERED by desire impulsive, 
By a mighty inward urging, 
I am ready now for singing, 
Ready to begin the coding -- 
A. Gallen-Kallela: The Boat’s Lament
What is dataLayer 
 A JavaScript Array 
@SimoAhava | MeasureCamp V
What is dataLayer 
 A JavaScript Array 
 dataLayer = []; 
@SimoAhava | MeasureCamp V
What is dataLayer 
 A JavaScript Array 
 dataLayer = []; 
 dataLayer.push('item1'); // dataLayer[0] => 'item1’ 
@SimoAhava | MeasureCamp V
What is dataLayer 
 A JavaScript Array 
 dataLayer = []; 
 dataLayer.push('item1'); // dataLayer[0] => 'item1' 
 dataLayer.push({'item2' : [{'data1' : true},{'data2' : 'Peter'}]}); 
// dataLayer[1] => 'item2' : Array[2] 
@SimoAhava | MeasureCamp V
What is dataLayer 
 A JavaScript Array 
 dataLayer = []; 
 dataLayer.push('item1'); // dataLayer[0] => 'item1' 
 dataLayer.push({'item2' : [{'data1' : true},{'data2' : 'Peter'}]}); 
// dataLayer[1] => 'item2' : Array[2] 
 var item2 = dataLayer.pop(); // item2 => Array[2], dataLayer[1] => 
@SimoAhava | MeasureCamp V 
undefined
What is dataLayer 
 A JavaScript Array 
 dataLayer = []; 
 dataLayer.push('item1'); // dataLayer[0] => 'item1' 
 dataLayer.push({'item2' : [{'data1' : true},{'data2' : 'Peter'}]}); 
// dataLayer[1] => 'item2' : Array[2] 
 var item2 = dataLayer.pop(); // item2 => Array[2], dataLayer[1] => 
@SimoAhava | MeasureCamp V 
undefined 
 dataLayer.push({'event' : 'gtm.js'}); // No special effects
What is dataLayer 
 A JavaScript Array 
 dataLayer = []; 
 dataLayer.push('item1'); // dataLayer[0] => 'item1' 
 dataLayer.push({'item2' : [{'data1' : true},{'data2' : 'Peter'}]}); 
// dataLayer[1] => 'item2' : Array[2] 
 var item2 = dataLayer.pop(); // item2 => Array[2], dataLayer[1] => 
@SimoAhava | MeasureCamp V 
undefined 
 dataLayer.push({'event' : 'gtm.js'}); // No special effects 
 There is absolutely nothing special about dataLayer ... or is there?
What is dataLayer 
 A JavaScript Array 
 dataLayer = []; 
 dataLayer.push('item1'); // dataLayer[0] => 'item1' 
 dataLayer.push({'item2' : [{'data1' : true},{'data2' : 'Peter'}]}); 
// dataLayer[1] => 'item2' : Array[2] 
 var item2 = dataLayer.pop(); // item2 => Array[2], dataLayer[1] => 
@SimoAhava | MeasureCamp V 
undefined 
 dataLayer.push({'event' : 'gtm.js'}); // No special effects 
 There is absolutely nothing special about dataLayer ... or is there? 
 It’s the default name of the data structure that Google Tag Manager uses
What is dataLayer 
 …but it looks like GTM overrides the default push() method: 
@SimoAhava | MeasureCamp V
What is dataLayer 
 …but it looks like GTM overrides the default push() method: 
 This does three (visible) things: 
@SimoAhava | MeasureCamp V
What is dataLayer 
 …but it looks like GTM overrides the default push() method: 
 This does three (visible) things: 
1. Initiates a listener which processes the new state of dataLayer after each push() 
2. Sets the maximum length of dataLayer to 300 
3. Instead of returning the length of the Array, a push() returns true if no tags were fired and 
false if tags were fired – synchronous operation for ”Wait for Tags”! 
@SimoAhava | MeasureCamp V
What is dataLayer 
 …but it looks like GTM overrides the default push() method: 
 This does three (visible) things: 
1. Initiates a listener which processes the new state of dataLayer after each push() 
2. Sets the maximum length of dataLayer to 300 
3. Instead of returning the length of the Array, a push() returns true if no tags were fired and 
false if tags were fired – synchronous operation for ”Wait for Tags”! 
 These will all be part of the specification that vendors need to adhere to 
 Memory management such as setting the maximum length of the Array will 
eventually be configurable 
@SimoAhava | MeasureCamp V
A. Gallen-Kallela: Lemminkainen’s Mother 
THERE the blood-stained data model, 
There Google's son and hero, 
Cuts in pieces dataLayer, 
Chops it with his mighty hatchet --
What is Google Tag Manager’s data model 
 An abstract data model, which passes and processes data from dataLayer to 
Google Tag Manager 
@SimoAhava | MeasureCamp V
What is Google Tag Manager’s data model 
 An abstract data model, which passes and processes data from dataLayer to 
Google Tag Manager 
dataLayer Data model 
Tool-agnostic Tool-specific 
Generic Unique 
Accessed directly Accessed via helper 
Structured Abstract 
@SimoAhava | MeasureCamp V
What is Google Tag Manager’s data model 
 In GTM, the interface exposes two methods: 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key') 
 google_tag_manager["GTM-XXXX"].dataLayer.set('key','value') 
@SimoAhava | MeasureCamp V
What is Google Tag Manager’s data model 
 In GTM, the interface exposes two methods: 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key') 
 google_tag_manager["GTM-XXXX"].dataLayer.set('key','value') 
 These are used to access the data stored in the data model, and should not be 
used directly 
@SimoAhava | MeasureCamp V
What is Google Tag Manager’s data model 
 In GTM, the interface exposes two methods: 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key') 
 google_tag_manager["GTM-XXXX"].dataLayer.set('key','value') 
 These are used to access the data stored in the data model, and should not be 
used directly 
 Using get() retrieves the most recent value for ’key’ 
 dataLayer.push({'key1' : 'value1'}); // dataLayer[0] 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // 'value1' 
 dataLayer.push({'key1' : 'value2'}); // dataLayer[1]! 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // 'value2' 
@SimoAhava | MeasureCamp V
What is Google Tag Manager’s data model 
 Cool, get() works nicely with dotted names and nested objects 
 dataLayer.push({'key1.id' : '123'}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1.id'); // '123' 
 dataLayer.push({'key2' : {'id' : '234'}}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key2.id'); // '234’ 
@SimoAhava | MeasureCamp V
What is Google Tag Manager’s data model 
 Cool, get() works nicely with dotted names and nested objects 
 dataLayer.push({'key1.id' : '123'}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1.id'); // '123' 
 dataLayer.push({'key2' : {'id' : '234'}}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key2.id'); // '234’ 
 Yes, get() is the method that is called by your Data Layer Variable Macros 
@SimoAhava | MeasureCamp V
What is Google Tag Manager’s data model 
 Cool, get() works nicely with dotted names and nested objects 
 dataLayer.push({'key1.id' : '123'}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1.id'); // '123' 
 dataLayer.push({'key2' : {'id' : '234'}}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key2.id'); // '234’ 
 Yes, get() is the method that is called by your Data Layer Variable Macros 
 So… 
 When a dataLayer.push() occurs, the arguments are copied to the data 
model 
@SimoAhava | MeasureCamp V
What is Google Tag Manager’s data model 
 Cool, get() works nicely with dotted names and nested objects 
 dataLayer.push({'key1.id' : '123'}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1.id'); // '123' 
 dataLayer.push({'key2' : {'id' : '234'}}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key2.id'); // '234’ 
 Yes, get() is the method that is called by your Data Layer Variable Macros 
 So… 
 When a dataLayer.push() occurs, the arguments are copied to the data 
model 
 The get() method can be used to retrieve data from the data model 
@SimoAhava | MeasureCamp V
A. Gallen-Kallela: The Forging Of The Sampo 
dataLayer, worthy brother, 
Thou, my faithful indexed Array, 
Come and see this wondrous beauty, 
Abstract structure, awesome methods --
Peculiarities of the data model 
 Changing value type overwrites the previous value 
 dataLayer.push({'key1' : [1, 2, 3]}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // Array[3] 
 dataLayer.push({'key1' : 'cool'}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // 'cool' 
@SimoAhava | MeasureCamp V
Peculiarities of the data model 
 Changing value type overwrites the previous value 
 dataLayer.push({'key1' : [1, 2, 3]}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // Array[3] 
 dataLayer.push({'key1' : 'cool'}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // 'cool' 
 Array to Array and plain object to plain object behave a bit differently 
 dataLayer.push({'key1' : [1, 2, 3]}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3] 
 dataLayer.push({'key1' : [4, 5]}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [4, 5, 3]! 
@SimoAhava | MeasureCamp V
Peculiarities of the data model 
 Updating an Array in the data model is clumsy (and not a good idea) 
 dataLayer.push({'key1' : [1, 2, 3]}); 
 var k = google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3] 
 k.push(4, 5); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3, 4, 5] 
@SimoAhava | MeasureCamp V
Peculiarities of the data model 
 Updating an Array in the data model is clumsy (and not a good idea) 
 dataLayer.push({'key1' : [1, 2, 3]}); 
 var k = google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3] 
 k.push(4, 5); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3, 4, 5] 
 So there’s a special ’command array’ you can use, which accesses all supported 
methods of the value 
 dataLayer.push({'key1' : [1, 2, 3]}); 
 dataLayer.push(['key1.push', 4, 5]); // Note the square brackets! 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3, 4, 5] 
@SimoAhava | MeasureCamp V
Peculiarities of the data model 
 Plain object to plain object is more straightforward 
 dataLayer.push({'key1' : {'one' : 1}}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 1} 
@SimoAhava | MeasureCamp V
Peculiarities of the data model 
 Plain object to plain object is more straightforward 
 dataLayer.push({'key1' : {'one' : 1}}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 1} 
 dataLayer.push({'key1' : {'two' : 2}}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 1}, {two: 2} 
@SimoAhava | MeasureCamp V
Peculiarities of the data model 
 Plain object to plain object is more straightforward 
 dataLayer.push({'key1' : {'one' : 1}}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 1} 
 dataLayer.push({'key1' : {'two' : 2}}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 1}, {two: 2} 
 dataLayer.push({'key1' : {'one' : {'two' : 3}}}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: {two: 3}}, 
@SimoAhava | MeasureCamp V 
{two: 2}
Peculiarities of the data model 
 You can also run your own functions on values in the data model 
 dataLayer.push({'key1' : {'one' : 1}}); 
 dataLayer.push(function() { 
var key1 = this.get('key1'); 
if(key1.hasOwnProperty('one') { 
this.set('key1', {'one' : 2}); 
} 
}); 
 google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 2} 
@SimoAhava | MeasureCamp V
@SimoAhava | MeasureCamp V 
Thank you 
www.simoahava.com/analytics/data-layer/ 
www.simoahava.com/analytics/google-tag-manager-data-model/ 
#GTMtips 
http://google.me/+SimoAhava @SimoAhava

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Google Tag Manager 101
Google Tag Manager 101Google Tag Manager 101
Google Tag Manager 101
 
Google Optimize for testing and personalization
Google Optimize for testing and personalizationGoogle Optimize for testing and personalization
Google Optimize for testing and personalization
 
Guide to-google-analytics google 4
Guide to-google-analytics google 4Guide to-google-analytics google 4
Guide to-google-analytics google 4
 
Getting Started with Google Analytics 4
Getting Started with Google Analytics 4Getting Started with Google Analytics 4
Getting Started with Google Analytics 4
 
Digital Analytics with the Google Tag Manager (GTM)
Digital Analytics with the Google Tag Manager (GTM)Digital Analytics with the Google Tag Manager (GTM)
Digital Analytics with the Google Tag Manager (GTM)
 
Google My Business
Google My BusinessGoogle My Business
Google My Business
 
Google Tag Manager (GTM)
Google Tag Manager (GTM)Google Tag Manager (GTM)
Google Tag Manager (GTM)
 
Google Analytics 4 Trial Recommendation
Google Analytics 4 Trial RecommendationGoogle Analytics 4 Trial Recommendation
Google Analytics 4 Trial Recommendation
 
Mixpanel
MixpanelMixpanel
Mixpanel
 
SEO
SEOSEO
SEO
 
Google Local SEO Marketing Strategy for Local Businesses
Google Local SEO Marketing Strategy for Local BusinessesGoogle Local SEO Marketing Strategy for Local Businesses
Google Local SEO Marketing Strategy for Local Businesses
 
One Further - Spektrix and Google Analytics 4
One Further - Spektrix and Google Analytics 4One Further - Spektrix and Google Analytics 4
One Further - Spektrix and Google Analytics 4
 
Google tag manager
Google tag managerGoogle tag manager
Google tag manager
 
Google Analytics 4: A Quick Start Guide
 Google Analytics 4: A Quick Start Guide Google Analytics 4: A Quick Start Guide
Google Analytics 4: A Quick Start Guide
 
Digital Marketing Trends 2023- Shereen Badr
Digital Marketing Trends 2023- Shereen BadrDigital Marketing Trends 2023- Shereen Badr
Digital Marketing Trends 2023- Shereen Badr
 
Mailchimp Introduction
Mailchimp IntroductionMailchimp Introduction
Mailchimp Introduction
 
Mastering GA4: How To Use The New Google Analytics Like A Pro
 Mastering GA4: How To Use The New Google Analytics Like A Pro Mastering GA4: How To Use The New Google Analytics Like A Pro
Mastering GA4: How To Use The New Google Analytics Like A Pro
 
Adobe Analytics
Adobe AnalyticsAdobe Analytics
Adobe Analytics
 
Measurefest - GA4 From Migration to Measurement - The Key To Success.pptx
Measurefest - GA4 From Migration to Measurement - The Key To Success.pptxMeasurefest - GA4 From Migration to Measurement - The Key To Success.pptx
Measurefest - GA4 From Migration to Measurement - The Key To Success.pptx
 
Pixel tags and tag management
Pixel tags and tag managementPixel tags and tag management
Pixel tags and tag management
 

Destacado

Google Tag Manager (Manual in English)
Google Tag Manager (Manual in English)Google Tag Manager (Manual in English)
Google Tag Manager (Manual in English)
Sergey Bizikin
 

Destacado (20)

Advanced Remarketing in Google Analytics Using CRM Data
Advanced Remarketing in Google Analytics Using CRM DataAdvanced Remarketing in Google Analytics Using CRM Data
Advanced Remarketing in Google Analytics Using CRM Data
 
The Lego Data Layer
The Lego Data LayerThe Lego Data Layer
The Lego Data Layer
 
MeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
MeasureCamp IX (London) - 10 JavaScript Concepts for web analystsMeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
MeasureCamp IX (London) - 10 JavaScript Concepts for web analysts
 
Search Marketer's Toolkit for Google Tag Manager and Google Analytics
Search Marketer's Toolkit for Google Tag Manager and Google AnalyticsSearch Marketer's Toolkit for Google Tag Manager and Google Analytics
Search Marketer's Toolkit for Google Tag Manager and Google Analytics
 
Advanced Form Tracking in Google Tag Manager
Advanced Form Tracking in Google Tag ManagerAdvanced Form Tracking in Google Tag Manager
Advanced Form Tracking in Google Tag Manager
 
Tricks and tweaks for Google Analytics and Google Tag Manager
Tricks and tweaks for Google Analytics and Google Tag ManagerTricks and tweaks for Google Analytics and Google Tag Manager
Tricks and tweaks for Google Analytics and Google Tag Manager
 
Google Tag Manager for beginners
Google Tag Manager for beginnersGoogle Tag Manager for beginners
Google Tag Manager for beginners
 
Be Critical: Going Beyond The Defaults With GA And GTM (SMX Munich 2015)
Be Critical: Going Beyond The Defaults With GA And GTM (SMX Munich 2015)Be Critical: Going Beyond The Defaults With GA And GTM (SMX Munich 2015)
Be Critical: Going Beyond The Defaults With GA And GTM (SMX Munich 2015)
 
What's the weather like? MeasureFest 2014
What's the weather like? MeasureFest 2014What's the weather like? MeasureFest 2014
What's the weather like? MeasureFest 2014
 
Rationalizing Tag Management
Rationalizing Tag ManagementRationalizing Tag Management
Rationalizing Tag Management
 
Meaningful Data - Reaktor Breakpoint 2015
Meaningful Data - Reaktor Breakpoint 2015Meaningful Data - Reaktor Breakpoint 2015
Meaningful Data - Reaktor Breakpoint 2015
 
Tag Management Solutions - Best Data Ever (Marketing Festival 2014)
Tag Management Solutions - Best Data Ever (Marketing Festival 2014)Tag Management Solutions - Best Data Ever (Marketing Festival 2014)
Tag Management Solutions - Best Data Ever (Marketing Festival 2014)
 
Content Analytics - The Whys And Hows For Google Analytics
Content Analytics - The Whys And Hows For Google AnalyticsContent Analytics - The Whys And Hows For Google Analytics
Content Analytics - The Whys And Hows For Google Analytics
 
SuperWeek 2016 - Garbage In Garbage Out: Data Quality in a TMS World
SuperWeek 2016 - Garbage In Garbage Out: Data Quality in a TMS WorldSuperWeek 2016 - Garbage In Garbage Out: Data Quality in a TMS World
SuperWeek 2016 - Garbage In Garbage Out: Data Quality in a TMS World
 
Google tag manager fundamentals question and answer (june 23 and july 24, 2015)
Google tag manager fundamentals question and answer (june 23 and july 24, 2015)Google tag manager fundamentals question and answer (june 23 and july 24, 2015)
Google tag manager fundamentals question and answer (june 23 and july 24, 2015)
 
Google Tag Manager Advanced - SEOCampixx 2016
Google Tag Manager Advanced - SEOCampixx 2016Google Tag Manager Advanced - SEOCampixx 2016
Google Tag Manager Advanced - SEOCampixx 2016
 
Google Tag Manager (Manual in English)
Google Tag Manager (Manual in English)Google Tag Manager (Manual in English)
Google Tag Manager (Manual in English)
 
Content Engagement with Google Analytics (Emerce Conversion 2015)
Content Engagement with Google Analytics (Emerce Conversion 2015)Content Engagement with Google Analytics (Emerce Conversion 2015)
Content Engagement with Google Analytics (Emerce Conversion 2015)
 
Universal Analytics and Google Tag Manager - Superweek 2014
Universal Analytics and Google Tag Manager - Superweek 2014Universal Analytics and Google Tag Manager - Superweek 2014
Universal Analytics and Google Tag Manager - Superweek 2014
 
Google tag manager-web analytics101
Google tag manager-web analytics101Google tag manager-web analytics101
Google tag manager-web analytics101
 

Similar a Google Tag Manager For Nerds

XQuery Triggers in Native XML Database Sedna
XQuery Triggers in Native XML Database SednaXQuery Triggers in Native XML Database Sedna
XQuery Triggers in Native XML Database Sedna
maria.grineva
 
Drupal in aerospace - selling geodetic satellite data with Commerce - Martin ...
Drupal in aerospace - selling geodetic satellite data with Commerce - Martin ...Drupal in aerospace - selling geodetic satellite data with Commerce - Martin ...
Drupal in aerospace - selling geodetic satellite data with Commerce - Martin ...
DrupalCamp MSK
 

Similar a Google Tag Manager For Nerds (20)

Data Layer - MeasureCamp VII 2015
Data Layer - MeasureCamp VII 2015Data Layer - MeasureCamp VII 2015
Data Layer - MeasureCamp VII 2015
 
"Taster Slides" for Most advanced GTM implementation
"Taster Slides" for Most advanced GTM implementation"Taster Slides" for Most advanced GTM implementation
"Taster Slides" for Most advanced GTM implementation
 
Simo's Top 30 GTM tips
Simo's Top 30 GTM tipsSimo's Top 30 GTM tips
Simo's Top 30 GTM tips
 
Speed bumps ahead
Speed bumps aheadSpeed bumps ahead
Speed bumps ahead
 
Game Playing RL Agent
Game Playing RL AgentGame Playing RL Agent
Game Playing RL Agent
 
AWS Lambda를 통한 Tensorflow 및 Keras 기반 추론 모델 서비스하기 :: 이준범 :: AWS Summit Seoul 2018
AWS Lambda를 통한 Tensorflow 및 Keras 기반 추론 모델 서비스하기 :: 이준범 :: AWS Summit Seoul 2018AWS Lambda를 통한 Tensorflow 및 Keras 기반 추론 모델 서비스하기 :: 이준범 :: AWS Summit Seoul 2018
AWS Lambda를 통한 Tensorflow 및 Keras 기반 추론 모델 서비스하기 :: 이준범 :: AWS Summit Seoul 2018
 
Graphite
GraphiteGraphite
Graphite
 
Build, train and deploy your ML models with Amazon Sage Maker
Build, train and deploy your ML models with Amazon Sage MakerBuild, train and deploy your ML models with Amazon Sage Maker
Build, train and deploy your ML models with Amazon Sage Maker
 
Oracle - Program with PL/SQL - Lession 17
Oracle - Program with PL/SQL - Lession 17Oracle - Program with PL/SQL - Lession 17
Oracle - Program with PL/SQL - Lession 17
 
XQuery Triggers in Native XML Database Sedna
XQuery Triggers in Native XML Database SednaXQuery Triggers in Native XML Database Sedna
XQuery Triggers in Native XML Database Sedna
 
Drupal in aerospace - selling geodetic satellite data with Commerce - Martin ...
Drupal in aerospace - selling geodetic satellite data with Commerce - Martin ...Drupal in aerospace - selling geodetic satellite data with Commerce - Martin ...
Drupal in aerospace - selling geodetic satellite data with Commerce - Martin ...
 
Morphing GA into an Affiliate Analytics Monster
Morphing GA into an Affiliate Analytics MonsterMorphing GA into an Affiliate Analytics Monster
Morphing GA into an Affiliate Analytics Monster
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
Javascript & SQL within database management system
Javascript & SQL within database management systemJavascript & SQL within database management system
Javascript & SQL within database management system
 
Hacking Movable Type
Hacking Movable TypeHacking Movable Type
Hacking Movable Type
 
Having fun with Google Tag Manager (implement cool things like weather tracki...
Having fun with Google Tag Manager (implement cool things like weather tracki...Having fun with Google Tag Manager (implement cool things like weather tracki...
Having fun with Google Tag Manager (implement cool things like weather tracki...
 
JavaScript Refactoring
JavaScript RefactoringJavaScript Refactoring
JavaScript Refactoring
 
Clean Javascript
Clean JavascriptClean Javascript
Clean Javascript
 
Bulletproof Jobs: Patterns For Large-Scale Spark Processing
Bulletproof Jobs: Patterns For Large-Scale Spark ProcessingBulletproof Jobs: Patterns For Large-Scale Spark Processing
Bulletproof Jobs: Patterns For Large-Scale Spark Processing
 
Using Task Queues and D3.js to build an analytics product on App Engine
Using Task Queues and D3.js to build an analytics product on App EngineUsing Task Queues and D3.js to build an analytics product on App Engine
Using Task Queues and D3.js to build an analytics product on App Engine
 

Más de Simo Ahava

Más de Simo Ahava (11)

Web Browsers and Tracking Protections
Web Browsers and Tracking ProtectionsWeb Browsers and Tracking Protections
Web Browsers and Tracking Protections
 
Server-side Tagging in Google Tag Manager - MeasureSummit 2020
Server-side Tagging in Google Tag Manager - MeasureSummit 2020Server-side Tagging in Google Tag Manager - MeasureSummit 2020
Server-side Tagging in Google Tag Manager - MeasureSummit 2020
 
Browser Tracking Protections - SuperWeek 2020
Browser Tracking Protections - SuperWeek 2020Browser Tracking Protections - SuperWeek 2020
Browser Tracking Protections - SuperWeek 2020
 
You can't spell MEASURE without CUSTOMIZATION
You can't spell MEASURE without CUSTOMIZATIONYou can't spell MEASURE without CUSTOMIZATION
You can't spell MEASURE without CUSTOMIZATION
 
Essential Search Marketing Tweaks For Google Analytics And Google Tag Manager
Essential Search Marketing Tweaks For Google Analytics And Google Tag ManagerEssential Search Marketing Tweaks For Google Analytics And Google Tag Manager
Essential Search Marketing Tweaks For Google Analytics And Google Tag Manager
 
Agile Analytics
Agile AnalyticsAgile Analytics
Agile Analytics
 
Google Tag Manager - 5 years. What have we learned?
Google Tag Manager - 5 years. What have we learned?Google Tag Manager - 5 years. What have we learned?
Google Tag Manager - 5 years. What have we learned?
 
Meaningful Data - Best Internet Conference 2015 (Lithuania)
Meaningful Data - Best Internet Conference 2015 (Lithuania)Meaningful Data - Best Internet Conference 2015 (Lithuania)
Meaningful Data - Best Internet Conference 2015 (Lithuania)
 
Key Insights From Funnels - Enhanced Ecommerce For Google Analytics
Key Insights From Funnels - Enhanced Ecommerce For Google AnalyticsKey Insights From Funnels - Enhanced Ecommerce For Google Analytics
Key Insights From Funnels - Enhanced Ecommerce For Google Analytics
 
Enhanced Ecommerce For Content (SMX München 2015)
Enhanced Ecommerce For Content (SMX München 2015)Enhanced Ecommerce For Content (SMX München 2015)
Enhanced Ecommerce For Content (SMX München 2015)
 
Google Analytics Bag O' Tricks
Google Analytics Bag O' TricksGoogle Analytics Bag O' Tricks
Google Analytics Bag O' Tricks
 

Último

一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
ayvbos
 
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi EscortsRussian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Monica Sydney
 
call girls in Anand Vihar (delhi) call me [🔝9953056974🔝] escort service 24X7
call girls in Anand Vihar (delhi) call me [🔝9953056974🔝] escort service 24X7call girls in Anand Vihar (delhi) call me [🔝9953056974🔝] escort service 24X7
call girls in Anand Vihar (delhi) call me [🔝9953056974🔝] escort service 24X7
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
ydyuyu
 
一比一原版田纳西大学毕业证如何办理
一比一原版田纳西大学毕业证如何办理一比一原版田纳西大学毕业证如何办理
一比一原版田纳西大学毕业证如何办理
F
 
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
ayvbos
 
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
ydyuyu
 

Último (20)

一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
 
Trump Diapers Over Dems t shirts Sweatshirt
Trump Diapers Over Dems t shirts SweatshirtTrump Diapers Over Dems t shirts Sweatshirt
Trump Diapers Over Dems t shirts Sweatshirt
 
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi EscortsRussian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
 
Vip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac Room
Vip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac RoomVip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac Room
Vip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac Room
 
call girls in Anand Vihar (delhi) call me [🔝9953056974🔝] escort service 24X7
call girls in Anand Vihar (delhi) call me [🔝9953056974🔝] escort service 24X7call girls in Anand Vihar (delhi) call me [🔝9953056974🔝] escort service 24X7
call girls in Anand Vihar (delhi) call me [🔝9953056974🔝] escort service 24X7
 
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
原版制作美国爱荷华大学毕业证(iowa毕业证书)学位证网上存档可查
 
Nagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime Nagercoil
Nagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime NagercoilNagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime Nagercoil
Nagercoil Escorts Service Girl ^ 9332606886, WhatsApp Anytime Nagercoil
 
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
 
Real Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtReal Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirt
 
Call girls Service in Ajman 0505086370 Ajman call girls
Call girls Service in Ajman 0505086370 Ajman call girlsCall girls Service in Ajman 0505086370 Ajman call girls
Call girls Service in Ajman 0505086370 Ajman call girls
 
Meaning of On page SEO & its process in detail.
Meaning of On page SEO & its process in detail.Meaning of On page SEO & its process in detail.
Meaning of On page SEO & its process in detail.
 
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime BalliaBallia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
 
20240508 QFM014 Elixir Reading List April 2024.pdf
20240508 QFM014 Elixir Reading List April 2024.pdf20240508 QFM014 Elixir Reading List April 2024.pdf
20240508 QFM014 Elixir Reading List April 2024.pdf
 
一比一原版田纳西大学毕业证如何办理
一比一原版田纳西大学毕业证如何办理一比一原版田纳西大学毕业证如何办理
一比一原版田纳西大学毕业证如何办理
 
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
 
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
 
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
 
20240507 QFM013 Machine Intelligence Reading List April 2024.pdf
20240507 QFM013 Machine Intelligence Reading List April 2024.pdf20240507 QFM013 Machine Intelligence Reading List April 2024.pdf
20240507 QFM013 Machine Intelligence Reading List April 2024.pdf
 
APNIC Updates presented by Paul Wilson at ARIN 53
APNIC Updates presented by Paul Wilson at ARIN 53APNIC Updates presented by Paul Wilson at ARIN 53
APNIC Updates presented by Paul Wilson at ARIN 53
 
APNIC Policy Roundup, presented by Sunny Chendi at the 5th ICANN APAC-TWNIC E...
APNIC Policy Roundup, presented by Sunny Chendi at the 5th ICANN APAC-TWNIC E...APNIC Policy Roundup, presented by Sunny Chendi at the 5th ICANN APAC-TWNIC E...
APNIC Policy Roundup, presented by Sunny Chendi at the 5th ICANN APAC-TWNIC E...
 

Google Tag Manager For Nerds

  • 1. Simo Ahava | NetBooster
  • 2. GTM For Nerds MeasureCamp V – 20 September 2014 function MeasureCampV() { this.awesome = awesome; }
  • 3. GTM For Nerds MeasureCamp V – 20 September 2014 @SimoAhava function MeasureCampV() { this.awesome = awesome; } http://google.me/+SimoAhava simo@simoahava.com www.simoahava.com
  • 4. MASTERED by desire impulsive, By a mighty inward urging, I am ready now for singing, Ready to begin the coding -- A. Gallen-Kallela: The Boat’s Lament
  • 5. What is dataLayer  A JavaScript Array @SimoAhava | MeasureCamp V
  • 6. What is dataLayer  A JavaScript Array  dataLayer = []; @SimoAhava | MeasureCamp V
  • 7. What is dataLayer  A JavaScript Array  dataLayer = [];  dataLayer.push('item1'); // dataLayer[0] => 'item1’ @SimoAhava | MeasureCamp V
  • 8. What is dataLayer  A JavaScript Array  dataLayer = [];  dataLayer.push('item1'); // dataLayer[0] => 'item1'  dataLayer.push({'item2' : [{'data1' : true},{'data2' : 'Peter'}]}); // dataLayer[1] => 'item2' : Array[2] @SimoAhava | MeasureCamp V
  • 9. What is dataLayer  A JavaScript Array  dataLayer = [];  dataLayer.push('item1'); // dataLayer[0] => 'item1'  dataLayer.push({'item2' : [{'data1' : true},{'data2' : 'Peter'}]}); // dataLayer[1] => 'item2' : Array[2]  var item2 = dataLayer.pop(); // item2 => Array[2], dataLayer[1] => @SimoAhava | MeasureCamp V undefined
  • 10. What is dataLayer  A JavaScript Array  dataLayer = [];  dataLayer.push('item1'); // dataLayer[0] => 'item1'  dataLayer.push({'item2' : [{'data1' : true},{'data2' : 'Peter'}]}); // dataLayer[1] => 'item2' : Array[2]  var item2 = dataLayer.pop(); // item2 => Array[2], dataLayer[1] => @SimoAhava | MeasureCamp V undefined  dataLayer.push({'event' : 'gtm.js'}); // No special effects
  • 11. What is dataLayer  A JavaScript Array  dataLayer = [];  dataLayer.push('item1'); // dataLayer[0] => 'item1'  dataLayer.push({'item2' : [{'data1' : true},{'data2' : 'Peter'}]}); // dataLayer[1] => 'item2' : Array[2]  var item2 = dataLayer.pop(); // item2 => Array[2], dataLayer[1] => @SimoAhava | MeasureCamp V undefined  dataLayer.push({'event' : 'gtm.js'}); // No special effects  There is absolutely nothing special about dataLayer ... or is there?
  • 12. What is dataLayer  A JavaScript Array  dataLayer = [];  dataLayer.push('item1'); // dataLayer[0] => 'item1'  dataLayer.push({'item2' : [{'data1' : true},{'data2' : 'Peter'}]}); // dataLayer[1] => 'item2' : Array[2]  var item2 = dataLayer.pop(); // item2 => Array[2], dataLayer[1] => @SimoAhava | MeasureCamp V undefined  dataLayer.push({'event' : 'gtm.js'}); // No special effects  There is absolutely nothing special about dataLayer ... or is there?  It’s the default name of the data structure that Google Tag Manager uses
  • 13. What is dataLayer  …but it looks like GTM overrides the default push() method: @SimoAhava | MeasureCamp V
  • 14. What is dataLayer  …but it looks like GTM overrides the default push() method:  This does three (visible) things: @SimoAhava | MeasureCamp V
  • 15. What is dataLayer  …but it looks like GTM overrides the default push() method:  This does three (visible) things: 1. Initiates a listener which processes the new state of dataLayer after each push() 2. Sets the maximum length of dataLayer to 300 3. Instead of returning the length of the Array, a push() returns true if no tags were fired and false if tags were fired – synchronous operation for ”Wait for Tags”! @SimoAhava | MeasureCamp V
  • 16. What is dataLayer  …but it looks like GTM overrides the default push() method:  This does three (visible) things: 1. Initiates a listener which processes the new state of dataLayer after each push() 2. Sets the maximum length of dataLayer to 300 3. Instead of returning the length of the Array, a push() returns true if no tags were fired and false if tags were fired – synchronous operation for ”Wait for Tags”!  These will all be part of the specification that vendors need to adhere to  Memory management such as setting the maximum length of the Array will eventually be configurable @SimoAhava | MeasureCamp V
  • 17. A. Gallen-Kallela: Lemminkainen’s Mother THERE the blood-stained data model, There Google's son and hero, Cuts in pieces dataLayer, Chops it with his mighty hatchet --
  • 18. What is Google Tag Manager’s data model  An abstract data model, which passes and processes data from dataLayer to Google Tag Manager @SimoAhava | MeasureCamp V
  • 19. What is Google Tag Manager’s data model  An abstract data model, which passes and processes data from dataLayer to Google Tag Manager dataLayer Data model Tool-agnostic Tool-specific Generic Unique Accessed directly Accessed via helper Structured Abstract @SimoAhava | MeasureCamp V
  • 20. What is Google Tag Manager’s data model  In GTM, the interface exposes two methods:  google_tag_manager["GTM-XXXX"].dataLayer.get('key')  google_tag_manager["GTM-XXXX"].dataLayer.set('key','value') @SimoAhava | MeasureCamp V
  • 21. What is Google Tag Manager’s data model  In GTM, the interface exposes two methods:  google_tag_manager["GTM-XXXX"].dataLayer.get('key')  google_tag_manager["GTM-XXXX"].dataLayer.set('key','value')  These are used to access the data stored in the data model, and should not be used directly @SimoAhava | MeasureCamp V
  • 22. What is Google Tag Manager’s data model  In GTM, the interface exposes two methods:  google_tag_manager["GTM-XXXX"].dataLayer.get('key')  google_tag_manager["GTM-XXXX"].dataLayer.set('key','value')  These are used to access the data stored in the data model, and should not be used directly  Using get() retrieves the most recent value for ’key’  dataLayer.push({'key1' : 'value1'}); // dataLayer[0]  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // 'value1'  dataLayer.push({'key1' : 'value2'}); // dataLayer[1]!  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // 'value2' @SimoAhava | MeasureCamp V
  • 23. What is Google Tag Manager’s data model  Cool, get() works nicely with dotted names and nested objects  dataLayer.push({'key1.id' : '123'});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1.id'); // '123'  dataLayer.push({'key2' : {'id' : '234'}});  google_tag_manager["GTM-XXXX"].dataLayer.get('key2.id'); // '234’ @SimoAhava | MeasureCamp V
  • 24. What is Google Tag Manager’s data model  Cool, get() works nicely with dotted names and nested objects  dataLayer.push({'key1.id' : '123'});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1.id'); // '123'  dataLayer.push({'key2' : {'id' : '234'}});  google_tag_manager["GTM-XXXX"].dataLayer.get('key2.id'); // '234’  Yes, get() is the method that is called by your Data Layer Variable Macros @SimoAhava | MeasureCamp V
  • 25. What is Google Tag Manager’s data model  Cool, get() works nicely with dotted names and nested objects  dataLayer.push({'key1.id' : '123'});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1.id'); // '123'  dataLayer.push({'key2' : {'id' : '234'}});  google_tag_manager["GTM-XXXX"].dataLayer.get('key2.id'); // '234’  Yes, get() is the method that is called by your Data Layer Variable Macros  So…  When a dataLayer.push() occurs, the arguments are copied to the data model @SimoAhava | MeasureCamp V
  • 26. What is Google Tag Manager’s data model  Cool, get() works nicely with dotted names and nested objects  dataLayer.push({'key1.id' : '123'});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1.id'); // '123'  dataLayer.push({'key2' : {'id' : '234'}});  google_tag_manager["GTM-XXXX"].dataLayer.get('key2.id'); // '234’  Yes, get() is the method that is called by your Data Layer Variable Macros  So…  When a dataLayer.push() occurs, the arguments are copied to the data model  The get() method can be used to retrieve data from the data model @SimoAhava | MeasureCamp V
  • 27. A. Gallen-Kallela: The Forging Of The Sampo dataLayer, worthy brother, Thou, my faithful indexed Array, Come and see this wondrous beauty, Abstract structure, awesome methods --
  • 28. Peculiarities of the data model  Changing value type overwrites the previous value  dataLayer.push({'key1' : [1, 2, 3]});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // Array[3]  dataLayer.push({'key1' : 'cool'});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // 'cool' @SimoAhava | MeasureCamp V
  • 29. Peculiarities of the data model  Changing value type overwrites the previous value  dataLayer.push({'key1' : [1, 2, 3]});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // Array[3]  dataLayer.push({'key1' : 'cool'});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // 'cool'  Array to Array and plain object to plain object behave a bit differently  dataLayer.push({'key1' : [1, 2, 3]});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3]  dataLayer.push({'key1' : [4, 5]});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [4, 5, 3]! @SimoAhava | MeasureCamp V
  • 30. Peculiarities of the data model  Updating an Array in the data model is clumsy (and not a good idea)  dataLayer.push({'key1' : [1, 2, 3]});  var k = google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3]  k.push(4, 5);  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3, 4, 5] @SimoAhava | MeasureCamp V
  • 31. Peculiarities of the data model  Updating an Array in the data model is clumsy (and not a good idea)  dataLayer.push({'key1' : [1, 2, 3]});  var k = google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3]  k.push(4, 5);  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3, 4, 5]  So there’s a special ’command array’ you can use, which accesses all supported methods of the value  dataLayer.push({'key1' : [1, 2, 3]});  dataLayer.push(['key1.push', 4, 5]); // Note the square brackets!  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // [1, 2, 3, 4, 5] @SimoAhava | MeasureCamp V
  • 32. Peculiarities of the data model  Plain object to plain object is more straightforward  dataLayer.push({'key1' : {'one' : 1}});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 1} @SimoAhava | MeasureCamp V
  • 33. Peculiarities of the data model  Plain object to plain object is more straightforward  dataLayer.push({'key1' : {'one' : 1}});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 1}  dataLayer.push({'key1' : {'two' : 2}});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 1}, {two: 2} @SimoAhava | MeasureCamp V
  • 34. Peculiarities of the data model  Plain object to plain object is more straightforward  dataLayer.push({'key1' : {'one' : 1}});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 1}  dataLayer.push({'key1' : {'two' : 2}});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 1}, {two: 2}  dataLayer.push({'key1' : {'one' : {'two' : 3}}});  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: {two: 3}}, @SimoAhava | MeasureCamp V {two: 2}
  • 35. Peculiarities of the data model  You can also run your own functions on values in the data model  dataLayer.push({'key1' : {'one' : 1}});  dataLayer.push(function() { var key1 = this.get('key1'); if(key1.hasOwnProperty('one') { this.set('key1', {'one' : 2}); } });  google_tag_manager["GTM-XXXX"].dataLayer.get('key1'); // {one: 2} @SimoAhava | MeasureCamp V
  • 36. @SimoAhava | MeasureCamp V Thank you www.simoahava.com/analytics/data-layer/ www.simoahava.com/analytics/google-tag-manager-data-model/ #GTMtips http://google.me/+SimoAhava @SimoAhava