Deterministic.
The same history always gives the same scores.
OPTIMIZE · THE AFFINITY ENGINE · HOW IT WORKS
The formulas, the defaults and the rules, as the product holds them in October 2026. It is arithmetic, so it can be written down in full.
| On screen | In the arithmetic |
|---|---|
| "How long interest lasts" | τ, the memory |
| "How much activity counts as strong interest" | K, the bar for strong interest |
| "A visitor joins an audience at" | The join threshold |
| "and leaves when it falls below" | The leave threshold |
| "What each visitor action counts for" | w, the points each action adds |
| "The interests the engine scores on" | The interests, each read from a tag or field on your content |
| "Safety limits" | The floor below which a value is forgotten, and the most values kept per interest |
| "Affinity on" or "Affinity off" | Whether the three serving conditions hold, and which one does not |
| "tune this audience" | One audience's own memory, bar and join point |
An action adds its points w to every interest value it touches, after fading what was there:
R becomes R × e^(-Δt/τ) + w
where Δt is the time since the value was last touched. An action with no points adds nothing.
A site starts from these on its first approved save.
| Setting | Default |
|---|---|
| "How long interest lasts" | 7 days (a half-life of about 4.9 days) |
| "How much activity counts as strong interest" | 1.8 |
| "A visitor joins an audience at" | 0.6 |
| "and leaves when it falls below" | 0.45 |
| "What each visitor action counts for" | "Added to the bag" 3 · "Bought" 5 |
| Content behaviours, offered until you apply them | "Was shown a piece of content" 0.25 · "Lingered on a piece of content" 2 · "Clicked a piece of content" 1 · "Watched a video to the end" 2 |
| "Safety limits" | A value below 0.0001 is forgotten; at most 24 values per interest |
| "The interests the engine scores on" | Channel; add your own |
Our own arithmetic on the defaults, not a product output.
from one add to cart. Strength is 3 / (3 + 1.8) = 0.625, above 0.6, so the visitor joins the audience.
with no further activity, the score has faded below 2.7, where strength drops under 0.6. From then on, pages stop treating the visitor as a member: each page checks membership against the audience's own join point.
the score is below 1.47, where strength drops under 0.45, the leave point.
An event reaches the engine only through three gates, in this order.
and the site's settings are saved. Otherwise affinity is off, and costs nothing.
Global Privacy Control outranks everything, then the visitor's recorded grant, then their consent cookie, then the regime's default.
under the interests you set. A plain page view carries nothing for it, and never reaches it.
In practice, adding to cart and buying teach it with the platform's points; a click on a recommended card teaches it once "Clicked a piece of content" has points, because every card carries its item's tags; and so does any other event you give points to that carries the field an interest reads.
The same history always gives the same scores.
Every join and leave carries its cause.
No consent, no learning; Global Privacy Control, never.
One door for weights, behind its own approval.
Each visitor's store is named for one site.
If the engine cannot be reached, pages lose personalization and nothing else.
Because it is R / (R + K): it climbs toward 1 as activity grows, and K decides how much activity counts as strong.
So that the engine's record of a visitor hovering near the line does not flicker in and out of an audience with every action. Pages themselves check each audience's join point as they are served.
The engine scores only actions you give points to that carry what your content is about, and a plain page view carries nothing for it to score.
The site's own pages pick it up on the next page load, and the change can be undone.
It lets audiences form around how people arrive, not only around your content, with a memory of 30 days.
No. Each site keeps its own.
They are deleted with the rest of the visitor's record, their live state is reset, and their live channel is closed.