Nye Google Analytics lar deg spore hva som helst 7

Universal Analytics er den nye versjonen av Google Analytics, og Google betalanserte løsningen i mars i år. Ordet «Universal» indikerer at den nye versjonen nå kan spore mer enn bare nettsider.

Dette er Universal Analytics

Med Universal Analytics kan du for eksempel spore:

Med Universal Analytics kan du se at den samme brukeren har kjøpt noe på både mobil, nettbrett og desktop.
Med Universal Analytics kan du se at den samme brukeren har kjøpt noe på både mobil, nettbrett og desktop.

I denne presentasjonen fra utviklerkonferansen Google I/O snakker folkene bak Universal Analytics om hvordan det fungerer:

User ID og Measurement Protocol

Den store nyheten er at Universal Analytics kan spore brukere på tvers av alle plattformer.

Hvordan kan man vite at det er snakk om den samme brukeren på både mobil, nettbrett og desktop?

Google sier selv at brukeren må være logget inn for å kunne telles som én bruker på tvers av plattformer. I praksis trenger du en «User ID» som forteller hvem brukeren er.

Det er ikke lov å sende personlig identifiserende informasjon til Universal Analytics, så her må man gå forsiktig frem. Du kan altså ikke sende brukernavnet til Google, i stedet må du generere en unik kode som du sender hver gang den samme brukeren besøker nettsiden/appen/butikken din.

Foreløpig er ikke User ID tilgjengelig for alle, men andre deler av Universal Analytics er det mulig å teste ut i dag.

Du kan prøve Universal Analytics ved å opprette en ny konto eller property i Google Analytics. Da får du valget mellom Universal Analytics og «gamle» Google Analytics. Universal Analytics er nå valgt som standard, og om en stund vil alle gamle kontoer bli konvertert til Universal Analytics.

Brukergrensesnittet til Universal Analytics er helt likt som Google Analytics, og du har tilgang til nesten alle de samme rapportene.
Brukergrensesnittet til Universal Analytics er helt likt som Google Analytics, og du har tilgang til nesten alle de samme rapportene.
De nye rapportene i Universal Analytics vil vise inntekter fra den samme brukeren på tvers av plattformer. Rapportene som viser oppførsel på tvers av plattformer er foreløpig ikke tilgjengelige, siden User ID ikke er tilgjengelig for de fleste.
De nye rapportene i Universal Analytics vil vise inntekter fra den samme brukeren på tvers av plattformer. Rapportene som viser oppførsel på tvers av plattformer er foreløpig ikke tilgjengelige, siden User ID ikke er tilgjengelig for de fleste.

Sporing uten Javascript

Den nye sporingskoden til Universal Analytics ser slik ut:

