google-analytics-serverseitig-tracken-header

Google Analytics serverseitig tracken

Das Google Analytics Measurement Protocol nimmt alle GA-Calls an. Sowohl aus dem Standard-JS-Tracker, als auch aus selbst gebauten Lösungen. Das kann genau dann sehr hilfreich sein, wenn die Standard-Lösungen von GA nicht mehr ausreichen. Wie man serverseitig Google Analytics tracken kann, zeige ich in diesem Artikel mit fertigen „ready-to-use“ PHP-Scripten.

Hinweis: Vollständiges Script am Ende. Erklärungen als Erstes.
Direkt zum kompletten Script!

Adblocker umgehen

Über Adblocker-sicheres Google Analytics habe ich letztens bereits mal etwas gepostet. Dabei allerdings eine andere Möglichkeit verwendet. Dort habe ich den JS-Tracker so umgebaut, dass er nicht mehr von Adblockern erkannt wird. Solltest du also Adblocker umgehen wollen, solltest du auch diesen Artikel lesen und dich dann für die Lösung entscheiden, die am besten für dich passt.

Google Analytics Measurement Protocol

Das Measurement Protocol ist im Grunde nichts anderes, als die API von GA für alle eingehenden Tracking-Requests. Der normale JS-Tracker nutz diese und wenn spezielle Anforderungen erfüllt werden müssen, lässt sich mit eigenen Scripten ebenfalls sehr einfach das Measurement Protocol nutzen. Eine ausführliche Beschreibung zu dem Google Analytics Measurement Protocol ist hier zu finden: https://developers.google.com/analytics/devguides/collection/protocol/v1/

Auslösen von Tracking Requests

„Protocol“ klingt irgendwie so schon technisch und komplex. Dabei funktioniert das ganze ganz simple über GET-Parameter, die an die folgende URL angehängt werden müssen:

https://google-analytics.com/collect?

Um verschiedene GET-Parameter nun also an GA zu senden, kann die folgende PHP-Funktion benutzt werden. Dabei werden alle als Array $data in die Funktion übergebenden Werte also Key-Value-Paare an die URL mit angehängt.

function sendGaData($data) {
    $getString = 'https://google-analytics.com/collect?';
    $getString .= http_build_query($data);
    $result = file_get_contents($getString);
    return $result;
}

Tracking-Parameter

Je nach Request-Typ, der an Google Analytics geschickt werden soll, sind unterschiedliche Parameter erforderlich. Außerdem sind einige optional und einige immer erforderlich. Im folgenden eine nicht vollständige Liste. Aber diese Parameter sind die, die für die häufigsten Anforderungen erforderlich oder nützlich sind.

defaults / immer erforderlich

Es gibt einige Parameter, die an jeden Request angehängt werden müssen. Und einige können je nach Wunsch an jeden angehängt werden. Dabei spielt die Art oder Inhalt des Requests noch keine Rolle. Die default-Parameter werden später beim senden immer automatisch mit angefügt.

$defaults = array(
    'tid' => 'UA-123456-1', // Tracking ID / Web Property ID (required)
    'aip' => '1', // Anonymize IP (optional)
    'cid' => getGaCookie(), // Client ID (required)
    'uip' => getUserIp(), // IP Override (optional)
    'ua' => $_SERVER['HTTP_USER_AGENT'], // User Agent Override (optional)
    'v' => '1', // Protocol Version (required)
    'z' => uniqid(), // Cache Buster (optional)
);

