ICP Fit Scorer
Pricing
from $50.00 / 1,000 results
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
Actor stats
0
Bookmarked
0
Total users
0
Monthly active users
20 hours ago
Last modified
Categories
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 inputgtm_hiring_signalgtm_role_count(integer) -- map to Actor 6 inputgtm_role_countsignal_strength(string: high/medium/low) -- map to Actor 6 inputsignal_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 inputuses_hubspotuses_salesforce(boolean) -- map to Actor 6 inputuses_salesforceuses_clay(boolean) -- map to Actor 6 inputuses_claycrm_detected(string) -- map to Actor 6 inputcrm_detectedseq_tool_detected(string) -- map to Actor 6 inputseq_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 withminandmaxfor 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.
| Field | Type | Required | Description |
|---|---|---|---|
company_domain | string | Yes | Primary domain of the company to score. |
scoring_config | object | No | JSON scoring weights config. Required if icp_description is not provided. |
template | string | No | Pre-built template: saas_outbound, b2b_services, fintech, smb_local, enterprise. |
icp_description | string | No | Plain-English ICP description. Requires llm_api_key. |
llm_api_key | string | No | OpenAI or Anthropic API key. Required for icp_description mode. Masked in Apify UI. |
llm_provider | string | No | "openai" (default) or "anthropic". Ignored if scoring_config is provided. |
company_name | string | No | Display name of the company. |
gtm_hiring_signal | boolean | No | Whether the company is hiring GTM roles. |
uses_hubspot | boolean | No | HubSpot detected. |
uses_salesforce | boolean | No | Salesforce detected. |
uses_clay | boolean | No | Clay detected. |
crm_detected | string | No | CRM platform detected. |
seq_tool_detected | string | No | Sequencing tool detected. |
headcount | integer | No | Current employee count. |
funding_stage | string | No | Funding stage (seed, series_a, series_b, growth). |
industry | string | No | The company's industry. |
previous_score | integer | No | ICP score from a prior run. Enables delta tracking. |
include_explanation | boolean | No | Add a score_explanation string to output. Default false. |
min_score_to_output | integer | No | Skip rows below this threshold. |
webhook_url | string | No | POST each result to this URL after scoring. |
Output schema
| Field | Type | Description |
|---|---|---|
company_domain | string | Domain that was scored. |
company_name | string | Company display name. |
icp_score | integer | Final score 0-100. |
icp_tier | string | A (80-100), B (60-79), C (40-59), D (0-39). |
lead_tag | string | priority (A), nurture (B/C), disqualify (D). |
score_hiring | integer | Points from hiring signals. |
score_tech_stack | integer | Points from tech stack signals. |
score_headcount | integer | Points from headcount signal. |
score_funding | integer | Points from funding signal. |
score_industry | integer | Points from industry signal. |
signals_matched | string | Comma-separated signal keys that matched. |
signals_missing | string | Comma-separated signal keys that did not match. |
scoring_config_used | string | JSON string of the config applied. |
config_source | string | "explicit" (JSON config) or "llm_generated" (from icp_description). |
previous_score | integer | Echoed from input. Null if not provided. |
score_delta | integer | Current score minus previous score. Null if no previous. |
score_direction | string | "improving" (delta > 0), "declining" (delta < 0), "unchanged" (delta = 0), "no_previous". |
score_explanation | string | Human-readable breakdown. Present when include_explanation is true. |
run_date | string | ISO timestamp. |
error | string | Error 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
- Add an Apify enrichment column. Search for
icp-fit-scorer. - Map
company_domainto your domain column. - Map signal fields from Actor 1 and Actor 2 output columns (or Clay native enrichment).
- Set
scoring_configas a static JSON value, or usetemplatefor a pre-built config. - Filter your table on
lead_tag = priorityfor 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.
Related actors
- GTM Hiring Signal Scraper -- provides gtm_hiring_signal, gtm_role_count, signal_strength
- GTM Tech Stack Signal Scraper -- provides uses_hubspot, uses_salesforce, uses_clay, crm_detected, seq_tool_detected
- GTM Signals Aggregator -- runs Actors 1 and 2 in parallel, returns all signals in one call
Built by Mamba Labs.