ICP Fit Scorer avatar

ICP Fit Scorer

Pricing

from $50.00 / 1,000 results

Go to Apify Store
ICP Fit Scorer

ICP Fit Scorer

Score companies against your ICP using weighted signals and pre-built templates. Returns icp_score 0-100, icp_tier A-D, per-signal breakdown, and plain-English explanation. Flat Clay-ready output.

Pricing

from $50.00 / 1,000 results

Rating

0.0

(0)

Developer

Mamba Labs

Mamba Labs

Maintained by Community

Actor stats

0

Bookmarked

0

Total users

0

Monthly active users

20 hours ago

Last modified

Share

Version: 1.1

Scores companies against your ICP using weighted signals. Returns icp_score 0-100, icp_tier A-D, and a per-signal breakdown. Works with plain-English ICP descriptions or a custom JSON config.


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. You control exactly how much each signal is worth. Best for teams that have already defined their ICP criteria.

Plain-English mode. Describe your ICP in a sentence or two and provide an OpenAI or Anthropic API key. The actor calls GPT-4o-mini or Claude Haiku to generate a valid scoring_config automatically. Best for non-technical users who want to score leads without writing JSON.

If you provide both, the JSON config wins and the LLM call is skipped.


How it works

Pass in pre-enriched company data (hiring signals, tech stack, headcount, funding, industry) along with a scoring config or ICP description. The actor evaluates each signal as true or false, applies the configured weights, and returns a score from 0 to 100 with a tier label.

No live scraping. No waiting for website crawls. Input data comes from Clay enrichment columns or from Actors 1 and 2 in the Mamba Labs suite. Scoring is fast and deterministic in JSON config mode.


The Actor 1 + 2 + 6 workflow

Actor 6 input fields map directly to Actor 1 and Actor 2 output column names. This is intentional. Run them in sequence in Clay and pass outputs directly into Actor 6 with no column remapping.

Step 1: Run Actor 1 (GTM Hiring Signal Scraper) on your company list. It returns:

  • gtm_hiring_signal (boolean) -- map to Actor 6 input gtm_hiring_signal
  • gtm_role_count (integer) -- map to Actor 6 input gtm_role_count
  • signal_strength (string: high/medium/low) -- map to Actor 6 input signal_strength

Step 2: Run Actor 2 (GTM Tech Stack Signal Scraper) on the same company list. It returns:

  • uses_hubspot (boolean) -- map to Actor 6 input uses_hubspot
  • uses_salesforce (boolean) -- map to Actor 6 input uses_salesforce
  • uses_clay (boolean) -- map to Actor 6 input uses_clay
  • crm_detected (string) -- map to Actor 6 input crm_detected
  • seq_tool_detected (string) -- map to Actor 6 input seq_tool_detected

Step 3: Add Clay native enrichment columns for headcount, funding_stage, and industry. These are standard Clay enrichment fields, not actor outputs.

Step 4: Run Actor 6 (this actor). Pass all the above as input fields using Clay's column token system. Set your scoring_config weights to reflect how much each signal matters for your ICP.

Step 5: Filter your Clay table on icp_tier = A or lead_tag = priority to get your send-ready list.

No other ICP scorer on the Apify Store is designed to receive these specific field names as input. This workflow is the fastest path from company list to scored outbound queue.


scoring_config format

The scoring_config object has three parts:

  • weights: maps signal names to integer point values. Must sum to exactly 100.
  • headcount_range: an object with min and max for the headcount_in_range signal.
  • target_industries: an array of industry strings for the industry_match signal.

Full example:

{
"scoring_config": {
"weights": {
"gtm_hiring_signal": 20,
"uses_hubspot": 10,
"uses_salesforce": 10,
"uses_clay": 5,
"headcount_in_range": 20,
"recently_funded": 20,
"industry_match": 15
},
"headcount_range": { "min": 50, "max": 500 },
"target_industries": ["B2B Software", "SaaS", "Developer Tools"]
}
}

Minimal 2-signal config:

{
"scoring_config": {
"weights": {
"gtm_hiring_signal": 60,
"headcount_in_range": 40
},
"headcount_range": { "min": 100, "max": 1000 }
}
}

Available signal keys: gtm_hiring_signal, uses_hubspot, uses_salesforce, uses_clay, crm_detected, seq_tool_detected, headcount_in_range, recently_funded, industry_match. Pick the ones that matter and distribute 100 points across them.


Input schema

Provide either scoring_config or icp_description. One of the two is required.

FieldTypeRequiredDescription
company_domainstringYesPrimary domain of the company to score.
scoring_configobjectNoJSON scoring weights config. Required if icp_description is not provided.
templatestringNoPre-built template: saas_outbound, b2b_services, fintech, smb_local, enterprise.
icp_descriptionstringNoPlain-English ICP description. Requires llm_api_key.
llm_api_keystringNoOpenAI or Anthropic API key. Required for icp_description mode. Masked in Apify UI.
llm_providerstringNo"openai" (default) or "anthropic". Ignored if scoring_config is provided.
company_namestringNoDisplay name of the company.
gtm_hiring_signalbooleanNoWhether the company is hiring GTM roles.
uses_hubspotbooleanNoHubSpot detected.
uses_salesforcebooleanNoSalesforce detected.
uses_claybooleanNoClay detected.
crm_detectedstringNoCRM platform detected.
seq_tool_detectedstringNoSequencing tool detected.
headcountintegerNoCurrent employee count.
funding_stagestringNoFunding stage (seed, series_a, series_b, growth).
industrystringNoThe company's industry.
previous_scoreintegerNoICP score from a prior run. Enables delta tracking.
include_explanationbooleanNoAdd a score_explanation string to output. Default false.
min_score_to_outputintegerNoSkip rows below this threshold.
webhook_urlstringNoPOST each result to this URL after scoring.

