OPTIMIZE · THE AFFINITY ENGINE

A score for every interest, for every visitor.

The affinity engine keeps a running score of each visitor's interest in the things your content is about. Every action you give points to adds to it, time away lets it fade, and at the moment a page is served, audiences and recommendations follow the scores. It is explainable arithmetic, and our engineers set it up with you. From a team that has spent decades building recommendation engines and personalization platforms.

Every figure on this page is as of October 2026.
The affinity engine's Engine tab on a demo store: interest lasts 7 days and halves about every 4.9 days, with the “How interest fades” chart.
On this pageWhat it does
  1. What it does
  2. What the engine may choose from, and what it learns on.
  3. Your own taxonomies become interests.
  4. Every action adds points to the interests it touches.
  5. The longer a visitor stays away, the less their interest counts.
  6. Audiences that people join, and leave.
  7. One audience, its own pace.
  8. Ranked for each visitor, as the page is served.
  9. An offer at the moment interest turns.
  10. Our engineers switch it on with you.
  11. How it works
  12. What keeps it honest
  13. Common questions
Actions build interest, and time reduces it.

What it does

The engine has no room of its own. It works from three places in Optimization: the content "Catalog", the "Engine" tab of Personalization, and the learned audiences in "Audiences"; and it shows itself on your pages through the Recommendations section and live offers.

Your catalog

What the engine may choose from, and what it learns on.

  • "Content catalog": "What the personalization engine may choose from, and the tags it learns on."
  • Everything you publish can be in it: pages, posts, sections, images and the entries of your own content types, products among them, each with its tags. Only what is published, has started and has not expired can ever be chosen.
  • "Rebuild the catalog" makes a new numbered snapshot. Its card shows what will change before you approve it, a rebuild never edits your content, and undo restores the snapshot before.
  • Its tabs: "Items", searchable and filtered by kind and by state, with "Edit tags" on every row; "Values", which tags earned an audience and which were held back; "Audiences"; and "Suggested tags", proposed by an AI model or by word matching, each approved or declined by a person.

Interests

Your own taxonomies become interests.

  • "How your content becomes audiences". Your content, tagged with your own taxonomies, becomes values on content axes. A value carried by at least two items earns a draft audience, and a draft audience serves nothing until it is activated and its interest is set up on the Engine tab.
  • From Site › Taxonomies. Each grouping's "Catalog axis" says whether personalization may use it.
  • By hand. "Add an interest" on the Engine tab: a name, the tag or field on your content that carries it, and its own memory if you want one.
  • One comes with the engine: the channel a visitor arrived by, remembered for 30 days.
The affinity engine's Engine tab on a demo store: the points per action, viewed a product 1, saved 2, added to the bag 3 and bought 5, offered and not yet applied.

Signals and points

Every action adds points to the interests it touches.

  • In the screen's own words: "Every action adds points to the interests it touches. These are the points. They are relative to each other, so what matters is the ratio, not the size."
  • Offered, not applied. A number shown in grey is what the platform offers; it counts only once you apply it, and a blank field counts nothing.
  • What teaches it: adding to cart and buying, with the platform's points; clicks on recommended cards, once "Clicked a piece of content" has points, since every card carries its item's tags back to the engine; and any other event you give points to that carries what your content is about. A plain page view teaches it nothing.
"What each visitor action counts for"Points
"Added to the bag"3
"Bought"5
"Was shown a piece of content"0.25, offered
"Lingered on a piece of content"2, offered
"Clicked a piece of content"1, offered
"Watched a video to the end"2, offered
The affinity engine's Engine tab on a demo store: interest lasts 7 days and halves about every 4.9 days, with the “How interest fades” chart.

How interest fades

The longer a visitor stays away, the less their interest counts.

  • "How long interest lasts": 7 days unless you change it, which means an interest halves in about 4.9 days without new activity.
  • "How much activity counts as strong interest": 1.8 points.
  • "How interest fades" draws it, and says in words when an interest is half gone and when it is almost gone.
  • Why these two matter, in the screen's words: "These two decide the pace. Together they are the difference between a page that reacts to the last click and one that reacts to the whole visit."

Joining and leaving

Audiences that people join, and leave.

  • "A visitor joins an audience at" 0.6, "and leaves when it falls below" 0.45. The gap between the two keeps a visitor's recorded membership from flickering in and out near the line; pages themselves check the join point each time they are served, as the worked example below shows.
  • Every join and every leave is recorded with what caused it: the score, both thresholds, the action that triggered it, and the version of the settings.
  • A worked example, our own arithmetic on the defaults: three points in quick succession give a strength of 0.625, so the visitor joins. With no further activity, pages stop treating them as a member after about 17.7 hours.

Tune one audience

One audience, its own pace.

  • "tune this audience" gives one learned audience its own join point, its own memory and its own bar for strong interest, without changing any other.

Recommendations