tid: Die tid ist die Property-Nummer von Google Analytics. Diese beginnt immer mit „UA-“ gefolgt von zwei Blöcken mit Nummern.
aip: Um dem Deutschen Datenschutz gerecht zu werden, muss die IP-Adresse immer anonymisiert werden. Dazu diesen Parameter einfach auf 1 setzen. 0 bedeutet nicht anonymisiert. Bei einer anonymisierten IP wird immer der letzte Block der IP auf 0 gesetzt.
cid: Das ist die Client-ID. Diese speichert Google immer in einem Cookie ab. Sollte noch kein Cookie vorhanden sein, kann einfach eine neue ID erstellt und mitgesendet werden. Hierfür habe ich mir die kleine Hilfsfunktion getGaCookie() geschrieben. Dazu später mehr.
uip: Als uip wird die IP-Adresse des Users übergeben. Hierbei sollte nicht versehentlich die IP des eigenen Servers übertragen werden. Auch Proxy-IPs sollten hier nicht übergeben werden. Dafür nutze ich ebenfalls eine Hilfsfunktion. Dazu später mehr.
ua: User Agent des Nutzers, der getracked werden soll. Hierfür greife ich auf die Info aus $_SERVER zu.
v: Versionsnummer des Protocols. Muss immer auf 1 stehen.
z: Beliebiger Wert. Verhindert nur, dass der Request in irgendeinem Cache gecached wird. Ich nutze dafür einfach die PHP-Funktion uniqid().

Pageview

Um einen Pageview an GA zu senden sind im Grunde die folgenden Parameter zusätzlich zu den obigen defaults notwendig oder zumindest hilfreich.

$params = array(
    't' => 'pageview', // Hit type (required)
    'dr' => $_SERVER['HTTP_REFERER'], // Document Referrer (optional)
    'cn' => getUtm('utm_campaign'), // Campaign Name (optional)
    'cs' => getUtm('utm_source'), // Campaign Source (optional)
    'cm' => getUtm('utm_medium'), // Campaign Medium (optional)
    'ck' => getUtm('utm_term'), // Campaign Keyword (optional)
    'cc' => getUtm('utm_content'), // Campaign Content (optional)
    'dl' => 'http'.(isset($_SERVER['HTTPS']) ? 's' : '').'://'.$_SERVER['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI'], // Document location URL (required for pageviews)
    'dt' => '(not set)', // Document Title (optional)
);

t: Das ist der Hit type. In diesem Fall muss der Wert mit „pageview“ gesetzt sein.
dr: Der aktuelle Referrer. Hierfür nutze ich die Info aus der $_SERVER-Variable.
cn: GET-Parameter utm_campaign. Muss leer sein, wenn kein Parameter vorhanden ist. getUtm() verhindert nur PHP-Fehler.
cs: GET-Parameter utm_source. Muss leer sein, wenn kein Parameter vorhanden ist. getUtm() verhindert nur PHP-Fehler.
cm: GET-Parameter utm_medium. Muss leer sein, wenn kein Parameter vorhanden ist. getUtm() verhindert nur PHP-Fehler.
ck: GET-Parameter utm_term. Muss leer sein, wenn kein Parameter vorhanden ist. getUtm() verhindert nur PHP-Fehler.
cc: GET-Parameter utm_content. Muss leer sein, wenn kein Parameter vorhanden ist. getUtm() verhindert nur PHP-Fehler.
dl: Als dl muss die gesamte aktuelle URL übergeben werden. Diese bastel ich aus mehreren $_SERVER-Variablen zusammen.
dt: Bei jedem Pageview kann zusätzlich auch der Title des Dokumentes übergeben werden. Das ist bei der Auswertung nach Content manchmal recht praktisch. Dieser Parameter kann aber sonst auch getrost weg gelassen werden.

Events

Events lassen sich mit noch weniger Parametern messen. Zusätzlich zu den defaults von oben wären die Folgenden notwendig.

$params = array(
    't' => 'event', // Hit type (required)
    'ec' => 'EVENT CATEGORY', // Event Category (required for events)
    'ea' => 'EVENT ACTION', // Event Action (required for events)
    'el' => 'EVENT LABEL', // Event Label (optional)
    'ev' => 'EVENT VALUE', // Event Value (optional)
);

t: Hit type. Muss auf „event“ stehen.
ec: Oberste Kategorie für Events. Kann frei gewählt werden.
ea: 2. Ebene für Events. Kann frei gewählt werden.
el: 3. Ebene für Events. Kann frei gewählt werden.
ev: Als Value dürfen nun nur noch Zahlenwerte übertragen werden. Kein Text.

