Most lead lists are ranked by gut feel. A rep scrolls the export, picks the names that look right, and the rest wait.
Point-based scoring was meant to fix that, but the weights are guesses and nobody updates them.
AI-powered fit scoring replaces the guesswork with one clear question per lead: how closely does this person match the customers you want?
30-Second Summary
- ICP fit scoring ranks leads by how closely they match your ideal customer profile, before you spend any time on outreach.
- A good fit score checks five things: company fit, buyer fit, need fit, timing signals and data completeness.
- You can run it in a spreadsheet, your CRM, Clay, n8n or a short script; we show a tested HubSpot workflow as the example.
- Data beats prompts: with only a job title, 0 of 40 leads scored Strong fit; with industry and location added, 5 of 50 did.
- Turn scores into four actions: prioritise, research, nurture, exclude, and review every list before it goes to outreach.
There is no single right tool for this. What matters is a clear profile, complete lead data and a model that answers the same question the same way for every lead.
We built the full workflow on a real HubSpot account to show what each step looks like. Copy it below, or follow the same method with your own stack.
We will walk you through the process step-by-step. If you want to use this workflow yourself, you can access it via our public GitHub repo.
If you use n8n, we have the JSON for you to use.
Score HubSpot leads against your ICP with AI
hubspot-ai-lead-scoring.json · 2 ways to run
GitHub Code
Python script, ICP.md template and agent instructions. Run it yourself, or with Claude Code, Codex or Cursor.
n8n No-code
Import the workflow into n8n. Paste it onto an empty canvas or upload the JSON.
We've used Claude and HubSpot to demonstrate how you can implement AI-powered best-fit lead scoring, but with a few tweaks, this process can be used with other LLMs and CRMs.
In this guide
- What Is AI-Powered Fit Scoring for an ICP Lead List?
- ICP Fit vs Lead Scoring vs Buying Intent
- What Should an AI Fit Score Check?
- Ways to Run AI Fit Scoring
- How to Score HubSpot Leads With AI: Step by Step
- AI Fit Scoring Example: 50 SaaS Sales Leaders
- How to Turn Fit Scores Into Actions
- Common AI Fit Scoring Mistakes
What Is AI-Powered Fit Scoring for an ICP Lead List?
AI ICP fit scoring uses an AI model to compare each lead with your ideal customer profile (ICP) and return a score.
The model reads what you know about the lead, such as job title, company, industry, size and location, and judges it against criteria you write down.
The output is a level (for example Strong, Partial, Weak or No fit). It's a number you can filter or rank.
For example, it would look like this in HubSpot
It replaces two older approaches:
- Manual review: accurate for 20 leads, impossible for 2,000.
- Point-based rules: "+10 for VP, +15 for 50 to 500 employees". Fast, but rigid. Every new job title or industry name needs a new rule, and the weights are guesses.
An AI model reads "Head of Revenue" and "Directeur Commercial" the same way you would, without a rule for each.
ICP Fit vs Lead Scoring vs Buying Intent
These three terms get mixed up, and mixing them produces bad lists.
| ICP fit | Buying intent | Lead scoring | |
|---|---|---|---|
| Question | Is this the kind of customer we want? | Are they in market right now? | How hot is this lead overall? |
| Based on | Industry, size, location, role, seniority | Hiring, funding, job changes, site visits | Usually fit plus engagement |
| Changes | Rarely | Weekly | Constantly |
| Use it to | Decide who belongs on a list | Decide when to reach out | Route leads inside a funnel |
Score fit first. A lead that will never fit is not worth any intent data, and a perfect-fit lead with no intent today still belongs on your list for later.
What Should an AI Fit Score Check?
Write your criteria so that a stranger could answer yes or no from a LinkedIn profile. "Fast-growing company" fails that test; "11 to 500 employees" passes.
1. Company Fit
Industry, company size, location and business model. These are firmographics, and they usually decide most of the score. If you sell to B2B software companies, a consumer app with the right headcount is still a poor fit.
2. Buyer Fit
Function, seniority and department. A Head of Sales and a Sales Development Representative work at the same company but buy very differently. Decide which roles sign, which use, and which you should not contact at all.
3. Need Fit
Whether the person's job includes the problem you solve. A "VP Revenue Operations" owns the CRM; a "VP Sales, Public Sector" may not care about outbound tooling at all. Job titles hint at this; the company description and the person's headline confirm it.
4. Timing Signals
Hiring for SDRs, a recent funding round, a new sales leader, a job change. These are intent signals. Keep them as positive signals that raise a score, never as must-haves, or the score turns into an intent score.
5. Data Completeness
The model can only judge what it can see. If industry or location is empty, it cannot confirm those criteria, and a good lead lands in the middle of the scale. Missing data looks exactly like a weak fit. Check field coverage before you trust any score.
This company record arrived in HubSpot with its size and location, but no industry. The model had to guess that criterion:
Ways to Run AI Fit Scoring
You do not need a specific tool. Pick the one where your leads already live.
| Option | How it works | Good for |
|---|---|---|
| Google Sheets | The =AI() function (Gemini) classifies each row from a prompt. Available on paid Google Workspace plans | One-off lists, no setup |
| Your CRM's scoring | CRMs like HubSpot have a lead scoring tool with fit and engagement scores on its premium editions; Salesforce has Einstein Lead Scoring | Teams already on those plans |
| Clay | An AI column or the Score Row enrichment scores each row against criteria you describe | Lists you already enrich in Clay |
| n8n or Make | A scheduled workflow sends each lead to an AI model and writes the result back | Scoring every new lead automatically |
| A script or an AI coding agent | A short script calls the CRM API and an AI model, with your ICP in a file. Claude Code, Codex or Cursor can run it for you | Full control, lowest cost |
Whatever you pick, two choices matter more than the tool:
- Use a decision model, not a chat model. A chat model invents a number each time, so a 70 today is not a 70 tomorrow, and the output sometimes needs parsing. A decision model answers a typed question with fixed levels and calibrated probabilities: across many leads, answers given with 80% confidence are right about 80% of the time. OpenAI's Decisions API and Typesafe's JEV both work this way.
- Keep the ICP in one file. When the profile lives in a prompt buried inside a tool, nobody updates it. A plain-text ICP.md can be versioned, shared and changed in one place.
Here is how the two decision models we tested compare:
How to Score HubSpot Leads With AI: Step by Step
We use HubSpot in our example because its free plan includes the API. The same steps work with Salesforce, Pipedrive, Attio or a CSV: only the API calls in step 3 and step 5 change.
We ran this on a real HubSpot account with 90 contacts. Every request, number and screenshot below comes from that run.
1. Write Your ICP.md File
Split your profile into company must-haves, buyer must-haves, positive signals and disqualifiers. Here is the template we used. Copy it below, or download ICP.md from GitHub, then replace every line with your own:
ICP.md
# Ideal customer profile
## Company must-haves
- Industry: B2B software (SaaS), IT services, or recruiting agencies.
- Size: 11 to 500 employees.
- Location: Europe or North America.
- Sells to other businesses, with an outbound sales team.
## Buyer must-haves
- Function: Sales, Business Development, Growth, or Revenue Operations.
- Seniority: Head of, Director, VP, C-level, or Founder.
## Positive signals (raise the fit, not required)
- Job title mentions outbound, prospecting, lead generation, or SDR team.
- Company is hiring SDRs or BDRs.
- Lead uses LinkedIn Sales Navigator.
## Disqualifiers (always No fit)
- Students, interns, job seekers, or freelancers with no team.
- Competitors: lead-data or email-finder vendors.
- Company with more than 5,000 employees.
- Government, education, or non-profit organizations.Keep it under one page: the model reads the whole file for every lead.
2. Get Complete Lead Data Into Your CRM
We first scored 40 existing HubSpot contacts. They had a name, a job title and a company, but no industry and no location. Result: 0 Strong fits.
We then built a matching Sales Navigator search with the Evaboot MCP in Claude, exported 50 leads with Evaboot and pushed them to HubSpot with industry and location mapped. Result: 5 Strong fits.
Prompt for Claude with the Evaboot MCP
Build a Sales Navigator search for Heads of Sales and VPs of Sales at B2B software companies with 11 to 500 employees in Europe or North America. Export the first 50 leads and push them to HubSpot.Claude asks for your approval before it calls each Evaboot tool:
A minute later it reports what it built. Read the summary before you export; here Claude warned that the title filter was broader than asked:
Before you push, map the fields the model needs on the Evaboot HubSpot mapping page: Location, Profile Industry, Company Employee Exact Count, Company Location and Company Description. See how to export leads from Sales Navigator for the export itself.
The company Industry trap
HubSpot's company Industry property is a fixed dropdown with 148 values. LinkedIn industry names such as "Software Development" are not on that list, so HubSpot drops them silently: in our push, 24 of 25 companies arrived with no industry. Map Profile Industry to the contact's Industry field, which is free text, or map Company Industry to a custom single-line text property.
After the push, a green check on the HubSpot icon confirms that the leads arrived:
3. Read the Leads From the CRM
Create a HubSpot service key. Open More > Development in the left menu, then Keys > Service Keys:
Click Create service key and add five scopes: crm.objects.contacts.read, crm.objects.contacts.write, crm.schemas.contacts.read, crm.schemas.contacts.write and crm.objects.companies.read.
Then ask HubSpot for every contact without a score. Size, location and description live on the company record, so read each contact's company too:
HubSpot API calls
POST https://api.hubapi.com/crm/v3/objects/contacts/search
{"filterGroups": [{"filters": [{"propertyName": "ai_icp_scored_at", "operator": "NOT_HAS_PROPERTY"}]}],
"properties": ["firstname", "lastname", "jobtitle", "company", "industry", "country", "city"], "limit": 100}
GET https://api.hubapi.com/crm/v4/objects/contacts/{contactId}/associations/companies
GET https://api.hubapi.com/crm/v3/objects/companies/{companyId}?properties=domain,industry,numberofemployees,country,description4. Score Each Lead With a Decision Model
Send the lead as the input and your ICP.md inside the question. The four levels go from lowest to highest:
OpenAI Decisions API request
curl https://api.openai.com/v1/decisions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-luna",
"input": "<job title, company, industry, size, location, company description>",
"questions": [{
"type": "score",
"name": "icp_fit",
"instructions": "How well does this lead match the ideal customer profile below?\n\n<the content of ICP.md>",
"levels": [
{"label": "No fit", "description": "Fails a disqualifier, or matches none of the must-haves."},
{"label": "Weak fit", "description": "Matches one must-have. The other must-haves fail or are unknown."},
{"label": "Partial fit", "description": "Matches most must-haves, but one fails or is unknown."},
{"label": "Strong fit", "description": "Matches every must-have and no disqualifier."}
]
}]
}'For the SVP and Head of Sales North America at Matilda Cloud, a 155-person software company in Texas, the answer came back in 0.8 seconds: score 2.75 out of 3, Strong fit at 76% probability, confidence 0.75. The call used 749 input tokens, so 1,000 leads cost about 8 cents.
Convert it for your CRM: score ÷ 3 × 100 gives 92, and the nearest level gives the label.
5. Write the Score Back
Create four contact properties once: fit, score, confidence and the date scored. The script and the n8n template create them for you on the first run. Check them in Settings > Properties:
Then write the scores with one batch call of up to 100 contacts:
Write the scores
POST https://api.hubapi.com/crm/v3/objects/contacts/batch/update
{"inputs": [{"id": "893520299194", "properties": {
"ai_icp_fit": "strong_fit", "ai_icp_score": 92,
"ai_icp_confidence": 0.75, "ai_icp_scored_at": "2026-10-16T15:13:20Z"}}]}HubSpot's search index updates a few seconds after a write, so leave at least a minute between two runs or the same contacts get scored twice.
6. Automate It
With an AI coding agent, clone the repo, add your keys to .env, open the folder in Claude Code, Codex or Cursor and ask "Score my new HubSpot leads." The repo's agent instructions tell it what to do. In Claude Code, it first checks your ICP.md and asks you to keep or replace the example:
Then it runs a dry run, shows the results and flags the scores that look wrong, with the reason for each:
Answer "yes" and it writes the scores and sums them up by fit level:
Without an agent, the same script runs from a terminal. python3 score_leads.py --dry-run prints one line per lead and writes nothing:
With n8n, copy or download the template from the workflow box at the top of this guide, and import it from the workflow menu next to the workflow name (Import > From file, or From URL with the template link):
Add a HubSpot Service Key credential with your key; n8n tests it when you save:
Add an OpenAI credential, paste your ICP into Set your ICP, then activate the workflow. It scores new contacts every morning:
To use JEV instead of OpenAI, run the script with --model jev. In our test it answered in about 0.3 seconds and costs $0.042 per million input tokens against $0.10, but access is by waitlist.
AI Fit Scoring Example: 50 SaaS Sales Leaders
Here is how five of our 50 Evaboot leads scored, and what we would do with each:
| Lead | Company fit | Buyer fit | Score | Action |
|---|---|---|---|---|
| SVP and Head of Sales North America, Matilda Cloud | Software, 155 staff, US | Senior sales leader | 92, Strong fit | Prioritise |
| Senior Vice President of Sales, Tempo Software | Software, size in range | Senior sales leader | 80, Partial fit | Prioritise after a quick check |
| SVP of Sales, B2B Rocket | Sells outbound tools | Senior sales leader | 54, Partial fit | Exclude if it is a competitor |
| Enterprise Account Director, Tempo Software | Software, size in range | Account manager, not a buyer | 28, Weak fit | Find the right contact |
| Director, Revenue Operations, Kickstarter | Consumer platform | Right function | 13, No fit | Exclude |
Across all 50 leads: 5 Strong, 30 Partial, 11 Weak and 4 No fit.
Two things stand out. Many leads above 80 are still "Partial fit", because the label is just the nearest level; sort and filter on the number. And the model did not know B2B Rocket sells outbound tools, while Claude Code spotted it during review. A score is a first pass, not a verdict.
How to Turn Fit Scores Into Actions
A score only helps if each band has a clear next step.
1. Prioritise High-Fit Leads
Send leads above your cutoff straight to outreach. In HubSpot, the call list is one filter: AI ICP score is greater than or equal to 75. In our account that gave 14 of 90 contacts.
2. Research Low-Confidence Leads
A confidence below 0.5 means the model hesitated between two levels, usually because a field is missing. Fill the field, clear the score date, and the lead is scored again on the next run.
3. Nurture the Middle
Partial fits with the right company but the wrong person are account opportunities, not dead leads. Find the decision-maker at the same company instead.
4. Exclude Poor Matches
Remove No fit leads and disqualified companies before outreach, so your sequences and your sender reputation only go to people who could buy.
Common AI Fit Scoring Mistakes
1. Writing a Vague ICP
"Mid-market tech companies with growth potential" gives the model nothing to check. Write criteria a stranger could verify from a profile, and split must-haves from nice-to-haves.
2. Mixing Fit With Intent
Putting "recently raised funding" in the must-haves turns a fit score into an intent score, and good-fit companies drop out every quarter. Keep timing as a positive signal.
3. Scoring Incomplete Data
The most common cause of flat, middle-of-the-scale scores. Check that industry, size and location are filled before you score, and map them from your data source.
4. Skipping the Review
Run a dry run on 20 leads and read the results before you score the whole list. If a won customer lands in Weak fit, a must-have is wrong; fix ICP.md and score again.
Frequently asked questions
What is AI-powered fit scoring for an ICP lead list?
An AI model compares each lead with your ideal customer profile.
AI ICP fit scoring uses an AI model to compare each lead with your ideal customer profile and return a score, usually with a confidence. It answers one question, "how closely does this lead match the customers we want?", from data such as industry, company size, location, job title and seniority.
It does not tell you whether the lead is ready to buy; that is intent.
What is the difference between ICP fit, lead scoring and buying intent?
Fit is who they are, intent is when they buy.
ICP fit measures who the lead is compared with your ideal customer. Buying intent measures whether the lead is in market right now, from signals such as hiring, funding or visits to your pricing page. Lead scoring is the umbrella term, and most lead scores mix fit and engagement.
Score fit first, because a lead that will never fit is not worth any intent data.
Which AI model is best for lead scoring?
A decision model, not a chat model.
For fit scoring, OpenAI's Decisions API (model gpt-6-luna) and Typesafe's JEV return a fixed answer with calibrated probabilities instead of free text, so every lead is judged on the same scale.
In our test, scoring 1,000 leads cost about 8 cents with OpenAI.
Can I score leads with AI without a CRM?
Yes: a spreadsheet, Clay or a script all work.
The same method works in a Google Sheet with the =AI() function, in Clay with an AI column or Score Row, or with a short script that reads a CSV.
A CRM such as HubSpot is useful because the score sits next to the contact and your team can sort and filter on it, but it is not required.
Why does my AI fit score give almost no high-fit leads?
Usually because the fields the model needs are empty.
If industry or location is missing, the model cannot confirm those criteria and caps the lead in the middle. In our test, 40 HubSpot contacts with only a job title and company produced zero Strong fits.
After we mapped industry and location from an Evaboot export, 5 of 50 leads scored Strong fit.
Rate this article
4.9/5 (125 votes)