DEV Community

Zackrag
Zackrag

Posted on

ICP Auto-Scoring: Turn Enrichment Data Into a Ranked Pipeline Without Hiring a Data Scientist

Three months ago I inherited a RevOps mess: 4,200 inbound leads sitting in HubSpot, sorted by nothing except the date they filled out a form. A founder told me "the good leads are in there somewhere." He was right. They were also buried under 3,800 companies that had zero chance of converting.

I spent two weeks building an auto-scoring system that now ranks every new lead in under 90 seconds. Here's the exact formula I used, the field weights I landed on after running it against 18 months of closed-won data, and a Clay table setup you can copy today.

Why most scoring systems fail before they start

The gap isn't methodology — it's data completeness. I've seen teams build elegant weighted models that collapse because 40% of records are missing employee_count. Before you score anything, audit what you actually have.

I ran that audit across the 4,200 records:

Field % Populated
Company domain 97%
Employee count 71%
Industry 68%
Revenue estimate 44%
Tech stack 39%
Funding stage 28%
Intent signals 11%

Revenue and funding looked attractive for scoring but were present on fewer than half the records. I moved them to secondary signals and built the primary model around fields I could actually fill through waterfall enrichment first.

The enrichment layer has to come first

Before scoring a single lead, I set up a waterfall enrichment column in Clay to fill the missing fields. The waterfall hits Clearbit first — it's stronger on tech stack and employee count for US companies — then falls back to People Data Labs for international records and email-only inputs, then Apollo for anything still blank.

After running those 4,200 records through the waterfall:

  • Employee count: 71% → 94% populated
  • Tech stack: 39% → 67%
  • Funding stage: 28% → 51%

That 28-point lift on tech stack alone changed which leads surfaced as tier-one. The enrichment step isn't optional — it's the foundation the scoring formula sits on.

For intent signals I piped in Bombora topics via Clay's native integration. If you don't have a Bombora contract, skip this field and assign 0 across the board. Plugging in zeroes is more honest than plugging in nothing and having the model treat blanks as noise.

The actual scoring formula

After running the model against 18 months of closed-won and closed-lost data and recalibrating twice, here's the weighted breakdown I settled on:

Total ICP Score = Firmographic (40 pts) + Technographic (30 pts) + Trigger Signals (20 pts) + Behavioral (10 pts)

Firmographic — max 40 points

Criterion Condition Points
Employee count 50–200 20
Employee count 201–1,000 15
Employee count 1,001–5,000 8
Employee count <50 or >5,000 0
Industry Primary ICP vertical 12
Industry Adjacent vertical 6
Industry No match 0
HQ geography Tier-1 target market 8
HQ geography Tier-2 target market 4

Technographic — max 30 points

Criterion Condition Points
Uses a direct competitor Yes 20
Uses a complementary tool Yes 10
Stack complexity (>10 tracked tools) Yes 5
No stack data available 0

Trigger Signals — max 20 points

Criterion Condition Points
Active hiring for roles you displace Job postings found 12
Recent funding (Series A–C, <12 months) Yes 10
Leadership change in buying role (<90 days) Yes 8
Intent topic match 2+ active topics 15
Intent topic match 1 topic 8

I cap trigger signals at 20 even when multiple fire simultaneously, so the 100-point ceiling holds.

Behavioral — max 10 points

Criterion Condition Points
Pricing page visit Yes 6
Case study or ROI page view Yes 4
Demo request form submitted Yes 10 (auto Tier 1)

Tier thresholds: 75+ = Tier 1 (route to AE immediately), 50–74 = Tier 2 (add to sequence), 30–49 = Tier 3 (nurture list), <30 = do not contact.

How to wire this into Clay in under an hour

Step 1 — Import your leads. Pull from a CSV, HubSpot native sync, or Salesforce connector. Clay supports all three without a Zapier middleman.

Step 2 — Add waterfall enrichment columns. For each field (employee count, industry, tech stack, funding stage), configure a waterfall: ClearbitPeople Data LabsApollo. Set each layer to trigger only if the previous returned null.

Step 3 — Build formula columns for each scoring category. In Clay's formula editor, create firmographic_score, techno_score, trigger_score, and behavior_score columns. The employee count portion of firmographic looks like this:

