Analytics Hits an eigenen Server senden

In vielen Fällen kann es interessant sein, neben den normalen Auswertungsmöglichkeiten über das Google Analytics Interface auch die Tracking "Rohdaten" auf Hit Ebene zu speichern, um sie für eigene tiefergehene Analysen zu nutzen. Während Google Analytics Premium mit dem Bigquery Export eine direkte Möglichkeit hierzu bietet, gibt es leider kein vergleichbares Feature mit der kostenlosen Analytics Version.

Mit der im Folgenden beschrieben Lösung lassen sich die Analytics Hits jedoch auf einfache und komfortable Art zusätzlich auch an einen eigenen Server Endpoint schicken, sodass man diese beispielsweise in ein Log-File oder eine Datenbank speichern kann. Somit hat man auch mit der kostenlosen Analytics Version Zugriff auf Tracking Rohdaten (sogar in Echtzeit).

Um die Tracking Daten zusätzlich an den eigenen Server zu schicken, kann folgender JavaScript Code eingesetzt werden - eine eigene Version der sendHitTask Funktion, die dann den Measurement Protocol Tracking Request sowohl an den Google Server als auch an den eigenen Server schickt.

function sendHitTask(){ 
    return function(model) {
        var payLoad = model.get('hitPayload');
        var trackingBaseUrls = ['//www.google-analytics.com/collect?', '//www.own-server.com/ownEndpoint?'];

        for (i = 0; i < trackingBaseUrls.length; i++) {
            if (payLoad.length < 400) {
                var collectUrl = window.location.protocol + trackingBaseUrls[i] + payLoad;
                var myImage = new Image();
                myImage.src = collectUrl;
            } else {
                var r = window.ord || Math.floor(Math.random() * 1e16);

                var myIframe = document.createElement('IFRAME');
                myIframe.width = "1px";
                myIframe.height = "1px";
                myIframe.style.display = 'none';
                myIframe.name = "tiframe_" + r;

                var myForm = document.createElement('FORM');
                myForm.method = 'POST';
                myForm.action = window.location.protocol + trackingBaseUrls[i];
                myForm.target = "tiframe_" + r;
                
                var parameterValuePairs = payLoad.split('&');

                for (var vpi=0; vpi < parameterValuePairs.length; vpi++) {
                    var splittedParameterValuePair = parameterValuePairs[vpi].split('=');
                    var parameterName = decodeURIComponent(splittedParameterValuePair[0]);
                    var parameterValue = (splittedParameterValuePair.length == 1) ? '' : decodeURIComponent(splittedParameterValuePair[1]);

                    var parameterInput = document.createElement('INPUT');
                    parameterInput.type = 'HIDDEN';
                    parameterInput.name = parameterName;
                    parameterInput.value = parameterValue;
                    myForm.appendChild(parameterInput);
                }

                document.body.appendChild(myForm);
                document.body.appendChild(myIframe);
                myForm.submit();
            }
        }
    }; 
}

Alternative Methode mit AJAX:

function sendHitTask(){
  return function(model) {
    var payLoad = model.get('hitPayload');
    var trackingBaseUrls = ['//www.google-analytics.com/collect', '//my-endpoint/tracker'];

    for (i = 0; i < trackingBaseUrls.length; i++) {
      var baseUrl = window.location.protocol + trackingBaseUrls[i];

      if (payLoad.length < 400) {
        var collectUrl = baseUrl +'?'+ payLoad;
        var myImage = new Image();
        myImage.src = collectUrl;
      } else {
        var req = Xhr();
        if(req != null){
          req.open('POST', baseUrl, true);
          req.send(payLoad);
        }
      }
    }
  };

  function Xhr(){
    try {
      return new XMLHttpRequest();
    }catch(e){}
    try {
      return new ActiveXObject("Msxml3.XMLHTTP");
    }catch(e){}
    try {
      return new ActiveXObject("Msxml2.XMLHTTP.6.0");
    }catch(e){}
    try {
      return new ActiveXObject("Msxml2.XMLHTTP.3.0");
    }catch(e){}
    try {
      return new ActiveXObject("Msxml2.XMLHTTP");
    }catch(e){}
    try {
      return new ActiveXObject("Microsoft.XMLHTTP");
    }catch(e){}
    return null;
  }
}

Um letztendlich die sendHitTask Funktion zu überschreiben, muss man folgenden Aufruf bei der Initialisierung des UA Trackers ergänzen bzw. wiederum das Gleiche über das GTM Interface realsieren: sendHitTaskFunction als Custom JavaScript Variable definieren und anschließend als sendHitTask Feld beim Analyitcs Tag übergeben.

ga('create', 'UA-XXXX-Y', 'auto');

ga(function(tracker) {
  tracker.set('sendHitTask', function(model) {
        // enter your send hit task function here
  });
});
GTM sendHitTask Override