Google Analytics, P3P, iframes, Internet Explorer en cookies

ie7Wat hebben deze termen met elkaar gemeen? Dat de combinaties van de laatste 3 vaak problemen opleveren voor een Google Analytics meting. En de 2de term een onderdeel is van de oplossing.

Dit zijn de problemen:

  • Google Analytics cookies doorgeven aan een (i)frame
  • Cookies in (i)frames met inhoud van externe domeinen worden geblokkeerd in Internet Explorer

Google Analytics, frames en iframes

Om op een goede manier het bezoek binnen een frame te meten moeten er een aantal zaken in het Google Analytics meetscript geregeld worden. Het ligt aan de situatie welke oplossing er het beste toegepast kan worden. Hieronder de diverse situatie met de bijbehorende oplossing:

Pagina met (i)frame op hetzelfde hoofddomein

  • voorbeeld.nl/hoofdpagina.html
  • voorbeeld.nl/pagina-in-frame.html

Omdat zowel de hoofdpagina als de pagina die in het frame geladen wordt op hetzelfde domein staan zijn er geen problemen met de meting. Op beide pagina's wordt er gebruik gemaakt van dezelfde cookies en hoeft er dus niets te gebeuren.

Pagina met (i)frame op een subdomein van hetzelfde hoofddomein

  • voorbeeld.nl/hoofdpagina.html
  • sub.voorbeeld.nl/pagina-in-frame.html

Omdat technisch gezien de beide pagina's op een ander domein staan maken ze allebei standaard gebruik van hun eigen cookies. Wat er dan gebeurd is dat in het (i)frame de hoofdpagina.html als verwijzende bron in de cookies geplaatst wordt. Dit is niet een gewenste situatie omdat je dan je eigen site als externe verwijzende bron gerapporteerd ziet worden. Er zijn 2 oplossingen. De eerste is door op het subdomein ook gebruik te maken van de cookies op het hoofddomein. Dit kan gedaan worden door de volgende regel in de Google Analytics meetcode op te nemen op beide domeinen:

pageTracker._setDomainName(".voorbeeld.nl");

De cookies worden dan op 1 centrale plaats gebruikt. Helaas werkt dit niet voor 2 letter domeinen, daar moet de cookie op "www.xx.nl" gezet worden.

De tweede oplossing (die je dus ook bij 2 letter domeinen moet gebruiken) is door de cookies van het hoofddomein mee te geven aan het subdomein. Dit kan gedaan worden door het (i)frame met javascript in de pagina te plaatsen:

<script>
document.write('<iframe src="' + pageTracker._getLinkerUrl("http://sub.voorbeeld.nl/pagina-in-frame.html") + '"></iframe>');
</script>
<noscript>
<iframe src="http://sub.voorbeeld.nl/pagina-in-frame.html"></iframe>
</noscript>

Of met de asynchrone Google Analytics code:

<div id="myIframe"></div>
<script>
var iframe_url = 'http://sub.voorbeeld.nl/pagina-in-frame.html';
window.onload = function() {
var divElm = document.getElementById('myIframe');
var iFrame = document.createElement('iframe');
iFrame.src = _gat ? _gat._getTrackerByName()._getLinkerUrl(iframe_url, false) : iframe_url;
divElm.appendChild(iFrame);
};
</script>
<noscript>
<iframe src="http://sub.voorbeeld.nl/pagina-in-frame.html"></iframe>
</noscript>

Let op: de Google Analytics functies (ga.js) moeten wel al ingeladen zijn voor dit script gebruikt word. De _getLinkerUrl functie zorgt er voor dat de Google Analytics cookies meegegeven worden aan de URL van het (i)frame.

Pagina met (i)frame op een ander (sub)domein dan het hoofddomein

  • voorbeeld.nl/hoofdpagina.html
  • example.com/pagina-in-frame.html

Deze situatie komt bijvoorbeeld vaak voor bij externe boekingssytemen. Op een of andere manier wil je de Google Analytics cookies toch meesturen om zo de uiteindelijke conversie aan de juiste bezoekersbron toe te kennen.

In principe kan voor deze situatie dezelfde oplossing gebruikt worden als in bovenstaande situatie: schrijf het (i)frame met javascript in de pagina.

Maar dan komt het echte probleem: Internet Explorer ziet pagina's van externe domeinen die geladen worden in een (i)frame als Third Party Content. Oftewel: cookies vanaf deze pagina's worden door de beveiligingsinstellingen geblokkeerd. En omdat de cookies geblokkeerd worden zal er ook geen Google Analytics meting plaatsvinden. Dit kun je dan weer oplossen met P3P.

