30-second verdict

Lead scoring dies for maintenance reasons, not math reasons. Build three score properties in HubSpot (Fit, Intent, Engagement), set the thresholds by backtesting against your recent customers, use rolling time windows so points expire on their own, and run a 30-minute calibration meeting with sales every two weeks. If you get fewer than about 100 new leads a month, skip scoring entirely and sort by recency.

Prerequisites

  • Marketing Hub Professional or Sales Hub Professional. Custom score properties and workflows are not available on Free or Starter. You do not need Enterprise, and you do not need predictive scoring.
  • The HubSpot tracking code installed on your site, including the pricing page.
  • Forms running through HubSpot, and marketing email sent from HubSpot.
  • At least 20 closed-won deals in the CRM. Fewer than that and you are guessing, not scoring.
  • One salesperson willing to spend 30 minutes every two weeks telling you which leads were junk.

Why most scoring models die

Most scoring models get built once, in a burst of good intentions, and never touched again. Points accumulate forever. A contact who opened newsletters for two years outscores someone who visited your pricing page yesterday. Sales calls three "hot" leads, gets three cold conversations, and quietly stops looking at the number. The model is dead within a quarter, and nobody announces it.

Two habits prevent this, and both are missing from almost every build we inherit: scores never decay, and nobody audits false positives. The fix is structural. Decay has to happen by construction, not by memory. Audits have to sit on a calendar, with sales feedback stored as data on the contact record, not as grumbling in Slack.

We build it this way because we have shipped it. Behavioural, intent and demographic scoring was the core of a GTM operating system we built on HubSpot: scores fed routing and multi-touch attribution, deal stages triggered QuickBooks invoicing, and 300+ permits ran through connected pipelines. That scoring layer survived because it decayed and got audited, not because the weights were clever.

Step 1: Pull the evidence before you touch a property

Export your last 20 closed-won deals and your last 20 disqualified leads. For each contact, write down what was true before the deal existed: company size, industry, job title, original source, pages visited, forms submitted.

You are looking for signals that separate the two groups. Maybe every won deal visited the pricing page. Maybe every junk lead had a free email address. Those observations become your criteria. Anything that appears equally in both groups gets zero points, no matter how interesting it feels.

If you cannot find 20 closed-won deals, stop here. Any weights you pick will be fiction. Sort your lead views by create date, work them by recency, and revisit scoring when the volume arrives.

Step 2: Create three score properties, not one

One blended score hides the why, and sales does not trust a number it cannot interrogate. Three scores let a rep see at a glance that a lead is a great fit with no intent, or a bad fit clicking everything.

In Settings, open Properties, pick the Contact object, and create a property group called Scoring. Inside it, create three properties with the field type Score:

  • Fit Score: who they are. Demographic and firmographic. Never decays.
  • Intent Score: what they are trying to do. Buying signals only.
  • Engagement Score: how warm they are. Marketing activity.

Create three supporting properties in the same group:

  • Lead Tier: dropdown select with options A: sales ready, B: watch, C: nurture only, D: no action.
  • Lead Tier Reason: single-line text, set by workflow, so sales sees why the tier changed.
  • Sales Score Feedback: dropdown select with options Agree, sales ready / False positive / Too early. This powers step 6.

Each score property has a Positive Attributes section and a Negative Attributes section, using the same filters as lists. Here is what goes where.

Fit Score: who they are

  • Industry is any of your two or three best industries: 10 points.
  • Number of Employees is between 10 and 200 (use your own closed-won range): 10 points.
  • Job Title contains any of founder, owner, operations, revenue: 10 points.
  • Negative: Email contains gmail.com or hotmail.com: minus 10. Job Title contains student or intern: minus 10.

Fit attributes get no time windows. A 50-person company is still a 50-person company next quarter.

Intent Score: what they are trying to do

  • Page view: has visited URL containing /pricing, in the last 14 days: 15 points.
  • Form submission: has filled out your demo or book-a-call form, in the last 30 days: 25 points.
  • Page view: has visited URL containing /case-studies, in the last 30 days: 5 points.

Keep this list short, four to six attributes. Intent is the score that earns sales attention, so every attribute must be a real buying signal. A blog visit is not intent. A pricing page visit is.

Engagement Score: how warm they are

  • Marketing email: has clicked any marketing email, in the last 30 days: 5 points.
  • Event registration or attendance, in the last 60 days: 10 points. If events run through Eventbrite, the native integration writes attendance to the contact so you can score it.
  • Form submission: any form, in the last 90 days: 5 points.

