Platform · Personalization

The right version for each visitor, in real-time.

qbrix works out what works for each kind of visitor, and applies it to the request in front of it. No segments built in advance, no overnight job, no profile to look up.

Which version wins, by kind of visitor and time of day
checkout-cta · learned, never configured
social-proofcontrolurgency-copydiscount-badge
Segment00–0606–1010–1414–1818–2222–24
mobile · returning
mobile · new
desktop · returning
desktop · new
tablet · all

Optimize the experience of each visitor. Let qbrix continuously optimize the customer experience for each of your segments.

New visitor · phone · NL
social-proof6.50%
control4.76%
urgency-copy4.58%
discount-badge3.98%
Returning visitor · phone · DE
social-proof8.10%
discount-badge4.90%
control4.40%
urgency-copy3.10%
Returning visitor · desktop · NL
urgency-copy6.80%
control5.30%
social-proof4.10%
discount-badge2.60%

One experiment, many answers — qbrix picks the right one per visitor.

Say what you know. Nothing more.

Whatever you already have on the request — their device, whether they have been here before, what is in the basket — travels with the call. Nothing is set up beforehand, and nothing has to be kept in sync.

1.0Context
# whatever you already have on the request
result = client.agent.select(
experiment_id="checkout-cta",
context={
"id": user_id,
"properties": {"device": "mobile", "returning": True, "cart_value": 84.00},
},
)
# nothing declared in advance, nothing kept afterwards

You never have to name a segment.

You never tell qbrix that evening mobile shoppers are a group. It works out which combinations of what you send actually change the answer — including ones you would not have thought to look for.

2.0Segments
What you named
device
mobiledesktop
returning
yesno
cart_value
under 5050 – 150over 150
qbrix looks at every combination of them, and every value in between
What it found — without being asked
mobile · returning · under 50social-proof
mobile · returning · 50–150social-proof
mobile · returning · over 150urgency-copy
mobile · new · under 50discount-badge
mobile · new · 50–150discount-badge
mobile · new · over 150social-proof
desktop · returning · under 50control
desktop · returning · 50–150urgency-copy
desktop · returning · over 150urgency-copy
desktop · new · under 50discount-badge
desktop · new · 50–150urgency-copy
desktop · new · over 150control

Three properties, twelve kinds of visitor — and you listed none of them. It is not limited to these twelve either: a basket of 49 and a basket of 51 are not two boxes, they are two numbers.

There is no profile to build.

qbrix keeps no copy of your visitors. What you send arrives with the request, makes that one decision, and goes into the event record — kept for ninety days, and then gone.

3.0Storage
Travels with the request
A stable id for the visitorWhatever you already use — a user id, a device id, a first-party cookie.
The properties you chose to sendRead for this decision, then written to the record with it.
Nothing you did not sendThere is no second channel. What qbrix knows is what was on the call.
Never exists anywhere
A visitor profile store
An identity graph to keep in sync
A copy of your customer table
A nightly job that reconciles the two
A cohort you have to define first

It works before you know anything about them.

A logged-out first-time visitor has no history and nothing worth sending. They still get a decision — the best one qbrix has for someone it knows nothing about. Send more when you have more.

4.0Cold start
The first millisecond
{ }

You know nothing at all. They landed from a search result.

social-proofthe best answer qbrix has for anyone
One page later
{ "device": "desktop" }

One thing. It is enough to change the answer.

urgency-copythe best answer for someone on a desktop
At the basket
{ "device": "desktop",
  "returning": true,
  "cart_value": 212.00 }

Now you have three things, and none of them came from a profile.

urgency-copythe same answer, held with much more conviction

You are never waiting to have better data before you can start. Add a property the day you have one.