Google Analytics zonder javascript

noscript.pngHeb je het gevoel dat je een deel van je bezoekers niet meet, of dat een deel je site niet optimaal kan gebruiken omdat ze javascript uit hebben staan? Meet dit dan door met Google Analytics. Zonder javascript een javascript gebaseerde teller aanroepen? Ja, dat kan.

Hoe meet Google Analytics

Het javascript bestand van Google Analytics (urchin.js of ga.js) verzamelt allerlei gegevens: referral, cookies, account ID, URL, enz. Vervolgens wordt een plaatje op de te meten pagina gezet die van de Google server gehaald word. In de URL van dat plaatje staan weer al die verzamelde gegevens, en op basis daarvan kan Google een meting uitvoeren. Het gaat dus allemaal om dat plaatje dat eigenlijk de gegevens verstuurd. De truc is om dat plaatje met een andere taal dan javascript te maken.

PHP in plaats van javascript

Allereerst credits voor Peter van de Graaf die een tijdje geleden een post op zijn weblog (link verwijderd: site bestaat niet meer) maakte over de exacte techniek die benodigd is. Met PHP worden zo veel mogelijk gegevens verzameld die een aanroep aan Google Analytics mogelijk maken. Vervolgens wordt vanaf de webserver het Google Analytics plaatje opgevraagd en is de meting gereed.

Enkele aanpassingen
Ik heb een paar wijzigingen doorgevoerd om een aantal redenen. Allereerst doe ik de aanroep naar het plaatje niet vanuit mijn server, maar laat ik het plaatje gewoon meeladen in de pagina. Mijn bezoekers vragen dus vanaf hun eigen pc dat plaatje op, dit levert mij weer extra gegevens op zoals bijvoorbeeld de Geografische locatie en Service provider. Daarnaast gebruik ik het script binnen <noscript> elementen als backup voor het reguliere meetscript. Peter gaf een oplossing om iets zoals bijvoorbeeld een RSS feed zonder javascript te meten, ik wil graag de bezoekers die geen javascript hebben meten.

Het script ziet er als volgt uit (kan direct onder het reguliere script geplaatst worden):

<noscript>
<?php
$var_utmac = 'UA-XXXXX-1';
$var_utmhn = 'voorbeeld.nl'; // domein
$var_utmn = rand(1000000000,9999999999); // random nummer
$var_cookie = rand(10000000,99999999); //random cookie nummer
$var_random = rand(1000000000,2147483647); //nummer onder 2147483647
$var_today = time();
$var_referer = $_SERVER['HTTP_REFERER']; //referer url
if ($var_referer == '') { $var_referer = '-'; }
$var_uservar='-'; // de user defined
$var_utmp='/jstracker' . $_SERVER['REQUEST_URI']; // mapje tracker om alles in te meten
$urchinUrl='http://www.google-analytics.com/__utm.gif?utmwv=3&utmn=' . $var_utmn . '&utme=&utmcs=-&utmsr=-&utmsc=-&utmul=-&utmje=0&utmfl=-&utmdt=-&utmhn=' . $var_utmhn . '&utmhid=' . $var_utmn . '&utmr=' . $var_referer . '&utmp=' . $var_utmp . '&utmac=' . $var_utmac . '&utmcc=__utma%3D' . $var_cookie . '.' . $var_random . '.' . $var_today . '.' . $var_today . '.' . $var_today . '.2%3B%2B__utmz%3D' . $var_cookie . '.' . $var_today . '.2.2.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B%2B__utmv%3D' . $var_cookie . '.' . $var_uservar . '%3B';
echo ' <img src="' . $urchinUrl . '" border="0" />';
?>
</noscript>

Let op: in de $var_utmp heb ik de map /jstracker voor de pagina URL's gezet. Dit geeft mij de mogelijkheid om deze map met javascriptloze bezoekers in een apart profiel bij te houden. Aangezien enkele data niet goed gemeten kan worden mag het mijn hoofdprofiel niet verstoren. Ik raadt een ieder aan een soortgelijke oplossing te hanteren, ga niet je hoofdprofiel verruïneren.

Resultaat

Ik weet nu dat ongeveer 2,5% van mijn bezoekers javascript uit heeft staan. Dit is een deel die voorheen niet bestond, en elk stukje extra informatie over je sitebezoekers is mooi meegenomen.

Click to activate social bookmarks

 
  • http://www.roelwillems.com Roel Willems

    Geweldige post! Ik was zelf ook al eens met het idee aan het spelen om zoiets te maken (ik had het idee dat het technisch mogelijk zou moeten zijn). Maar nooit aan toegekomen.
    Erg goed werk in ieder geval, ga het snel keer testen.

  • Paul van Dam

    Is het niet mogelijk om de img-url zo aan te roepen dat ie een event trackt? Op deze manier hoe je geen los profiel bij te houden en kun je simpelweg bijvoorbeeld een 'nojspagevisit' event tracken.

  • http://andrescholten.net André

    Het zou kunnen, maar event-tracking zit op dit moment alleen nog maar in beta-test accounts.

  • http://www.nr6.nl Barry

    Lijkt me een zeer nuttige toevoeging maar ik heb er 1 vraag over. Ik zie onderaan $urchinUrl staan. Werkt dit script ook met ga.js?

  • http://andrescholten.net André

    Ja hoor, geen probleem.

  • Phil

    * Vil robotter besøg registreres?

    Skal jeg oprette en ny profil for det samme domæne (f.eks UA-xxxx-2) til at filtrere disse?

    * Er det værd at optage user-agent i uservar eller utm_content områder?
    uservar = $ _SERVER [ 'HTTP_USER_AGENT'] eller utmcct = $ _SERVER [ 'HTTP_USER_AGENT']

    * Er det muligt at bruge $ _COOKIE eller $ _SESSION at ændre standard for alle besøg, der er sat til 2 besøg & 2 sidevisninger?. Jeg tror, hvis der ikke cookies indstilles disse ikke virker?

    * Er de en måde at tilføje server-side afsløring om henvisning utm_source = [SE], utm_medium = [], utm_term = [søgeord]?

    2.2.utmcsr=SOURCE|utmccn=CAMPAIGN|utmcmd=MEDIUM|utmctr=KEYWORD|utmcct=CONTENT;

    Tak

    Phil.

  • Johan Sikkema

    Beste André,
    Een aantal websites, die ik wil bezoeken, linken door naar http://www.google-analytics.com en daarna kan ik wachten tot ik een ons weeg, maar het groene balkje rechtsonder blijft maar voor 75% gevuld. Ik kom dan niet op de gewenste site, bijvoorbeeld "buienradar.nl".
    Al een paar jaar kan ik javascript niet updaten. Daar is al een heleboel over geschreven.
    Heeft dat met elkaar te maken?
    Met vriendelijke groet,
    Johan in Emmeloord.

  • http://robiii.tweakblogs.net/ RobIII

    Het lijkt me wel verstandig om een aantal veriabelen ($var_utmhn, $var_referer, $var_uservar, $var_utmp) te url-encoden.

  • http://andrescholten.net André

    Hmm, goede tip, maakt het een stuk veiliger ;)

  • http://robiii.tweakblogs.net/ RobIII

    Schreef ik nou echt veriabelen? :X
    Enniehoe: of het veiliger is of niet hangt sowieso af van het feit hoe je de waardes vult en of je zaken, waar nodig(!) HTML-encode etc. Ik opperde het vooral omdat bijvoorbeeld een uservar met waarde "a&b" dan bijvoorbeeld niet goed door gaat komen.