Den Google Tag Manager kannst du an allen Ecken und Kanten noch besser machen und ausnutzen, um dein Online Marketing zu verbessern. Im Workshop gibt's alltags- und praxistaugliche Hacks für dein Lieblingstool.
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
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
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
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
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“.
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
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
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
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
90. Die Herausforderung:
GA (kostenlos) aggregiert Daten für uns
Hack #12: „Rohdaten“ nachbauen
Die Herausforderung:
GA (kostenlos) aggrogiert Daten für uns
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.
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
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
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