p3

P3P en Internet Explorer

Wat is P3P dan precies? P3P staat voor "Platform for Privacy Preferences Project". Ik ga niet uitleggen wat het precies is, daar zijn anderen beter in en herhaling is ook zo saai. 😉 Maar de korte samenvatting is: "je koppelt een privacy beleid aan je site met een door computers en mensen te begrijpen inhoud".

Wat is er dan zo mooi aan? Met het juiste P3P privacy beleid zal Internet Explorer de cookies van het externe domein in het (i)frame keurig accepteren en zal er dus een Google Analytics meting plaatsvinden. De voordelen zijn:

  • Wanneer je site ingeframed wordt door een externe site zal dit keurig gemeten worden
  • Dit geldt dus ook voor de Google Image Search die ineens wel meetbaar wordt
  • Je Google Analytics meting is weer een stapje vollediger en betrouwbaarder

Een duidelijke zaak dus dat je dit geïmplementeerd wil hebben. Wat moet er voor gebeuren, hieronder stap voor stap de acties:

Toevoeging in de <head>
In de <head> moet een element opgenomen worden dat verwijst naar de plek waar de P3P instellingen te vinden zijn. Dit ziet er als volgt uit:

<link rel="P3Pv1" href="/w3c/p3p.xml" />

De locatie die ik hanteer is tevens de standaard locatie waar dit bestand zou moeten staan.

Inhoud van het P3P XML bestand

