AdBlocker im GTM erfassen

header_googletagmanager_adblocker_tracking

Bild.de sorgte kürzlich für Diskussionsstoff, als alle AdBlocker-Nutzer auf Bild.de ausgesperrt wurden und somit die Inhalte für Werbung-blockierende-Nutzer nicht mehr verfügbar waren. Eine interessante Aktion, obwohl wir hier nicht auf der ökonomischen Ebene einsteigen wollen, sondern auf der technischen. Es ist ein spannender Aspekt, die Zahl der AdBlocker-Nutzer in seinem Webanalyse Tool festzuhalten. Lasst uns also gemeinsam mit ein wenig JavaScript mögliche Lösungen implementieren, die uns verraten, ob jemand einen AdBlocker einsetzt.

Voraussetzung ist ein Tag Management Tool (z.B. Google Tag Manager (GTM)) und ein Webanalyse Tool (z.B. Google Analytics (GA)). Technisches Verständnis ist nicht verkehrt, aber auch kein Must Have. Es hängt auch davon ab für welche der vorgestellten Lösungen ihr euch entscheidet.

Gegenüber anderen Datenquellen wie z.B. dem AdServer haben wir in der Webanalyse die Möglichkeit, den Prozentsatz der adblockenden User mit allen dort verfügbaren Dimensionen in Verbindung zu setzen. Beispielsweise könnte man so erkennen, wenn unterschiedliche Traffickanäle andere Blockquoten aufweisen.

Unterschiedliche Lösungen bieten sich an, um unsere Zielfrage „Wie viele Nutzer meiner Seite haben einen AdBlocker?“ zu beantworten. Je nachdem wie die implementierte Lösung aussieht werden die Daten akkurat sein, oder eine gute Annäherung an den realen Wert. Der Grund dafür ist, dass AdBlocker unterschiedliche Lösungen anwenden um Werbung und Tracker zu blockieren.

Wie funktionieren AdBlocker

Prinzipiell hat ein AdBlocker zwei Aufgaben:

a) Werbung/Tracker erkennen (detect)

b) Werbung/Tracker blockieren (block)

Werbung erkennt man am einfachsten durch eine Blacklist. Dabei handelt es sich um eine kuratierte Liste, in der URLs manuell und automatisiert eingetragen werden, die auf einen Werbeinhalt verweisen oder zum Ausspielen eines Trackers notwendig sind (z.B. die JS-Bibliothek von Google Analytics unter *.google-analytics.com/analytics.js). Zusätzlich werden Begriffe gepflegt, die besser nicht in einer URL auftauchen sollten (z.B. URL enthält „advertisement.js“ oder „tracking.js“).

Ein schönes Beispiel für solche eine Liste sind die Ghostery Bugs, auf denen die Tracker- und Ad-Erkennung des Ghostery-Browserplugins basieren.

Erkannte Werbeinhalte können direkt an der Quelle blockiert werden oder während der Ausführung. AdBlocker werden in der Regel direkt an der Quelle ansetzen und das Laden einer Bibliothek verhindern, die dann Werbebanner und Tracker nachladen oder anzeigen. Um präzise zu arbeiten müssen wir jedoch auch die zweite Möglichkeit betrachten, nämlich wenn eine Bibliothek zwar geladen wurde, jedoch beim Ausführen behindert wird. Das ist der Fall wenn Google Analytics zwar Daten sammelt, aber der Request die Daten zu verschicken auf HTTP-Ebene blockiert wird.

AdBlocker erkennen

Wir nutzen die erste Eigenschaft (detect) aus um uns über den Status eines AdBlockers beim Nutzer zu informieren. Wird ein offensichtlich werbelastiger Inhalt beim Nutzer nicht geladen? Dann hat er offensichtlich einen AdBlocker (oder IE ;) ). Wir können den AdBlocker also auch gezielt mit einem vermeintlichen Werbeinhalt ködern. Zwei mögliche Implementierungen bieten sich an, die wir hier kurz im Detail durchgehen.

Als Köder erstellen wir eine „advertisement-display.js“ (Textdatei) mit folgendem Code (eine Zeile). Diese Datei wird schnell per FTP auf den Server geschoben, wo sie für alle verfügbar sein sollte.

dataLayer.adBlocker = true;

Diese Datei lassen wir nun alle Nutzer unserer Seite laden. Die einfache und schnelle Lösung wäre im GTM die „advertisement-display.js“ zu laden, jedoch unzuverlässig wenn der GTM selbst auf der Blacklist steht. Für alle die diese Lösung vorziehen hier die GTM Anweisung.

Neues HTML Tag im Google Tag Manager anlegen

Im benutzerdefinierten Tag können wir die Datei über folgenden Code asynchron laden lassen.

(function() {
    var d = document.createElement('script');
    d.src = '/advertisement-display.js';
    document.head.appendChild(d);
})();
Das fertige Script im Tag Manager sieht dann wie folgt aus.
Eigenes HTML Tag im GTM anlegen

