gauc 2016 - simo ahava - measuring the roi of your content marketing
TRANSCRIPT
ReaktorMannerheimintie 200100, Helsinki Finland
tel: +358 9 4152 [email protected]
Confidential©2015 ReaktorAll rights reserved
measuring content successGoogle Tag Manager & Google Analytics
Simo AhavaSenior Data Advocate
Simo AhavaSenior Data Advocate, ReaktorGoogle Developer Expert, Google AnalyticsBlogger, developer, www.simoahava.comTwitter-er, @SimoAhavaGoogle+:er, +SimoAhava
@SimoAhava from @ReaktorNow | #GAUCbe | 25 Aug 2016
Why customize?Google Analytics is GREAT out-of-the-box, right?
PAGEVIEWS
BOUNCE AND CONVERSION RATE
SESSIONS
Google Analytics Session
Group of interactions that takes place on a website
That expires after 30 minutes of inactivity…
Or at the end of they day…
Or when acquisition campaign changes… Unless the referral is in the Referral Exclusion List…
Or traffic is cross-domain, and cross-domain tracking is implemented… Unless it’s implemented incorrectly… Which is likely since it’s so !#/%(“% difficult…
Unless you’re using Google Tag Manager… Except if you’ve implemented THAT incorrectly…
There’s also the sessionControl parameter…
Lets not forget mobile and single-page apps!
Who knows what else happens server-side?
Cookies, localStorage, persistent data stores!?
@SimoAhava from @ReaktorNow | #2015ac | 8–11
X
All metrics and dimensions used by a platform subscribe to the definitions
of said platform!
GPeC Summit 11-May-2015 | @SimoAhava
All metrics and dimensions used by a platform subscribe to the definitions
of said platform!
GPeC Summit 11-May-2015 | @SimoAhava
sessionized
@SimoAhava from @ReaktorNow | #GAUCbe | 25 Aug 2016
Google Tag ManagerThe best only way to deploy Google Analytics tracking
Google Tag ManagerLets you create and deploy tracking and measurement scripts with ease.
Google Tag ManagerLets you create and deploy tracking and measurement scripts with ease.
Facilitates interaction between variousdepartments within your organization.
Google Tag ManagerLets you create and deploy tracking and measurement scripts with ease.
Facilitates interaction between variousdepartments within your organization.
Allows you to focus your time on analysisrather than implementation.
Google Tag Manager
https://analyticsacademy.withgoogle.com/course/5
@SimoAhava from @ReaktorNow | #GAUCbe | 25 Aug 2016
Tricks and methods…for content marketing via Google Tag Manager…
WHY?
WHY?
Scroll% & Read%
WHY?
SERP Bounce Time
WHY?
Content Funnel
WHY?
Article performance
WHY?
http://goo.gl/rN4VpW
#1: Track Structured Data As Content Attributes
function() { var jsonLd = document.querySelector('script[type*="ld+json"]'); return jsonLd ? JSON.parse(jsonLd.innerHTML) : {};}
Custom JS Variable 1: {{JSON-LD}}
function() { return {{JSON-LD}}.author.name || undefined;}
Custom JS Variable 2: {{JSON-LD - author.name}}
function() { return {{JSON-LD}}.datePublished || undefined;}
Custom JS Variable 3: {{JSON-LD - datePublished}}
function() { return {{JSON-LD}}.headline || undefined;}
Custom JS Variable 4: {{JSON-LD - headline}}
Google Analytics View Settings
Google Tag Manager - Page View Tag
Google Analytics - Site Content - All Pages
#2: Article Attributes As Content Groups
http://goo.gl/uQi71z
Custom JS Variable: {{JS - Blog Images}}
function() { // Make sure the selector points to your content element var content = document.querySelector('.entry-content'); var imgs = content.querySelectorAll('img').length - 1; if (imgs>20) return '21+'; else if (imgs>15) return '16-20'; else if (imgs>10) return '11-15'; else if (imgs>7) return '8-10'; else if (imgs>5) return '6-7'; else if (imgs>3) return '4-5'; else if (imgs>1) return '2-3'; else if (imgs>0) return '1'; else return '0';}
Custom JS Variable: {{JS - Blog Length}}
function() { // Make sure the selector matches your content element var content = document.querySelector('.entry-content'); var wCount = 0; var cText = content.textContent || content.innerText; cText = cText.replace(/(^\s*)|(\s*$)/gi,''); cText = cText.replace(/[ ]{2,}/gi,' '); cText = cText.replace(/\n /,'\n'); wCount = cText.split(' ').length; if (wCount>3000) return '3k+'; else if (wCount>2500) return '2.5k-3k'; else if (wCount>2000) return '2k-2.5k'; else if (wCount>1500) return '1.5k-2k'; else if (wCount>1100) return '1.1k-1.5k'; else if (wCount>800) return '800-1.1k'; else if (wCount>500) return '500-800'; else if (wCount>200) return '200-500'; else return '<200';}
Custom JS Variable: {{JS - Blog Title Length}}
function() { var title = document.title; var wCount; title = title.replace(/(^\s*)|(\s*$)/gi,''); title = title.replace(/[ ]{2,}/gi,' '); wCount = title.split(' ').length; if (wCount>20) return '21+'; else if (wCount>16) return '17-20'; else if (wCount>12) return '13-16'; else if (wCount>10) return '11-12'; else if (wCount>8) return '9-10'; else if (wCount>6) return '7-8'; else if (wCount>4) return '5-6'; else if (wCount>2) return '3-4'; else return '<3';}
Page View Tag
Google Analytics - Site Content - All Pages
https://support.google.com/analytics/answer/2853423?hl=en
You can create up to five Content Groupings."
https://support.google.com/analytics/answer/2853423?hl=en
You can create up to five Content Groupings."
https://support.google.com/analytics/answer/2853423?hl=en
You can create up to five Content Groupings."
https://support.google.com/analytics/answer/2853423?hl=en
"W
You can create up to five Content Groupings.
https://support.google.com/analytics/answer/2853423?hl=en
"W T
You can create up to five Content Groupings.
https://support.google.com/analytics/answer/2853423?hl=en
"W T F
You can create up to five Content Groupings.
https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets
There is a maximum of 20 CustomDimensions (200 for Premium…)"
#3: Measure SERP Bounce Time
http://goo.gl/jzQXD2
Total SERP
Average Dwell Time Before Bounce
<script> (function() { var s = document.location.search; var h = document.location.hash; var e = {{Event}}; var n = {{New History Fragment}}; var o = {{Old History Fragment}}; // Only run if the History API is supported if (window.history) {
// Create a new history state if the user lands from Google's SERP if (e === 'gtm.js' && document.referrer.indexOf('www.google.') > -1 && s.indexOf('gclid') === -1 && s.indexOf('utm_') === -1 && h !== '#gref') { window.oldFragment = false; window.history.pushState(null,null,'#gref'); } else if (e === 'gtm.js') { window.oldFragment = true; }
// When the user tries to return to the SERP using browser back, fire the // Google Analytics timing event, and after it's dispatched, manually // navigate to the previous history entry, i.e. the SERP if (e === 'gtm.historyChange' && n === '' && o === 'gref') { var time = new Date().getTime() - {{DLV - gtm.start}}; if (!window.oldFragment) { dataLayer.push({ 'event' : 'returnToSerp', 'timeToSerp' : time, 'eventCallback' : function() { window.history.go(-1); } }); } else { window.history.go(-1); } } } })();</script>
Custom HTML Tag
Triggers for the Custom HTML Tag
+ All Pages
Data Layer Variables
Trigger for the Event Tag
Custom JS Variable: {{JS - SERP Time In Seconds}}
function() { return {{DLV - timeToSerp}} < 1800000 ? {{DLV - timeToSerp}} / 1000 : undefined;}
GA Admin -> Property Settings -> Custom Definitions -> Custom Metrics
Event Tag
GA View Settings -> Calculated Metrics
Custom Report
Total SERP
Average Dwell Time Before Bounce
#4: Track Content Engagement
http://goo.gl/DkoTox
x5x10x7x7x8x8x9
Interactive Time = Time when user is actively interacting with the page (keyboard and mouse)
<script> (function() { var startEngage = new Date().getTime(); var timeEngaged = 0; var idleTime = 0; var idle = true; var idleReport = false; var idleTimer, reportTimer; /* Set the user as idle, and calculate the time they were non-idle */ var setIdle = function() { idleTime = new Date().getTime(); timeEngaged += idleTime - startEngage; idle = true; }; /* Reset the 5 second idle timer. If the user was idle, start the non-idle timer */ var pulse = function(evt) { if (idle) { idle = false; startEngage = new Date().getTime(); idleReport = false; } window.clearTimeout(idleTimer); idleTimer = window.setTimeout(setIdle, 5000); }; // Utility function for attaching listeners to the window var addListener = function(evt, cb) { if (window.addEventListener) { window.addEventListener(evt, cb); } else if (window.attachEvent) { window.attachEvent('on' + evt, cb); } }; /* Push an event to dataLayer every 15 seconds unless the user is idle. Also, push an event when the user leaves the page */ var report = function(evt) { if (!idle) { timeEngaged += new Date().getTime() - startEngage; } // Push the payload to dataLayer, and only push valid time values if (!idleReport && timeEngaged > 0 && timeEngaged < 3600000) { window.dataLayer.push({ 'event' : 'nonIdle', 'nonIdleTimeElapsed' : timeEngaged }); } if (idle) { idleReport = true; } // Fix possible beforeunload duplication problem if (evt && evt.type === 'beforeunload') { window.removeEventListener('beforeunload', report); } timeEngaged = 0; startEngage = new Date().getTime(); reportTimer = window.setTimeout(report, 15000); }; addListener('mousedown', pulse); addListener('keydown', pulse); addListener('scroll', pulse); addListener('mousemove', pulse); addListener('beforeunload', report); idleTimer = window.setTimeout(setIdle, 5000); reportTimer = window.setTimeout(report, 15000); })();</script>
Custom HTML Tag
Trigger for the Custom HTML Tag
Data Layer Variable
Custom JS Variable: {{JS - Get Engagement Time In Seconds}}
function() { return {{DLV - nonIdleTimeElapsed}} / 1000;}
GA: New Custom Metric
Trigger for the Event Tag
Event Tag
GA: New Calculated Metric
GA: New Custom Report
x5x10x7x7x8x8x9
Interactive Time = Time when user is actively interacting with the page (keyboard and mouse)
#5: Track Content As Ecommerce
http://goo.gl/8BFc1M
@SimoAhava from @ReaktorNow | #GAUCbe | 25 Aug 2016
5 Takeaways1. Data quality is earned, not acquired2. Google Analytics is too generic out-of-the-box3. Analytics platforms need to be customized so that they enable
you to make informed decisions that suit your organization4. Understanding how content can be measured is a great proxy for
all measurement goals5. Knowledge about web technologies is a must for the modern
analyst
[email protected]: @SimoAhavaGoogle+: +SimoAhava