ICP Fit Scorer
Pricing
from $42.50 / 1,000 results
ICP Fit Scorer
Scores pre-enriched companies against your Ideal Customer Profile using weighted signals. Returns a 0 to 100 fit score, A to D tier, and per-signal breakdown. Deterministic and LLM modes. Built for Clay enrichment and batch processing. MCP-ready for Claude Desktop and AI agents.
Pricing
from $42.50 / 1,000 results
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
๐ฏ What can ICP Fit Scorer do?
Give it pre-enriched company data and your ICP definition, and it returns an
icp_score from 0 to 100, an icp_tier from A to D, and a per-signal breakdown showing
exactly which signals earned the points.
Define your ICP as a JSON config with exact weights, or describe it in plain English and let the actor build the config for you.
| ๐ฆ What you get | โ๏ธ Features and integrations |
|---|---|
๐ฏ icp_score 0 to 100 and an A to D tier๐ท๏ธ lead_tag: priority, nurture or disqualify๐ Per-source score breakdown, 8 categories ๐งพ 28 flat fields, snake_case, one row per company | ๐ Plain-English mode builds the config for you ๐งฉ Six presets, or your own weights ๐ Score delta against your previous run โฌ๏ธ Export to JSON, CSV, Excel, HTML or XML |
Bought by teams who want account tiering that is auditable rather than a black box, and who already have enrichment columns to score.
๐ซ This actor does no scraping and fetches nothing by default. It scores data you already have. Run the enrichment actors first, or set
fetch_signalsto have it run the hiring and tech stack actors for you. That is also why it is fast: there is no crawl to wait for.
๐ก Why use ICP Fit Scorer?
| If you want | Read these fields |
|---|---|
| One number to sort accounts by | icp_score |
| A band instead of a number | icp_tier, lead_tag |
| To see which signals earned the score | score_hiring, score_tech_stack, score_headcount, score_firmographic, score_industry, score_funding, score_social, score_job_board |
| To find your data gaps | signals_matched, signals_missing |
| To audit the scoring itself | scoring_config_used, config_source, score_explanation |
| Movement since last time | previous_score, score_delta, score_direction |
๐งฎ Two ways to set up scoring
JSON config mode. Define exact weights per signal in a scoring_config object. Deterministic,
auditable, no API key needed. Best when you have already defined your ICP criteria.
Plain-English mode. Describe your ICP in a sentence or two and supply an OpenAI or Anthropic API
key. The actor generates a valid scoring_config for you. Best when you want scoring without writing
JSON.
If you provide both, the JSON config wins and the LLM call is skipped.
Six presets ship if you want neither: full_signal, saas_outbound, b2b_services, fintech,
smb_local and enterprise. full_signal scores every source out of the box.
๐ก Five signal sources, eight score components
Scoring spans hiring, tech stack, firmographics (employee band and revenue), social presence (platforms found and total followers), job board activity (job count and keyword matches), funding (recency plus amount), headcount and industry.
Tiers default to 80 / 60 / 40 for A / B / C and are configurable through tier_thresholds. The
funding recency window defaults to 540 days and is configurable through funded_within_days.
lead_tag falls out of the tier automatically: priority for tier A, nurture for B or C,
disqualify for D. Use it directly in a Clay view filter or a sequencer segment condition without
writing a formula column.
โถ๏ธ Ready-to-run examples
| Example | What it does |
|---|---|
| Score Fit With a Plain-English ICP | One-sentence ICP, your own LLM key |
| SaaS Outbound Lead Scoring | One-click preset, no JSON to write |
| Fintech Fit Scorer With Funding Window | Weights recent funding inside your window |
| Enterprise Tiering With Thresholds | Custom A to D thresholds |
| Headcount and Hiring Score | Custom weights on headcount and GTM hiring |
๐ What data can ICP Fit Scorer return?
28 fields per company.
| Field | What it holds |
|---|---|
icp_score | 0 to 100 |
icp_tier | A, B, C or D |
lead_tag | priority, nurture or disqualify |
score_hiring, score_tech_stack, score_headcount, score_firmographic, score_industry, score_funding, score_social, score_job_board | Points contributed by each source |
signals_matched, signals_missing | What fired, and what was absent |
scoring_config_used, config_source | The exact config applied, and where it came from |
previous_score, score_delta, score_direction | Movement since your last run |
score_explanation | Optional narrative, when include_explanation is on |
company_domain, company_name, run_date, error | Identity and bookkeeping |
โ ๏ธ
signals_missingcan misclassify present-but-false fields. When a boolean such asuses_hubspotis explicitly passed as"false", it can appear insignals_missingeven though it was provided and evaluated correctly. Scoring is unaffected, the signal correctly scores 0, but do not read that list as a pure data-gap report.
โ ๏ธ
falseandnullmean different things on every row.falseis a measurement: the actor looked and the answer was no.nullis the absence of one: the actor could not look. When something it needed fails, the row comes back withdegraded: true, a plain-languagedegradation_reason, and every field it could not measure set tonullrather than to a confidentfalseor0. Filter ondegradedbefore you trust a negative.
๐ ๏ธ How to score a company against your ICP
- Open the Input tab and supply
company_domainplus your enrichment fields. - Pick one: a
scoring_config, atemplatepreset, or anicp_descriptionwith anllm_api_key. - Optionally set
tier_thresholdsandfunded_within_days. - Click Start.
- Sort by
icp_score, or filter onlead_tag.
๐งช Using it in Clay
Add an Apify enrichment column and map your enrichment columns to the matching inputs. Every input is accepted as a string, which is what Clay sends.
There is a prebuilt Clay table with 13 input columns, the enrichment column and 17 formula columns,
including ISBLANK wrappers for the score fields:
open the template.
๐ As the scoring step in a chain
Run GTM Hiring Signal Scraper and
Tech Stack Signal Detector first, feed their
output here, then push what survives with
Sequencer Lead Push gated on
min_icp_score.
๐ Tracking score movement
Pass the prior run's score as previous_score and you get score_delta and score_direction. An
account moving from 55 to 78 is a better trigger than an account that has sat at 78 all year.
๐ต How much does it cost to score an account?
You are charged once per company scored.
| Plan | Per company | Per 1,000 companies |
|---|---|---|
| Free | $0.05 | $50.00 |
| Bronze | $0.0475 | $47.50 |
| Silver | $0.045 | $45.00 |
| Gold | $0.0425 | $42.50 |
There is also an Actor start event at $0.00005, charged once per run per GB of memory.
Free Apify plans get 60 results per calendar month, resetting on the 1st; a result counts once it is successfully scored. Paid plans have no monthly cap.
๐ Your spending limit is respected. Set a maximum cost per run in Apify, or max_charge_usd on the Input tab, and the run stops before it would go over, keeping every result already charged. Each row's billable_events_json lists the events that row was charged for.
๐ณ In plain-English mode you also pay your own LLM provider. The actor calls OpenAI or Anthropic with the key you supply and that vendor bills you directly; nothing is marked up. JSON config mode makes no LLM call at all and needs no key. Use
min_score_to_outputto suppress low scorers from the dataset.
โจ๏ธ Input
Everything is on the Input tab. The options worth explaining:
| Field | Type | Default | What it does |
|---|---|---|---|
company_domain, company_name | string | none | Identity for the row. |
scoring_config | object | none | Exact weights per signal. Must sum to 100. |
template | string | none | One of six presets instead of writing a config. |
icp_description + llm_api_key | string | none | Plain-English mode. llm_provider defaults to openai. |
tier_thresholds | object | 80 / 60 / 40 | A, B and C cutoffs. |
funded_within_days | integer | 540 | The funding recency window. |
fetch_signals | boolean | false | Run the GTM Hiring Signal Scraper and the GTM Tech Stack Signal Scraper for each company before scoring, and fill any hiring or tech stack signal you did not supply. Uses the run's own Apify token, so no token input is needed. Each actor bills your account at its own Store price: at list price 0.05 USD plus 0.015 USD per company, on top of this actor's result. If either lookup fails, the row is marked degraded and degradation_reason names the missing signals. |
apify_token | string | none | Optional. Token for fetch_signals and dataset_id. Leave empty to use the run's own token. |
include_explanation | boolean | false | Return score_explanation. |
min_score_to_output | integer | none | Suppress rows below this score. |
previous_score | integer | none | Unlocks delta tracking. |
dataset_id, csv_url | string | none | Batch input sources. |
webhook_url | string | none | Post results onward. |
gtm_role_count | string | none | Number of open GTM/sales roles. Scores via the gtm_role_count_strong signal when at or above min_gtm_roles (default 2). Accepts a numeric string (e.g. "8"). Sent as a string for Clay compatibility and coerced to integer at runtime. |
uses_salesforce | string | none | Whether the company uses Salesforce. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime. |
uses_clay | string | none | Whether the company uses Clay. Accepts a boolean-like string ("true"/"false"). Sent as a string for Clay compatibility and coerced to boolean at runtime. |
crm_detected | string | none | Whether any CRM was detected. Accepts a boolean-like string ("true"/"false") or any non-empty CRM name (e.g. "Salesforce"). Sent as a string for Clay compatibility and coerced to boolean at runtime. Auto-derived from uses_hubspot/uses_salesforce if not set. |
seq_tool_detected | string | none | Whether a sales sequencing tool (Outreach, SalesLoft, Apollo, Lemlist) was detected. Accepts a boolean-like string ("true"/"false") or any non-empty tool name (e.g. "Outreach"). Sent as a string for Clay compatibility and coerced to boolean at runtime. |
tech_stack | string | none | Comma-separated list of technologies. Used to auto-detect CRM/sequencing tools if booleans are not set. |
headcount_min | integer | none | Minimum headcount for the headcount_in_range signal. |
headcount_max | integer | none | Maximum headcount for the headcount_in_range signal. |
headcount_in_range | boolean | none | Override: whether headcount is in your target range. |
hq_location | string | none | Headquarters location from the Company Firmographic Enricher (Actor ID YlUtLWjfPpqykmB8g). Carried for reference; not currently scored. |
founded_year | string | none | Year the company was founded, from the Company Firmographic Enricher (Actor ID YlUtLWjfPpqykmB8g). Carried for reference; not currently scored. Accepts a numeric string (e.g. "2015"). |
recently_funded | boolean | none | Override: whether the company was recently funded (within funded_within_days, default 540). |
last_funding_date | string | none | ISO date of last funding round (legacy field; latest_funding_date is preferred). Used to auto-detect recently_funded if the boolean is not set. |
latest_funding_amount | string | none | Dollar amount of the latest funding round (from C1 when it ships). Scores via well_funded when at or above min_funding_amount (default 1000000). Accepts a numeric string (e.g. "50000000"). |
industry_match | boolean | none | Override: whether the company's industry matches your target list. |
target_industries | string | none | Comma-separated list of target industries for the industry_match signal. |
social_platforms_found | string | none | Number of official social platforms found, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h). Scores via social_presence when at or above min_social_platforms (default 2). Accepts a numeric string. |
has_linkedin | string | none | Whether a company LinkedIn page was found, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h) or the Domain to LinkedIn URL Resolver (Actor ID 3HtnSaqPHOg1Qg5gx). Contributes to social_presence. Accepts a boolean-like string. |
has_twitter | string | none | Whether a company X/Twitter profile was found, from the Company Social Presence Mapper (Actor ID 4k6CCemkgBDz18m2h). Contributes to social_presence. Accepts a boolean-like string. |
keyword_match_count | string | none | Number of target-keyword matches found, from the Job Board Keyword Signal Scanner (Actor ID 4DvqpvhMR74NLcDDY). Scores via keyword_signal_match when at or above min_keyword_matches (default 1). Accepts a numeric string. |
max_charge_usd | number | none | Optional. The run stops before the next result that would take this run's charges over this amount, and keeps every result already charged. Leave empty to rely only on the maximum cost per run you set in Apify. |
domains | array | none | Optional list of bare company domains, one company per line. Each domain is scored as its own row, with the same scoring_config or template. Turn on fetch_signals to read live hiring and tech stack signals for each one; otherwise only the signals you pass apply. |
The signal fields themselves (gtm_hiring_signal, uses_hubspot, headcount, employee_band,
revenue_estimate, industry, latest_funding_date, total_followers, job_count and the rest)
are all on the Input tab and all optional. Anything absent lands in signals_missing.
๐ค Output
One flat row per company, exportable as JSON, CSV, Excel, HTML or XML.
{"company_domain": "example.com","company_name": "Example Inc","icp_score": 78,"icp_tier": "B","lead_tag": "nurture","score_hiring": 20,"score_tech_stack": 18,"score_headcount": 15,"score_firmographic": 10,"score_industry": 10,"score_funding": 5,"score_social": 0,"score_job_board": 0,"signals_matched": ["gtm_hiring_signal", "crm_detected", "headcount_in_range"],"signals_missing": ["total_followers", "job_count"],"config_source": "template:saas_outbound","previous_score": 55,"score_delta": 23,"score_direction": "up","run_date": "2026-06-18T16:20:26.776Z","error": null}
๐งพ More fields on every row
| Field | Type | What it holds |
|---|---|---|
row_status | string | ok, degraded, error, or notice (a notice row carries a message, not a result). Present on every row. |
error_reason | string | Why the row is degraded or an error, in plain words. Null on an ok row. Present on every row. |
billable_events_json | string | JSON list of the pricing events this row was charged for, for example [{"event":"apify-default-dataset-item","count":1}]. Lets you reconcile a run from the dataset alone. The once per run start event is not repeated on rows. |
๐ก Tips
- Start with a
templatepreset. You can exportscoring_config_usedfrom the output and tune it from there rather than writing one from scratch. - Store each run's
icp_scoreand pass it back asprevious_score. Movement is a better trigger than a static score. - Read
signals_missingbefore you trust a low score. A company can score badly because it is a poor fit or because you did not enrich it. - Use JSON config mode for anything you have to justify to someone. It is deterministic and the exact config is echoed on every row.
- Normalize
funding_stagebefore passing it. See Known limits.
โ ๏ธ Known limits
JSON config mode is fully deterministic. LLM mode is not. The same plain-English description can produce slightly different configs across runs. Use JSON config mode when repeatability matters.
scoring_config weights must sum to 100. The actor errors if they do not. Unrecognized signal
keys are logged as warnings and skipped rather than causing an error.
Pre-enriched input only. The actor does not fetch signals on its own unless you set
fetch_signals. With it on, only hiring and tech stack signals are fetched; firmographic, funding,
social, and job board signals are always supplied as input.
signals_missing can misclassify present-but-false booleans. Scoring is correct either way; the
list is what is misleading.
funding_stage requires an exact format and is not normalized. "Series B" does not match, only
"series_b" does. The same applies to every stage. Normalize in Clay with a formula column before
passing it.
One error message is wrong. In LLM mode, when neither scoring_config nor icp_description is
supplied, the message reads "Either scoring_config or template is required." It should say
icp_description.
โ FAQ
Do I need an LLM key?
Only for plain-English mode. JSON config mode and the six presets need no key and make no LLM call.
What if I supply both a config and a description?
The JSON config wins and the LLM call is skipped.
Why did a company score 0 on a signal I know is true?
Check signals_missing and the exact format you passed. funding_stage in particular is not
normalized.
Can I change the A to D cutoffs?
Yes, through tier_thresholds. They default to 80 / 60 / 40.
Does it scrape anything?
No, not unless you turn on fetch_signals, which runs the hiring and tech stack actors for each
company. Otherwise it scores data you supply, which is why it is fast and deterministic.
๐งฉ Want other GTM data?
Mamba Labs builds custom actors for B2B go-to-market teams. The public versions of that work live here on the Store, so our users get the same tooling we build under contract.
Every actor in the suite takes a domain or a company and returns one flat row, so they stack in the same Clay table without reshaping anything.
๐ ๏ธ Need something custom built for you or your team? Tell us what you are trying to find and we will build it. Talk to Mamba Labs.
๐ Support
Found a bug or want a signal added to the scoring model? Open an issue on the Issues tab with the config and the row, and we will look at it.
โน๏ธ Sourcing and legal. This actor holds no data source of its own. It scores the fields you supply, which come from your own enrichment. In plain-English mode your ICP description and an LLM key are sent to the provider you choose, and that vendor bills you directly. The exact scoring config applied is echoed on every row, so any score is auditable. You are responsible for how you use the output.
Built by Mamba Labs.