Ranked for each visitor, as the page is served.

  • Place a Recommendations section anywhere, and set "Show", "How many cards" (1 to 12, 4 by default), "Narrow by", and "When there is nothing to personalise on".
  • Each card shows its title, its picture and its summary, and a product card its price.
  • When there is nothing to rank on, the section shows "The most recently updated items", or "Your pins, then catalog order", or hides itself: "Hide the section entirely".

Slots and their rules

  • The five slot rules of Personalization can shape it too: the shopper's stage in the buying journey, freshness, how often a visitor has seen a piece, variety, and your merchandising weights.

Offers

An offer at the moment interest turns.

  • An approved live offer can be set to trigger at the moment a visitor's interest crosses an audience's join point, and it is sent down that visitor's live channel. A page applies only the offers meant for the live slots it was served with.
  • Any learned audience can also have its own content swap, its own arrangement of a page, or its own experiment.

Live slots

Explainable by design

Arithmetic, not a trained model.

The same history always gives the same scores.

Every change on the record.

Every join and leave, and every revision of the settings, each revision with "Roll back to this".

One visitor's interests, in view.

On a visitor's record, "Interests and audiences" shows their scores and memberships to the site's Admins.

Set up with our engineers

Our engineers switch it on with you.

  • The engine works from your catalog, so we set it up together: the interests that matter, the actions that count, and how quickly interest fades. Then we tune it with you as real visitors arrive.
  • It serves once three things are in place: saved settings, active content bound to a learned audience, and the engine's connection, which our engineers set up with you. The Engine tab's "Affinity on" or "Affinity off" says which is missing.
  • Every change is a revision, behind approval. "This site's own pages pick it up on the next page load. The change is reversible: undo puts the previous settings back". Your answer to "What are you changing, and why?" is kept with it.

How it works

The arithmetic

  • What is kept. For each visitor and each interest value: a score, and the moment it was last touched. They live in that visitor's own Durable Object on Cloudflare, named for the site, its environment and the visitor, so no two sites ever mix.
  • An action adds its points to every value it touches: R becomes R × e^(-Δt/τ) + w, where w is the action's points and τ is the memory. An action with no points adds nothing.
  • Fading happens when the score is read: R now = R × e^(-Δt/τ). Strength is R / (R + K), always between 0 and 1, where K is the bar for strong interest. Half-life is τ × ln 2.
SettingThe platform's default
"How long interest lasts" (τ)7 days, a half-life of about 4.9 days
"How much activity counts as strong interest" (K)1.8
"A visitor joins an audience at"0.6
"and leaves when it falls below"0.45
"Safety limits"Forget a value below 0.0001; at most 24 values per interest
"The interests the engine scores on"Channel; add your own

Ranking

  • An item's score is the visitor's strength summed over the item's tags. Pins come first, then score, then your fallback order, then catalog order. "Narrow by" means any of the values within one interest, and all of the interests together.
  • No AI model is called while a page is ranked.
  • Every card carries its decision and its position. Impressions are counted from cards that were really at least half in view, and a click sends the item's tags back to the engine.

How the engine works, in full

What keeps it honest

Consent first.

The engine learns only where the visitor's consent allows personalization: after a yes in an opt-in country, by default in an opt-out region until the visitor says no, and never from a browser that sends Global Privacy Control. Without consent, recommendations fall back to the order you chose.

One door for points.

What an action is worth changes only through the engine's own tuning, on the Engine tab or by asking the copilot, behind its own approval card; nothing else writes it.

Each visitor's own store.

Scores are kept per visitor and per site, and sites never mix.

Erased means reset.

Erasing a visitor resets their scores and closes their live channel.

Drafts serve nothing.

An audience the catalog proposes stays a draft until a person activates it.

Revisions, not overwrites.

Every change to the settings is a revision you can undo.

Common questions

Is this a trained model?

No. It is arithmetic: scores that rise with the actions you weight and fade with time. The same history always gives the same scores, and every join and leave is recorded with its cause.

Does it learn from everything a visitor reads?

No. It learns from the actions you give points to, when they carry what your content is about: adding to cart, buying, clicks on recommendations, and the events you choose. A plain page view counts for nothing.

How quickly does interest fade?

By default it halves in about five days without new activity. You set the memory, for the whole site or for one audience.

Can one audience have its own settings?

Yes: "tune this audience" gives it its own join point, memory and bar for strong interest.

What happens when a visitor declines?

The engine learns nothing from them, and their recommendations fall back to the order you chose.

Do I need a shop?

No. Any catalog with tags works: articles, guides, pages, sections and products alike.

Can I see one visitor's scores?

Yes, on their record under "Interests and audiences", if you are an Admin of the site.

Do scores carry from one of my sites to another?

No. Each site keeps its own.

Who sets it up?

Our engineers, with you.

Do I have to take the whole platform?

No. The affinity engine is a feature you turn on for a site. Coming soon.