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: Clearbit → People Data Labs → Apollo. 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)
)
)
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)