Do not score email opens. Apple Mail privacy protection auto-loads images, which records opens nobody made. Score clicks. An inflated engagement score is the fastest way to send sales a list of dead inboxes.

Where this breaks

The silent URL change. Your site gets refreshed and the pricing page moves from /pricing to /plans. Nothing errors. Intent Score just stops accruing, and three weeks later sales asks why no leads are coming through. Same failure when someone clones a form instead of editing it: the criteria still point at the old form, which nobody submits. Catch it monthly: build an active list of contacts created in the last 30 days with Intent Score unknown. If its share of new contacts jumps, a criterion is pointing at something that no longer exists.

Step 3: Make decay automatic with rolling windows

The lazy version of decay is a workflow that subtracts points after 90 days of silence. Do not build that. It is one more moving part that can break, and the original points still sit in the criteria waiting to confuse the next admin.

Build decay into the attributes instead. Every intent and engagement attribute above carries an "in the last X days" refinement. When the window passes, HubSpot drops the points on its own. No workflow, no subtraction rules. Intent windows stay short, 14 to 30 days, because buying intent goes stale fast. Engagement windows can run 30 to 90 days. Fit never expires.

Verify it quarterly with an audit list: contacts with Engagement Score of 30 or higher whose last activity date is more than 90 days ago. If the windows are working, this list is near empty. If it holds hundreds of contacts, an attribute is missing its time refinement and your hot list is full of ghosts.

Step 4: Set thresholds by backtesting, not guessing

Here is the useful quirk: a score property recalculates across your entire database the moment you save its criteria. So you can test the model against history before sales ever sees it.

  1. Create an active list called Backtest: customers, filtered to Lifecycle stage is any of Customer.
  2. Add Fit Score, Intent Score and Engagement Score as columns and sort.
  3. Set your Tier A floors so that most recent customers would have crossed them. If your customers cluster at Fit 25 and Intent 30, those are your floors. Not numbers from a blog post, including this one.
  4. Test the other direction. List everyone who meets the Tier A condition today and is not a customer or an open deal. Read 20 records by hand. If half are junk, an attribute is inflating, usually an engagement signal hiding in intent.
TierCondition (example floors, replace with yours)What happens
A: sales readyFit Score 20 or higher AND Intent Score 25 or higherOwner task due in 1 business day, lifecycle set to MQL, alert sent
B: watchFit 20 or higher AND Engagement 30 or higher, intent floor not metNo alert. Reviewed in the calibration meeting
C: nurture onlyFit below 20, any intent or engagementStays with marketing, never alerted to sales
D: no actionEverything elseNothing

Step 5: Build the tier workflow

Create a contact-based workflow named Scoring: assign Lead Tier and route. Enrollment trigger: filter criteria matching your Tier A condition, Fit Score is greater than or equal to 20 AND Intent Score is greater than or equal to 25. Then open the re-enrollment settings and allow contacts to re-enroll when they meet the trigger again. Without re-enrollment, a lead who goes cold and warms back up never gets re-flagged, and that is exactly the lead sales wants.

Actions, in order:

  1. Set property value: Lead Tier to A: sales ready.
  2. Set property value: Lead Tier Reason to a short line such as "Crossed fit and intent floors".
  3. Branch on Contact owner. If unknown, assign one first, rotating if you have more than one rep.
  4. Set Lifecycle stage to Marketing Qualified Lead. Lifecycle stages only move forward, so a test contact who is already a customer will not move, and that is correct.
  5. Create a task for the contact owner, due in 1 business day, titled with personalization tokens: contact name plus the three scores.
  6. Send an in-app or Slack notification to the owner with the same tokens.

Build two smaller workflows for Tier B and Tier C that only set the Lead Tier property. No tasks, no notifications. Alert sales on Tier A and nothing else; notification spam kills scoring trust faster than bad math does. Finally, edit the contact record layout so the Scoring group shows on the record without clicking. Sales trusts what it can see.

Where this breaks

Duplicates split the signal. One human fills out your demo form with a work email and registers for a webinar with a personal one. HubSpot now has two contacts, one holding intent points and one holding engagement points, and neither crosses a floor. Run duplicate management before launch and weekly for the first two months. The related failure is company blindness: three people from one company each sitting at Tier B is a stronger signal than a single Tier A contact, but contact scoring cannot see it. If that pattern repeats, you need company-level scoring or a rollup, which is a bigger build than this article covers.

Step 6: Run the calibration meeting nobody runs

This meeting decides whether the model lives. 30 minutes, every two weeks for the first eight weeks, monthly after that. Attendees: whoever owns the scoring, plus at least one rep who actually works the leads. The agenda never changes:

  1. Pull every contact that hit Tier A since the last meeting.
  2. The rep sets Sales Score Feedback on each one, out loud, with a reason. "This one was a student using a company name" is not a complaint, it is a new negative attribute.
  3. Marketing brings the false negatives: deals created since the last meeting whose contact never reached Tier A. What signal did the model miss?
  4. Change at most three criteria per meeting, and log every change with a date in a running document. Score edits recalculate everything instantly, so a written changelog is the only history you get.

One standing rule keeps it honest: any attribute that produces false positives in two consecutive meetings gets cut or halved. Nobody defends a pet criterion twice.

If nobody on the sales side will commit to this meeting, do not build scoring at all. An unmaintained model is worse than none, because it stamps bad leads with a number that looks like authority.

How you know it worked

Run this acceptance test at day 60. The model passes if all five hold:

  1. The backtest still holds: most contacts who became customers in the last 60 days reached Tier A before their deal was created. Check the Lead Tier property history against the deal create date.
  2. Sales agreement clears the bar you set before launch. We suggest a floor of 7 out of 10 Tier A leads marked Agree in Sales Score Feedback. Below that, the model is not ready to drive routing.
  3. Tier A tasks are completed inside one business day, visible in task reports.
  4. The stale-score audit list from step 3 is near empty.
  5. The unprompted test: a rep sorts a view by Lead Tier, or cites the tier in a pipeline review, without being asked. That is what trust looks like in practice.

If any of the five fail, fix it in the calibration meeting. Resist rebuilding from scratch. Almost every failure traces to one inflating attribute or one missing time window.

When to stop DIYing, and what we charge

First, the cases where you should not build this at all. Fewer than about 100 new leads a month, or one rep who already touches every lead: scoring adds process without adding judgment. Sort by create date and read the records. We wrote more about right-sizing this in RevOps for small teams.

DIY is realistic if one person owns it end to end. Budget roughly half a day for the closed-won analysis, a day for properties and workflows, half a day for the backtest, then the standing calibration meetings. The build is not the hard part. The maintenance discipline is, and no consultant can attend your calibration meeting forever.

If we build it: a scoring build of this shape, meaning discovery, the closed-won analysis, three score properties, tier workflows, the backtest, and sitting in your first two calibration meetings, typically runs 15 to 25 hours. At our flat $150 per hour CAD, that is $2,250 to $3,750. We quote scope in writing before starting, and unused hours never expire. The details are on our process page.

One honest caveat: if your CRM carries heavy duplicates, dead properties, or lifecycle stages nobody maintains, scoring will faithfully amplify the mess. Fix the data first. That is RevOps cleanup work, and it is cheaper before the scoring build than after sales has lost faith in the numbers twice.

FAQ

Do I need HubSpot Enterprise or predictive scoring for this?

No. Everything here runs on Marketing Hub Professional or Sales Hub Professional. Predictive scoring needs a large volume of closed deals to learn from, and it still produces false positives you have to audit. Build the manual model first. You will learn what your real buying signals are, which makes any later predictive layer possible to sanity-check.

How many points should each action be worth?

The absolute numbers do not matter; the ratios do. Make a pricing page visit worth roughly three times a marketing email click, and a demo request worth more than any passive signal. Then backtest against recent customers and adjust until most of them would have crossed your Tier A floor before their deal was created.

How fast should scores decay?

Match the window to the signal. Intent signals like pricing visits go stale in two to four weeks. Engagement signals like email clicks hold for one to three months. Fit signals like company size and industry do not decay at all. Build the windows into the score criteria with "in the last X days" refinements so decay happens without a separate workflow.

What if sales still ignores the score?

Check volume first: under about 100 new leads a month, scoring solves a problem you do not have. If volume is real, the gap is trust, and trust comes from the feedback loop. Record sales feedback as a property, run the calibration meeting, and cut criteria that miss twice. If nobody on the sales side will give 30 minutes every two weeks, retire the model rather than letting a stale number route leads.

Want this handled instead of read about?

We scope this exact work in hours, quote it in writing, and ship it in weeks. The 30-minute call is free and useful either way.

Book a 30-minute call

$150/hr flat · published pricing · no retainer pitch