Übrigens zu den Events in GA habe ich schon mal einen Artikel geschrieben. Solltest du dich für Event-Tracking interessieren, solltest du meinen Artikel „Events in GA messen“ mal lesen.

komplettes Script

Nun zusammenfassend noch mal das gesamte Script inklusive meiner Hilfsfunktionen.

Funktionen

Die Funktionen sind grundsätzlich immer erforderlich.

// Get the cid from the _ga-Cookie or create a new one
function getGaCookie() {
	if (isset($_COOKIE['_ga'])) {
		$cid = explode('.', $_COOKIE["_ga"], 4);
		$cid = $cid[2].'.'.$cid[3];
	} else {
		$cid = uniqid().'.'.time();
		setcookie('_ga', 'GA1.2.'.$cid, time()+(60*60*24*365*2), '/', );
	}
	return $cid;
}

// get the current user ip due to proxies
function getUserIp() {
    if(!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        return $_SERVER['REMOTE_ADDR'];
    }  else {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
}

// get a get-parameter or return empty string
function getUtm($utm) {
    if(isset($_GET[$utm])) {
        return $_GET[$utm];
    } else {
        return '';
    }
}

// Send the data to the GA-Collector
function sendGaData($data, $debug = false) {
    
    $defaults = array(
        'tid' => 'UA-123456-1', // Tracking ID / Web Property ID (required)
        'aip' => '1', // Anonymize IP (optional)
        'cid' => getGaCookie(), // Client ID (required)
        'uip' => getUserIp(), // IP Override (optional)
        'ua' => $_SERVER['HTTP_USER_AGENT'], // User Agent Override (optional)
        'v' => '1', // Protocol Version (required)
        'z' => uniqid(), // Cache Buster (optional)
    );

    if($debug) {
        $getString = 'https://google-analytics.com/debug/collect?';
    } else {
        $getString = 'https://google-analytics.com/collect?';
    }
    $data = array_merge($data, $defaults);
    $getString .= http_build_query($data);
    $result = file_get_contents($getString);
    return $result.PHP_EOL.$getString;
}

Pageview tracken

Pageviews tracken mit folgendem Code:

$params = array(
    't' => 'pageview', // Hit type (required)
    'dr' => $_SERVER['HTTP_REFERER'], // Document Referrer (optional)
    'cn' => getUtm('utm_campaign'), // Campaign Name (optional)
    'cs' => getUtm('utm_source'), // Campaign Source (optional)
    'cm' => getUtm('utm_medium'), // Campaign Medium (optional)
    'ck' => getUtm('utm_term'), // Campaign Keyword (optional)
    'cc' => getUtm('utm_content'), // Campaign Content (optional)
    'dl' => 'http'.(isset($_SERVER['HTTPS']) ? 's' : '').'://'.$_SERVER['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI'], // Document location URL (required for pageviews)
    'dt' => '(not set)', // Document Title (optional)
);
sendGaData($params);

Event tracken

Events tracken mit folgendem Code:

$params = array(
    't' => 'event', // Hit type (required)
    'ec' => 'EVENT CATEGORY', // Event Category (required for events)
    'ea' => 'EVENT ACTION', // Event Action (required for events)
    'el' => 'EVENT LABEL', // Event Label (optional)
    'ev' => 'EVENT VALUE', // Event Value (optional)
);
sendGaData($params);

Debuggen eines GA-Requests

Es gibt eine einfache Möglichkeit die Requests, die an GA gehen zu testen. Dies habe ich bereits mit in die Funktion sendGaData() eingebaut. Dazu muss die Funktion nur anders aufgerufen werden. Ist der 2. Funktionswert von sendGaData() auf true, werden die Debug-Infos abgerufen. Es wird dabei kein tatsächlicher Call von GA aufgezeichnet!

Debuggen

echo sendGaData($params, true);

Livebetrieb

sendGaData($params, false);

Freelancer. Blogger. Affiliate. Und auf Weltreise.

Kommentar verfassen