Google Tag Manager advanced - interne Website-Besucher in Google Analytics datenschutzkonform nach IP-Adresse filtern

Ronald Schmidt | Technologie

Online-Marketing-Abteilungen kennen das Problem: Google Analytics ist eingerichtet und wir möchten die Wirkung unseres Marketings anhand der nun zur Verfügung stehenden Zahlen ermitteln. Doch greifen nicht nur die potenziellen Leads auf die Seite zu, sondern auch Mitarbeiter des eigenen Unternehmens oder diverser Agenturen, die mit der Website zu tun haben. Dies kann, je nach Menge der Mitarbeiter und Agenturen, die Zahlen ziemlich verfälschen.

Eigentlich bietet Google Analytics hier bereits die Option einen IP-Filter einzurichten. Wenn man Google Analytics jedoch datenschutzkonform nutzen möchte, funktioniert diese Methode natürlich nicht. Doch es gibt eine Möglichkeit interne Nutzer datenschutzkonform zu filtern: Benutzerdefinierte Dimensionen.

Nützliches Wissen vorab

1. Google Analytics Benutzerdefinierte Dimension

In Google Analytics besteht jeder Bericht aus Dimensionen und Messwerten. Eine Dimension kann z.B. das Land oder die Stadt sein, aus der die Zugriffe kommen. Die zugehörigen Messwerte können die Anzahl der Sitzungen oder Seitenaufrufe pro Sitzung sein. Mit Benutzerdefinierten Dimensionen kann man Daten analysieren, die von Google Analytics nicht automatisch erfasst werden. Wie zum Beispiel unsere internen Websitezugriffe. Standardisierte und Benutzerdefinierte Dimensionen haben jeweils einen bestimmten Umfang: die Nutzer-, Sitzungs- oder Trefferebene.

  • Trefferebene: der Messwert wird nur auf den einzelnen Treffer angewendet.
  • Sitzungsebene: der Messwert wird auf alle Treffer einer Sitzung angewendet.
  • Nutzerebene: der Messwert der aktuellen Sitzung wird auf künftige Sitzungen dieses Nutzers angewendet.

Die Treffer einer standardisierten Dimension werden mit einem entsprechenden Tracking-Code versehen und stehen automatisch in Google Analytics Berichten zur Verfügung. Bei Benutzerdefinierten Dimensionen muss der Tracking-Code manuell jedem Treffer hinzugefügt werden. Ein weiteres Google-Tool bietet hier sehr gute Unterstützung – der Google Tag Manager. Mit seiner Hilfe ist es möglich, die Treffer mit Tracking-Codes zu versehen, ohne auf den Quellcode zugreifen zu müssen.

2. Exkurs Google Tag Manager (GTM)

Der Google Tag Manager (GTM) ist ein kostenloses Tag-Management-Tool, mit dem Code-Schnipsel (Tracking-Codes) von Google Analytics oder Drittanbietern auf einer Web-Oberfläche verwaltet werden können. 

Der GTM stellt dafür sogenannte Container zur Verfügung. Diese Container repräsentieren eine in sich geschlossene Einheit, wie zum Beispiel eine Website oder eine App. Der Aufbau der Container besteht aus Tags, Triggern, Variablen und zugehörigen Konfigurationen. Tags sind Code-Snippets, die in eine Website eingebunden werden und Tracking-Informationen an Dritte senden. Tag Manager Variablen kommen in Tags und Triggern zum Einsatz. In Triggern definieren Variablen, wann ein bestimmtes Tag ausgelöst wird.