(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','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-20250367-4', 'rundberg.no');
  ga('send', 'pageview');

Du trenger imidlertid ikke bruke Javascript for å spore brukere, og derfor er det nå mulig å spore hva som helst.

Sporing uten Javascript har vært mulig før også, men i Universal Analytics har du fått langt flere muligheter gjennom det Google kaller Measurement Protocol.

Her er noen eksempler på hvordan du kan spore sidevisninger og hendelser ved hjelp av PHP og Measurement Protocol.

PHP-klasser for cookies og sporing

I de to første eksemplene skal vi etterligne Javascript-sporingen til Universal Analytics, og da må vi kunne lese og skrive informasjonskapselen/cookien som Universal Analytics bruker.

class universalAnalyticsCookie {

	/*
	* Name: Universal Analytics Cookie Parser Class
	* Description: Parses the new format Universal Analytics cookie. 
	* Developer: Matt Clarke
	* Date: January 10, 2013
	* Modified by Audun Rundberg
	*/

	/*
	* Get cid from the cookie
	*/

	public function getCid () {

		if (isset ($_COOKIE["_ga"]) ){

			$contents = $this->parse ();
			return $contents['cid'];

		}
		else {

			return false;

		}

	}

	/*
	* Handle the parsing of the _ga cookie
	* This assumes the 32bit + 32bit CID format, not the new
	* UUID v4 format
	*/

	private function parse () {

		list ($version,$domainDepth, $cid1, $cid2) = explode ('.', $_COOKIE["_ga"], 4);
		return array ('version' => $version, 'domainDepth' => $domainDepth, 'cid' => $cid1.'.'.$cid2);

	}

	/*
	* Creates a new GA cookie and returns the tracking id (cid)
	*/

	public function set () {

		$cid1 = mt_rand (0, 2147483647);
		$cid2 = mt_rand (0, 2147483647);

		$cid = $cid1 . '.' . $cid2;
		setcookie  ('_ga', '1.2.' . $cid, time ()+60*60*24*365*2, '/');

		return $cid;

	}

}

Den neste klassen bruker jeg til å gjennomføre selve sporingen. Du trenger PHP og Curl for at den skal funke.

class universalAnalytics {
        /*
        * Name: Universal Analytics tracking class
        * Description: Track user behaviour using Google's measurement protocol
        * Developer: Audun Rundberg
        * Date: August 2, 2013
        */

        protected $commonParameters = array ();
        protected $version = '1';
        protected $url = 'http://www.google-analytics.com/collect';

        /*
        * Inital setup of the tracking info to be submitted to Google
        * "tid" is the Universal Analytics tracking ID, i.e. UA-XXXXX-X
        * "cid" is the Client ID, which can be part of the cookie
        * "useServer" indicates if we should use $_SERVER to set the
        * host, path and referer parameters
        */

        public function __construct ($tid, $cid, $useServer = false) {

                // Version (required)
                $this->commonParameters['v'] = $this->version;

                // Tracking ID (required)
                $this->commonParameters['tid'] = $tid;

                // Client ID (required)
                $this->commonParameters['cid'] = $cid;

                // Host, path and referer are not required, but we probably want
                // to set them and can do so using $_SERVER
                if ($useServer) {

                        if (array_key_exists ('SERVER_NAME', $_SERVER)) {

                                $this->commonParameters['dh'] = $_SERVER['SERVER_NAME'];

                        }
                        if (array_key_exists ('REQUEST_URI', $_SERVER)) {

                                $this->commonParameters['dp'] = $_SERVER['REQUEST_URI'];

                        }
                        if (array_key_exists ('HTTP_REFERER', $_SERVER)) {

                                $this->commonParameters['dr'] = $_SERVER['HTTP_REFERER'];

                        }

                }

        }

        /*
        * Track the event/pageview
        * "parameters" is an array of parameters and values that will be sent to Google
        * The minimum requirement is to supply the "Hit type" parameter, i.e. array ('t' => 'pageview')
        * See https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#t
        */

        public function track ($parameters) {

                try {

                        // Require parameter 't'
                        if (is_array ($parameters) and isset ($parameters['t'])) {

                                $parameters = array_merge ($this->commonParameters, $parameters);

                        }
                        else {

                                throw new Exception ('Hit type parameter "t" is required');

                        }

                        $ch = curl_init ();

                        //set the url and don't output the data directly
                        curl_setopt ($ch, CURLOPT_URL, $this->url);
                        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

                        // Add user-agent to the request
                        if (array_key_exists ('HTTP_USER_AGENT', $_SERVER)) {

                                curl_setopt ($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);

                        }
                        //url-ify the data for the POST
                        $parametersString = http_build_query ($parameters);

                        curl_setopt ($ch, CURLOPT_POST, true);
                        curl_setopt ($ch, CURLOPT_POSTFIELDS, $parametersString);

                        //execute post request
                        curl_exec ($ch);

                        // Get info
                        if (substr (curl_getinfo ($ch, CURLINFO_HTTP_CODE), 0, 1) != '2') {

                                throw new Exception ('HTTP status code is not 2XX. Something went wrong.');

                        }

                        //close connection
                        curl_close ($ch);
                        
                        
                }
                catch (Exception $e){

                        echo $e->getMessage ();

                }

        }
        
}

Eksempel 1: Spore sidevisning

I dette eksempelet bruker jeg de to klassene til å spore en sidevisning.

/*
* This example shows how to get and set the _ga cookie, track a
* pageview and an event using the Measurement Protocol.
*
* For more examples of tracking with the Measurement Protocol, see
* https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide
*
* For a list of all parameters, see
* https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters
*/

require ('class.universalAnalyticsCookie.php');
require ('class.universalAnalytics.php');

// Tracking ID (required)
$tid = 'UA-20250367-2';

/*
* Get existing Client ID from the _ga cookie, or set a new cookie
* If the _ga cookie exists, that means the user has visited the
* site before. The cookie may have been set by Google Analytics
* Javascript code, or by universalAnalyticsCookie. Either way,
* we'll reuse the Client ID if we can, which means that we won't
* count the same user twice if both Javascript and server-side
* tracking is being used.
*/

$cookie = new universalAnalyticsCookie ();
if (!$cid = $cookie->getCid ()) {

	$cid = $cookie->set ();

}

// Use $_SERVER variables for host, path and referer
$useServer = true;

$ua = new universalAnalytics (
	$tid,
	$cid,
	$useServer);

/*
* Track pageview
*
* 't' is a required parameter, see
* https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#t
*
* 'dp' is the document path, see
* https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#dp
*/

$ua->track (array (
	't' => 'pageview',
	'dp' => '/example'));

Eksempel 2: Spore hendelse

I dette eksempelet bruker jeg de to klassene til å spore en hendelse/event. En hendelse kan være hva som helst, men typisk noe brukeren gjør som ikke innebærer en sidevisning. Et eksempel kan være å starte eller stoppe avspillingen av en video, eller å laste ned en fil.

/*
* Track event
*
* 'ec' is the event category, seee
* https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#ec
*
* 'ea' is the event action, seee
* https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#ea
*/

$ua->track (array (
	't' => 'event',
	'ec' => 'Download',
	'ea' => '/files/example.pdf'));

Og hva så?

De to eksemplene viser hvordan helt standard sporing kan gjøres uten Javascript.

Det er ikke så unyttig som det høres ut. Når sporingskoden kjører på serveren, kan du f.eks. spore filnedlastinger, også filnedlastinger som skjer direkte fra Google-søk eller via linker fra andres nettsteder. Det får man ikke til med Javascript, siden brukeren i disse tilfellene aldri besøker nettstedet ditt og den vanlige Javascript-sporingskoden ikke laster.

Eksempel 3: Sporing på tvers av plattformer

Det mest spennende med Universal Analytics er å kunne spore brukere på tvers av plattformer, også plattformer som ikke er nettsider.

Det er User ID-parameteret som gjør at brukeren kjennes igjen på tvers. Hver gang den samme brukeren gjør noe, enten det er på nettsiden, appen eller i butikklokalene dine, sender du samme User ID til Google.

Foreløpig betyr det at «absolutt unike besøkende» øker med 1 når en ny bruker kommer til, selv om denne brukeren benytter både mobil, nettbrett og PC. Når de nye rapportene er på plass, vil du kunne se sammenhengen mellom alle plattformene du sporer.

Foreløpig er ikke User ID tilgjengelig for alle, så her er et eksempel der jeg jukser til en løsning ved hjelp av Client ID (som er den gamle måten å gjenkjenne nettlesere/enheter på).

/*
* This example shows how to track a pageview with a custom Client ID
*
* You can use this with something like hcitool (a Bluetooth command line tool for Linux)
* to scan for nearby Bluetooth devices and track them using Universal Analytics
*
* For more examples of tracking with the Measurement Protocol, see
* https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide
*
* For a list of all parameters, see
* https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters
*/

require ('class.universalAnalytics.php');
require ('class.uuidv4.php');

// Tracking ID (required)
$tid = 'UA-20250367-3';

while ($string = trim (fgets (STDIN))) {

        /*
        * Client ID (required)
        *
        * Since we're not getting the Client ID from the _ga cookie, we have
        * to generate it ourselves.
        *
        * Our source for the Client ID is STDIN, so whatever is read from STDIN
        * will be turned into a Client ID by the generateFromString function
        */

        $cid = uuidv4::generateFromString ($string);

        $ua = new universalAnalytics (
                $tid,
                $cid);

        /*
        * Track pageview
        *
        * 't' is a required parameter, see
        * https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#t
        *
        * 'dh' is the host, see
        * https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#dh
        *
        * 'dp' is the page path, see
        * https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#dp
        */

        $ua->track (array (
                't' => 'pageview',
                'dh' => 'localhost',
                'dp' => '/~audun/nettbutikk/kvittering'));
                
        echo 'Tracked pageview for ' . $cid . "\n";
}

All koden jeg har brukt her er tilgjengelig på Github.

Audun Rundberg

Flere artikler av Audun CV

7 kommentarer

  1. Pingback: → Sosial direkte 5 digitale notiser fra Norge, Sverige, Halden og verden - Sosial direkte
  2. Takk for fin sak. Interessant om å spore hendelser. Du skriver bl.a. at “Et eksempel kan være å starte eller stoppe avspillingen av en video, eller å laste ned en fil.”

    Vil andre eksempler kunne være å starte/stoppe musikkfil i en strømmetjeneste? Og er det mulig å bruke analytics på hendelser i en eBok? (eksempelvis åpne lenke, definere ord, gå til fotnote?)

  3. Ja, det kan være hva som helst. Klikk på knapper, skjule/vise et element, start/stopp av musikk/video. Det typiske er nok at man har lagt inn sporingskoden på nettsiden sin, og så oppdager man at det er mange ting som ikke fanges opp fordi Google Analytics bare fanger opp sidevisninger som standard.

    Ebøker: Det har jeg ikke vært borte i, men løsningen kommer nok an på formatet du har distribuert boken som. Er det et spesielt format du bruker?

  4. I teorien kan man vel også spore handlinger i en e-bok, så fremt programvaren for e-bokleseren støtter å sende data når brukeren samhandler. Men i eksisterende løsninger en ikke råder over selv vil jo det naturligvis ikke være mulig. Tviler f.eks. på at Amazon ikke vet hva deres Kindle-brukere foretar seg på lesebrettene deres.

  5. Lenkene i en ebok kan du spore om du sender folk via bit.ly eller en lignende tjeneste. Om du lenker til ditt eget nettsted kan du legge til din egen kampanjesporing.

  6. Pingback: → Catalytics: Track your cat’s eating habits using Google Analytics — iAllenkelhet
  7. Pingback: → Tonys Blogg » Blog Archive » Virksomheters bruk av måleverktøy – Hvorfor måle, og hva bør måles?

Skriv en kommentar

  • *

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>