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 / seniority | Chief / VP / Director = 5 · Manager = 3 · Engineer / Analyst = 2 · unknown = −5 |
|---|---|
| Industry | Target 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 |
| Geography | Primary 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.
| Signal | Fresh | Aged |
|---|---|---|
| Demo / free-trial form submission | 50 (<3 days) | 25 (>3 days) |
| “Demo Booked” (activity note) | 100 | — |
| Product-page view | 5 (<7 days) | 2 (>7 days) |
| Product page viewed 3+ times (SQL signal) | 10 | — |
| Recent conversion | 10 (<7 days) | 5 (>7 days) |
| “Time last seen” (recency) | 10 (<7 days) | 5 (>7 days) |
| Sales-email reply / open | 10 / 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.
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.
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.
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
VerifiedA 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
VerifiedInbound 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
VerifiedThe 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
VerifiedAcross 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.