<META xmlns="http://www.w3.org/2002/01/P3Pv1">
<POLICY-REFERENCES>
<POLICY-REF about="http://andrescholten.net/w3c/privacy.xml#Privacy_Policy">
<INCLUDE>/*</INCLUDE>
<COOKIE-INCLUDE/>
</POLICY-REF>
</POLICY-REFERENCES>
</META>

Zoals je ziet staat hier weer een verwijzing in naar de plek waar de voor de computer te begrijpen privacy instellingen te vinden zijn. De inhoud van dat bestand kun je hier bekijken. Daarin staat het privacy beleid wat je voert beschreven, tevens een link naar de voor mensen te begrijpen privacy statement.

Toevoeging in de headers van je site
Bekijk eerst de HTTP headers van mijn site (handige tool om ook redirects te controleren). Zoals je kunt zien staat deze zin er in:

p3p: policyref="http://andrescholten.net/w3c/p3p.xml", CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"

In deze header staat ook een link naar het P3P XML bestand en tevens een verkorte notatie van het privacy beleid. In WordPress kun je in je header.php op regel 1 op deze manier de header toevoegen:

<?php header("p3p: policyref="http://andrescholten.net/w3c/p3p.xml", CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"");?>

De afronding
Nadat je zelf ook een publieke privacy statement online hebt gezet (wat verplicht is als je Google Analytics gebruikt), kun je je beleid valideren. Als alles goed is gegaan worden nu ook cookies van externe domeinen in een (i)frame geaccepteerd.

Tipje: ik heb deze P3P editor gebruikt. En alsjeblieft: ga me niet naar de verkorte notatie vragen die in de headers gebruikt worden. Zo zwaar heb ik me daar niet in verdiept, ik was alleen op zoek naar een oplossing voor Google Analytics 😉

De resultaten

Wanneer ik nu mijn site in een (i)frame laadt vanaf een andere site worden toch de Google Analytics cookies geplaatst. Dit is bijvoorbeeld de (ingeknipte) inhoud van de utmz cookie wanneer ik een ingeframed bezoek doe vanuit de Google Image search:

__utmz
utmcsr=images.google.nl
utmccn=(referral)
utmcmd=referral
utmcct=/imgres

Lees ook hoe ik dit weer gebruik om de Google Image Search als zoekmachine door te meten inclusief het gebruikte zoekwoord.

Click to activate social bookmarks

 
  • Op deze pagina is informatie te vinden over hoe Internet Explorer precies met P3P omgaat.

    Hier staat dus welke policies voor cookie acceptatie zorgen en welke niet.
    Daarnaast staat er dat je alleen een verkorte policy nodig hebt voor cookie acceptatie. Het XML bestand is hiervoor dus niet noodzakelijk.

  • @Jorrit: dank voor de link. Ik weet dat het met de korte policy al werkt, maar een volledige implementatie kan geen kwaad 😉

  • Andre,
    Natuurlijk was ik van plan om je aanpassing direct door te laten voeren bij een klant van mij, maar ook (bijna) natuurlijk ondersteund het CMS deze methode niet standaard. En blijkt het een kostbare aangelegenheid om deze aanpassing aan het cms door te voeren. Nu werd aan mij gevraagd of het zich inderdaad terug vertaald in betere cijfers. Naar aanleiding daarvan ben ik eens gaan kijken wat er nu daadwerkelijk gebeurt met het cookie als de iframe pagina wordt aangesproken. Eerlijk gezegd zie ik niks veranderen aan het cookie en blijft de originele bron van afkomst bestaan in het cookie van de geladen iframe pagina. Kortom ik begrijp je oplossing, maar blijkbaar zijn er uitzonderingen wanneer je je oplossing toepast.
    ik heb het alsvolgt gestest. Al mijn cookie's die betrekking hebben op het betreffende domein verwijderd.
    Vervolgens via een google adwords advertentie naar de site gegaan.
    Cookie is geplaatst met de juiste bron informatie
    vervolgens ben ik naar een pagina gegaan met daarin het iframe en heb gecontroleerd of de bron informatie van Google adwords naar direct werd overschreven... En dat was niet het geval.

    voorbeeld.nl/bestel met iframe bestel.voorbeeld.nl/helelangenaampagina beide GA tags maken gebruik van pageTracker._setDomainName("voorbeeld.nl");
    pageTracker._setAllowLinker(true);

    Ik heb het een ander gecontroleerd met firefox en firebug

    Test ik het nou verkeerd of is jou oplossing op en of andere manier hierop niet van toepassing?

  • Jouw voorbeeld gaat over een subdomein en een hoofddomein van hetzelfde domein, daar treedt het probleem niet op aangezien sub domeinen cookies kunnen delen met hun hoofddomein. Dat wordt ook genoemd in het 2de stuk hierboven "Pagina met (i)frame op een subdomein van hetzelfde hoofddomein".

  • Om te beginnen bedankt voor je snelle respons. Je hebt gelijk, ik heb te snel een conclusie getrokken.. Dan toch nog een klein vraagje. Hoe belangrijk is de . voor het domein? want deze staat er bij mijn klant niet voor..

  • Volgens mij is die redelijk belangrijk omdat je dan aangeeft dat alles wat eindigt op .domein.nl bij de cookie mag. Maar wellicht dat het zonder die punt ook werkt, nog nooit getest eigenlijk.

  • Ik zal het eens laten wijzigen en kijken of het enig verschil uit maakt. Ik laat je weten wat het resultaat is. Alvast bedankt.

  • He André

    bedankt voor de uitleg waar ik al een tijdje naar op zoek was!
    Ik heb een iframe.php bij een andere site hangen en zou inderdaad graag ook de bezoeken aan die site kunnen zien/meetellen in mijn analytics.

    Ik heb je stappen gedaan alleen was mijn vraag nog even: de toevoeging in de headers .. moet dit in de header van mijn iframe.php of in de headers van de desbetreffende website waar mijn iframe in getoond wordt ?

    Alvast bedankt!

  • In de headers van je iframe 😉

  • Had er zelf nog geen last gehad, maar het is altijd interessant om te weten dat er oplossingen bestaan voor dergelijke problemen...

  • Benjamin

    Hoi Andre,

    Handig artikel!

    Alleen zit ik toch nog even met je punt "Pagina met (i)frame op hetzelfde hoofddomein" hier kan je uiteindelijk niet meten als de iframe pagina veranderd binnen de gestelde pagina.

    Stel je hebt "example.com/iframe"

    Ik bezoek de site en druk binnen het iframe op een blok. Vervolgens herlaat de iframe maar de url verandert niet omdat de hoofdpagina ook niet veranderd want je clickt immers binnen het iframe. Dus dan valt het toch niet te meten?

    Groeten en bedankt,

    Benjamin

  • Jawel, wanneer de iframe herlaad krijgt die een andere URL, en dus kun je die meten. De oplossing is door in je iframe code ook een Google Analytics meetcode te plaatsen.

  • Thanx André! Heb er veel aangehad en het is me gelukt... 🙂

  • daka

    Hoi Andre,
    Ik heb tutorial gelezen en ik weet niet of mij dit lukt?
    Hier is de verhaal:
    ik heb website: http://www.iets.nl die houd in de iframe van affiliate partner affiliatepartner.nl
    Ik heb P3P geinstaleerd zoals jij dat deed.
    Volgende code heb ik van partner erin geplaatst:


    dan heb ik analytics zoals volgende geplaatst:

    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));

    try {
    var pageTracker = _gat._getTracker("UA-xxxxxxxx-xx");
    pageTracker._setDomainName("none");
    pageTracker._setAllowLinker(true);
    pageTracker._trackPageview();
    } catch(err) {}

    var iframe = document.getElementById("myIFrame");
    iframe.src = pageTracker._getLinkerUrl("http://mini.beslist.nl/minisite/?request=list&query=acer&maincatID=6");

    Met die p3p heb ik geen privacy raport, wat denk ik betekent dat ik p3p goed geinstaleerd had!
    En nu nog doel opzetten:
    bij de doelen in analytics heb ik volgende gezet:
    http://mini.beslist.nl/php/ (hier komt nog veel meer erachter, maar dat zijn wel rare codes)
    omdat hiernaa komt een blank link die leidt naar een doel

    Dus als ik klik op de link in analytics bij de doelen zie ik niks
    en hoe kan ik uberhoupt zien of het werkt???

    Ik ben al week me bezig en niks....
    gr. daka

  • He Daka, kun je dit misschien even naar me mailen? Dan zitten ook alle codes er bij 😉

  • Rien Hermans

    Hallo Andre, mooie info!

    Ik heb een externe booking engine in een (i)frame. Moet ik de P3P header nu aanpassen op mijn eigen site of op het domein van de (i)frames?

    Groet,
    Rien

  • Op het domein van het iframe 😉

  • Rien Hermans

    Dank.
    Je zit me toch niet uit te lachen he 😉

  • Wouter

    Hey André,

    Op deze manier wordt als referrer altijd de naam van de parent gezet. Wij geven deze altijd handmatig door aan het IFrame. Is daar ook nog een makkelijkere oplossing voor?

  • @Wouter: als het goed is worden de Google Analytics cookies meegegeven en zou de bron die daar in staat als bron van het iframe gemeten moeten worden. En niet de meegegeven referrer. Of bedoel je dat niet?

  • Beste André,

    Bedankt voor dit artikel. Dit is zo ongeveer het eerst wat begrijpelijk op mij overkomt. Het blijft toch wel lastig en moet uiteraard wel goed gaan.

    Wij hebben het iframe op een subdomein staan wat gelijk is aan het domein. Dit staat duidelijk vermeld. Wij hebben geen 2 letter domein. Klopt het dat ik binnen de GA-code enkel:
    pageTracker._setDomainName(".website.nl")
    moet bij plaatsen?

    Of moet ik hierna ook nog _getlinkurl bij de link plaatsen (dit heb ik ook meerdere malen gelezen op diverse blogs)

    Ik hoop dat je meer duidelijkheid kan geven zodat wij het eindelijk goed kunnen wegschrijven.

    Mvg

    Rutger van den Brule

  • Siegert

    Hi André,

    Is het mogelijk dat IE er problemen mee heeft indien de iFrame content op een https domain staat?
    Ik heb op 2 verschillende projecten met iframe en cross-domain tracking alles volgens het boekje gedaan, maar bij project B heb ik nog steeds problemen.
    Het enige verschil tussen A en B is het feit dat de iframe pagina in project B op een secure omgeving staat. En misschien vind IE daardoor de P3P niet (hoewel die wel oplaadt in IE als ik de rechtstreeks https url gebruik)?

    Alle tips welkom.

    Tx,
    Siegert

  • Dat zou inderdaad een reden kunnen zijn waarom het niet werkt. Wellicht kun je dit testen door met een eigen script in het iframe een testcookie te plaatsen. Als dat niet werkt ligt het aan de https icm een iframe.

  • Siegert

    Tx. Een dedicated GA scriptje met unieke account ID voor de iframe bedoel je?

  • Nee, gewoon een javascriptje die een cookie zet is al genoeg om te testen 😉

  • Andre,

    Ik heb geprobeerd om het javascript (iframe) aan te passen naar de ge-up-date versie van de google analytics tag. _gaq.push(['_setAllowLinker', 'true']);

    Ik ben al een tijdje aan het knutselen maar mijn javascript kennis schiet schromelijk te kort. Wellicht dat jij een voorzet kunt geven. Hoe het nu er moet komen te zien.

    Alvast bedankt.