SlideShare una empresa de Scribd logo
1 de 119
Descargar para leer sin conexión
II
Ich weiß, warum du hier bist!
Du solltest Webanalyst werden …
» „Not everything that counts
can be counted,
and not everything
that can be counted counts.“
Albert Einstein,
Theoretischer Physiker
1879 – 1955
Maik Bruns
#metrika
#analyticspro
#dsmdm
#trainer
#writer
#papa
#freeletics
#enabler
@brunsmaik@maikbrunsmetrika@maikbruns
#markenfaible
FOLLOW ME FOR STORIES, LIVESTREAMS, INSIGHTS ON
#mentor
Ich mache
Websites profitabler.
#dwzwa
„War das nicht der Typ mit den vielen Slides?“
Dein und mein erstes Mal
You are here
… maybe
Your GTM Skill?
Simo is here
IT‘S NOT
EASY
BUT IT‘S
WORTH IT
»
I can see crazy people
Nicht alles machen! Kritisch sein.
RTFM! Sonst …
What‘s in it for you today?
GTM
Hacks
Tools
Je mehr Hacker, desto mehr Script …
Immer daran denken …
TALK NERDY TO ME …
And now …
QUICK
Level Fähigkeit
Dateiendungen
weiter nutzen
Dein Vorteil
Relevante
Informationen
weitergeben
Genau triggern
Hack #1: Dateinamenserweiterung nutzen
• Neuer URL-Variablen-Typ: „Dateinamenserweiterung“
• URL-Quelle festlegen (wo soll die
Information geparst werden?)
• Dateityp wird automatisch in der
Variable gespeichert bei Click,
Aufruf oder was auch immer
Anwendungsbeispiel „Download Tracking“
• Klick-Trigger anlegen,
z. B. mithilfe der Variablen
und dem Tag zuweisen =
genaueres Triggering
Hack #1: Dateinamenserweiterung nutzen
Anwendungsbeispiel „Download Tracking“
• Tag anlegen (z. B. Ereignis-Tracking
für Google Analytics)
• Neben z. B. „{{Click Text}}“ auch
die Dateinamenserweiterung
ergänzen (z. B. im Label)
• Dateinamenserweiterung ggf.
in Suchtabelle „verfeinern“
Hack #1: Dateinamenserweiterung nutzen
Level Fähigkeit
Vereinheitlichung
von Variablen-
Inhalten
Dein Vorteil
Beugt Fehlern vor
Datenqualität
verbessern
Hack #2: Vereinheitlichung von Inhalten
Früher
Variablen wurden vor der Verwendung (wenn überhaupt) nochmal
durch ein JavaScript „gejagt“, das sie „vereinheitlicht“ hat.
Zum Beispiel
function () {
return {{url}}.toLowerCase();
}
Hack #2: Vereinheitlichung von Inhalten
• Immer, wenn Daten auch an Dritt-Systeme weitergegeben werden,
kommt es besonders auf die Datenqualität der Variablen an.
• Oftmals „einfache“ Fehler wie falsche
Groß-/Kleinschreibung, nicht definierte
Werte usw.
• „Korrektur“/„Bereinigung“ jetzt
durch Funktion in Variablen
Hack #2: Vereinheitlichung von Inhalten
Einfache Möglichkeit der
Einflussnahme: „Formatwerte“
Level Fähigkeit
Neue Scroll und
YouTube Trigger
Dein Vorteil
Vor allem bei Lazy
Load mehr
Präzision
Hack #3: Neue Scroll und YouTube Trigger
Bisheriges Problem
Bei Lazy Loading
oder sehr kurzen Seiten
funktionierten die
Trigger für Scrolling und
YouTube teils schlecht.
Scrolling war oftmals zu
schnell bei 100 %
(bevor die Seite fertig
geladen hatte)
YouTube wurde oftmals
nicht ausgelöst
Hack #3: Neue Scroll und YouTube Trigger
Hack #3: Neue Scroll und YouTube Trigger
Aber bitte …
• Aussagekraft Scroll Trigger?
• Besser: Visibility Trigger
• Denke an die Limits: 500 Hits/Session und 10 Mio. Hits/Monat
• Wenn Video Trigger nicht funktionieren, kann das auch andere
Ursachen haben, z. B.
– Fehlender JS API Support
• entweder „enablejsapi=1“ in Abruf-URLeinbinden
• oder im GTM im YT Trigger den Haken setzen:
– Fehlendes YouTube API Script
• Einfach <script src="https://www.youtube.com/iframe_api"> per Custom HTML,
Trigger: Pageview auf allen relevanten Seiten.
Im Anschluss YT Trigger mind. auf DOM Ready verzögern.
Hack #4: Zeitgebundene Tags ausspielen
Level Fähigkeit
Dauer der
Tag-Ausspielung
regeln
Dein Vorteil
Weniger kümmern
um Kampagnen-
basierte Dinge
Unabhängigkeit
von Anwesenheit
Hack #4 Zeitgebundene Tags ausspielen
Was, wenn bestimmte Tags nicht ständig laufen sollen?
Was, wenn keiner Bock hat auf ständige Container-
Veröffentlichungen (inkl. kompletter Testings)?
Da gibt‘s nur eine Lösung ...
Tag Man
Hack #4: Zeitgebundene Tags ausspielen
Anwendungsfälle
Support-Tag/Chat-Bot
soll nur zu
Geschäftszeiten
ausgespielt werden.
Aktions-Hinweise
sollen nur zu
bestimmten Zeiten
oder in einem
bestimmten Zeitraum
gesetzt werden.
…
Hack #4: Zeitgebundene Tags ausspielen
Möglichkeit im Tag selbst
Schon ganz OK, aber immer noch etwas unflexibel
Hack #4: Zeitgebundene Tags ausspielen
Noch besser: JavaScript nutzen.
Wir brauchen
Benutzerdefinierte JavaScript-Variable(n)
(danke an Bounteous!)
Auf Tagesbasis, benutzerdefinierte JavaScript-Variable
function() {
var myTimeZone = 1; //UTC-Zeitzone ggf. anpassen
var userTime = new Date();
var utc = userTime.getTime() + (userTime.getTimezoneOffset() * 60000);
var currentDate = new Date(utc + (3600000 * myTimeZone));
var daysOfWeek = new Array(7);
daysOfWeek[0] = "Sonntag";
daysOfWeek[1] = "Montag";
daysOfWeek[2] = "Dienstag";
daysOfWeek[3] = "Mittwoch";
daysOfWeek[4] = "Donnerstag";
daysOfWeek[5] = "Freitag";
daysOfWeek[6]= "Samstag";
return(daysOfWeek[currentDate.getDay()]);
}
Hack #4: Zeitgebundene Tags ausspielen
Auf Stundenbasis, benutzerdefinierte JavaScript-Variable
function(){
var userTime = new Date();
var myTimeZone = 1; //ggf. UTC-Zeitzone anpassen
var currentHour = (userTime.getTime()%(24*60*60*1000))/(60*60*1000)+
myTimeZone;
if (currentHour < 0){
return (currentHour+24);
} else {
return (currentHour);
}
}
Hack #4: Zeitgebundene Tags ausspielen
Hack #4: Zeitgebundene Tags ausspielen
INTENSE
Level Fähigkeit
dataLayer.push
nutzen
Dein Vorteil
Das ewige
Gescrape
reduzieren
Zuverlässig
Informationen in
den DL legen
dataWHAT?
Was ist der dataLayer (oder auch „die Datenschicht“)?
dataLayer
Daten dataLayer
Daten
Daten Facebook
uvm.
Hack #5: dataLayer.push nutzen
dataLayer
= „unsichtbare“ Informationsschicht, auf die der Tag Manager
zugreifen kann.
= wird vom Tag Manager permanent „abgehört“
= Werte können durch GTM z. B. in dataLayer Variablen eingelesen
werden und stehen so für Tags und Trigger zur Verfügung.
= gehört zum Tag Manager wie Tags, Trigger und Variablen
Hack #5: dataLayer.push nutzen
Wer Informationen zuverlässig in den dataLayer bringen möchte,
sollte „pushy“ werden, ohne ihn jedes Mal zu initialisieren.
Dann „überschreibt“ man ihn nicht, sondern „fügt hinzu“.
Daher dataLayer immer leer (und bitte nur ein Mal!!1elf!) initialisieren
und Informationen pushen.
window.dataLayer = window.dataLayer || [];
//Initialisieren (nur 1x oberhalb des Container Code Snippets)
window.dataLayer.push({ 'einSchluessel' : 'einWert' }); //später Push ohne Init
Hack #5: dataLayer.push nutzen
Der dataLayer kann dann z. B. so aussehen:
<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'registrierung',
'loginStatus': 'logged in',
'eventCategory': 'click'
});
</script>
Event kann auch als
Trigger für Tags dienen!
Beliebige wichtige
Information
Hack #5: dataLayer.push nutzen
Anwendungsbeispiele:
• Du bist Entwickler und möchtest Informationen für die Marketer
bereitstellen, z. B.
– Produktinformationen
– Kauf-Informationen
– Formular-Optionen
– Sonstige Metadaten
– …
• Du bist Wordpress-Anwender und möchtest, dass Informationen
für den CTA-Click für den Tag Manager zur Verfügung stehen.
Level Fähigkeit
Nur die größte
Scroll-Tiefe per
Event senden
Dein Vorteil
Überflüssige
Informationen
reduzieren
Hit-Anzahl
begrenzen
Hack #6: Nur letzte Scroll Position schicken
Vor allem bei kurzen Seiten und ohne Trigger-Verzögerung werden
Scroll Events sehr schnell hintereinander gefeuert.
Hack #6: Nur letzte Scroll Position schicken
Lösung: Wir senden nur die letzte Scroll-Position.
Dafür -> Browser-Event „beforeunload“ nutzen
(Dazu gedacht beim Nutzer nachzufragen, ob die Seite wirklich verlassen werden soll.)
„Beforeunload“ reagiert (meist) bei Verlassen der Seite via Klick auf andere Seite
oder anderen „unterbrechbaren“ Aktionen.
Trigger: Sobald „beforeunload“-Event eintritt
Custom HTML Tag, um „beforeunload“ zu bemerken
<script> window.addEventListener('beforeunload', function() {
window.dataLayer.push({ event: 'beforeunload' }); }); </script>
Hack #6: Nur letzte Scroll Position schicken
• Wenn Custom HTML sauber installiert, sollte im Preview-Mode bei
Exit-Klick folgendes erscheinen:
• „beforeunload“-Event als Trigger
für unser Scroll Event nutzen
(ggf. für andere Events)
• „Verlassen“ der Seite ist
„unruhiges“ Gefilde …
(heißt: Hit wird oft nicht übertragen,
bevor der Seitenwechsel stattfindet)
Hack #6: Nur letzte Scroll Position schicken
Lösung: Wir nutzen ein anderes Transport-Protokoll: Beacon
• = neues HTML Feature, das asynchron sendet
und damit genau diese Probleme beheben soll.
• Wird voraussichtlich zukünftig sogar das bevorzugte Protokoll für GA.
• Bewirkt, dass selbst ein Hit Callback noch ankommt.
Haken an der Sache: Nicht jeder Browser unterstützt das.
Allerdings ist Fallback immer die „normale“ Methode.
Haken II: Debugging erschwert, da „Beacon“ bewirkt, dass Payload
„unübersichtlich“ übertragen wird.
Hack #6: Nur letzte Scroll Position schicken
Einbau in GA-Basis-Variable (oder dem konkreten Tag)
als „festzulegendes Feld“.
Und alles wird gut
Level Fähigkeit
Holt sich kopierten
Text aus
Zwischenablage
Dein Vorteil
Wissen, was
Menschen
kopieren
Genau triggern
Was interessiert Menschen auf deiner Website?
Hack #7: Kopierten Text erfassen
Benutzerdefiniertes
HTML Tag
• für markierten Text
Event Listener
• damit wir wissen,
wann kopiert wird
dataLayer-Variablen
• um alles in den GTM zu holen
Irgendwas Sinnvolles,
das wir damit machen
wollen
• z. B. GA Event
Zutaten
Hack #7: Kopierten Text erfassen
Benutzerdefiniertes HTML Tag für markierten Text
function getSelectionText() {
var text = '';
if (window.getSelection) {
text = window.getSelection().toString();
} else if (document.selection && document.selection.type != 'Control') {
text = document.selection.createRange().text;
}
return text;
}
> http://stackoverflow.com/questions/5379120/get-the-highlighted-selected-text
Hack #7: Kopierten Text erfassen
Zusätzlich in das HTML Tag einbauen:
„Event Listener“ und „dataLayer.push“ für das „Kopieren“
document.addEventListener('copy', function(e){
dataLayer.push({
'event': 'textKopiert',
'kopierterText': getSelectionText(),
'kopierterTextLaenge': getSelectionText().length
});
});
> http://stackoverflow.com/questions/5379120/get-the-highlighted-selected-text
Hack #7: Kopierten Text erfassen
Mix it up …
Die
brauchen
wir gleich
noch
Hack #7: Kopierten Text erfassen
Dann noch Datenschichtvariablen und Trigger anlegen
Hack #7: Kopierten Text erfassen
… und verarbeiten
Level Fähigkeit
RegEx Tabelle
statt Suchtabelle
nutzen
Dein Vorteil
flexibler
Besser
Konsolidierung
von Suchtabellen
Hack #8: RegEx-Tabelle statt Suchtabelle
„Suchtabelle“
• Eingabewert (exakt)
und gibt Ausgabewert
zurück.
• Hilfreich, aber stumpf!
Weil kein Spielraum.
Es geht flexibler …
Hack #8: RegEx-Tabelle statt Suchtabelle
„RegEx-Tabelle“
• Eingabewert basiert auf regulären Ausdrücken und gibt
Ausgabewert zurück.
• Viiiiel Spielraum
Zusätzliche Optionen!
Darf auch
Variable sein
(z. B. weitere
Suchtabelle)
Lerne reguläre Ausdrücke
^(?=.*?[A-Z])
(?=.*?[a-z])
(?=.*?[0-9])
(?=.*?[#?!@$%^&*-
]).{8,}$
Hack #8: RegEx-Tabelle statt Suchtabelle
Hier kannst du RegEx lernen und testen
• Super erklärt
https://danielfett.de/de/tutorials/tutorial-regulare-ausdrucke/
• https://regexone.com/ (interaktiv)
• https://regex101.com/ (u. a. Test-Tool)
• https://regexr.com/ (u. a. Test-Tool)
Level Fähigkeit
Site-Search-
Ordner als
Suchbegriff
übergeben
Dein Vorteil
Bordmittel von GA
überlisten
Google Analytics braucht für Erfassung der Site Search eigentlich
einen Suchparameter
Was, wenn wir nur URL-Ordner haben?
Hack #9: Site Search ohne Parameter
Benutzerdefiniertes JavaScript
function() {
var regex = /^/suchordner/(.*)/; //mit deinem Suchordner ersetzen
var pagePath = '/suchordner/(.*)/‘; //mit deinem Suchordner ersetzen
if(regex.test({{Page Path}}))
{
var searchTerm = regex.exec({{Page Path}})[1];
var NewUri = "/suchordner/?s=" + searchTerm; //mit deinem Suchordner ersetzen
return NewUri;
}
return false; //sorgt dafür, dass der alte Wert nicht überschrieben wird, wenn
kein Unterordner von /suchordner/
}
Hack #9: Site Search ohne Parameter
GA Pageview Tag oder GA-Einstellungen-Variable anpassen
Hack #9: Site Search ohne Parameter
JS-Variable
einbinden
Site-Search-Einstellungen in GA wie üblich
Hack #9: Site Search ohne Parameter
Optional, aber
oft sinnvoll
Suchparameter
Level Fähigkeit
Filtert doppelte
Transaktionen
außerhalb der
gleichen Sitzung
Dein Vorteil
Keine doppelten
Transaktionen
Hack #10: Doppelte Transaktionen vermeiden
E-Commerce Transaktionen
Pro Sitzung dürfen
mehrere vorkommen
… jedoch nicht mit der
gleichen Transaktions-ID
innerhalb der gleichen
Sitzung (GA filtert diese
automatisch)
… aaaaber:
sitzungsübergreifend geht
das dennoch …
Hack #10: Doppelte Transaktionen vermeiden
So sieht das aus …
Eigentlich darf da
nur „1“ stehen …
Hack #10: Doppelte Transaktionen vermeiden
Wie verhindern wir doppelte Transaktionen?
Nachträglich korrigieren (Rückerstattung)
• Nur mit Enhanced E-Commerce
• Verzerrt die Berichte (z. B. wenn nicht am gleichen Tag korrigiert wird)
Verhindern, dass der Nutzer die Danke-Seite ein weiteres Mal mit
Transaktions-Daten aufrufen kann
• Transaktionsdaten entfernen bei Refresh, neuer Sitzung, Back-Button, …
Serverseitig verhindern, dass die Transaktion doppelt gezählt wird
• in der Regel die beste Lösung, aber eben kein GTM-Hack 
Mithilfe des GTM verhindern, dass Transaktion doppelt gezählt wird
(Lösung hier)
Hack #10: Doppelte Transaktionen vermeiden
Wie können wir das Zählen doppelter Transaktionen verhindern?
• Z. B. mittels Cookie-Check und Zeitstempel
(Lösung von von Bounteous unter
https://www.bounteous.com/insights/2014/07/07/duplicate-transactions/?ns=l)
• Oder Prüfung mittels Custom-Task*-Variable im local Storage,
ob die Transaktions-ID vorhanden ist
(hier behandelte Lösung von Simo Ahava unter
https://www.simoahava.com/analytics/prevent-google-analytics-duplicate-
transactions-with-customtask/)
*Custom Task: Schon beim Erzeugen des Hits via „send“ werden die Daten des Treffers direkt zu
Beginn modifiziert.
Hack #10: Doppelte Transaktionen vermeiden
Benutzerdefiniertes JavaScript
„customtask – transaction deduper“
function() {
// customTask Builder by Simo Ahava
//
// More information about customTask:
https://www.simoahava.com/analytics/customtask-the-guide/
//
// Change the default values for the settings below.
// transactionDeduper: Configuration object for preventing
duplicate transactions from being recorded.
// https://bit.ly/2AvSZ2Y
var transactionDeduper = {
keyName: '_transaction_ids',
cookieExpiresDays: 365
};
// DO NOT EDIT ANYTHING BELOW THIS LINE
var readFromStorage = function(key) {
if (!window.Storage) {
// From: https://stackoverflow.com/a/15724300/2367037
var value = '; ' + document.cookie;
var parts = value.split('; ' + key + '=');
if (parts.length === 2) return parts.pop().split(';').shift();
} else {
return window.localStorage.getItem(key);
}
};
var writeToStorage = function(key, value, expireDays) {
if (!window.Storage) {
var expiresDate = new Date();
expiresDate.setDate(expiresDate.getDate() + expireDays);
document.cookie = key + '=' + value + ';expires=' +
expiresDate.toUTCString();
} else {
window.localStorage.setItem(key, value);
}
};
var globalSendHitTaskName = '_ga_originalSendHitTask';
return function(customTaskModel) {
window[globalSendHitTaskName] =
window[globalSendHitTaskName] ||
customTaskModel.get('sendHitTask');
var tempFieldObject, dimensionIndex, count, ga, tracker,
decorateTimer, decorateIframe, iframe;
customTaskModel.set('sendHitTask',
function(sendHitTaskModel) {
var originalSendHitTaskModel = sendHitTaskModel,
originalSendHitTask = window[globalSendHitTaskName],
canSendHit = true;
var hitPayload, hitPayloadParts, param, val, regexI, trackingId,
snowplowVendor, snowplowVersion, snowplowPath, request,
originalTrackingId, hitType, nonInteraction, d, transactionId,
storedIds;
try {
// transactionDeduper
if (typeof transactionDeduper === 'object' &&
transactionDeduper.hasOwnProperty('keyName') &&
transactionDeduper.hasOwnProperty('cookieExpiresDays') &&
typeof sendHitTaskModel.get('&ti') !== 'undefined') {
transactionId = sendHitTaskModel.get('&ti');
storedIds =
JSON.parse(readFromStorage(transactionDeduper.keyName) ||
'[]');
if (storedIds.indexOf(transactionId) > -1 && ['transaction',
'item'].indexOf(sendHitTaskModel.get('hitType')) === -1) {
canSendHit = false;
} else if (storedIds.indexOf(transactionId) === -1) {
storedIds.push(transactionId);
writeToStorage(transactionDeduper.keyName,
JSON.stringify(storedIds),
transactionDeduper.cookieExpiresDays);
}
}
// /transactionDeduper
if (canSendHit) {
originalSendHitTask(sendHitTaskModel);
}
} catch(e) {
originalSendHitTask(originalSendHitTaskModel);
}
});
};
}
Hack #10: Doppelte Transaktionen vermeiden
Ein paar Variablen …
Datenschichtvariable
1st Party Cookie
Custom JavaScript
Hack #10: Doppelte Transaktionen vermeiden
… und ein Blocking-Trigger – sowie die Verwendung im Tag
Blocking-Trigger
Verwendung des Blocking-Triggers im Tag
Level Fähigkeit
Dokumentation des
GTM Containers
Dein Vorteil
Nicht alles per
Hand abschreiben
Du vergisst sonst sowieso alles …
Und noch schlimmer: Niemand anderer blickt das noch.
Du
dokumentierst
doch, oder?
Hack #11: Dokumentation leicht gemacht
Lass dir von Tools helfen.
Export des
jeweiligen
GTM-Containers
Schreib‘s alles auf …
oder ->
GTM Tools
von Simo Ahava
(Chrome Plugin,
nicht das andere  )
GTM Tools for Spreadsheets
Hack #11: Dokumentation leicht gemacht
Hack #11: Dokumentation leicht gemacht
Hack #11: Dokumentation leicht gemacht
Hack #11: Dokumentation leicht gemacht
Hack #11: Dokumentation leicht gemacht
Hack #11: Dokumentation leicht gemacht
• Einträge in „Notes“ machen
– Wer hat was angefordert?
– Wer hat umgesetzt?
– Was war der Zweck?
• Upload:
OVERKILL
Level Fähigkeit
„Rohdaten“
nachbauen.
Wir tun so als wäre
GA = GA360
Dein Vorteil
Wir können die
Daten besser
weiterverarbeiten
Debugging wird
leichter
Die Herausforderung:
GA (kostenlos) aggregiert Daten für uns
Hack #12: „Rohdaten“ nachbauen
Die Herausforderung:
GA (kostenlos) aggrogiert Daten für uns
Hack #12: „Rohdaten“ nachbauen
vs
Hack #12: „Rohdaten“ nachbauen
Hack #12: „Rohdaten“ nachbauen
Warum Rohdaten?
• In welcher Reihenfolge fanden die Hits statt?
• Welche werden welcher Session und welchem Client zugerechnet?
• Scope-übergreifende Berichte ermöglichen.
Daher: Manchmal brauchen wir sie einzeln und UNaggregiert
We need RAW …
Hack #12: „Rohdaten“ nachbauen
„Rohdaten“ bedeutet, dass wir ein paar Dinge brauchen
Session ID Zeitstempel
Client ID Hit Type
Zutaten
Hack #12: „Rohdaten“ nachbauen
Zutaten
In der GA Property „benutzerdefinierte
Dimensionen“ anlegen
Auf Scope achten!
Hack #12: „Rohdaten“ nachbauen
Und dann rein damit … ClientID
Custom-JavaScript-Variable
anlegen (Indexnummer!).
Diese im GA-Tag oder den
GA-Einstellungen per
customTask nutzen
cJS – clientIdToDimension1
Hack #12: „Rohdaten“ nachbauen
Und dann rein damit … Hit Type
Custom-JavaScript-Variable
anlegen (Indexnummer!).
Diese im GA-Tag oder den
GA-Einstellungen per
customTask nutzen.
Hack #12: „Rohdaten“ nachbauen
Short break: Custom Task darf nur 1x je GA Tag rein!
Also konsolidieren und nur 1x in GA Tags!
Siehe nächste Seite.
Danke an Simo Ahava für den Custom Task Builder!
https://www.simoahava.com/tools/customtask-builder/#the-customtask-builder-tool
Nicht ganz trivial für Nicht-Developer …
function() {
var clientIdIndex = 1;
var hitTypeIndex = 6;
// DO NOT EDIT ANYTHING BELOW THIS
LINE
var readFromStorage = function (key) {
if (!window.Storage) {
// From:
https://stackoverflow.com/a/15724300/2367
037
var value = '; ' + document.cookie;
var parts = value.split('; ' + key + '=');
if (parts.length === 2) {
return parts.pop().split(';').shift();
}
} else {
return window.localStorage.getItem(key);
}
};
var writeToStorage = function (key, value,
expireDays) {
if (!window.Storage) {
var expiresDate = new Date();
expiresDate.setDate(expiresDate.getDate()
+ expireDays);
document.cookie = key + '=' + value +
';expires=' + expiresDate.toUTCString();
} else {
window.localStorage.setItem(key, value);
}
};
var globalSendHitTaskName =
'_ga_originalSendHitTask';
return function (customTaskModel) {
window[globalSendHitTaskName] =
window[globalSendHitTaskName] ||
customTaskModel.get('sendHitTask');
// clientIdIndex
if (typeof clientIdIndex === 'number') {
customTaskModel.set('dimension' +
clientIdIndex,
customTaskModel.get('clientId'));
}
// /clientIdIndex
// hitTypeIndex
if (typeof hitTypeIndex === 'number') {
customTaskModel.set('dimension' +
hitTypeIndex,
customTaskModel.get('hitType'));
}
// /hitTypeIndex
customTaskModel.set('sendHitTask',
function (sendHitTaskModel) {
var originalSendHitTaskModel =
sendHitTaskModel,
originalSendHitTask =
window[globalSendHitTaskName],
canSendHit = true;
try {
if (canSendHit) {
originalSendHitTask(sendHitTaskModel);
}
} catch(err) {
originalSendHitTask(originalSendHitTaskMod
el);
}
});
};
}
Hack #12: „Rohdaten“ nachbauen
Und dann rein damit … SessionID
Custom-JavaScript-Variable
anlegen (Zufallszahl setzen)
Diese im GA-Tag oder den
GA-Einstellungen nutzen
Hack #12: „Rohdaten“ nachbauen
Und dann rein damit … Zeitstempel
Custom-JavaScript-Variable
anlegen
Diese im GA-Tag oder den
GA-Einstellungen nutzen
Hack #12: „Rohdaten“ nachbauen
Und wofür der ganze Stress?
Dafür:
Oder um die Daten anderweitig zu nutzen:
Segmente, Berichte, Plakate, …
Level Fähigkeit
Sendet GA Hits
an mehr als eine
Property
Dein Vorteil
Du sparst dir das
Anlegen mehrerer
Tags, die das
Gleiche tun.
Dein Tracking wird
flexibler
Hack #13: Hits an mehrere Propertys senden
Benutzerdefiniertes JavaScript (Name hier: „cJS – customTask hit duplicator“)
function() { // Replace newTrackingId value with the UA property to which you want to duplicate this tag
var newTrackingId = 'UA-XXXXX-Y‘;
var globalSendTaskName = '_' + newTrackingId + '_originalSendTask‘;
return function(customModel) {
window[globalSendTaskName] = window[globalSendTaskName] ||
customModel.get('sendHitTask‘);
customModel.set('sendHitTask', function(sendModel) {
var hitPayload = sendModel.get('hitPayload‘);
var trackingId = new RegExp(sendModel.get('trackingId'), 'gi‘);
window[globalSendTaskName](sendModel);
sendModel.set('hitPayload', hitPayload.replace(trackingId, newTrackingId),
true);
window[globalSendTaskName](sendModel);
});
};
}
> https://www.simoahava.com/gtm-tips/send-google-analytics-tag-multiple-properties/
Hack #13: Hits an mehrere Propertys senden
Custom Task zu Google Analytics Einstellungen oder zu
entsprechenden Hits hinzufügen
Nicht vergessen: Custom Task nur 1x je Tag ausführen!
Ggf. kombinieren.
Hacks: Tooltime
Anwendungsgebiet Fähigkeit
diverse
Dein Vorteil
Höher, schneller,
weiter
Hack #14: Tooltime: Injection
Level Fähigkeit
Tag Manager
ohne Installation
nutzen
Dein Vorteil
Du musst nicht auf
die IT warten
Du kannst Gas
geben
Hack #14: Tooltime: Injection
„Tag Manager Injector“ „Analytics Pros
dataLayer Inspector+“
Chrome Plugins
Level Fähigkeit
GTM Copy &
Paste
Dein Vorteil
Elemente des
GTM kopieren und
einfügen
Du sparst dir Export und
Import eines Containers
Du musst den Tag
Manager nicht verlassen
Hack #15: Tooltime: Copy & Paste
Chrome Plugin
Hack #15: Tooltime: Copy & Paste
Beachten
Wenn Tag einen Trigger beinhaltet, sollte
dieser ggf. mitkopiert werden. Ansonsten wird
der Trigger automatisch entfernt.
Level Fähigkeit
GTM Spy
Dein Vorteil
Tag Manager
Container
„ausspionieren“
Verstehen, wie
andere es machen
Gute Lösungen
nachbauen
Hack #16: Tooltime: GTM Spy
https://gtmspy.com/
©Dustin Recko, um veröffentlichte Container auszulesen.
Tags, Trigger und Variablen können so eingesehen werden.
Hack #16: Tooltime: GTM Spy
BABO-Hack: Nutze den GTM
Anwendungsgebiet
GTM Allgemein
Fähigkeit
Nutze den GTM
Dein Vorteil
Er macht dich
schneller, …
… flexibler …
… besser.
LIKEABOSS
© 121WATT
Hörbuch
“Dein Weg zum Webanalysten”
• Deine Abkürzung zum
beruflichen Erfolg
• Über 5 Stunden (!) Inhalt
PLUS Bonusmaterial
• Wie du Webanalyst wirst
und wo dein Startpunkt ist
• Wie du Unternehmen mit
Webanalyse weiterbringst
• Zugang zu einer geschlossenen
Facebook-Gruppe zum Austausch
Du bist mein
#analyseheld
Biddeschön!
@brunsmaik@maikbrunsmetrika@maikbruns
Maik Bruns
Analytics Professional undCoach
maik.bruns@metrika.de
Trag‘ dich ein:
https://go.metrika.de
/GMPCON19
inkl. Container mit
Code und Co.
FOLLOW ME FOR STORIES, LIVESTREAMS, INSIGHTS

Más contenido relacionado

Similar a GMP-Con 2019 - GTM Hacks - Maik Bruns (Metrika)

Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
Daniel Havlik
 
Javascript done right
Javascript done rightJavascript done right
Javascript done right
Dirk Ginader
 

Similar a GMP-Con 2019 - GTM Hacks - Maik Bruns (Metrika) (20)

Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im Web
 
Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
 
MongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen HackerMongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen Hacker
 
Javascript done right
Javascript done rightJavascript done right
Javascript done right
 
Site Speed EXTREME - SEOkomm 2014
Site Speed EXTREME - SEOkomm 2014Site Speed EXTREME - SEOkomm 2014
Site Speed EXTREME - SEOkomm 2014
 
Deploy Magento Shops with Capistrano v3
Deploy Magento Shops with Capistrano  v3Deploy Magento Shops with Capistrano  v3
Deploy Magento Shops with Capistrano v3
 
Wieso Informatiker bei der Informationssicherheit scheitern
Wieso Informatiker bei der Informationssicherheit scheiternWieso Informatiker bei der Informationssicherheit scheitern
Wieso Informatiker bei der Informationssicherheit scheitern
 
Chatbot Hackathon Slidedeck
Chatbot Hackathon SlidedeckChatbot Hackathon Slidedeck
Chatbot Hackathon Slidedeck
 
Google Analytics Konferenz 2015: WORKSHOP: Enhanced ECommerce (Michaela Linha...
Google Analytics Konferenz 2015: WORKSHOP: Enhanced ECommerce (Michaela Linha...Google Analytics Konferenz 2015: WORKSHOP: Enhanced ECommerce (Michaela Linha...
Google Analytics Konferenz 2015: WORKSHOP: Enhanced ECommerce (Michaela Linha...
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Google Tag Manager Advanced - SEOCampixx 2016
Google Tag Manager Advanced - SEOCampixx 2016Google Tag Manager Advanced - SEOCampixx 2016
Google Tag Manager Advanced - SEOCampixx 2016
 
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
 
Layout Katalog 12/2019 DE
Layout Katalog 12/2019 DELayout Katalog 12/2019 DE
Layout Katalog 12/2019 DE
 
Lösungsorientierte Fehlerbehandlung
Lösungsorientierte FehlerbehandlungLösungsorientierte Fehlerbehandlung
Lösungsorientierte Fehlerbehandlung
 
Google Tag Manager Advanced - SEO CAMPIXX 2016
Google Tag Manager Advanced - SEO CAMPIXX 2016Google Tag Manager Advanced - SEO CAMPIXX 2016
Google Tag Manager Advanced - SEO CAMPIXX 2016
 
#wpdm - Plugin-Entwicklung für den TinyMCE
#wpdm - Plugin-Entwicklung für den TinyMCE#wpdm - Plugin-Entwicklung für den TinyMCE
#wpdm - Plugin-Entwicklung für den TinyMCE
 
PageSpeed Extreme für das große Speed Update 2021
PageSpeed Extreme für das große Speed Update 2021PageSpeed Extreme für das große Speed Update 2021
PageSpeed Extreme für das große Speed Update 2021
 
Tracking-Herausforderungen 2020
Tracking-Herausforderungen 2020Tracking-Herausforderungen 2020
Tracking-Herausforderungen 2020
 
Web Performance Optimierung (WPO)
Web Performance Optimierung (WPO)Web Performance Optimierung (WPO)
Web Performance Optimierung (WPO)
 
SEO Day 2016: Perfekte Ladezeiten und SEO-Hosting für Speed-Freaks
SEO Day 2016: Perfekte Ladezeiten und SEO-Hosting für Speed-FreaksSEO Day 2016: Perfekte Ladezeiten und SEO-Hosting für Speed-Freaks
SEO Day 2016: Perfekte Ladezeiten und SEO-Hosting für Speed-Freaks
 

Más de e-dialog GmbH

Más de e-dialog GmbH (20)

Webinar Online Marktforschung 04.03.2020
Webinar Online Marktforschung 04.03.2020Webinar Online Marktforschung 04.03.2020
Webinar Online Marktforschung 04.03.2020
 
ProgrammatiCon 2019 - Content Marketing skalierbar machen - Kurier - Stephani...
ProgrammatiCon 2019 - Content Marketing skalierbar machen - Kurier - Stephani...ProgrammatiCon 2019 - Content Marketing skalierbar machen - Kurier - Stephani...
ProgrammatiCon 2019 - Content Marketing skalierbar machen - Kurier - Stephani...
 
ProgrammatiCon 2019 - Programmatic DOOH - Goldbach - Paul Adamelis
ProgrammatiCon 2019 - Programmatic DOOH - Goldbach - Paul AdamelisProgrammatiCon 2019 - Programmatic DOOH - Goldbach - Paul Adamelis
ProgrammatiCon 2019 - Programmatic DOOH - Goldbach - Paul Adamelis
 
GMP-Con 2019 - Conversion Optimierung mit Analytics + Optimize - Sophie Kubec...
GMP-Con 2019 - Conversion Optimierung mit Analytics + Optimize - Sophie Kubec...GMP-Con 2019 - Conversion Optimierung mit Analytics + Optimize - Sophie Kubec...
GMP-Con 2019 - Conversion Optimierung mit Analytics + Optimize - Sophie Kubec...
 
GMP-Con 2019 - App Tracking - Markus Vollmert (lunapark)
GMP-Con 2019 - App Tracking - Markus Vollmert (lunapark) GMP-Con 2019 - App Tracking - Markus Vollmert (lunapark)
GMP-Con 2019 - App Tracking - Markus Vollmert (lunapark)
 
GMP-Con 2019 - Programmatic Display mit DV360 - Lisa Weichselbaum (e-dialog)
GMP-Con 2019 - Programmatic Display mit DV360 - Lisa Weichselbaum (e-dialog)GMP-Con 2019 - Programmatic Display mit DV360 - Lisa Weichselbaum (e-dialog)
GMP-Con 2019 - Programmatic Display mit DV360 - Lisa Weichselbaum (e-dialog)
 
GMP-Con 2019 - Facebook & Google Analytics in Love - Michaela Linhart (e-dialog)
GMP-Con 2019 - Facebook & Google Analytics in Love - Michaela Linhart (e-dialog)GMP-Con 2019 - Facebook & Google Analytics in Love - Michaela Linhart (e-dialog)
GMP-Con 2019 - Facebook & Google Analytics in Love - Michaela Linhart (e-dialog)
 
GMP-Con 2019 - Enterprise Ausblick, CRM, Machine Learning, Cloud - Siegfried ...
GMP-Con 2019 - Enterprise Ausblick, CRM, Machine Learning, Cloud - Siegfried ...GMP-Con 2019 - Enterprise Ausblick, CRM, Machine Learning, Cloud - Siegfried ...
GMP-Con 2019 - Enterprise Ausblick, CRM, Machine Learning, Cloud - Siegfried ...
 
GMP-Con 2019 - Enhanced E-Commerce - Markus Vollmert (lunapark)
GMP-Con 2019 - Enhanced E-Commerce - Markus Vollmert (lunapark)GMP-Con 2019 - Enhanced E-Commerce - Markus Vollmert (lunapark)
GMP-Con 2019 - Enhanced E-Commerce - Markus Vollmert (lunapark)
 
GMP-Con 2019 - Conversion Optimierung mit Analytics + Optimize - Sophie Kubec...
GMP-Con 2019 - Conversion Optimierung mit Analytics + Optimize - Sophie Kubec...GMP-Con 2019 - Conversion Optimierung mit Analytics + Optimize - Sophie Kubec...
GMP-Con 2019 - Conversion Optimierung mit Analytics + Optimize - Sophie Kubec...
 
Google Analytics Konferenz 2019_Kampagnen-Tracking_Holger Tempel (webalytics)
Google Analytics Konferenz 2019_Kampagnen-Tracking_Holger Tempel (webalytics)Google Analytics Konferenz 2019_Kampagnen-Tracking_Holger Tempel (webalytics)
Google Analytics Konferenz 2019_Kampagnen-Tracking_Holger Tempel (webalytics)
 
Google Analytics Konferenz 2019_App Tracking_Runa Reno (Booking.com) & Markus...
Google Analytics Konferenz 2019_App Tracking_Runa Reno (Booking.com) & Markus...Google Analytics Konferenz 2019_App Tracking_Runa Reno (Booking.com) & Markus...
Google Analytics Konferenz 2019_App Tracking_Runa Reno (Booking.com) & Markus...
 
Google Analytics Konferenz 2019_Attribution: building a model_Martin Frotzler...
Google Analytics Konferenz 2019_Attribution: building a model_Martin Frotzler...Google Analytics Konferenz 2019_Attribution: building a model_Martin Frotzler...
Google Analytics Konferenz 2019_Attribution: building a model_Martin Frotzler...
 
Google Analytics Konferenz 2019_Audience Management_Emma Crawford-Prajapati (...
Google Analytics Konferenz 2019_Audience Management_Emma Crawford-Prajapati (...Google Analytics Konferenz 2019_Audience Management_Emma Crawford-Prajapati (...
Google Analytics Konferenz 2019_Audience Management_Emma Crawford-Prajapati (...
 
Google Analytics Konferenz 2019_Data Privacy & Consent Management_Eckart Holz...
Google Analytics Konferenz 2019_Data Privacy & Consent Management_Eckart Holz...Google Analytics Konferenz 2019_Data Privacy & Consent Management_Eckart Holz...
Google Analytics Konferenz 2019_Data Privacy & Consent Management_Eckart Holz...
 
Google Analytics Konferenz 2019_Conversion Optimierung mit Analytics & Optimi...
Google Analytics Konferenz 2019_Conversion Optimierung mit Analytics & Optimi...Google Analytics Konferenz 2019_Conversion Optimierung mit Analytics & Optimi...
Google Analytics Konferenz 2019_Conversion Optimierung mit Analytics & Optimi...
 
Google Analytics Konferenz 2019_Customer Data Platform_Michaela Linhart (e-di...
Google Analytics Konferenz 2019_Customer Data Platform_Michaela Linhart (e-di...Google Analytics Konferenz 2019_Customer Data Platform_Michaela Linhart (e-di...
Google Analytics Konferenz 2019_Customer Data Platform_Michaela Linhart (e-di...
 
Google Analytics Konferenz 2019_Customer Data Platform_Timo von Focht (Comman...
Google Analytics Konferenz 2019_Customer Data Platform_Timo von Focht (Comman...Google Analytics Konferenz 2019_Customer Data Platform_Timo von Focht (Comman...
Google Analytics Konferenz 2019_Customer Data Platform_Timo von Focht (Comman...
 
Google Analytics Konferenz 2019_Google Marketing Platform - Enterprise_Siegfr...
Google Analytics Konferenz 2019_Google Marketing Platform - Enterprise_Siegfr...Google Analytics Konferenz 2019_Google Marketing Platform - Enterprise_Siegfr...
Google Analytics Konferenz 2019_Google Marketing Platform - Enterprise_Siegfr...
 
Google Analytics Konferenz 2019_Google Marketing Platform - Enterprise_Oleg P...
Google Analytics Konferenz 2019_Google Marketing Platform - Enterprise_Oleg P...Google Analytics Konferenz 2019_Google Marketing Platform - Enterprise_Oleg P...
Google Analytics Konferenz 2019_Google Marketing Platform - Enterprise_Oleg P...
 

GMP-Con 2019 - GTM Hacks - Maik Bruns (Metrika)

  • 1. II
  • 2. Ich weiß, warum du hier bist!
  • 4. » „Not everything that counts can be counted, and not everything that can be counted counts.“ Albert Einstein, Theoretischer Physiker 1879 – 1955
  • 6. „War das nicht der Typ mit den vielen Slides?“
  • 7. Dein und mein erstes Mal
  • 8. You are here … maybe Your GTM Skill? Simo is here
  • 10. » I can see crazy people
  • 11. Nicht alles machen! Kritisch sein.
  • 13. What‘s in it for you today? GTM Hacks Tools
  • 14. Je mehr Hacker, desto mehr Script … Immer daran denken …
  • 15. TALK NERDY TO ME … And now …
  • 16. QUICK
  • 17. Level Fähigkeit Dateiendungen weiter nutzen Dein Vorteil Relevante Informationen weitergeben Genau triggern
  • 18. Hack #1: Dateinamenserweiterung nutzen • Neuer URL-Variablen-Typ: „Dateinamenserweiterung“ • URL-Quelle festlegen (wo soll die Information geparst werden?) • Dateityp wird automatisch in der Variable gespeichert bei Click, Aufruf oder was auch immer
  • 19. Anwendungsbeispiel „Download Tracking“ • Klick-Trigger anlegen, z. B. mithilfe der Variablen und dem Tag zuweisen = genaueres Triggering Hack #1: Dateinamenserweiterung nutzen
  • 20. Anwendungsbeispiel „Download Tracking“ • Tag anlegen (z. B. Ereignis-Tracking für Google Analytics) • Neben z. B. „{{Click Text}}“ auch die Dateinamenserweiterung ergänzen (z. B. im Label) • Dateinamenserweiterung ggf. in Suchtabelle „verfeinern“ Hack #1: Dateinamenserweiterung nutzen
  • 21. Level Fähigkeit Vereinheitlichung von Variablen- Inhalten Dein Vorteil Beugt Fehlern vor Datenqualität verbessern
  • 22. Hack #2: Vereinheitlichung von Inhalten Früher Variablen wurden vor der Verwendung (wenn überhaupt) nochmal durch ein JavaScript „gejagt“, das sie „vereinheitlicht“ hat. Zum Beispiel function () { return {{url}}.toLowerCase(); }
  • 23. Hack #2: Vereinheitlichung von Inhalten • Immer, wenn Daten auch an Dritt-Systeme weitergegeben werden, kommt es besonders auf die Datenqualität der Variablen an. • Oftmals „einfache“ Fehler wie falsche Groß-/Kleinschreibung, nicht definierte Werte usw. • „Korrektur“/„Bereinigung“ jetzt durch Funktion in Variablen
  • 24. Hack #2: Vereinheitlichung von Inhalten Einfache Möglichkeit der Einflussnahme: „Formatwerte“
  • 25. Level Fähigkeit Neue Scroll und YouTube Trigger Dein Vorteil Vor allem bei Lazy Load mehr Präzision
  • 26. Hack #3: Neue Scroll und YouTube Trigger Bisheriges Problem Bei Lazy Loading oder sehr kurzen Seiten funktionierten die Trigger für Scrolling und YouTube teils schlecht. Scrolling war oftmals zu schnell bei 100 % (bevor die Seite fertig geladen hatte) YouTube wurde oftmals nicht ausgelöst
  • 27. Hack #3: Neue Scroll und YouTube Trigger
  • 28. Hack #3: Neue Scroll und YouTube Trigger Aber bitte … • Aussagekraft Scroll Trigger? • Besser: Visibility Trigger • Denke an die Limits: 500 Hits/Session und 10 Mio. Hits/Monat • Wenn Video Trigger nicht funktionieren, kann das auch andere Ursachen haben, z. B. – Fehlender JS API Support • entweder „enablejsapi=1“ in Abruf-URLeinbinden • oder im GTM im YT Trigger den Haken setzen: – Fehlendes YouTube API Script • Einfach <script src="https://www.youtube.com/iframe_api"> per Custom HTML, Trigger: Pageview auf allen relevanten Seiten. Im Anschluss YT Trigger mind. auf DOM Ready verzögern.
  • 29. Hack #4: Zeitgebundene Tags ausspielen Level Fähigkeit Dauer der Tag-Ausspielung regeln Dein Vorteil Weniger kümmern um Kampagnen- basierte Dinge Unabhängigkeit von Anwesenheit
  • 30. Hack #4 Zeitgebundene Tags ausspielen Was, wenn bestimmte Tags nicht ständig laufen sollen? Was, wenn keiner Bock hat auf ständige Container- Veröffentlichungen (inkl. kompletter Testings)? Da gibt‘s nur eine Lösung ...
  • 32. Hack #4: Zeitgebundene Tags ausspielen Anwendungsfälle Support-Tag/Chat-Bot soll nur zu Geschäftszeiten ausgespielt werden. Aktions-Hinweise sollen nur zu bestimmten Zeiten oder in einem bestimmten Zeitraum gesetzt werden. …
  • 33. Hack #4: Zeitgebundene Tags ausspielen Möglichkeit im Tag selbst Schon ganz OK, aber immer noch etwas unflexibel
  • 34. Hack #4: Zeitgebundene Tags ausspielen Noch besser: JavaScript nutzen. Wir brauchen Benutzerdefinierte JavaScript-Variable(n) (danke an Bounteous!)
  • 35. Auf Tagesbasis, benutzerdefinierte JavaScript-Variable function() { var myTimeZone = 1; //UTC-Zeitzone ggf. anpassen var userTime = new Date(); var utc = userTime.getTime() + (userTime.getTimezoneOffset() * 60000); var currentDate = new Date(utc + (3600000 * myTimeZone)); var daysOfWeek = new Array(7); daysOfWeek[0] = "Sonntag"; daysOfWeek[1] = "Montag"; daysOfWeek[2] = "Dienstag"; daysOfWeek[3] = "Mittwoch"; daysOfWeek[4] = "Donnerstag"; daysOfWeek[5] = "Freitag"; daysOfWeek[6]= "Samstag"; return(daysOfWeek[currentDate.getDay()]); } Hack #4: Zeitgebundene Tags ausspielen
  • 36. Auf Stundenbasis, benutzerdefinierte JavaScript-Variable function(){ var userTime = new Date(); var myTimeZone = 1; //ggf. UTC-Zeitzone anpassen var currentHour = (userTime.getTime()%(24*60*60*1000))/(60*60*1000)+ myTimeZone; if (currentHour < 0){ return (currentHour+24); } else { return (currentHour); } } Hack #4: Zeitgebundene Tags ausspielen
  • 37. Hack #4: Zeitgebundene Tags ausspielen
  • 39. Level Fähigkeit dataLayer.push nutzen Dein Vorteil Das ewige Gescrape reduzieren Zuverlässig Informationen in den DL legen
  • 41. Was ist der dataLayer (oder auch „die Datenschicht“)? dataLayer Daten dataLayer Daten Daten Facebook uvm.
  • 42. Hack #5: dataLayer.push nutzen dataLayer = „unsichtbare“ Informationsschicht, auf die der Tag Manager zugreifen kann. = wird vom Tag Manager permanent „abgehört“ = Werte können durch GTM z. B. in dataLayer Variablen eingelesen werden und stehen so für Tags und Trigger zur Verfügung. = gehört zum Tag Manager wie Tags, Trigger und Variablen
  • 43. Hack #5: dataLayer.push nutzen Wer Informationen zuverlässig in den dataLayer bringen möchte, sollte „pushy“ werden, ohne ihn jedes Mal zu initialisieren. Dann „überschreibt“ man ihn nicht, sondern „fügt hinzu“. Daher dataLayer immer leer (und bitte nur ein Mal!!1elf!) initialisieren und Informationen pushen. window.dataLayer = window.dataLayer || []; //Initialisieren (nur 1x oberhalb des Container Code Snippets) window.dataLayer.push({ 'einSchluessel' : 'einWert' }); //später Push ohne Init
  • 44. Hack #5: dataLayer.push nutzen Der dataLayer kann dann z. B. so aussehen: <script> window.dataLayer = window.dataLayer || []; window.dataLayer.push({ 'event': 'registrierung', 'loginStatus': 'logged in', 'eventCategory': 'click' }); </script> Event kann auch als Trigger für Tags dienen! Beliebige wichtige Information
  • 45. Hack #5: dataLayer.push nutzen Anwendungsbeispiele: • Du bist Entwickler und möchtest Informationen für die Marketer bereitstellen, z. B. – Produktinformationen – Kauf-Informationen – Formular-Optionen – Sonstige Metadaten – … • Du bist Wordpress-Anwender und möchtest, dass Informationen für den CTA-Click für den Tag Manager zur Verfügung stehen.
  • 46. Level Fähigkeit Nur die größte Scroll-Tiefe per Event senden Dein Vorteil Überflüssige Informationen reduzieren Hit-Anzahl begrenzen
  • 47. Hack #6: Nur letzte Scroll Position schicken Vor allem bei kurzen Seiten und ohne Trigger-Verzögerung werden Scroll Events sehr schnell hintereinander gefeuert.
  • 48. Hack #6: Nur letzte Scroll Position schicken Lösung: Wir senden nur die letzte Scroll-Position. Dafür -> Browser-Event „beforeunload“ nutzen (Dazu gedacht beim Nutzer nachzufragen, ob die Seite wirklich verlassen werden soll.) „Beforeunload“ reagiert (meist) bei Verlassen der Seite via Klick auf andere Seite oder anderen „unterbrechbaren“ Aktionen. Trigger: Sobald „beforeunload“-Event eintritt Custom HTML Tag, um „beforeunload“ zu bemerken <script> window.addEventListener('beforeunload', function() { window.dataLayer.push({ event: 'beforeunload' }); }); </script>
  • 49. Hack #6: Nur letzte Scroll Position schicken • Wenn Custom HTML sauber installiert, sollte im Preview-Mode bei Exit-Klick folgendes erscheinen: • „beforeunload“-Event als Trigger für unser Scroll Event nutzen (ggf. für andere Events) • „Verlassen“ der Seite ist „unruhiges“ Gefilde … (heißt: Hit wird oft nicht übertragen, bevor der Seitenwechsel stattfindet)
  • 50. Hack #6: Nur letzte Scroll Position schicken Lösung: Wir nutzen ein anderes Transport-Protokoll: Beacon • = neues HTML Feature, das asynchron sendet und damit genau diese Probleme beheben soll. • Wird voraussichtlich zukünftig sogar das bevorzugte Protokoll für GA. • Bewirkt, dass selbst ein Hit Callback noch ankommt. Haken an der Sache: Nicht jeder Browser unterstützt das. Allerdings ist Fallback immer die „normale“ Methode. Haken II: Debugging erschwert, da „Beacon“ bewirkt, dass Payload „unübersichtlich“ übertragen wird.
  • 51. Hack #6: Nur letzte Scroll Position schicken Einbau in GA-Basis-Variable (oder dem konkreten Tag) als „festzulegendes Feld“.
  • 53. Level Fähigkeit Holt sich kopierten Text aus Zwischenablage Dein Vorteil Wissen, was Menschen kopieren Genau triggern
  • 54. Was interessiert Menschen auf deiner Website?
  • 55. Hack #7: Kopierten Text erfassen Benutzerdefiniertes HTML Tag • für markierten Text Event Listener • damit wir wissen, wann kopiert wird dataLayer-Variablen • um alles in den GTM zu holen Irgendwas Sinnvolles, das wir damit machen wollen • z. B. GA Event Zutaten
  • 56. Hack #7: Kopierten Text erfassen Benutzerdefiniertes HTML Tag für markierten Text function getSelectionText() { var text = ''; if (window.getSelection) { text = window.getSelection().toString(); } else if (document.selection && document.selection.type != 'Control') { text = document.selection.createRange().text; } return text; } > http://stackoverflow.com/questions/5379120/get-the-highlighted-selected-text
  • 57. Hack #7: Kopierten Text erfassen Zusätzlich in das HTML Tag einbauen: „Event Listener“ und „dataLayer.push“ für das „Kopieren“ document.addEventListener('copy', function(e){ dataLayer.push({ 'event': 'textKopiert', 'kopierterText': getSelectionText(), 'kopierterTextLaenge': getSelectionText().length }); }); > http://stackoverflow.com/questions/5379120/get-the-highlighted-selected-text
  • 58. Hack #7: Kopierten Text erfassen Mix it up … Die brauchen wir gleich noch
  • 59. Hack #7: Kopierten Text erfassen Dann noch Datenschichtvariablen und Trigger anlegen
  • 60. Hack #7: Kopierten Text erfassen … und verarbeiten
  • 61. Level Fähigkeit RegEx Tabelle statt Suchtabelle nutzen Dein Vorteil flexibler Besser Konsolidierung von Suchtabellen
  • 62. Hack #8: RegEx-Tabelle statt Suchtabelle „Suchtabelle“ • Eingabewert (exakt) und gibt Ausgabewert zurück. • Hilfreich, aber stumpf! Weil kein Spielraum. Es geht flexibler …
  • 63. Hack #8: RegEx-Tabelle statt Suchtabelle „RegEx-Tabelle“ • Eingabewert basiert auf regulären Ausdrücken und gibt Ausgabewert zurück. • Viiiiel Spielraum Zusätzliche Optionen! Darf auch Variable sein (z. B. weitere Suchtabelle)
  • 65. Hack #8: RegEx-Tabelle statt Suchtabelle Hier kannst du RegEx lernen und testen • Super erklärt https://danielfett.de/de/tutorials/tutorial-regulare-ausdrucke/ • https://regexone.com/ (interaktiv) • https://regex101.com/ (u. a. Test-Tool) • https://regexr.com/ (u. a. Test-Tool)
  • 67. Google Analytics braucht für Erfassung der Site Search eigentlich einen Suchparameter Was, wenn wir nur URL-Ordner haben? Hack #9: Site Search ohne Parameter
  • 68. Benutzerdefiniertes JavaScript function() { var regex = /^/suchordner/(.*)/; //mit deinem Suchordner ersetzen var pagePath = '/suchordner/(.*)/‘; //mit deinem Suchordner ersetzen if(regex.test({{Page Path}})) { var searchTerm = regex.exec({{Page Path}})[1]; var NewUri = "/suchordner/?s=" + searchTerm; //mit deinem Suchordner ersetzen return NewUri; } return false; //sorgt dafür, dass der alte Wert nicht überschrieben wird, wenn kein Unterordner von /suchordner/ } Hack #9: Site Search ohne Parameter
  • 69. GA Pageview Tag oder GA-Einstellungen-Variable anpassen Hack #9: Site Search ohne Parameter JS-Variable einbinden
  • 70. Site-Search-Einstellungen in GA wie üblich Hack #9: Site Search ohne Parameter Optional, aber oft sinnvoll Suchparameter
  • 71. Level Fähigkeit Filtert doppelte Transaktionen außerhalb der gleichen Sitzung Dein Vorteil Keine doppelten Transaktionen
  • 72. Hack #10: Doppelte Transaktionen vermeiden E-Commerce Transaktionen Pro Sitzung dürfen mehrere vorkommen … jedoch nicht mit der gleichen Transaktions-ID innerhalb der gleichen Sitzung (GA filtert diese automatisch) … aaaaber: sitzungsübergreifend geht das dennoch …
  • 73. Hack #10: Doppelte Transaktionen vermeiden So sieht das aus … Eigentlich darf da nur „1“ stehen …
  • 74. Hack #10: Doppelte Transaktionen vermeiden Wie verhindern wir doppelte Transaktionen? Nachträglich korrigieren (Rückerstattung) • Nur mit Enhanced E-Commerce • Verzerrt die Berichte (z. B. wenn nicht am gleichen Tag korrigiert wird) Verhindern, dass der Nutzer die Danke-Seite ein weiteres Mal mit Transaktions-Daten aufrufen kann • Transaktionsdaten entfernen bei Refresh, neuer Sitzung, Back-Button, … Serverseitig verhindern, dass die Transaktion doppelt gezählt wird • in der Regel die beste Lösung, aber eben kein GTM-Hack  Mithilfe des GTM verhindern, dass Transaktion doppelt gezählt wird (Lösung hier)
  • 75. Hack #10: Doppelte Transaktionen vermeiden Wie können wir das Zählen doppelter Transaktionen verhindern? • Z. B. mittels Cookie-Check und Zeitstempel (Lösung von von Bounteous unter https://www.bounteous.com/insights/2014/07/07/duplicate-transactions/?ns=l) • Oder Prüfung mittels Custom-Task*-Variable im local Storage, ob die Transaktions-ID vorhanden ist (hier behandelte Lösung von Simo Ahava unter https://www.simoahava.com/analytics/prevent-google-analytics-duplicate- transactions-with-customtask/) *Custom Task: Schon beim Erzeugen des Hits via „send“ werden die Daten des Treffers direkt zu Beginn modifiziert.
  • 76. Hack #10: Doppelte Transaktionen vermeiden Benutzerdefiniertes JavaScript „customtask – transaction deduper“ function() { // customTask Builder by Simo Ahava // // More information about customTask: https://www.simoahava.com/analytics/customtask-the-guide/ // // Change the default values for the settings below. // transactionDeduper: Configuration object for preventing duplicate transactions from being recorded. // https://bit.ly/2AvSZ2Y var transactionDeduper = { keyName: '_transaction_ids', cookieExpiresDays: 365 }; // DO NOT EDIT ANYTHING BELOW THIS LINE var readFromStorage = function(key) { if (!window.Storage) { // From: https://stackoverflow.com/a/15724300/2367037 var value = '; ' + document.cookie; var parts = value.split('; ' + key + '='); if (parts.length === 2) return parts.pop().split(';').shift(); } else { return window.localStorage.getItem(key); } }; var writeToStorage = function(key, value, expireDays) { if (!window.Storage) { var expiresDate = new Date(); expiresDate.setDate(expiresDate.getDate() + expireDays); document.cookie = key + '=' + value + ';expires=' + expiresDate.toUTCString(); } else { window.localStorage.setItem(key, value); } }; var globalSendHitTaskName = '_ga_originalSendHitTask'; return function(customTaskModel) { window[globalSendHitTaskName] = window[globalSendHitTaskName] || customTaskModel.get('sendHitTask'); var tempFieldObject, dimensionIndex, count, ga, tracker, decorateTimer, decorateIframe, iframe; customTaskModel.set('sendHitTask', function(sendHitTaskModel) { var originalSendHitTaskModel = sendHitTaskModel, originalSendHitTask = window[globalSendHitTaskName], canSendHit = true; var hitPayload, hitPayloadParts, param, val, regexI, trackingId, snowplowVendor, snowplowVersion, snowplowPath, request, originalTrackingId, hitType, nonInteraction, d, transactionId, storedIds; try { // transactionDeduper if (typeof transactionDeduper === 'object' && transactionDeduper.hasOwnProperty('keyName') && transactionDeduper.hasOwnProperty('cookieExpiresDays') && typeof sendHitTaskModel.get('&ti') !== 'undefined') { transactionId = sendHitTaskModel.get('&ti'); storedIds = JSON.parse(readFromStorage(transactionDeduper.keyName) || '[]'); if (storedIds.indexOf(transactionId) > -1 && ['transaction', 'item'].indexOf(sendHitTaskModel.get('hitType')) === -1) { canSendHit = false; } else if (storedIds.indexOf(transactionId) === -1) { storedIds.push(transactionId); writeToStorage(transactionDeduper.keyName, JSON.stringify(storedIds), transactionDeduper.cookieExpiresDays); } } // /transactionDeduper if (canSendHit) { originalSendHitTask(sendHitTaskModel); } } catch(e) { originalSendHitTask(originalSendHitTaskModel); } }); }; }
  • 77. Hack #10: Doppelte Transaktionen vermeiden Ein paar Variablen … Datenschichtvariable 1st Party Cookie Custom JavaScript
  • 78. Hack #10: Doppelte Transaktionen vermeiden … und ein Blocking-Trigger – sowie die Verwendung im Tag Blocking-Trigger Verwendung des Blocking-Triggers im Tag
  • 79. Level Fähigkeit Dokumentation des GTM Containers Dein Vorteil Nicht alles per Hand abschreiben
  • 80. Du vergisst sonst sowieso alles … Und noch schlimmer: Niemand anderer blickt das noch. Du dokumentierst doch, oder?
  • 81. Hack #11: Dokumentation leicht gemacht Lass dir von Tools helfen. Export des jeweiligen GTM-Containers Schreib‘s alles auf … oder -> GTM Tools von Simo Ahava (Chrome Plugin, nicht das andere  )
  • 82. GTM Tools for Spreadsheets Hack #11: Dokumentation leicht gemacht
  • 83. Hack #11: Dokumentation leicht gemacht
  • 84. Hack #11: Dokumentation leicht gemacht
  • 85. Hack #11: Dokumentation leicht gemacht
  • 86. Hack #11: Dokumentation leicht gemacht
  • 87. Hack #11: Dokumentation leicht gemacht • Einträge in „Notes“ machen – Wer hat was angefordert? – Wer hat umgesetzt? – Was war der Zweck? • Upload:
  • 89. Level Fähigkeit „Rohdaten“ nachbauen. Wir tun so als wäre GA = GA360 Dein Vorteil Wir können die Daten besser weiterverarbeiten Debugging wird leichter
  • 90. Die Herausforderung: GA (kostenlos) aggregiert Daten für uns Hack #12: „Rohdaten“ nachbauen Die Herausforderung: GA (kostenlos) aggrogiert Daten für uns
  • 91. Hack #12: „Rohdaten“ nachbauen vs
  • 93. Hack #12: „Rohdaten“ nachbauen Warum Rohdaten? • In welcher Reihenfolge fanden die Hits statt? • Welche werden welcher Session und welchem Client zugerechnet? • Scope-übergreifende Berichte ermöglichen. Daher: Manchmal brauchen wir sie einzeln und UNaggregiert We need RAW …
  • 94. Hack #12: „Rohdaten“ nachbauen „Rohdaten“ bedeutet, dass wir ein paar Dinge brauchen Session ID Zeitstempel Client ID Hit Type Zutaten
  • 95. Hack #12: „Rohdaten“ nachbauen Zutaten In der GA Property „benutzerdefinierte Dimensionen“ anlegen Auf Scope achten!
  • 96. Hack #12: „Rohdaten“ nachbauen Und dann rein damit … ClientID Custom-JavaScript-Variable anlegen (Indexnummer!). Diese im GA-Tag oder den GA-Einstellungen per customTask nutzen cJS – clientIdToDimension1
  • 97. Hack #12: „Rohdaten“ nachbauen Und dann rein damit … Hit Type Custom-JavaScript-Variable anlegen (Indexnummer!). Diese im GA-Tag oder den GA-Einstellungen per customTask nutzen.
  • 98. Hack #12: „Rohdaten“ nachbauen Short break: Custom Task darf nur 1x je GA Tag rein! Also konsolidieren und nur 1x in GA Tags! Siehe nächste Seite. Danke an Simo Ahava für den Custom Task Builder! https://www.simoahava.com/tools/customtask-builder/#the-customtask-builder-tool Nicht ganz trivial für Nicht-Developer …
  • 99. function() { var clientIdIndex = 1; var hitTypeIndex = 6; // DO NOT EDIT ANYTHING BELOW THIS LINE var readFromStorage = function (key) { if (!window.Storage) { // From: https://stackoverflow.com/a/15724300/2367 037 var value = '; ' + document.cookie; var parts = value.split('; ' + key + '='); if (parts.length === 2) { return parts.pop().split(';').shift(); } } else { return window.localStorage.getItem(key); } }; var writeToStorage = function (key, value, expireDays) { if (!window.Storage) { var expiresDate = new Date(); expiresDate.setDate(expiresDate.getDate() + expireDays); document.cookie = key + '=' + value + ';expires=' + expiresDate.toUTCString(); } else { window.localStorage.setItem(key, value); } }; var globalSendHitTaskName = '_ga_originalSendHitTask'; return function (customTaskModel) { window[globalSendHitTaskName] = window[globalSendHitTaskName] || customTaskModel.get('sendHitTask'); // clientIdIndex if (typeof clientIdIndex === 'number') { customTaskModel.set('dimension' + clientIdIndex, customTaskModel.get('clientId')); } // /clientIdIndex // hitTypeIndex if (typeof hitTypeIndex === 'number') { customTaskModel.set('dimension' + hitTypeIndex, customTaskModel.get('hitType')); } // /hitTypeIndex customTaskModel.set('sendHitTask', function (sendHitTaskModel) { var originalSendHitTaskModel = sendHitTaskModel, originalSendHitTask = window[globalSendHitTaskName], canSendHit = true; try { if (canSendHit) { originalSendHitTask(sendHitTaskModel); } } catch(err) { originalSendHitTask(originalSendHitTaskMod el); } }); }; }
  • 100. Hack #12: „Rohdaten“ nachbauen Und dann rein damit … SessionID Custom-JavaScript-Variable anlegen (Zufallszahl setzen) Diese im GA-Tag oder den GA-Einstellungen nutzen
  • 101. Hack #12: „Rohdaten“ nachbauen Und dann rein damit … Zeitstempel Custom-JavaScript-Variable anlegen Diese im GA-Tag oder den GA-Einstellungen nutzen
  • 102. Hack #12: „Rohdaten“ nachbauen Und wofür der ganze Stress? Dafür: Oder um die Daten anderweitig zu nutzen: Segmente, Berichte, Plakate, …
  • 103. Level Fähigkeit Sendet GA Hits an mehr als eine Property Dein Vorteil Du sparst dir das Anlegen mehrerer Tags, die das Gleiche tun. Dein Tracking wird flexibler
  • 104. Hack #13: Hits an mehrere Propertys senden Benutzerdefiniertes JavaScript (Name hier: „cJS – customTask hit duplicator“) function() { // Replace newTrackingId value with the UA property to which you want to duplicate this tag var newTrackingId = 'UA-XXXXX-Y‘; var globalSendTaskName = '_' + newTrackingId + '_originalSendTask‘; return function(customModel) { window[globalSendTaskName] = window[globalSendTaskName] || customModel.get('sendHitTask‘); customModel.set('sendHitTask', function(sendModel) { var hitPayload = sendModel.get('hitPayload‘); var trackingId = new RegExp(sendModel.get('trackingId'), 'gi‘); window[globalSendTaskName](sendModel); sendModel.set('hitPayload', hitPayload.replace(trackingId, newTrackingId), true); window[globalSendTaskName](sendModel); }); }; } > https://www.simoahava.com/gtm-tips/send-google-analytics-tag-multiple-properties/
  • 105. Hack #13: Hits an mehrere Propertys senden Custom Task zu Google Analytics Einstellungen oder zu entsprechenden Hits hinzufügen Nicht vergessen: Custom Task nur 1x je Tag ausführen! Ggf. kombinieren.
  • 106. Hacks: Tooltime Anwendungsgebiet Fähigkeit diverse Dein Vorteil Höher, schneller, weiter
  • 107. Hack #14: Tooltime: Injection Level Fähigkeit Tag Manager ohne Installation nutzen Dein Vorteil Du musst nicht auf die IT warten Du kannst Gas geben
  • 108. Hack #14: Tooltime: Injection „Tag Manager Injector“ „Analytics Pros dataLayer Inspector+“ Chrome Plugins
  • 109. Level Fähigkeit GTM Copy & Paste Dein Vorteil Elemente des GTM kopieren und einfügen Du sparst dir Export und Import eines Containers Du musst den Tag Manager nicht verlassen
  • 110. Hack #15: Tooltime: Copy & Paste Chrome Plugin
  • 111. Hack #15: Tooltime: Copy & Paste Beachten Wenn Tag einen Trigger beinhaltet, sollte dieser ggf. mitkopiert werden. Ansonsten wird der Trigger automatisch entfernt.
  • 112. Level Fähigkeit GTM Spy Dein Vorteil Tag Manager Container „ausspionieren“ Verstehen, wie andere es machen Gute Lösungen nachbauen
  • 113. Hack #16: Tooltime: GTM Spy https://gtmspy.com/ ©Dustin Recko, um veröffentlichte Container auszulesen. Tags, Trigger und Variablen können so eingesehen werden.
  • 115. BABO-Hack: Nutze den GTM Anwendungsgebiet GTM Allgemein Fähigkeit Nutze den GTM Dein Vorteil Er macht dich schneller, … … flexibler … … besser.
  • 117. © 121WATT Hörbuch “Dein Weg zum Webanalysten” • Deine Abkürzung zum beruflichen Erfolg • Über 5 Stunden (!) Inhalt PLUS Bonusmaterial • Wie du Webanalyst wirst und wo dein Startpunkt ist • Wie du Unternehmen mit Webanalyse weiterbringst • Zugang zu einer geschlossenen Facebook-Gruppe zum Austausch
  • 119. Biddeschön! @brunsmaik@maikbrunsmetrika@maikbruns Maik Bruns Analytics Professional undCoach maik.bruns@metrika.de Trag‘ dich ein: https://go.metrika.de /GMPCON19 inkl. Container mit Code und Co. FOLLOW ME FOR STORIES, LIVESTREAMS, INSIGHTS