Cloudflare Docs
Workers
Visit Workers on GitHub
Set theme to dark (⇧+D)

A/B testing with same-URL direct access

Set up an A/B test by controlling what response is served based on cookies. This version supports passing the request through to test and control on the origin, bypassing random assignment.
const NAME = 'myExampleWorkersABTest';

async function abTestingWithPassthrough(req) {
  const url = new URL(req.url);
  // Enable Passthrough to allow direct access to control and test routes.
  if (url.pathname.startsWith('/control') || url.pathname.startsWith('/test')) return fetch(req);
  // Determine which group this requester is in.
  const cookie = req.headers.get('cookie');
  if (cookie && cookie.includes(`${NAME}=control`)) {
    url.pathname = '/control' + url.pathname;
  } else if (cookie && cookie.includes(`${NAME}=test`)) {
    url.pathname = '/test' + url.pathname;
  } else {
    // If there is no cookie, this is a new client. Choose a group and set the cookie.
    const group = Math.random() < 0.5 ? 'test' : 'control'; // 50/50 split
    if (group === 'control') {
      url.pathname = '/control' + url.pathname;
    } else {
      url.pathname = '/test' + url.pathname;
    }
    // Reconstruct response to avoid immutability
    let res = await fetch(url);
    res = new Response(res.body, res);
    // Set cookie to enable persistent A/B sessions.
    res.headers.append('Set-Cookie', `${NAME}=${group}; path=/`);
    return res;
  }
  return fetch(url);
}

addEventListener('fetch', e => {
  e.respondWith(abTestingWithPassthrough(e.request));
});