We gaan wat dieper in op de manier waarop je A/B MV tests kunt implementeren.
De eerste stap is het uitbreiden van de contenttype(n) die je wilt testen, met een aantal velden. Een voorbeeld zie je in de afbeelding.
In een apart tabblad zijn drie velden opgenomen. Het eerste veld koppelt de layout varianten die je wilt testen met het testitem. Het tweede veld is een lijst van targets die op het testitem aanwezig zijn. Dit zijn de items die kunnen leiden tot een conversie. Als laatste een slider waarmee je aangeeft in hoeverre de standaard layout meetelt bij het genereren van de random layout. Als de standaard testpagina bijvoorbeeld nu al geld oplevert, dan wil je het risico dat je geld misloopt omdat de standaardpagina veel minder getoond wordt, beperken. Dat doe je door het gewicht van standaardpagina in te stellen. Hiermee wordt een gewogen random keuze gemaakt uit de gekoppelde layouts.
De tweede stap is het aanpassen van de translatie die de layout van het item opvraagt. In deze translatie voeg je code toe die (gewogen) random, een layout uit de gekoppelde layouts selecteert. Hieronder staat wat voorbeeld code.
De 'gewogen' randomizer werkt als volgt:
| Smartsite SXML |
|
|---|---|
<se:sqlquery save="dtlayout" rem="get assigned AB Testing layouts from contentrelation ABLAYOUTS">
<se:parameters>
<se:parameter name="resulttype">datatable</se:parameter>
<se:parameter name="sql">
SELECT TOP 10 c.Nr FROM ContentRelations cr
INNER JOIN vwActive c ON cr.nrTo = c.Nr
INNER JOIN ContentRelationTypes crt ON cr.nrType = crt.Nr
WHERE crt.Code = 'ABLAYOUTS' AND cr.nrFrom=?:nr
</se:parameter>
<se:parameter name="params">
<se:collection>
<se:member name="nr" type="integer">{itemdata.number()}</se:member>
</se:collection>
</se:parameter>
</se:parameters>
</se:sqlquery>
{datatable.rows.insertat(dtlayout,1,$layout)}
{buffer.set(N,datatable.rows.count(dtlayout))}
{buffer.set(layout,Page,(sys.iif( $N == 0,data_navigate(layout, nr, default=$layout,
error=$layout),datatable.getvalue(dtlayout,ab_weighted_randomizer($ControlWeight,$N),1))))}
|
|
Om te registreren welke layout actueel is, kun je een sessie cookie gebruiken. Hierin leg je vast welke layout is gegenereerd. Daarnaast registreer je de layout in SMI met de viper: smi.store(). In de voorbeeldcode hieronder wordt de layout naam met extra informatie (in dit geval de description van het layout item) vastgelegd in zowel het cookie als in SMI.
| Smartsite SXML |
|
|---|---|
<se:if expression="smi.isinstalled()">
{buffer.set(layoutname,Page, itemdata.field(title,buffer.get(layout,Page)) +'-'+itemdata.field(description,buffer.get(layout,Page)))}
{response.setcookie($GL_sessionid,buffer.get(layoutname,Page))}
{smi.store('ABTest_Cat','layoutnr_AB',buffer.get(layout,Page),itemdata.number())}
{smi.store('ABTest_Cat','layoutname_AB',buffer.get(layoutname,Page),itemdata.number())}
</se:if>
|
|
Als laatste moeten we de conversie registreren. De conversie is dit geval het klikken door de bezoeker op de banner. Hiermee wordt de bezoeker naar een ander item gestuurd. Deze gebeurtenis kunnen we registreren door het doelitem (target), uit te rusten met wat registratie code. Deze code moet achterhalen vanuit welke layout het doelitem is aangeroepen en vervolgens deze informatie in SMI registreren. Voorbeeld code hieronder.
In de code wordt rekening gehouden met de mogelijkheid dat een aanroep van het item niet via het testitem gaat.
| Smartsite SXML |
|
|---|---|
{buffer.set(sessionid,translation.arg(session))}
{buffer.set(prefix1,ab_prefix_variant())}
{buffer.set(prefix2,ab_prefix_non_variant())}
<!--//
Get layout variant. If the request came from a AB Test variant layout then
register this event in SMI as such. Else register this event as originated
by a None-variant layout
-->
{buffer.set(cookie,request.getcookie($sessionid))}
<se:if expression="$cookie != 'no_variant' AND $cookie !='' ">
<se:then>
{buffer.set(smi_value,request.getcookie($sessionid))}
<!--// Store value in SMI -->
{buffer.set(SMI_category,$prefix1+itemdata.name())}
{smi.store('MVTest',$SMI_category,$smi_value)}
</se:then>
<se:else>
{buffer.set(smi_value,'None_layout_variant_from: '+ request.referrer())}
{buffer.set(SMI_category,$prefix2+itemdata.name())}
{smi.store('MVTest',$SMI_category,$smi_value)}
</se:else>
</se:if>
{response.setcookie($sessionid,'no_variant')}
|
|
In SMI kun je nu de resultaten zien.
Om het geheel af te ronden, kun je de gegevens presenteren in een tabel, waarbij je dynamisch de data uit SMI haalt.
In zo'n tabel kun je een overzicht geven van de conversierates die behaald zijn.
Hieronder staan de resultaten van een MV test van een webpagina. Op deze pagina bevindt zich een banner. De banner wordt op de pagina via drie varianten gepositioneerd:
| Standaard | Variant A | variant B |
|---|---|---|
De varianten worden met een gewogen random getal gekozen. De standaard variant kan een hoger of lager gewicht toegekend worden, afhankelijk van het risico dat je wilt nemen met het aanpassen van de standaard webpagina. Hoe hoger het gewicht, hoe vaker de bezoeker de standaard variant ziet. De alternatieve varianten A en B worden met gelijk gewicht random gekozen.
de conversierate is als volgt gedefinieerd.
Banner Clicks
Conversierate = ------------------------
Bezoekers Pagina