Die bessere Lösung ist unabhängig von einem Tag Manager (der selbst in der Regel in jeder Blacklist zu finden ist) den Köder (advertisement-display.js) laden zu lassen. Leider ist der Weg über das Template/CMS (also die Technik) dann unumgänglich. Der einfachste Weg wäre folgender Code um die Datei synchron laden zu lassen (natürlich ist auch der asynchrone Weg, den wir im Tag Manager benutzt haben) auch möglich. Stimmt euch am besten mit eurer Technik und Infrastruktur ab.

<script src="advertisement-display.js"></script>

Vergesst nicht die korrekte URL anzugeben, wo ihr sie hochgeladen habt.

Alternative Lösung zum Ködern

Wir können uns jedoch nicht darauf verlassen, dass ein AdBlocker tatsächlich auf unseren Köder hereinfällt. Was, wenn er gar keine Blacklist mit dem Begriff „advertisement“ hat? Deshalb bietet es sich an eine verfügbare Werbebanner-Bibliothek zu laden, zum Beispiel die stark verbreitete von Google AdSense „*.googlesyndication.com/pagead/osd.js“.

Mit folgendem Code auf der Seite bekommt man die Möglichkeit auf einen AdBlocker zu reagieren. Lest bitte die Kommentare im Code aufmerksam durch, hier sind mehrere Anpassungen nötig um den Code auf eurer Seite zum Laufen zu bringen.

function adblockDetect(url, callback){
var dummy = document.createElement(‘script’);
dummy.onerror = function(){
// Bevor wir den Köder asynchron aufrufen konfigurieren
// wir diese Funktion zum Fehlerhandling (Köder blockiert).
// http://www.w3schools.com/jsref/event_onerror.asp
dummy.onerror = null;
document.body.removeChild(dummy);
callback();
}
dummy.src = url;
document.body.appendChild(script);
// generieren wir beim Laden des Scripts (appendChild) einen Fehler, dann
// wird alles zurück gesetzt und die Callback-Funktion ausgeführt.
}

adblockDetect("http://pagead2.googlesyndication.com/pagead/osd.js", function(){
// in dieser Funktion können wir auf einen aktiven AdBlocker reagieren
});

Hat man mit dieser Methode einen AdBlocker identifiziert, dann bietet es sich an diese Information zu tracken. Es gibt unterschiedliche Wege damit umzugehen, die wir im nächsten Abschnitt sehen werden.

Auf AdBlocker reagieren

Wir haben den Nutzer mit dem AdBlocker identifiziert und möchten jetzt adequat darauf reagieren. Was adequat ist muss jeder für sich entscheiden, aber wir würden in unserm Beispiel gerne wissen wie viele Nutzer es sind und einen Trend im Verlauf sehen. Müssen aber einige Fehlerquellen umgehen, da ein AdBlock-Nutzer nicht jeden Tracker ausführt.

Um die Daten in Google Analytics zu speichern müssen wir den Nutzer beschreiben (also eine Dimension anlegen). Dazu geht man in Google Analytics in das entsprechende Konto unter „Verwalten“ und legt auf Property-Ebene eine benutzerdefinierte Dimension an. Relevant ist der Index der Dimension (z.B. „1“), diesen zeigt euch GA an sobald ihr auf „Erstellen“ geklickt habt. Zusätzlich könnt ihr einen Scope für die Dimension anlegen (wie lange ist der Wert gültig). Da der AdBlocker eher eine permanente Einstellung ist sollte die Einstellung auf „Nutzer“ oder „Sitzung“ gestellt werden. Wir wählen in unserem Beispiel „Nutzer“.

Custom Dimension in Google Analytics anlegen.

Die größte Herausforderung ist die Daten an ein Webanalyse Tool zu schicken, da es mit hoher Wahrscheinlichkeit auch blockiert wird. Deshalb bieten sich wieder zwei Möglichkeiten an, die schnelle aber unsichere Lösung oder die etwas aufwändigere aber zuverlässigere.

Entscheidet man sich für die schnelle Lösung, dann kann man wieder auf den GTM zurückgreifen. Hierzu greifen wir auf das Google Analytics Tag zurück, welches ihr evtl. bereits installiert habt um Page Views zu tracken. Es muss lediglich ein zusätzliches Feld angegeben werden. In diesem Feld geben wir an, ob der Nutzer einen AdBlocker hat, oder nicht. Diese Information speichern wir erst in einer Variable und dann übergeben wir diese Info im Tag.

function() {
return dataLayer.adBlocker ? 'false' : 'true';
//wenn der Code aus der advertisement-display.js nicht blockiert wurde,
//dann existiert kein AdBlocker
}

Dieser Code kommt in eine JavaScript-Variable im Tag Manager. Die Variable können wir z.B. „advertisement-display.js“ nennen. Der Name ist wichtig, da wir die Variable im nächsten Schritt angeben müssen.

gtm_javascript_variable

Im eigentlichen Tag um jegliche Page Views zu tracken muss folgende Dimension (mit dem Index eurer angelegten Dimension übereinstimmend) angelegt werden. Dies findet ihr im Universal Analytics Tag unter „Weitere Einstellungen“ -> „Benutzerdefinierte Dimensionen“. Der Dimensionswert entspricht dem Namen eurer gerade angelegten Variable.

