Decide what each visitor sees, at the moment they ask.
Every page you render already makes a choice — a headline, an offer, a layout. qbrix makes that choice per request, from what you know about the visitor and what your experiments have learned so far.
qbrix.agent.select(experiment_id, context) → "social-proof"No model serverYour checkout copy was chosen in March. Every visitor
since has seen the same thing. Nobody has checked
if it still works.
Every visitor, the same answer.
A new decision every time, for the visitor in front of you.
Two calls. That is the whole integration.
Ask which version to show. Later, say what happened. Nothing else in your stack moves — same renderer, same database, same deploy.
const { arm, requestId } = await qbrix.select("checkout-cta", {id: userId,properties: { device: "mobile", cartValue: 84 },});render(CTA[arm.name]); // → "social-proof"// minutes later, when they check outawait qbrix.feedback(requestId, 1.0);
It answers, or your page does.
The answer comes from what qbrix already knows — there is nothing else standing between the request and the response. And if it ever takes longer than you allow, the SDK stops waiting and your own default renders.
Learning runs somewhere else entirely. The loop that makes the next decision better is never the reason this one waits.
Send qbrix the outcomes. The next decision will be better.
When the visitor converts or doesn’t, send the outcome. qbrix will learn from all your user interactions and will improve its decisions.
Why did this visitor see that?
Adaptive does not mean unaccountable. Every decision, every outcome and every change to an experiment is logged — so any single request can be read back, months later, exactly as it happened.
Shown: the Event Log in the console.