Datenschutzkonform arbeiten

AnonymizeIP: So baust du es in dein Google Analytics ein

Mit und ohne Google Tag Manager

 

by Maik Bruns

Datenschutzkonform arbeiten

AnonymizeIP: So baust du es in dein Google Analytics ein

Mit und ohne Google Tag Manager

 

by Maik Bruns

by Maik Bruns

Wer in Deutschland datenschutzkonform mit Google Analytics arbeiten will, kommt nicht drumherum: Die IP-Adresse des Besuchers muss anonymisiert werden. Das geht mithilfe von „anonymizeIP“. Wie das ins Tracking eingebaut wird, mit oder ohne den Google Tag Manager, erklärt dieser kurze Beitrag.

Das findest du hier

  1. Was steckt hinter „anonymizeIP“
  2. Was passiert bei „anonymizeIP“?
  3. Anonymisieren mit Universal Analytics (analytics.js) (Hard Coded oder via Google Tag Manager)
  4. Anonymisieren mit Global Site Tag (gtag.js) (Hard Coded oder via Google Tag Manager)
  5. Anonymisieren mit Classic Analytics (ga.js) (Hard Coded oder via Google Tag Manager)

Was steckt hinter „anonymizeIP“?

Google hat durch die deutschen Datenschutzbehörden einige Regeln auferlegt bekommen, die aus Sicht der Behörden dafür sorgen, dass Google Analytics in Deutschland rechtskonform genutzt werden kann. Dazu gehören folgende Punkte:

  1. Vertrag zur Auftragsdatenverarbeitung muss mit Google geschlossen werden (§ 11 BDSG – Vertrag)
  2. das Widerspruchsrecht der Betroffenen (also der Besucher der Seite) muss eingeräumt werden
  3. eine angepasste Datenschutzerklärung ist erforderlich
  4. ggf. die Löschung von Altdaten nötig
  5. und vor allem: die Anonymisierung der IP-Adressen muss erfolgen

Der letzte Punkt dient dabei dazu, die Eindeutigkeit einer IP-Adresse zu verändern, so dass ein einzelner Nutzer nicht mehr „eindeutig“ erkennbar ist.

Als PDF zum Download
Du willst den Beitrag als PDF haben? Lade ihn dir hier herunter.

Was passiert bei „anonymizeIP“?

Im Grunde genommen ist es einfach. Um die IP-Adresse zu anonymisieren, wird einfach das letzte Oktett der IP-Adresse gelöscht. Genauer gesagt wird dort anstelle der eigentlich vorhandenen Zahl einfach eine „0“ gesetzt.

anonymizeIP im Einsatz

So funktioniert anonymizeIP

Und schon ist das Problem erledigt. Nachteil: Nun können wir tatsächlich nicht mehr die einzelnen Nutzer anhand ihrer IP-Adresse auseinanderhalten. Allerdings muss ich sagen, dass man davon in der Praxis nichts bemerkt. Vorteil: Wir bekommen keine Probleme mit dem Datenschutz mehr. 🙂

Wie wird das Ganze denn nun eingebaut? Denn per se ist diese Funktion im Google Analytics Tracking Code natürlich noch nicht enthalten. Denn anders als in Deutschland ist die Anonymisierung nicht in allen Ländern nötig.

Zunächst einmal unterscheiden wir zwischen dem (Universal Analytics) Trackingcode, ferner dem seit 2017 in der Beta befindlichen Global Site Tag (gtag.js) und dem alten (Classic Analytics). Und dort lässt sich jeweils noch unterscheiden, ob der Tracking Code mit dem Tag Manager ausgespielt wird oder ob er „hard coded“ eingebettet ist.

Anonymisieren mit Universal Analytics (analytics.js)

Hard coded Universal Analytics Code

Ist der Universal Analytics Code „hart“ im Quellcode eingebettet worden, ist in der Regel im Quellcode so etwas zu sehen:

<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-XXXXXXXX-X', 'auto');
ga('require', 'displayfeatures');
ga('require', 'linkid', 'linkid.js');
ga('send', 'pageview');
</script>

Um die anonymizeIP-Funktion für alle Hits zu nutzen, die auf der Seite stattfinden, muss nun eine Zeile ergänzt werden:

ga('set', 'anonymizeIp', true);

Und zwar im Code noch VOR dem Senden des Pageviews, etwa so:

<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-XXXXXXXX-X', 'auto');
ga('require', 'displayfeatures');
ga('require', 'linkid', 'linkid.js');
ga('set', 'anonymizeIp', true);
ga('send', 'pageview');
</script>