Google Tag Manager benutzerdefinierte Dimensionen und Dimensionswert

Damit haben wir die GTM Lösung fertig und können sie publishen. Was jedoch, wenn wir sicher gehen wollen und ohne den GTM arbeiten?

Ohne GTM implementieren

Wem die 95% Lösung noch nicht reicht und die 99% anstrebt kann folgende Lösung implementieren. Diese wird jedoch wieder etwas mehr Aufwand erfordern. Kombiniert mit den zuvor genannten sicheren Alternativlösungen zum Ködern (erster Abschnitt) ergibt es ein sehr zuverlässiges Konstrukt.

In vielen AdBlocker-Blacklists findet sich sowohl GA als auch GTM wieder. Diese Unsicherheit kann man umgehen indem man eigene Trackingcodes schreibt und die Daten über den eigenen Server weiterleitet. So weit gehen wir aber nicht, sondern schicken die Daten wie über einen manuellen Request zum GA Server.

Mit folgendem Code erreichen wir genau dies.

<script>
function gaTrack (cd, trackingId) {
window.addEventListener('load', function() {
if (!dataLayer.adBlocker && !window.google_tag_manager) {
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1);
if (c.indexOf("myGa_") == 0) var clientId = c.substring(name.length,c.length);
}
if(!clientId) var clientId = "" + (new Date).getTime() + Math.floor(1e6 * Math.random());
var request = new XMLHttpRequest;
request.open('POST', 'https://www.google-analytics.com/collect');
var parameter = 'tid=' + trackingId + '&cd' + cd + '=true&t=pageview&dp=' + document.location.pathname + '&v=1&cid=' + clientId;
request.send(parameter);
var g = new Date;
g.setTime(g.getTime() + 63072e6);
var expDate = 'expires=' + g.toUTCString();
document.cookie = 'myGa_=' + clientId + '; ' + expDate
}
})
}
gaTrack('1', 'UA-1234567-8') //euer Custom Dimension Index (z.B. 1) und Property-ID
</script>

Das Skript führt folgende Schritte der Reihenfolge nach aus:

  1. Auf das „load“ Event warten, es wird also erst ausgeführt wenn wirklich alle Elemente geladen sind.
  2. Prüfen, ob das „adBlocker“ Objekt vorhanden ist (wir erinnern uns: das Objekt wird in der advertisement-display.js generiert, die Datei muss also existieren und eingebunden sein, damit wir korrekte Daten bekommen)
  3. Prüfen, ob das „google_tag_manager“ Objekt vorhanden ist (wir gehen davon aus, dass der GTM implementiert ist und prüfen mit dieser Regel, ob der Nutzer auch den GTM blockt)
  4. Untersuchen ob ein eigens für dieses Skript definierte „myGa_“ Cookie existiert. Wenn ja, dann wird dessen Wert als cid (Client ID) übernommen. Sonst generieren wir einen zufälligen Schlüssel als cid.
  5. Feuern eines Request an die Measurement-Protocol-API. In der letzten Zeile im Code müsst ihr den Index eurer Custom Dimension angeben (haben wir oben angelegt) und die für euch relevante Tracking-ID angeben.
  6. Zuletzt wird noch die generierte ID im Cookie gespeichert, damit wir beim nächsten Aufruf den Nutzer wiedererkennen.

Ein sehr rudimentäres Skript, was uns jedoch eine voll umfängliche Einsicht ermöglicht, wie viele Nutzer sowohl AdBlocker aktiviert haben als auch den GTM blockieren.

Übrig bleibt nur noch die 100%-Lösung, nämlich wenn man noch zusätzlich den Fall berücksichtigt, dass der Request an Google Analytics geblockt wird. Dazu müssten wir den Request über einen domaininternen Aufruf (z.B. tracking.meine-seite.de) leiten und die Daten per Server-to-Server Verbindung übermitteln.

Wir freuen uns auf eure Fragen und Ideen in den Kommentaren.


Verlinkt von

[…] ist und wie stark Sie betroffen sind. Im Blog von 121 Watt (Skript und Plugin für WordPress) und Wingmen (Aktivierung über Google Tag Manager) gibt es eine Anleitung, wie man Adblocker-User quantitativ […]

Kommentare

Michael Friedrich am 5. November 2015 um 18:40:29

Hallo Michael,

danke für diesen Super-Beitrag. Soweit ich das einschätzen kann, ist es dir damit gelungen, das Verfahren, welches Simo Ahava in seinem Blogpost vorgestellt hat (http://www.simoahava.com/analytics/measure-ad-content-blocker-impact-on-traffic/) noch zu verfeinern.

Für viele Publisher wird durch dieses Tracking ersichtlich, wie groß das Problem mit den Adblockern wirklich ist. Auch wenn anschließend das Katz- und Maus-Spiel weitergeht.

Keep up the good work!
Michael

Schreibe einen Kommentar

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