Durch die Verknüpfung mit Google Analytics kann man mit dem GTM auch komplexere Tracking-Aufgaben, wie zum Beispiel das Event-Tracking einrichten. Mit Event-Tracking kann man detailliert nachverfolgen, mit welchen einzelnen Elementen die Besucher einer Website regelmäßig interagieren und welche Elemente auf weniger Interesse stoßen. Ein Event ist die Bezeichnung einer Aktion, die man mit dem entsprechenden Tag erfassen möchte. Solche Aktionen können ein Klick auf den Kaufen-Button oder das Scrollen auf der Website bis zu einem definierten Ankerpunkt sein. Das Tag ist mit einem Trigger verknüpft, der über eine Variable definiert, unter welcher Bedingung das Tag ausgelöst werden soll. Der GTM bietet viele eigene Variablen und Möglichkeiten, diese Tags auszulösen. Darüber hinaus kann man benutzerdefinierte Variablen anlegen. Abgerundet wird das Ganze durch eine integrierte Versionskontrolle und Debug-Umgebung.

Der Google Tag Manager ist, wie auch Google Analytics, in der Gesamtheit der Funktionalitäten nicht ganz trivial, weshalb es durchaus Sinn machen kann, auf professionelle Hilfe bei der Einrichtung komplexer Tracking-Aufgaben zurückzugreifen.

Aber nun zurück zu unserer eigentlichen Frage, wie unterstützt uns der Google Tag Manager, unsere internen Nutzer zu erkennen und die Daten an Google Analytics zu senden, ohne die DSGVO zu unterlaufen?

Interne Website-Besucher in Google Analytics datenschutzkonform filtern - Step by Step

Im Folgenden möchte ich einen Weg zeigen, wie wir anhand einer Benutzerdefinierten Dimension unsere internen Website-Besucher in Google Analytics datenschutzkonform filtern können. Unsere verschiedenen Nutzerarten teilen wir in Intern, Extern und Agentur ein. Die zugehörigen Tracking-Codes der Nutzer können wir mit Hilfe des Google Tag Managers an Google Analytics übermitteln.

Step 1: Benutzerdefinierte Dimension in Google Analytics anlegen

Dazu gehen wir in unserem Google Analytics Konto auf Verwaltung > Property > Benutzerdefinierte Definitionen > und legen eine neue Benutzerdefinierte Dimension mit dem Namen Interne Nutzer an. Wir wählen den Umfang Nutzer, damit Messwerte der aktuellen Sitzung auch auf künftige Sitzungen dieses Nutzers angewendet werden. Dann setzen wir noch unser Häkchen bei aktiv, denn nur aktive Benutzerdefinierte Dimensionen speichern die nötigen Daten.

Screenshot: Anlegen der Benutzerdefinierten Dimension in Google Analytics

Step 2: Benutzerdefinierte Dimension im Tag Manager verwenden

Zunächst tragen wir im Google Tag Manager unter Erweiterte Einstellungen > Benutzerdefinierte Dimension die Dimensionsnummer in das Feld “Index“ ein. Die Dimensionsnummer der erstellten Benutzerdefinierten Dimension kann man jederzeit bei Google Analytics nachschlagen.

Screenshot: Anlegen der Benutzerdefinierten Dimension in Google Analytics

Den eigentlichen Dimensionswert, also die GTM-Variable für Intern, Extern oder Agentur müssen wir jetzt noch erstellen, um diesen dann in das Feld “Value“ oder “Dimensionswert“ eintragen zu können. Und damit beginnt jetzt die eigentliche Arbeit.

Screenshot: Benutzerdefinierte Dimension im Google Tag Manager verwenden

Step 3: GTM-Variable einrichten

Damit wir den aktuellen Nutzer in eine der Kategorien Intern, Extern oder Agentur einteilen können, benötigen wir drei Dinge:

  1. Die IP-Adresslisten für zwei verschiedene Nutzerarten (Intern und Agentur) – Externe Nutzer sind alle, die nicht zu diesen Listen passen.
  2. Die IP-Adresse des aktuellen Nutzers.
  3. Eine Funktion (benutzerdefinierte GTM-Variable), welche die Nutzerart des aktuellen Nutzers auf Basis von 1 und 2 zurückgibt.

