Inbound Lead Qualification
Takes a set of inbound leads and validates each against your full ICP criteria. Not a fast-pass triage (that's inbound-lead-triage) — this is the thorough qualification step that determines whether a lead is genuinely worth pursuing, and produces a scored CSV for the team.
When to Auto-Load
Load this composite when:
- User says "qualify these inbound leads", "check if these leads are ICP", "score my inbound"
- An upstream triage has been completed and leads need deeper qualification
- User has a batch of leads and wants a qualified/disqualified verdict on each
Architecture
[Inbound Leads] → Step 1: Load ICP & Config → Step 2: CRM/Pipeline Check → Step 3: Company Qualification → Step 4: Person Qualification → Step 5: Use Case Fit → Step 6: Score & Verdict → Step 7: Output CSV
Step 0: Configuration (Once Per Client)
On first run, establish the ICP definition and CRM access. Save to the current working directory or wherever the user prefers (e.g., config/lead-qualification.json).
{
"icp_definition": {
"company_size": {
"min_employees": null,
"max_employees": null,
"sweet_spot": "",
"notes": ""
},
"industry": {
"target_industries": [],
"excluded_industries": [],
"notes": ""
},
"use_case": {
"primary_use_cases": [],
"secondary_use_cases": [],
"anti_use_cases": [],
"notes": ""
},
"company_stage": {
"target_stages": [],
"excluded_stages": [],
"notes": ""
},
"geography": {
"target_regions": [],
"excluded_regions": [],
"notes": ""
}
},
"buyer_personas": [
{
"name": "",
"titles": [],
"seniority_levels": [],
"departments": [],
"is_economic_buyer": false,
"is_champion": false,
"is_user": false
}
],
"hard_disqualifiers": [],
"hard_qualifiers": [],
"crm_access": {
"tool": "HubSpot | Salesforce | CSV export | none",
"access_method": "",
"tables_or_objects": []
},
"existing_customer_source": {
"tool": "HubSpot | Salesforce | CSV | none",
"access_method": ""
},
"qualification_prompt_path": "path/to/lead-qualification/prompt.md or null"
}
If lead-qualification capability already has a saved qualification prompt: Reference it directly — don't rebuild ICP criteria from scratch.
On subsequent runs: Load config silently.
Step 1: Load ICP Criteria & Parse Leads
Process
- Load the client's ICP config (or qualification prompt from
lead-qualificationcapability) - Parse the inbound lead list — accept any format:
- Output from
inbound-lead-triage(already normalized) - Raw CSV with any column structure
- Pasted list of names/emails/companies
- CRM export
- Output from
- Identify what data is available vs. missing per lead:
- Have: Fields present in the input
- Need: Fields required for qualification but missing
- Gap report: "X leads have company name, Y have title, Z have nothing but email"
Output
- Parsed lead list with available/missing field inventory
- Gap report for the user
Human Checkpoint
If >50% of leads are missing critical fields (company name or person title), recommend running inbound-lead-enrichment first. Ask: "Many leads are missing company/title data. Want me to enrich them first, or qualify with what's available?"
Step 2: CRM & Pipeline Check
Process
For each lead, check against existing data sources to identify overlaps:
Check 1 — Existing customer?
- Search customer database by company domain/name
- If match found: Flag as
existing_customerwith customer details (plan, account owner, contract status) - This is NOT a disqualification — it's a routing flag (upsell vs. new business)
Check 2 — Already in pipeline?
- Search your CRM (HubSpot, Salesforce, CSV) for the company in active deals
- If match found: Flag as
in_pipelinewith deal details (stage, owner, last activity) - Critical: Sales rep should know before reaching out that a colleague already has this account
Check 3 — Previous engagement?
- Search outreach logs for the email/company
- If match found: Flag as
previously_contactedwith history summary (when, what channel, outcome)
Check 4 — Known from signal composites?
- Search your CRM or signal tracking system for the company
- If match found: Flag as
signal_flaggedwith signal type and date
Output
Each lead tagged with:
pipeline_status:new|existing_customer|in_pipeline|previously_contactedpipeline_detail: One sentence explaining the overlap (or null)signal_flags: Any signal composite matches
Handling Overlaps
- Existing customer: Don't disqualify. Mark separately. Might be expansion/upsell.
- In pipeline: Don't disqualify. Flag for sales rep coordination. Note the existing deal owner.
- Previously contacted but no response: Still qualify. The inbound signal means they're now warmer.
- Previously contacted and rejected: Still qualify the inbound. People change their minds. Note the prior context.
Step 3: Company Qualification
Process
For each lead's company, evaluate against every ICP company dimension:
Dimension 1 — Company Size
- Check employee count against ICP range
- Sources: enrichment data, LinkedIn company page, web search
- Score:
match|borderline|mismatch|unknown - Note: If the lead is from a subsidiary or division, evaluate the relevant unit, not the parent company
Dimension 2 — Industry
- Check against target and excluded industry lists
- Be smart about classification: "AI-powered HR platform" matches both "AI/ML" and "HR Tech"
- Score:
match|adjacent(related but not core target) |mismatch|unknown
Dimension 3 — Company Stage
- Seed, Series A, Series B+, Growth, Public, Bootstrapped
- Sources: SixtyFour or Orthogonal, news, enrichment data
- Score:
match|borderline|mismatch|unknown
Dimension 4 — Geography
- Check HQ location and/or the specific person's location
- For remote-first companies, check where the majority of the team is
- Score:
match|borderline|mismatch|unknown
Dimension 5 — Use Case Fit
- Based on what the company does, could they plausibly use the product?
- This is the most nuanced dimension — requires understanding both the product and the company's operations
- Sources: company website, product description, job postings (hint at internal tools/processes)
- Score:
strong_fit|moderate_fit|weak_fit|no_fit|unknown
Output
Each lead gets a company_qualification block:
{
"company_size": { "score": "", "value": "", "reasoning": "" },
"industry": { "score": "", "value": "", "reasoning": "" },
"stage": { "score": "", "value": "", "reasoning": "" },
"geography": { "score": "", "value": "", "reasoning": "" },
"use_case": { "score": "", "value": "", "reasoning": "" },
"company_verdict": "qualified | borderline | disqualified | insufficient_data"
}
Step 4: Person Qualification
Process
For each lead's contact person, evaluate against buyer persona criteria:
Dimension 1 — Title/Role Match
- Check title against buyer persona title lists
- Handle variations: "VP of Marketing" = "Vice President, Marketing" = "VP Marketing"
- Be smart about title inflation at small companies (a "Director" at a 10-person startup ≠ "Director" at a 10,000-person enterprise)
- Score:
exact_match|close_match|adjacent|mismatch|unknown
Dimension 2 — Seniority Level
- Map to: Individual Contributor, Manager, Director, VP, C-Level, Founder
- Check against ICP seniority requirements
- Score:
match|too_junior|too_senior|unknown
Dimension 3 — Department
- Engineering, Product, Marketing, Sales, Operations, Finance, HR, etc.
- Check against ICP department targets
- Score:
match|adjacent|mismatch| `un