Output schema

FieldTypeDescription
company_domainstringDomain that was scored.
company_namestringCompany display name.
icp_scoreintegerFinal score 0-100.
icp_tierstringA (80-100), B (60-79), C (40-59), D (0-39).
lead_tagstringpriority (A), nurture (B/C), disqualify (D).
score_hiringintegerPoints from hiring signals.
score_tech_stackintegerPoints from tech stack signals.
score_headcountintegerPoints from headcount signal.
score_fundingintegerPoints from funding signal.
score_industryintegerPoints from industry signal.
signals_matchedstringComma-separated signal keys that matched.
signals_missingstringComma-separated signal keys that did not match.
scoring_config_usedstringJSON string of the config applied.
config_sourcestring"explicit" (JSON config) or "llm_generated" (from icp_description).
previous_scoreintegerEchoed from input. Null if not provided.
score_deltaintegerCurrent score minus previous score. Null if no previous.
score_directionstring"improving" (delta > 0), "declining" (delta < 0), "unchanged" (delta = 0), "no_previous".
score_explanationstringHuman-readable breakdown. Present when include_explanation is true.
run_datestringISO timestamp.
errorstringError message if scoring failed.

Tracking score changes over time

This is the only ICP scorer on the Apify Store that tracks score change per company across runs.

Store icp_score from each run in your Clay table. On the next run, pass it as previous_score. The output includes score_delta (integer, can be negative) and score_direction ("improving", "declining", "unchanged", or "no_previous"). Use score_direction = improving as a trigger for outbound timing, or filter on score_delta > 10 to surface companies that just crossed a scoring threshold.


lead_tag values

Every output row includes a lead_tag field derived automatically from icp_tier. Values: "priority" for tier A, "nurture" for tier B or C, "disqualify" for tier D. Use these directly in Clay view filters, Instantly segment conditions, or Smartlead campaign triggers without writing a formula column.


Sample output

JSON config mode with delta:

{
"company_domain": "linear.app",
"company_name": "Linear",
"icp_score": 80,
"icp_tier": "A",
"lead_tag": "priority",
"score_hiring": 30,
"score_tech_stack": 0,
"score_headcount": 25,
"score_funding": 25,
"score_industry": 0,
"signals_matched": "gtm_hiring_signal, headcount_in_range, recently_funded",
"signals_missing": "uses_hubspot",
"scoring_config_used": "{\"weights\":{\"gtm_hiring_signal\":30,\"uses_hubspot\":20,\"headcount_in_range\":25,\"recently_funded\":25},\"headcount_range\":{\"min\":50,\"max\":500}}",
"config_source": "explicit",
"previous_score": 65,
"score_delta": 15,
"score_direction": "improving",
"run_date": "2026-04-15T12:00:00.000Z"
}

LLM-generated config mode:

{
"company_domain": "ramp.com",
"company_name": "Ramp",
"icp_score": 55,
"icp_tier": "C",
"lead_tag": "nurture",
"score_hiring": 20,
"score_tech_stack": 15,
"score_headcount": 20,
"score_funding": 0,
"score_industry": 0,
"signals_matched": "gtm_hiring_signal, uses_hubspot, headcount_in_range",
"signals_missing": "recently_funded, industry_match",
"scoring_config_used": "{\"weights\":{\"gtm_hiring_signal\":20,\"uses_hubspot\":15,\"headcount_in_range\":20,\"recently_funded\":25,\"industry_match\":20},\"headcount_range\":{\"min\":100,\"max\":1000},\"target_industries\":[\"B2B Software\",\"SaaS\",\"Fintech\"]}",
"config_source": "llm_generated",
"previous_score": null,
"score_delta": null,
"score_direction": "no_previous",
"run_date": "2026-04-15T12:00:00.000Z"
}

Clay integration

  1. Add an Apify enrichment column. Search for icp-fit-scorer.
  2. Map company_domain to your domain column.
  3. Map signal fields from Actor 1 and Actor 2 output columns (or Clay native enrichment).
  4. Set scoring_config as a static JSON value, or use template for a pre-built config.
  5. Filter your table on lead_tag = priority for your send-ready list.

Pricing

$0.05 per company scored. No LLM cost in JSON config mode.

LLM mode uses your own OpenAI (GPT-4o-mini) or Anthropic (Claude Haiku) API key, approximately $0.001-$0.003 per call billed directly to your API provider account. You choose the provider. Your key is masked in the Apify UI and redacted from run logs. It is not stored by Mamba Labs. Set a spend limit on your key if you are running at high volume.


Known limitations

  • JSON config mode is fully deterministic. LLM mode may produce slightly different scoring_config interpretations for the same description across runs.
  • scoring_config weights must sum to 100. The actor returns an error row if they do not.
  • Pre-enriched input only: this actor does not fetch signals on its own. Run Actors 1 and 2 first, or use the fetch_signals option with an Apify token.
  • signals_missing will be populated for any input field that was null or absent. Review this field to identify data gaps before treating scores as final.


Built by Mamba Labs.