A/B experiments

Same visitor.
Same variant.
Every time.

AyBee assigns variants at the edge with deterministic bucketing — a hash of the experiment salt and the visitor token. No sticky-session store, no flicker between renders, no variant drift across devices in the same session.

Get early access See gradual rollouts →

How assignment works

Deterministic, not random.

A visitor's bucket is murmur3(salt + visitor_token) mapped to a point in [0, 1). The same inputs always produce the same bucket, so a visitor stays in their variant for the life of the experiment — even if the request lands on a different edge node.

// the edge computes this — your app never sees the math
let bucket = murmur3(experiment.salt + visitor_token) // → 0.0..1.0

if bucket > rollout_pct / 100 { return default_variant }
if !matches_segment(visitor) { return default_variant }
return weighted_pick(variants, bucket)

Allocation

Weight traffic however you like.

Give each variant a relative weight. AyBee normalises them and selects over the sorted variants — so control / variant-a / variant-b at 50 / 30 / 20 splits exactly that way.

Variables & conversions

Typed values in.
Metrics out.

Attach typed variables to a variant — strings, numbers, booleans, JSON — and read them through the SDK. Report conversions back through a response header; the edge collects them and strips the header before the client sees it.

// read the assigned variant + a typed variable
const color = ab.variant("button-color") // "green" | "blue" | "control"
const max = ab.value("max_items") // typed: number

// report a conversion — the SDK writes the header for you
ab.track(res, "purchase", { amount: 149.90 })
// under the hood: res.setHeader("X-AYBEE-METRIC", "purchase,amount=149.90")

Experiment without a sticky-session store.

AyBee is in development. Get early access and we'll reach out personally.

Get early access