Es gibt neben der „kompletten“ Möglichkeit, wie oben beschrieben, auch noch die Möglichkeit, nur einzelne Hits zu anonymisieren. Dafür kann anonymizeIP einfach an den entsprechenden Hit gehängt werden, etwa so:

ga('send', 'pageview', {
'anonymizeIp': true
});

Doch da vor allem in Deutschland ohnehin alles anonymisiert werden muss, ist das eher akademisch als praktisch.

anonymizeIP im Universal Analytics Code mit Google Tag Manager und Settings-Variable

Wer seinen Universal Analytics Tracking Code mit dem Google Tag Manager eingebunden hat, hat seit Kurzem gleich zwei Möglichkeiten, die anonymizeIP-Funktion einzubinden. Entweder in jedem einzelnen Google-Analytics-Tag oder mithilfe der neuen Google-Analytics-Settings-Variablen. Ich beschreibe hier mal, wie das mit der neuen Settings-Variablen funktioniert.

Neue Variable im Google Tag Manager anlegen

Neue Variable im Google Tag Manager anlegen

Variablentyp "Google Analytics Einstellungen" im Google Tag Manager wählen

Variablentyp „Google Analytics Einstellungen“ wählen

Google Analytics Einstellungen im Google Tag Manager

Ggf. Basis-Einstellungen wie Tracking ID vornehmen und unter „Festzulegende Felder“ „Feld hinzufügen“ drücken

Eintrag anonymizeIP und dazugehöriger Wert

Dort händisch „anonymizeIP“ unter Feldname eintragen und „true“ als Wert definieren.

Wenn das erledigt ist, muss nur noch bei allen Pageview-Tags ergänzt werden, dass auf die Google-Analytics-Basis-Einstellungen zurückgegriffen werden soll. Das funktioniert über ein Dropdown im  Tag.

Standard-Pageview-Tag in Google Tag Manager mit gewähltem Basis-Setting

Die Basis-Einstellungen im Pageview-Tag auswählen

 

Alternativ dazu kann man natürlich auch in jedes Google-Analytics-Tag einzeln das anonymizeIP-Feld eintragen – sofern es mehrere gibt. Das geht dann im Prinzip genau so, aber statt in einer Variablen dann eben in jedem einzelnen Tag. Auch dort findet sich unter „Festzulegende Felder“ die Möglichkeit „anonymizeIP“ und dessen Wert „true“ zu ergänzen.

Nach der Änderung nicht vergessen: Testen, ob der Tag Manager alles richtig ausspielt und dann Änderungen veröffentlichen.

[UPDATE] Anonymisieren mit Global Site Tag (gtag.js)

Für diejenigen von euch, die bereits das seit September 2017 in der Beta befindliche neue Global Site Tag (gtag.js) nutzen, ist das Prinzip sehr ähnlich.

[Randnotiz: Zum Stand Oktober 2017 muss niemand plötzlich auf das neue Global Site Tag umstellen. Es bedient mit einer neuen Syntax und vielen codeseitigen Vereinfachungen nach wie vor das Universal Analytics. Wer dennoch umstellen möchte oder muss (weil Google Analytics primär nur noch gtag.js-Trackingcode vorgibt), findet hier, wie es geht. Allerdings werden auf Dauer weitere Google Analytics Features wohl im Wesentlichen für das Global Site Tag gtag.js entwickelt.]

Hard coded Global Site Tag

Bei gtag.js sieht der Standard-Code so aus:

<script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXX-X"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-XXXXXXXX-X');
</script>

Um die anonymizeIP-Funktion für alle Hits zu nutzen, die auf der Seite stattfinden, muss nun eine Zeile ergänzt werden:

gtag('config', 'UA-XXXXXXXX-X', { 'anonymize_ip': true });

Und im Gesamtkunstwerk sieht der Code dann so aus:

<script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXX-X"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-XXXXXXXX-X', { 'anonymize_ip': true });
</script>

Es gibt neben der „kompletten“ Möglichkeit, wie oben beschrieben, auch noch die Möglichkeit, nur einzelne Hits zu anonymisieren. Dafür kann anonymizeIP einfach an den entsprechenden Hit gehängt werden, etwa so:

gtag('event', 'your_event', {'anonymize_ip': true});

Doch wie bei Universal Analytics zuvor auch: Da vor allem in Deutschland ohnehin alles anonymisiert werden muss, ist das eher akademisch als praktisch.

Alternativ Global Site Tag mit Tag Manager