Kurz zur Erklärung: Auch wenn wir hier mit vollständigen IP-Adressen arbeiten, ist das Verfahren trotzdem datenschutzkonform, da wir die Adressen verarbeiten, bevor sie anonymisiert werden.

1 und 3 können wir im Google Tag Manager sehr gut in einer Variablen vereinen. Dazu legen wir eine benutzerdefinierte Variable in JavaScript an. Diese richten wir so ein, dass sie uns mit jedem übermittelten Tracking-Code die Information über die Nutzerart zurückgibt. Wir legen zunächst eine benutzerdefinierte Variable mit dem Namen userType an und wählen als Art, benutzerdefiniertes JavaScript. Die IP-Adressen sind hier rein willkürlich gewählt. Dieser Variable fügen wir folgendes JavaScript hinzu.

Screenshot: Erstellung der GTM Variable
Screenshot: Erstellung der GTM Variable

CODE:

function() {

// Liste für die internen IPs
var ipListInternal = [
	   
      /^99\.99\.99\.99$/,
      /^88\.88\.88\.88$/,
      /^77\.77\.77\.77$/

  	  ];
	
// Abgleich der IP des Nutzers mit der Liste der internen IPs
// Bei Übereinstimmung Rückgabe des Wertes „Intern“
 	for (var i = 0; i < ipListInternal.length; i++){
      		if (ipListInternal[i].test({{ clientIPAddress }}) == true){
  			return "Intern";
    		}
    	}

// Liste für die Agentur IPs
var ipListAgencies = [
	   
      /^66\.66\.66\.66$/,
      /^55\.55\.55\.55$/,
      /^44\.44\.44\.44$/

    	];

// Abgleich der IP des Nutzers mit der Liste der Agentur IPs
// Bei Übereinstimmung Rückgabe des Wertes „Agentur“
for (var i = 0; i < ipListAgencies.length; i++){
      		if (ipListAgencies[i].test({{ clientIPAddress }}) == true){
  			return "Agentur";
    		}
    	}

// Bei keiner Übereinstimmung der IP mit einer der Listen - Rückgabe des Wertes „Extern“
return "Extern";
    
}
Zum besseren Verständnis werde ich kurz die einzelnen Bestandteile erläutern:


CODE:

var ipListInternal = [
	   
      /^99\.99\.99\.99$/,
      /^88\.88\.88\.88$/,
      /^77\.77\.77\.77$/

];
Dies ist eine der IP-Listen, mit der die IP-Adresse des aktuellen Nutzers abgeglichen werden soll. Den Namen der Liste (hier ipListInternal) können wir frei wählen. Die Liste kann beliebig viele Einträge umfassen, welche wir durch Komma getrennt eintragen müssen. Die Einträge selbst müssen dem RegEx Format entsprechen. /^ bezeichnet den Beginn des regulären Ausdrucks und $/ das Ende. Da der Punkt ein Steuerzeichen im regulären Ausdruck ist, müssen wir diesen mit einem Backslash als konkreten Teil der IP-Adresse kennzeichnen.

Wir können hier nun alle IP-Adressen, die interne Nutzer kennzeichnen sollen, hinzufügen. Für die Ausgabe von Adressbereichen nutzen wir z.B. dieses Tool oder schreiben diese nach dem kleinen RegEx Exkurs am Ende dieses Artikels einfach selbst.

CODE:

for (var i = 0; i < ipListInternal.length; i++){
      	if (ipListInternal[i].test({{ clientIPAddress }}) == true){
  		return "Intern";
}	
}
Für jede Liste, die wir im Code hinzugefügt haben, um eine andere Nutzerart zu kennzeichnen, müssen wir die obige Funktion hinzufügen. Diese vergleicht jeden Eintrag der Liste mit dem Wert der Google Tag Manager Variable clientIPAddress. Wichtig ist, dass wir den korrekten Namen der zu nutzenden Liste an beiden stellen des Codes einsetzen. Der Wert hinter return beschreibt den Rückgabewert der Funktion, sollte die IP-Adresse des Nutzers einem Eintrag in der Liste entsprechen. Dieser wird als Dimensionswert der Benutzerdefinierten Dimension übergeben. Für die Liste mit den Einträgen der internen IP-Adressen wird hier Intern zurückgegeben. Extern wird am Ende der gesamten Funktion zurückgegeben, wenn die IP-Adresse des Nutzers mit keiner Liste eine Übereinstimmung hatte.

