/bestchoice

bestchoice.js - Self Learning Weighted Multivariate Testing Tool

Primary LanguageJavaScriptMIT LicenseMIT

bestchoice.js

Self Learning Weighted Multivariate Testing Module

This is a tool to automate the selection of the best page. not only it provides you with an ability to chose the best page, but also it does this more effectively that your typical A/B test approach. It is based on Statistical significance test and typically is superior to A/B testing. Rather than telling which page is the best by the end of testing, typical to A/B testing, it gradually selects the best performing page.

How to use

Type in terminal to install

npm install bestchoice

In your index.js and add

var bc = require('bestchoice');

Campaign Managment Example Code

Adding a new campaign

bc.addCampaign('t00000001',
   'http://www.test1.com/register',
   ['http://www.test1.com/register?lpv=a',
    'http://www.test1.com/register?lpv=b',
    'http://www.test1.com/register?lpv=c',
    'http://www.test1.com/register?lpv=b'],
    0.1,
    1);

Removing a campaign

bc.removeCampaign('t00000001');

Getting all availible campaigns Returns all running campaigns as Objects

bc.getCampaigns();

Saving all availible campaigns as JSON Returns all running campaigns

var data = bc.getCampaigns();

Loading previously computed campaigns as a current stack

bc.loadCampaign(data);

Campaign Managment Example Code

First visit. Supply with campaign ID and path name. Returns page variant to use and unique ID to use as a Cookie.

bc.getPage('t00000001', 'http://www.test1.com/register');

Conversion trigger. Supply with campaign ID, path name, cookie and the amount of reward between 0 and 1.

bc.getPage('t00000001', 'http://www.test2.com/register', 'unique cookie');

Express Example


'use strict';

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
var bc = require('bestchoice');
app.use(cookieParser());

bc.dictionary = {
  'http://www.test1.com/register': 't00000001',
  'http://localhost:3000/register': 't00000001'
};

bc.addCampaign('t00000001',
  'http://localhost:3000/register',
  ['http://localhost:3000/register/a',
   'http://localhost:3000/register/b',
   'http://localhost:3000/register/c'
  ],
  0.1,
  30); // expire every 30 minutes

  setInterval(function() {
      bc.updateExpiredVisits("t00000001");
  }, 30000); // update every 30 minutes

app.get('/', function(req, res) {

  res.send('Locked and Loaded');

});

app.get('/register', function(req, res) {

  var cookie = req.cookies.bc;
  var url = req.protocol + '://' + req.get('host') + req.originalUrl;
  var campaign = bc.dictionary[url];
  var get = bc.getPage(bc.dictionary[url], url, cookie);
  if (cookie === undefined) {
    res.cookie('bc', get, {
      maxAge: 3600 * 1000,
      httpOnly: true
    });
  }
  res.redirect(get.pageVariant);

});

app.get('/register/:variant', function(req, res) {
  var campaign = req.cookies.bc.campaignID;
  var variant = req.cookies.bc.pageVariant;
  res.send('Variant Page');
});

app.get('/convert', function(req, res) {
  var params = req.cookies.bc;
  var cookie = params.cookie;
  var campaign = req.cookies.bc.campaignID;
  var variant = req.cookies.bc.pageVariant;
  bc.registerConversion(campaign, variant, req.cookies.bc.cookie, 1);
  res.send('Converted');
});

app.get('/results', function(req, res) {
  res.send(JSON.stringify(bc.getCampaigns()));
});

app.listen(3000, function() {
  console.log('Example app listening on port 3000!');
});