IF(AND({employee_count} >= 50, {employee_count} <= 200), 20,
  IF(AND({employee_count} >= 201, {employee_count} <= 1000), 15,
    IF(AND({employee_count} >= 1001, {employee_count} <= 5000), 8, 0)
  )
)
Enter fullscreen mode Exit fullscreen mode

Stack the remaining sub-criteria using SUM(), then add them into the category total.

Step 4 — Add a Total Score column. =firmographic_score + techno_score + trigger_score + behavior_score

Step 5 — Add a Tier column. IF({total_score} >= 75, "Tier 1", IF({total_score} >= 50, "Tier 2", IF({total_score} >= 30, "Tier 3", "Disqualify")))

Step 6 — Route by tier. Push Tier 1 rows to a HubSpot deal stage and trigger a Slack alert to your AE. Push Tier 2 to your outreach sequence. Let Tier 3 age into a nurture cadence. Tier 4 goes nowhere.

The first build took me about 3 hours. I've replicated it for three other teams since then — the formula columns are reusable and the waterfall configuration carries over cleanly.

What happens when you recalibrate against your own conversion data

Here's the part every other article skips: the weights I listed above are not universal. They're the weights that fit one SaaS company targeting ops teams at mid-market B2B companies in North America. Your numbers will differ.

After six weeks of live scoring, I exported all closed-won and closed-lost records and ran a correlation analysis in a spreadsheet — no code, no data scientist, just CORREL() between each binary signal column and the closed-won flag. What I found for that company:

  • Competitor tech match: 0.71 correlation with close → kept at 20 points
  • Hiring signal: 0.63 correlation → bumped from 12 to 18 points
  • Funding stage: 0.31 correlation → dropped from 10 to 6 points
  • Employee count 50–200: 0.68 correlation → kept at 20 points
  • Intent topic match (2+ topics): 0.74 correlation → strongest single signal, I subsequently weighted it at 18 (capped by category ceiling)

Run this recalibration quarterly. Pull 50+ closed deals minimum for the correlation to be meaningful. Two quarters in, our Tier 1 → pipeline conversion rate had improved from 34% to 51% — purely from tightening the weights, not from changing anything in the outreach.

Tools that do scoring end-to-end vs. tools that assist

Tool Scoring Approach Enrichment Built-in Weight Customization CRM Sync Approx. Cost/Month
Clay Formula-based, fully manual Yes — 150+ providers Full control Yes $149–$800+
Apollo Proprietary auto-score Apollo data only Limited presets Yes $99–$499
6sense AI intent modeling Yes No Yes ~$2,500+
RocketReach None Partial N/A Limited $80–$300
Clearbit Fit score only Yes Limited HubSpot only Bundled
Snov.io Basic rule-based Partial Yes Yes $39–$189
Cognism No scoring Yes (strong EU coverage) N/A Yes Custom

6sense has genuinely strong intent modeling — I've seen it surface accounts that no firmographic signal would have caught — but the cost is only defensible if your average ACV is north of $50k. Apollo's auto-score works, but it's trained on Apollo's behavioral dataset, not your closed-won history. Clay wins on flexibility: you own the model, you understand every point that went into a score, and you can explain a Tier 1 designation to an AE without hand-waving.

What I actually use

For the scoring engine itself, Clay is where I've standardized. Transparent formula columns, waterfall enrichment that covers most edge cases, and a CRM push that actually works.

For the enrichment data layer: People Data Labs is my primary vendor — better API coverage on employee count and industry for non-US companies than Clearbit, and the pricing is more predictable at volume. Apollo fills the gaps on email-only records.

For trigger signals — job posting data and leadership changes — I run Phantombuster scrapers pointed at LinkedIn job listings and pipe the output back into the Clay table as additional enrichment columns. Scrappy, but it adds real signal and I've measured the correlation to prove it.

If you have budget for one add-on, make it Bombora intent data. Of every signal I've tested, intent topic match has the strongest correlation with close rate — stronger than tech stack, stronger than funding stage. The accounts that are actively researching your category right now are the accounts worth spending your AEs' time on.

The model isn't magic. It's a spreadsheet formula trained on your own history, feeding decisions your team would make anyway if they had time to review every record. The automation just makes sure nothing falls through the gap between "promising" and "contacted."

Top comments (0)