Nun fehlt noch ein letztes Teil in unserem Puzzle: die IP-Adresse des aktuellen Nutzers.

Step 5: IP-Adresse des aktuellen Nutzers ermitteln

Im Code oben wird die Google Tag Manager Variable clientIPAddress genutzt, diese muss jetzt noch die IP-Adresse des aktuellen Nutzers als Wert zurückgeben. Um das zu bewerkstelligen, gibt es zwei Möglichkeiten.

  1. Die Nutzung eines geoIP-Service.
  2. Serverseitiges ermitteln der IP-Adresse und automatische Ausgabe im Code.


IP-Adresse über geoIP-Service ermitteln

Um die IP-Adresse des aktuellen Nutzers über einen geoIP-Service zu ermitteln, müssen wir keine Änderungen am Quellcode vornehmen, sondern jeden Aufruf einer Website an den Service senden. Das ist voraussichtlich mit Kosten für den Service verbunden. Es gibt zwar ein paar kostenlose Services, diese lassen aber nur eine begrenzte Anzahl an Anfragen in einem bestimmten Zeitraum zu.

Wir müssten für diese Variante eine weitere benutzerdefinierte Variable im Google Tag Manager erstellen. In diesem müssen wir per JavaScript eine API-Anfrage nach der IP-Adresse durchführen. Der Rückgabewert ist dann die IP-Adresse, welche uns der Service mitteilt.

CODE:

function(){
	// Abruf der IP-Adresse über die API des geoIP Service
	// Rückgabe der ermittelten IP-Adresse
		return IPfromService
}

Da wir bei webit! in Projekten in der Regel von der zweiten Möglichkeit Gebrauch machen, habe ich auch in unserem beschrieben Case die serverseitige Ermittlung der IP-Adresse angewendet.

IP-Adresse serverseitig ermitteln

Bei der serverseitigen Ermittlung wird die IP-Adresse des aktuellen Nutzers beim Web-Server angefragt und in den Quellcode einer Website ausgeliefert. Das hat den Vorteil, dass wir keine kostenpflichtigen Drittservices in Anspruch nehmen müssen. Am einfachsten ist es, wenn die IP-Adresse im HTML-Quellcode als JavaScript Variable ausgegeben wird. Diese Ausgabe sollte vor dem Script des Google Tag Managers geschehen, damit dieser die Variable und somit IP-Adresse nutzen kann. Dazu erstellen wir vorher im GTM eine benutzerdefinierte Variable des Typs JavaScript (clientIPAdress) und legen dort die im Quellcode gespeicherte Variable fest.

Step 6: Geschafft! Variable als Dimensionswert eintragen und veröffentlichen

Nach all diesen Schritten haben wir endlich eine Google Tag Manager Variable generiert, die uns die Art des Nutzers anhand seiner IP-Adresse und der von uns festgelegten IP-Listen zurückgibt. Diese können wir jetzt als Dimensionswert in die Benutzerdefinierte Dimension am Seitenaufruf-Tag oder der Google Analytics Variable setzen. Dazu setzen wir in das Feld für den Wert den Namen der Variable umgeben von {{ }}: {{ userType }}

Screenshot: Vollständige Benutzerdefinierte Dimension