Die erfreuliche Nachricht: Wenn ihr derzeit euer Tracking auf Basis des Universal Analytics Tags mit dem Google Tag Manager aufgesetzt habt, müsst ihr NICHTS machen. Zwar ist das neue gtag.js mit einer neuen Syntax ausgestattet, diese bedient aber letztlich weiterhin das Universal Analytics Tag, das ihr weiter oben schon gesehen habt oder ihr bislang sogar nutzt.

Anonymisieren mit Classic Analytics (ga.js)

Wer den alten asynchronen Trackingcode immer noch nutzt, sollte sich mal überlegen, ob es nicht langsam an der Zeit wäre zu wechseln, denn für den alten Code werden jetzt schon eine Menge Features aus Google Analytics nicht mehr angeboten. Aber das ist ein anderes Thema.

Hard coded Classic Analytics Code

Ist der Trackingcode „hart“ auf der Seite implementiert worden, also direkt in den Quellcode hineingeschrieben worden, steht er in etwa so auf der Seite:

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXXXXX-X']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>

Auch hier muss das „anonymizeIP“ VOR dem Senden des Pageviews eingebettet werden, am besten an folgender Stelle.

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXXXXX-X']);
_gaq.push (['_gat._anonymizeIp']);
_gaq.push(['_trackPageview']);
...

Alternativ Classic Analytics mit Tag Manager

Wer den Classic Analytics Code mit dem Tag Manager eingebunden hat, kann leider nicht auf die Settings-Variable zurückgreifen. Die funktioniert nur mit Universal Analytics. Also muss in jedem Google-Analytics-Tag die Funktion der IP-Anonymisierung einzeln ergänzt werden. Das geht im Tag für Klassisches Analytics sogar noch einfacher als im Universal Analytics Tag (was DEFINITIV kein Grund zum Zurückwechseln ist 🙂 ).

Feld zum Anhaken für klassisches Analytics im Google Tag Manager

Für klassisches Analytics gibt es sogar ein eigenes Feld zum Anhaken im Tag Manager

Also, einfach Haken setzen, testen, veröffentlichen und fertig.

Fazit: Ja, muss gemacht werden. Ist aber einfach.

Um dem Datenschutz genüge zu tun, muss anonymizeIP eingebaut werden, ohne wenn und aber. Das geht aber ziemlich entspannt sowohl mit als auch ohne Google Tag Manager und ganz gleich ob für Universal Analytics, das neue Global Site Tag oder das klassische Google Analytics.

Maik Bruns

Gründer und Inhaber bei Metrika e. K.
Seit Jahren ist er der Webanalyse mit Google Analytics und dem Google Tag Manager stark verbunden - und er vermittelt jederzeit den Spaß daran an alle, die ihn kennenlernen.

Er schreibt und bloggt zu diesen Themen, wenn er nicht gerade unterwegs oder bei seiner Familie ist. Ferner ist er in verschiedenen sozialen Netzwerken zu finden, um dort das Wissen über Webanalyse weiterzugeben.

Er hostet den Podcast "Die Sendung mit der Metrik", spricht zu Webanalyse-Themen auf Konferenzen und gibt Seminare/Workshops vor allem zu Google Analytics, Google Tag Manager und Google Data Studio.

Nebenbei fotografiert er leidenschaftlich gerne und hat mit Freeletics einen Sportnachfolger für Volleyball gefunden.

Twitter Facebook Instagram Google+ LinkedIn   XING

Maik Bruns ist seit Jahren der Webanalyse mit Google Analytics und dem Google Tag Manager stark verbunden. Er schreibt und bloggt zu diesen Themen, wenn er nicht gerade unterwegs oder bei seiner Familie ist und ist in verschiedenen sozialen Netzwerken zu finden. Er spricht außerdem zu Webanalyse- und SEO-Themen auf Konferenzen und gibt Seminare/Workshops zum Thema Google Analytics und Google Tag Manager. Nebenbei fotografiert er leidenschaftlich gerne und hat mit Freeletics einen Sportnachfolger für Volleyball gefunden. Twitter Google+ LinkedIn XING

