How to Set Up AI-Powered Fit Scoring for an ICP Lead List? (2026)

JB Jezequel JB Jezequel Sales Tools

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.

Walkthrough: from ICP to scored leads in HubSpot

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 logo

GitHub Code

Python script, ICP.md template and agent instructions. Run it yourself, or with Claude Code, Codex or Cursor.

n8n logo

n8n No-code

Import the workflow into n8n. Paste it onto an empty canvas or upload the JSON.

Download 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

HubSpot contact with AI ICP fit Strong fit, AI ICP score 92, AI ICP confidence 0.75 and AI ICP scored at

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 fitBuying intentLead scoring
QuestionIs this the kind of customer we want?Are they in market right now?How hot is this lead overall?
Based onIndustry, size, location, role, seniorityHiring, funding, job changes, site visitsUsually fit plus engagement
ChangesRarelyWeeklyConstantly
Use it toDecide who belongs on a listDecide when to reach outRoute 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.

AI ICP fit scoring checks company fit, buyer fit, need fit and timing signals for each lead

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:

HubSpot company Matilda Cloud with an empty Industry field

Ways to Run AI Fit Scoring

You do not need a specific tool. Pick the one where your leads already live.

OptionHow it worksGood for
Google SheetsThe =AI() function (Gemini) classifies each row from a prompt. Available on paid Google Workspace plansOne-off lists, no setup
Your CRM's scoringCRMs like HubSpot have a lead scoring tool with fit and engagement scores on its premium editions; Salesforce has Einstein Lead ScoringTeams already on those plans
ClayAn AI column or the Score Row enrichment scores each row against criteria you describeLists you already enrich in Clay
n8n or MakeA scheduled workflow sends each lead to an AI model and writes the result backScoring every new lead automatically
A script or an AI coding agentA 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 youFull 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:

Comparison of two decision models for AI-powered fit scoring: OpenAI Decisions API and Typesafe JEV, with price, speed and access

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:

Claude asking to use the Evaboot tool Build a Sales Navigator search from a prompt with max results 50

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:

Claude reply: the Sales Navigator search is built with 50 companies and 101 leads, with a warning that the title filter is 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.

Evaboot HubSpot field mapping with Company Employee Exact Count, Industry, Description and Location mapped to HubSpot company properties

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:

Evaboot export row: 50 leads, 45 emails, pushed to HubSpot with a green check

3. Read the Leads From the CRM

Create a HubSpot service key. Open More > Development in the left menu, then Keys > Service Keys:

HubSpot More menu open on Development, with the Service Keys page and the Create service key button

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.

HubSpot service key AI lead scoring with five scopes: companies read, contacts read and write, contact schemas read and write

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,description

4. 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:

HubSpot contact properties search for AI ICP showing AI ICP fit, score, scored at and confidence

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 contacts list sorted by AI ICP score, with five Strong fit sales leaders at the top and their AI ICP confidence

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:

Claude Code loads the score-leads skill and asks whether to keep the example ICP.md before scoring

Then it runs a dry run, shows the results and flags the scores that look wrong, with the reason for each:

Claude Code dry-run table of HubSpot leads with scores and fit levels, flagging two scores to check

Answer "yes" and it writes the scores and sums them up by fit level:

Claude Code confirms it wrote 8 scores to HubSpot with a count per 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:

Terminal dry run of score_leads.py scoring 8 HubSpot contacts, nothing written to HubSpot

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):

n8n workflow menu open on Import with the From URL and From file options

Add a HubSpot Service Key credential with your key; n8n tests it when you save:

n8n HubSpot Service Key credential with Connection tested successfully

Add an OpenAI credential, paste your ICP into Set your ICP, then activate the workflow. It scores new contacts every morning:

Successful n8n run of the HubSpot AI lead scoring workflow, every node green with 3 items from Find unscored contacts to Write score to HubSpot

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.

TypeSafe console with the JEV playground, example score, choice and noul requests, and the quickstart with an API key

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:

LeadCompany fitBuyer fitScoreAction
SVP and Head of Sales North America, Matilda CloudSoftware, 155 staff, USSenior sales leader92, Strong fitPrioritise
Senior Vice President of Sales, Tempo SoftwareSoftware, size in rangeSenior sales leader80, Partial fitPrioritise after a quick check
SVP of Sales, B2B RocketSells outbound toolsSenior sales leader54, Partial fitExclude if it is a competitor
Enterprise Account Director, Tempo SoftwareSoftware, size in rangeAccount manager, not a buyer28, Weak fitFind the right contact
Director, Revenue Operations, KickstarterConsumer platformRight function13, No fitExclude

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.

HubSpot contacts filtered on AI ICP score greater than or equal to 75, showing 14 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.

Four common AI fit scoring mistakes and their fixes: vague ICP, mixing fit with intent, incomplete data and skipping the review

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)