Mit Hilfe des Debug Tools der Vorschauansicht des Google Tag Managers können wir jetzt die korrekte Funktionsweise prüfen. Dazu sollte beim Seitenaufruf die Benutzerdefinierte Dimension mit dem korrekten Wert übergeben werden (wahrscheinlich „Intern“). Im unteren Beispiel wird die Dimension mit dem Index 1 auf true gesetzt. Dies bedeutet in diesem Beispiel, dass ein interner Nutzer die Seite aufruft (Ich).

Jetzt können wir die Änderungen veröffentlichen und die Benutzerdefinierte Dimension in Google Analytics nutzen. Das heißt, wir können unsere internen Nutzer per Filter aus bestimmten Datenansichten komplett ausschließen oder wir nutzen z.B. die Segmente, um die angezeigten Daten direkt zu filtern. Wir haben jetzt also alle Möglichkeiten unsere Daten korrekt zu analysieren – z.B. auch das Surfverhalten unserer Mitarbeiter auf unserer Unternehmens-Website.

Zum Schluss: der versprochene RegEx Exkurs

RegEx ist die Abkürzung für regular expression – zu Deutsch: regulärer Ausdruck. Solch ein regulärer Ausdruck ist eine Zeichenkette, die der Beschreibung einer Menge von Zeichenketten mit Hilfe von Steuerzeichen dient. In unserem Anwendungsfall kann man mit RegEx eine Zeichenkette erstellen, die alle IP-Adressen für einen Bereich abbildet.

Der Ausdruck /^192\.168\.1\.1$/ bildet genau eine Zeichenkette und somit eine IP-Adresse ab: 192.168.1.1 /^ und $/ beschreiben den Anfang und das Ende der Zeichenkette des regulären Ausdrucks. Da der Punkt ein Steuerzeichen in einem regulären Ausdruck darstellen würde, muss man diesem mitteilen, dass der Punkt Teil der Zeichenkette ist. Das macht man mit \.

Doch wie kann man jetzt die Zahlenbereiche abbilden?

Für ein einzelnes Zeichen kann man einen Zahlenbereich in folgender Form abbilden: ([0-9])
Dies bedeutet, dort können alle Zeichen von 0 bis 9 stehen. Schreibt man also ([2-3][0-9]) bildet man eine zweistellige Zeichenkette ab, die an erster Stelle die Zahlen 2 bis 3 und an zweiter Stelle die Zahlen 0 bis 9 haben kann – also den Zahlenbereich 20 bis 39.

Möchte man einen Bereich abbilden, der 1 bis 19 umfasst, muss man im regulären Ausdruck deutlich machen, dass man Zeichenketten von 1 bis 9 oder 1 und 0 bis 9 sucht. Das oder wird dabei als | dargestellt. Das Ergebnis ist dann also: ([1-9]|1[1-9]). Um den gesamten Bereich von 1 bis 255 abzubilden, muss man im regulären Ausdruck verdeutlichen, dass man Zahlen von 1 bis 9 oder 10 bis 99 oder 100 bis 199 oder 200 bis 255 sucht.

  • 1 bis 9: [1-9]
  • 10 bis 99: [1-9][0-9]
  • 100 bis 99: 1[0-9][0-9]
  • 200 bis 255: 2([0-4][0-9]|5[0-5]) (eine 2 mit 00 bis 49 oder 50 bis 55)

Zusammen also: ([1-9]|[1-9][0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))

Ein kompletter regulärer Ausdruck für den Adressbereich 192.168.1.1 bis 192.168.1.255 sieht dann wie folgt aus: /^192\.168\.1\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$/

Der ganze Ausdruck kann mit dem Regextester getestet werden.

Dieser kleine Exkurs hilft euch hoffentlich die IP-Adressbereiche eures Unternehmens abzubilden bzw. zu verstehen, was in einem solchen regulären Ausdruck überhaupt passiert. Mit Hilfe dieses Tools können wir ja auch ohne große geistige Anstrengung die korrekten regulären Ausdrücke für IP-Adressbereiche erzeugen.