Contact Scores In Depth


Contact rating identifies your best performing contacts, ranking them according to how actively engaged they are. The more a contact engages positively with your emails, the higher their rating. Knowing who the most interactive, interested contacts are lets you create competitions, loyalty and incentive campaigns for those contacts. This article takes an in depth look at how we calculate the contact score and rating. It's a little math-heavy, but bear with us, it's worth it!


Each contact's score and rating is based on his/her activity. The score improves with positive actions (e.g. reads, clicks, and forwards), and decreases with negative actions (e.g. bounces, complaints, and unread mails).

The relevancy of an action to the current score is inversely proportional to the action's age. We'll explain that in detail shortly, but for now just think of it as "older actions have less impact on the contact score."

Contact Score

We keep track of the following actions to calculate the contact's score:

  • Bounces
  • Reads
  • Clicks
  • Forwards
  • Complaints
  • Replies
  • Profile-updates
  • Invites

Each positive action is assigned a points value relating to how good that action is. A forward, for example, is worth a lot more than a read.

Not all individual actions will be taken into account when calculating the final score. For bounces, reads, clicks, forwards, complaints, and replies, only the latest action on an individual message will be taken into account. In other words, if a contact reads a particular message four times, it will only count as read once.

Profile updates will similarly only be counted once, at the time the profile was last updated. Invites will count once per list that an invite is sent for.

An action's values will be ‘aged’ to decrease their relevance on the final score depending on how long ago they occurred. Their age can be determined according to actual age (physical time), or according to how many actions have occurred since.

Score degradation according to age can be done exponentially.


Here the gravity parameter can be tweaked to adjust how fast the old actions will fade. The following graph shows how fast aging will occur to a score of 10 with gravity set to 0.5, 1, and 1.5.

Score degradation over time

Age, should also be taken to be greater than one, as this formula will return extremely high values as the asymptote at age=0 is approached. This can be simply done by just adding one to all ages before calculation.

The current score for each contact will be calculated by a summation, of all the age-adjusted sub scores for each action. Negative actions will however have a drastic impact on the score. A bounce or complaint will divide the current contact score, instead of simply subtracting from it.

These negative actions will use a similar aging formula to the one above for positive actions.


With gravity of 1 this will give the following graph.


If we add 1 to our ages as done previously, then this will give us a degrading value between 2 and 1 depending on the age of the negative action. So, if the negative action (e.g. a bounced email) was the last action to occur, then the contact score will be divided by 2, but as that bounce becomes older, it will have less effect, until the aged value is close to 1. Obviously dividing by 1 will have no effect.

The final contact score will be determined by first adding together the positive action scores, which have already been aged, and then dividing by all the aged negative scores.

The decreasing priority of older scores will also mean that it is not that important to keep old data. So if we want to truncate the tables, getting rid of historical data, it should not have much impact on the current contact scores.

Contact Rating

Now we have a numerical score associated with each contact. Next, we will use this score to come up with a contact rating which will be a star value from 1 to 5.

The 1-star value is for contacts that have a score less than 2. This might be caused by multiple bounces, or complaints. It would probably be best to remove them from the contacts list.

Scores between 2 and 3 equate to a 2-star rating. New contacts joining the system will be given a score of 2. This is not a very high score, but we are assuming that since they have just been subscribed, they are still active and want to engage with the email being sent to them. Inactive contacts may also be rated 2-stars. They receive the mail (not bounced) but have never opened the mail to read it. This means that they never check their mail, it is being caught by a spam filter, or they are simply ignoring your emails.

As the contact score increases above 3, the contact will receive 3-stars and up, depending on their activity.

Ideally, a contact with 5-star rating should be one that reads every mail sent to them, as well as interacting with the mail by clicking some links, forwarding the mail, etc.

When are Contact Scores Calculated?

The contact score and contact rating are updated each time that a contact action occurs, such as a read, a bounce, etc.

In order to calculate the scores, we must first gather all the actions that occurred. Our system takes note of the action, as well as the time the action occurred.

All of these actions will be gathered into an array representing the contact’s history.

Next, the array of actions must be sorted in reverse chronological order to establish the correct age of each action. Then we process the array from oldest to newest, using the position in the array as the age. For each array item, we first determine if it is a positive action or negative, then age it appropriately, then add or divide the current running total accordingly.

This will give us the contact score, and from the score, the rating. This rating and score will then be updated in the contact's profile so that it is always up to date.


If we take the gravity constant as 1, we get the following.

A new contact is subscribed, his score is 2.

He is sent a mail, which he reads. Array is:

Read 2 Subscribed 2

We get 2/2 + 2/1 = 3

After another read, the contacts score is 3.7

After reading 5 mails: 2/6 + 2/5 + 2/4 + 2/3 + 2/2 + 2/1 = 4.9

But then next one bounces:

Sub 2 Read 2 Read 2 Read 2 Read 2 Read 2 Bounce/2

2/7 + 2/6 + 2/5 + 2/4 + 2/3 + 2/2 = 3.18 then divide by (1/1 + 1) = 1.59

Gets next one: 2/8 + 2/7 + 2/6 + 2/5 + 2/4 + 2/3 = 2.43 divide by ½+1 = 1.62 + 2 = 3.62

The following chart shows how contact score gradually increases over time, drops drastically if there is a bounce, but quickly recovers after the email bounce.


Translate »