35 Comments

    • Vielen Dank, Rafael. Aber aufgezwungen wird sie aktuell noch nicht – und wird sie wohl auch ebenso wenig wie analytics.js, denn auch heute noch kannst du ja auch den asynchronen Code nutzen. Und derzeit gelten ohnehin noch alle alten Möglichkeiten. Wann gtag.js tatsächlich produktiv in den Einsatz gehen wird, ist derzeit noch ziemlich unklar. Ist ja quasi noch Beta.

        • Thanks Jin, well that is surprising indeed. I didn’t think it to be enrolled so fast.
          Anyway, there is no need to panic at the moment as analytics.js is still „in charge“ and gtag.js still in beta. You can anyway send data through the „old“ analytics.js.

          As most of my implementations are on base of Google Tag Manager I don’t have a chance to change anything right now. 🙂

  1. Im Gesamtcodebeispiel für gtag ist ein kleiner Fehler. Statt
    gtag(‚config‘, ‚UA-XXXXXXXX-X‘; { ‚anonymize_ip‘: true });
    müsste es
    gtag(‚config‘, ‚UA-XXXXXXXX-X‘, { ‚anonymize_ip‘: true });
    sein 😉

  2. super super super ! ich habe es nirgendwo gerunden bis jetzt.
    Ich verstehe nicht, warum nicht google selber so eine anleitung macht.

    • Danke, danke, danke, Patrick.
      Ist halt mehr Aufwand als nur das Prinzip erklären. Und die haben ja durchaus noch Themen. Außerdem: Was wäre dann noch meine Daseinsberechtigung als Berater, wenn Google alles perfekt machen würde. 😉

  3. Super Anleitung!
    Zwei Fragen noch bitte:

    1. Wie schreibe ich wenn ich auch noch Google Optimize nutze?

    So? :
    gtag(‚config‘, ‚UA-XXXXXXXXX‘,{ ‚anonymize_ip‘: true, ‚optimize_id‘: ‚GTM-XXXXXX‘});

    2. Wie lässt sich die korrekte Einbindung der IP-Anonymisierung überprüfen?

    • Hallo Thomas,

      Google Optimize bindest du so ein: gtag(‚config‘, ‚UA-XXXXXXXXX‘, { ‚anonymize_ip‘: true, ‚optimize_id‘: ‚OPT_CONTAINER_ID‘});
      Also mit Komma zwischen den einzelnen Parameter-Definitionen.

      Die Einbindung überprüfst du – wie bei der bisherigen Implementierung bei analytics.js – am besten mit den Developer Tools deines Browsers (bei Chrome auf Windows z. B. über Taste F12 zu erreichen). Dort findest du nach einem Reload der Seite im Bereich „Network“ eine Auflistung, welche Abrufe stattgefunden haben. Wenn du im Suchfeld dort nach „collect“ suchst, wirst du die Hits finden, die an Google Analytics gesendet wurden. Wenn du nur eine Analytics-Implementierung hast, wirst du nur die richtigen finden, ansonsten musst du in die einzelnen Collects hineinklicken und dort bei den „Query String Parameters“ nach der passenden „tid“ (Tracking ID) suchen. Innerhalb des Collects sollte auch ein Query String Parameter „aip“ (= „anonymizeIP“) zu sehen sein. Wenn der Wert dort = 1 ist, ist anonymizeIP in Ordnung.

      Alternative zu den Developer Tools ist das Plugin Google Analytics Debugger.

      Ich hoffe, das hilft dir weiter.

  4. Hallo Maik,
    eingangs muss ich sagen, dass ich von Programmierung leider überhaupt keine Ahnung habe.
    Ich habe mich Anfang des Jahres selbständig gemacht und habe hierfür eine Website über Jimdo erstellt. Diese ist mit meinem Google Analytics Konto verknüpft. Jetzt habe ich von der AnonymizeIP gelesen und möchte sie für meine Website nutzen. Ich habe die
    „anonymizeIP im Universal Analytics Code mit Google Tag Manager und Settings-Variable“
    nach Ihren Vorgaben eingestellt. Jetzt schreiben Sie am Ende des Absatzes „Nach der Änderung nicht vergessen: Testen, ob der Tag Manager alles richtig ausspielt und dann Änderungen veröffentlichen.“ Wie teste ich ob der Tag manager alles richtig ausspielt? Wie kann ich überprüfen ob die IPs jetzt anonymisiert sind?
    Viele Grüße
    Christine

      • Die Änderungen im Tag Manager Container veröffentlichst du über den Button „Senden“ und dann dort „Version erstellen und veröffentlichen“ wählen, nachvollziehbare Beschreibung deiner neuen Container-Version eingeben und im Anschluss oben „Veröffentlichen“ klicken. Fertig.
        Vorher immer vor allem die veränderten Tags im Vorschaumodus des Tag Managers testen.

    • Hallo Christine,

      da gibt es zum Beispiel die Möglichkeit, die Seite aufzurufen und mit geöffneten Developer Tools zu überprüfen (in Chrome über das Browser-Menü -> Weitere Tools -> Entwicklertools oder alternativ (auf dem PC) mit F12 zu öffnen).

      Es öffnet sich im Browserfenster ein neuer Bereich, in dem mehrere Reiter zu sehen sind. Dort auf „Network“ gehen und, falls dort dann (noch) nichts steht, die Seite ggf. neu laden.

      Der große Bereich dort füllt sich dann mit Elementen, die beim Laden der Seite aufgerufen werden, darüber findest du ein Suchfeld, in das du einfach mal „collect“ eingibst. Das verbleibende Element (oder die verbleibenden Elemente) sind die Zugriffe auf Google Analytics. Klicke einfach auf den oder die Einträge, daraufhin sollte sich ein „Unterfenster“ öffnen, in dem du in den Reiter „Header“ wechselst, falls er sich nicht ohnehin automatisch öffnet.

      Wenn du dann etwas nach unten scrollst in dem Bereich, werden irgendwann „Query String Parameters“ gezeigt. Wenn du darin eine Zeile findest, in der „aip: 1“ steht (steht für anonymizeIP = wahr), ist die Anonymisierung aktiv.

      Ich hoffe, das hilft dir.

  5. Hi Maik,
    wenn ich jetzt einen neuen Code für eine Property via Google Tag Manager erzeuge, muss ich dann irgendetwas bzw. den Schritt „anonymizeIP im Universal Analytics Code mit Google Tag Manager und Settings-Variable“ machen, oder ist das mittlerweile im Tag Manager Code integriert?

    • Hi Julian,

      anonymizeIP ist immer noch manuelle Arbeit im Tag Manager. Du musst also ein zusätzliches Feld anlegen in der Einstellungen-Variable mit dem Namen „anonymizeIP“ und dem Wert „true“ wie oben beschrieben.
      Viele Grüße

  6. Danke für die Info. Ich höre jetzt zum ersten Mal davon, dass es eine solche Option bei Analytics gibt. Wer hätte gedacht, dass Google noch Hilfen zum Datenschutz zur Verfügung stellt. Mein Analytics Code wird direkt angepasst!

  7. Hi Maik,

    erstmal danke für die tolle Anleitung. Hat alles wunderbar geklappt.
    Am Anfang schreibst du, dass die Altdaten gelöscht werden müssen. Wie mache ich das?

    lg
    Elisa

    • Hi Elisa,

      danke dir für die Frage. Das geht leider nicht mithilfe einer Funktion …
      Praktischerweise müsstest du dafür eine neue Analytics-Property mit neuer Tracking-ID anlegen und die alte Property schließen. Es ist zwar von „außen“ nicht zu bewerten, ob du das getan hast und muss auch niemandem gemeldet werden, dennoch sieht es die Vereinbarung so vor.

      Viele Grüße
      Maik

  8. Hallo Maik,
    es gibt aktuell zwei Google Tag Manager Plugins für WordPress. Mit welchem hast Du Deine obige Beschreibung der Anonymisierung: „anonymizeIP im Universal Analytics Code mit Google Tag Manager und Settings-Variable“ denn gemacht?
    Hier die beiden Varianten, die ich gefunden habe:
    1.) https://de.wordpress.org/plugins/simple-google-tag-manager/
    2.) https://de.wordpress.org/plugins/google-tag-manager/
    Vielen Dank und viele Grüße
    Niels

    • Hallo Niels,

      welches Plugin du benutzt, ist ziemlich egal, weil diese in der Regel nur dafür sorgen, dass der Tag Manager verfügbar ist. Entscheidend ist, dass du dann im Tag Manager selber und dort in den Analytics-Tags die Anonymisierung wie in der Anleitung gezeigt aktivierst.

      VG
      Maik

  9. Hallo Maik,
    vielen Dank! Das hat geholfen. Ich benutze jetzt noch ein anderes Plugin, dass auch diese Funktionalität hat. Nach dem oben beschriebenen Test (aip=1) hat es funktioniert. Gut, dass es solche Blogs, wie Deinen, gibt. 🙂
    VG
    Niels

  10. Hey Maik!
    Wirklich beeindruckend, was du hier aufgezogen hast! Hab ne Frage gehabt, der erste Google-Treffer war Metrika .. und ich hab hier zumindest so viel verstanden, dass ich weiterkomme! 😉

    Danke! ..und viel Erfolg weiterhin! ^^ Gruß vom Caleu

    • Hey Caleu,
      cool, wenn ich dir helfen konnte. Und: Danke für die Blumen. Es macht einfach Spaß, da fällt es fast schon leicht, das alles zu machen. 🙂
      Maik

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Top