A/B testing — route users to different variants.
1const crypto = require("crypto");23class ABTest {4 constructor() {5 this.experiments = new Map();6 }78 addExperiment(name, variants) {9 this.experiments.set(name, variants);10 }1112 getVariant(experimentName, userId) {13 const variants = this.experiments.get(experimentName);14 if (!variants) return null;1516 // Deterministic hash17 const hash = crypto18 .createHash("md5")19 .update(`${experimentName}:${userId}`)20 .digest("hex");21 const index = parseInt(hash.slice(0, 8), 16) % variants.length;22 return variants[index];23 }24}2526// Middleware27const abTest = new ABTest();28abTest.addExperiment("checkout-flow", ["control", "simplified"]);2930app.use((req, res, next) => {31 req.experiments = {};32 for (const [name] of abTest.experiments) {33 req.experiments[name] = abTest.getVariant(name, req.user.id);34 }35 next();36});3738app.get("/checkout", (req, res) => {39 if (req.experiments["checkout-flow"] === "simplified") {40 return res.render("checkout-simplified");41 }42 res.render("checkout-control");43});
Key points: