Skip to content
← All case studies

Revenue Operations · B2B SaaS

Lead scoring in HubSpot, built as a decision engine

How a living lead-scoring system turned a flood of undifferentiated leads into a ranked, self-updating queue — and became the decision engine an entire B2B SaaS revenue org ran on.

80+ days → 71 min
Inbound lead assignment time
$1.39M
Product-only pipeline, one routed MQL cohort
27 → 16
Meetings booked → opportunities created
  • Context: Global B2B SaaS
  • Platform: HubSpot
  • Focus: Lead scoring, lifecycle, routing

The problem

Not too few leads — too many to judge

A global B2B SaaS company with an enterprise ICP and an international sales motion was, by every measure, doing well. It generated demand at scale across marketing, business development and account-executive teams, all on HubSpot.

That success was the problem: the company was creating more opportunities than it could process systematically. A single rep's book could run to 500–600 leads — a cold contact scraped from a data tool sitting in the same list as a director who requested a demo that morning, with nothing on the surface to tell them apart. To know which was which, a rep had to open a lead and read its whole activity history: ten to fifteen minutes each. Across hundreds of leads, the arithmetic is fatal.

  • 01

    No triage

    A rep starting the day had no way to know who to call first. Priority was guesswork.

  • 02

    No context on assignment

    When a lead landed on a rep, they didn't know why — scraped outbound contact, or someone who'd toured the product pages and asked for pricing? Every lead started from zero.

  • 03

    Signals dying in the CRM

    An inbound demo request would generate, then sit unassigned. A lead that's white-hot on Monday is lukewarm by the time anyone notices it Thursday. Intent expired on the shelf.

The diagnosis wasn't “they need a lead score.” It was “they have every signal and no way to turn it into a decision — fast enough to matter.”

The core

The core: a living lead score

The centre of the solution — the thing everything else was built on top of — was an active lead-scoring model in HubSpot. Not a report, not a tag: a single, continuously-recalculated number that compressed “who is this, how good a fit, and how engaged right now” into something a rep could sort by.

It ran on two axes, each carrying positive and negative weight.

Explicit score — who they are (ICP fit). Tiered so a decision-maker at a target-industry enterprise rose to the top:

Role / seniorityChief / VP / Director = 5 · Manager = 3 · Engineer / Analyst = 2 · unknown = −5
IndustryTarget industries = 5 · outside = 3 · unknown = −5
Company size>1,000 = 5 · 100–999 = 3 · <100 = 1 · unknown = −5
Annual revenue>$100M = 5 · $10–100M = 3 · <$10M = 1 · unknown = −5
GeographyPrimary market = 5 · priority regions = 3 · remaining = 2

A crucial piece of craftsmanship: fit was product-specific. For the flagship enterprise product, a sub-100-employee, sub-$10M company scored −10 — a poor fit. For a lighter, self-serve product, that same company scored +5 — a good fit. “Ideal customer” isn't one profile; it's one per product line.

Implicit score — what they're doing (engagement + intent), weighted by recency. This is where the score became alive: recent behaviour counted for more, old behaviour faded.

SignalFreshAged
Demo / free-trial form submission50 (<3 days)25 (>3 days)
“Demo Booked” (activity note)100
Product-page view5 (<7 days)2 (>7 days)
Product page viewed 3+ times (SQL signal)10
Recent conversion10 (<7 days)5 (>7 days)
“Time last seen” (recency)10 (<7 days)5 (>7 days)
Sales-email reply / open10 / 5 (<3 days)
Content (blog / whitepaper / podcast)3 (<7 days)1 (>7 days)

Negative scoring — the judgment layer. As disciplined about what lowered a score as what raised it. This is what stopped activity from inflating junk:

  • Poor fit for the product — sub-scale or low-revenue for the enterprise product = −10 each.
  • Not a real buyer — careers / contact-HR page visit = −50 (job seekers, not prospects); .edu address = −25; unknown company = −5.
  • Internal noise excluded outright — the company's own domain and staff = −200, so employees testing forms never polluted the pipeline.
  • Decay for going cold — not seen in >30 days = −10; >60 days = −30. Unsubscribes = −10 each.

That decay isn't a footnote. It is the mechanism.

The trigger-down effects

Why this was the whole game

A score by itself is a number. What made it transformational was what it did to how the revenue team worked — three compounding effects.

  1. Triage became instantaneous

    A rep opening their desktop no longer faced 500 undifferentiated leads. They sorted by score and worked top-down. The ten-to-fifteen-minutes of manual archaeology per lead collapsed to a glance — the same book, suddenly workable.

  2. Value-at-a-glance on assignment

    When a lead arrived, its score was its briefing. A high score said “this person requested a demo three days ago and has been on the product pages” before the rep read a single activity. Context stopped being something you excavated.

  3. The dormant-lead resurrection engine

    A buyer takes a demo, loves it — and has no budget for two quarters. ~180 days of silence no human tracks. But the score is alive: it decays as the lead goes cold (−10 at 30 days, −30 at 60), correctly sinking it out of the queue — then climbs on its own the instant that buyer re-enters the market (a product-page revisit +5, a content conversion +10, three product views +10). At the threshold, a workflow notifies a rep: this six-month-old lead is active again — it's warm now. A dead lead becomes a hot lead automatically, because intent was made into a number the system could watch when humans couldn't.

Downstream

What having a score unlocked

Because a reliable, live score now existed, a series of other capabilities became possible — each secondary to, and dependent on, the scoring engine.

  • Automated lifecycle promotion

    A “Demo Booked” note alone scored 100, and a workflow promoted any lead crossing the threshold to Opportunity — so genuinely hot leads surfaced and were never missed.

  • Dormant-account recycling

    Verified

    A report surfaced companies inactive 60+ days alongside their best available score — letting sales reclaim high-value cold accounts on evidence, not memory. A significant number were picked up once it went live.

  • Prioritised routing

    Territory + round-robin distribution across regions could now hand reps leads that already carried a priority signal, not just an owner.

  • Behaviour-based cadence

    Outreach used the same signals feeding the score to personalise the first touch — explicitly cautioning against over-automating inbound.

The load-bearing layer underneath

A living score needs data to live on. Before any scoring, the measurement layer had to exist.

  • The data properties

    HubSpot properties — Today's Date (workflow-activated), Time Between Created & Assigned, and Days Since Last Activity — created the raw material for both scoring recency and assignment-time reporting.

  • Ownership sync & dashboards

    Company→contact ownership sync (assign the company, contacts follow) kept ownership clean enough to route on; a team KPI dashboard and an inbound source × time-to-assign report turned “follow-up feels slow” into a tracked number.

  • Designed for the next stage

    A multi-level scoring architecture (separate ICP scores per product line, combined via calculated properties) and CRM data-model upgrades were specified as the path forward — framed to keep iterating: “nothing done with a lead score is permanent.”

The results

The results

  • 80+ days → 71 minutes

    Verified

    Inbound lead assignment time, via the HubSpot dashboard and workflow automation. Lead response time also dropped sharply — most leads contacted within the first 24 hours — and “no-value calls” measurably fell.

  • Prioritised effort

    Verified

    The active score let BDR and AE teams separate hot from warm and cold and allocate attention accordingly, contributing to better quarter-over-quarter demo counts.

  • 90 MQLs → 55 routed → 27 meetings → 16 opportunities → $1.39M

    Verified

    Across a July–August window, of 90 MQLs, 55 were routed to the BDR / new-logo team, which booked 27 meetings, created 16 opportunities and added $1,387,961 in product-only pipeline — with ~49% booking a meeting within six days and ~29% becoming opportunities within seven.

The takeaway

The RevOps lesson

The value wasn't putting more data into the CRM. It was compressing all of it into one living number that answered the only question a rep actually has at 9am — who do I call first? — and that kept answering it, on its own, even for the leads everyone else had forgotten.

Quantify fit and intent, wire the number into lifecycle, routing, recycling and alerts, and let it decay and revive on its own — and the revenue engine stops depending on anyone remembering. That is diagnosis-first, system-over-tool RevOps.

Wondering what this would look like for your operation?