Skip to main content

How scoring works

The visitor's intent scores are calculated based on each signal's strength that the visitor has triggered.

Let's take the following intent manifest:

  • Intent: Foo
    • Signal: Query String, ?foo contains bar, strength Normal (50%).

In this situation, a visitor who visited would receive +50 score in the Foo intent:

// uniform_trk_visitor_score cookie{ "foo": { "str": 50 } }

Signals can also have negative strength - in this case, they subtract intent score if triggered. A visitor with a 100 score in an intent that triggered would leave a signal with -50 strength with only a 50 score left, cannot reduce scores below zero.

Signals can also have the special strength value of 0. Signals with zero strength remove all score in the intent, regardless of how much there is. A visitor with 451 score in an intent who triggered a signal with 0 strength would then have 0 strength in that intent.


A signal can set the scope of its effect.

  • Visit-scoped signals - cause a score change only for the current visit; it will remove the score after a short inactivity period.
  • Visitor-scoped signals - cause a score change for as long as the visitor does not clear their Optimize data ('forever').

Technically these are implemented by storing a score vector for each scope. These scope vectors are merged when the current visitor scores are calculated; for example, if you have dev: 25 in visitor, and dev: 75, mkt: 25 in visit, then your intent score is dev:100, mkt:25.


Signals with 0 strength that remove all score in an intent are scope-specific. If that signal has scope visit, it would remove all visit score for the intent but not affect visitor score. If you wanted to clear all intent regardless of scope, you would create two signals - one for each scope - with 0 strength.


Signals support the concept of frequency which enables control of how often a signal may trigger. For example, you may not wish for a query string signal to continue adding more intent score if a visitor refreshes the page or for a cookie signal to continue increasing intent score every time a page is visited and the cookie is set.

  • Visit frequency signals can fire at most once per visit.
  • Once frequency signals can fire, at most, once per visitor unless the visitor clears their Optimize data.
  • Always frequency signals fire every time they evaluate to true.

Behavior Scoring#

Behavior signals have special scoring rules because:

Behavior Signals Have Two Strength Values#

The behavior signal added to the intent has a strength value as does the intent tag on the content. It provides independent control over how strong a signal behavior is and how strongly correlated a tagged piece of content is to the intent.

We might say that behavior is a Strong signal in the dev intent but that an intent tag on a technical author is a Weak indicator of interest in dev. This is because the technical author might write about more than dev-related content.

Behavior intents' two strengths are combined as an average. For example, if the intent strength is 50% and the tag strength is 75%, the base final strength is (50 + 75) / 2 = 62.5, which turns into 62.5 score added to the visitor's intent.

One Route Can Have Many Content Items with Intent Tags#

Visiting a news release page might have an intent tag on the release copy itself, the release's author(s), or a call to the action shown with the release. In this situation, Optimize dilutes each behavior score's strength based on the number of behaviors being tracked. For example, suppose we have the following behaviors:

  • Author: Intent dev, strength 50, intent tag strength 50
  • News release: Intent marketer, strength 50, intent tag strength 50
  • Call to action: Intent dev, strength 50, intent tag strength 100

First, we scale the tags by their two strength values as discussed above:

  • Author: dev 50 ((50 + 50)/2)
  • News release: marketer 50 ((50 + 50)/2)
  • Call to action: dev 75 ((50 + 100)/2)

Next, we divide each score by the number of behaviors being tracked - so we divide each scaled score by 3 in this case:

  • Author: dev 16.66 (50/3)
  • News release: marketer 16.66 (50/3)
  • Call to action: dev 25 (75/3)

Finally, we sum the scores for each intent, resulting in a net intent score change of:

  • dev 41.66 (16.66 + 25)
  • marketer 16.66

This dilution prevents a single page with several behavior tags from overwhelming the strength of other signals.


Uniform Optimize will automatically decay intent strength over time calculated when a new visit occurs. The default decay algorithm will cause intent scores to wither over a 30-day time scale based on the time since the previous visit.

This is not an absolute time scale - frequent visits will cause less overall decay, for example, given a visitor with a100 score in an intent:

  • Visitor returns after 30 days: they have 0 score in that intent.
  • Visitor returns after 10 days: they have 66 score in that intent.
  • Visitor returns daily for 10 days: each day they return, they will lose 1/30 of their remaining intent score:
    • On day 2, 100 * 0.966 = 96.66
    • On day 3, 96.66 * 0.966 = 93.44
    • ...
    • On day 10, 76.24 - more than the 66 they would have without the daily engagement

Intent decay is done on an absolute time scale: the decay amount is calculated by the exact amount of time since the last interaction, not whole days.