Inbound lead qualification
Qualifies inbound leads against full ICP criteria — company size, industry, use case fit, role/seniority of the person.
How to use it
- Hit Copy the whole skill.
- Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
ChatGPT: make a Project and paste it into Instructions.
Neither? Paste it at the top of a new chat — it works for that chat. - Describe your job in plain words. The AI follows the skill from there.
npx degit gooseworks-ai/goose-skills/skills/lead-generation/composites/inbound-lead-qualification#main ~/.claude/skills/inbound-lead-qualificationFor one project only, change the path to .claude/skills/inbound-lead-qualification.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Show the full text451 lines
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|unknown
Dimension 4 — Authority Type
- Based on title + seniority, classify:
economic_buyer— Can sign the checkchampion— Wants it, can influence the decisionuser— Would use it daily, can validate needevaluator— Tasked with research, limited decision powergatekeeper— Can block but not approveunknown
Dimension 5 — Right Person, Wrong Company (or Vice Versa)
- If company qualifies but person doesn't: Flag as
right_company_wrong_person— this is a referral opportunity - If person qualifies but company doesn't: Flag as
right_person_wrong_company— rare for inbound, but possible with job changers
Output
Each lead gets a person_qualification block:
{
"title_match": { "score": "", "value": "", "reasoning": "" },
"seniority": { "score": "", "value": "", "reasoning": "" },
"department": { "score": "", "value": "", "reasoning": "" },
"authority_type": "",
"person_verdict": "qualified | borderline | disqualified | insufficient_data",
"mismatch_type": "null | right_company_wrong_person | right_person_wrong_company"
}
Step 5: Use Case Fit Assessment
Process
This step connects the company's likely needs to your product's actual capabilities. It goes deeper than Step 3's company-level use case check.
Infer the lead's intent from their inbound action:
- Demo request message → What did they say they need?
- Content downloaded → What topic were they researching?
- Webinar attended → What problem were they trying to solve?
- Free trial signup → What feature did they try first?
- Chatbot conversation → What questions did they ask?
Map intent to product capabilities:
- Does the product actually solve what they seem to need?
- Is this a primary use case or a stretch?
- Are there known limitations that would disappoint them?
Assess implementation feasibility:
- Based on company size and stage, can they realistically implement?
- Do they likely have the technical resources / team to adopt?
- Any known blockers for companies like this? (e.g., "banks need SOC2 and we don't have it yet")
Output
{
"inferred_intent": "",
"intent_source": "",
"product_fit": "strong | moderate | weak | unknown",
"product_fit_reasoning": "",
"implementation_feasibility": "easy | moderate | complex | unlikely",
"known_blockers": []
}
Step 6: Score & Verdict
Scoring Logic
Combine all dimensions into a final qualification verdict.
Composite Score Calculation:
| Dimension | Weight | Possible Values |
|---|---|---|
| Company Size | 15% | match=100, borderline=50, mismatch=0, unknown=30 |
| Industry | 20% | match=100, adjacent=60, mismatch=0, unknown=30 |
| Company Stage | 10% | match=100, borderline=50, mismatch=0, unknown=30 |
| Geography | 10% | match=100, borderline=50, mismatch=0, unknown=30 |
| Use Case Fit | 25% | strong=100, moderate=60, weak=20, no_fit=0, unknown=30 |
| Person Title/Role | 15% | exact=100, close=75, adjacent=40, mismatch=0, unknown=30 |
| Person Seniority | 5% | match=100, too_junior=20, too_senior=60, unknown=30 |
Hard overrides (bypass the score):
- Any hard disqualifier present →
disqualifiedregardless of score - Any hard qualifier present →
qualifiedregardless of score (but still show the full breakdown) - Existing customer → Route separately, don't score as new lead
Verdict thresholds:
- Score ≥ 75:
qualified— Pursue actively - Score 50-74:
borderline— Qualified with caveats, may need manual review - Score 30-49:
near_miss— Not qualified now, but close enough to consider (referral or nurture) - Score < 30:
disqualified— Does not fit ICP
Sub-verdicts for routing:
qualified_hot— Score ≥ 75 AND Tier 1/2 urgency from triagequalified_warm— Score ≥ 75 AND Tier 3/4 urgencyborderline_review— Score 50-74, needs human judgment callnear_miss_referral— Score 30-49 AND right_company_wrong_person (referral opportunity)near_miss_nurture— Score 30-49, might fit in the futuredisqualified_polite— Score < 30, needs polite declinedisqualified_competitor— Competitor employeeexisting_customer_upsell— Existing customer with expansion signal
Output
Each lead gets:
{
"composite_score": 0-100,
"verdict": "",
"sub_verdict": "",
"top_qualification_reasons": [],
"top_disqualification_reasons": [],
"summary": "One sentence: why this lead is/isn't a fit"
}
Step 7: Output CSV
CSV Structure
Produce a CSV with ALL input fields preserved plus qualification columns appended:
Core qualification columns:
qualification_verdict— qualified | borderline | near_miss | disqualifiedqualification_sub_verdict— qualified_hot | qualified_warm | borderline_review | near_miss_referral | near_miss_nurture | disqualified_polite | disqualified_competitor | existing_customer_upsellcomposite_score— 0-100summary— One sentence qualification reasoning
Pipeline check columns:
pipeline_status— new | existing_customer | in_pipeline | previously_contactedpipeline_detail— One sentence on the overlapsignal_flags— Any signal composite matches
Company qualification columns:
company_size_score— match | borderline | mismatch | unknownindustry_score— match | adjacent | mismatch | unknownstage_score— match | borderline | mismatch | unknowngeography_score— match | borderline | mismatch | unknownuse_case_score— strong | moderate | weak | no_fit | unknown
Person qualification columns:
title_match_score— exact_match | close_match | adjacent | mismatch | unknownseniority_score— match | too_junior | too_senior | unknownauthority_type— economic_buyer | champion | user | evaluator | gatekeeper | unknownmismatch_type— null | right_company_wrong_person | right_person_wrong_company
Use case columns:
inferred_intent— What they seem to needproduct_fit— strong | moderate | weak | unknownimplementation_feasibility— easy | moderate | complex | unlikely
Save Location
The current working directory or wherever the user prefers (e.g., leads/inbound-qualified-[date].csv).
Summary Report
After producing the CSV, present a summary:
## Inbound Lead Qualification: [Period]
**Total leads processed:** X
**Qualified:** X (Y%) — X hot, X warm
**Borderline (manual review):** X (Y%)
**Near miss:** X (Y%) — X referral opportunities, X nurture
**Disqualified:** X (Y%)
**Pipeline overlaps:**
- Existing customers: X (route to CS)
- Already in pipeline: X (coordinate with deal owner)
- Previously contacted: X (now warmer — re-engage)
**Top qualification reasons:**
1. [reason] — X leads
2. [reason] — X leads
**Top disqualification reasons:**
1. [reason] — X leads
2. [reason] — X leads
**Data quality:**
- Leads with full data: X
- Leads with partial data (some dimensions scored as 'unknown'): X
- Leads needing enrichment: X
**CSV saved to:** [path]
Handling Edge Cases
Lead with only an email (no name, no company):
- Extract company domain from email
- If corporate domain: look up the company, proceed with company qualification (person qualification will be mostly "unknown")
- If personal email (gmail, yahoo): Score as
insufficient_data, recommend enrichment or manual review
Same company, multiple leads:
- Qualify the company once, apply to all leads from that company
- Person qualification runs individually for each
- Flag the multi-contact opportunity: "3 people from [Company] came inbound — potential committee buy"
Contradictory signals:
- Company is strong fit but person is completely wrong (e.g., intern at a perfect company)
- Score honestly. The sub-verdict
right_company_wrong_personroutes this to referral handling indisqualification-handling
Borderline calls:
- When the score is 50-74 and could go either way, lean toward qualifying for inbound leads
- Rationale: they came to YOU. The intent signal tips borderline cases toward "worth a conversation"
- Note this lean in the reasoning: "Borderline on [dimension], but inbound intent suggests pursuing"
Scoring with missing data:
- Unknown dimensions score at 30 (not 0, not 50) — absence of data is mildly negative but not disqualifying
- If >3 dimensions are "unknown", the lead is
insufficient_dataregardless of score — recommend enrichment first
Tools Required
- CRM access — to check pipeline, existing customers, outreach history
- Web search — for company research when enrichment data is sparse
- Enrichment tools — SixtyFour or Orthogonal, LinkedIn scraper, or similar (optional, enhances accuracy)
- Read/Write — for CSV I/O and config management
| 1 | |
| 2 | name inbound-lead-qualification |
| 3 | version 1.0.0 |
| 4 | description > |
| 5 | Qualifies inbound leads against full ICP criteria — company size, industry, use case fit, |
| 6 | role/seniority of the person. Checks CRM and existing customer base for duplicates and |
| 7 | existing relationships. Outputs a scored CSV with qualification status, reasoning, and |
| 8 | pipeline overlap flags. Tool-agnostic — works with any CRM, enrichment tool, or data source. |
| 9 | tags [lead-generation] |
| 10 | |
| 11 | |
| 12 | # Inbound Lead Qualification |
| 13 | |
| 14 | 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. |
| 15 | |
| 16 | ## When to Auto-Load |
| 17 | |
| 18 | Load this composite when: |
| 19 | User says "qualify these inbound leads", "check if these leads are ICP", "score my inbound" |
| 20 | An upstream triage has been completed and leads need deeper qualification |
| 21 | User has a batch of leads and wants a qualified/disqualified verdict on each |
| 22 | |
| 23 | ## Architecture |
| 24 | |
| 25 | |
| 26 | [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 |
| 27 | |
| 28 | |
| 29 | |
| 30 | |
| 31 | ## Step 0: Configuration (Once Per Client) |
| 32 | |
| 33 | 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`). |
| 34 | |
| 35 | |
| 36 | { |
| 37 | "icp_definition": { |
| 38 | "company_size": { |
| 39 | "min_employees": null, |
| 40 | "max_employees": null, |
| 41 | "sweet_spot": "", |
| 42 | "notes": "" |
| 43 | }, |
| 44 | "industry": { |
| 45 | "target_industries": [], |
| 46 | "excluded_industries": [], |
| 47 | "notes": "" |
| 48 | }, |
| 49 | "use_case": { |
| 50 | "primary_use_cases": [], |
| 51 | "secondary_use_cases": [], |
| 52 | "anti_use_cases": [], |
| 53 | "notes": "" |
| 54 | }, |
| 55 | "company_stage": { |
| 56 | "target_stages": [], |
| 57 | "excluded_stages": [], |
| 58 | "notes": "" |
| 59 | }, |
| 60 | "geography": { |
| 61 | "target_regions": [], |
| 62 | "excluded_regions": [], |
| 63 | "notes": "" |
| 64 | } |
| 65 | }, |
| 66 | "buyer_personas": [ |
| 67 | { |
| 68 | "name": "", |
| 69 | "titles": [], |
| 70 | "seniority_levels": [], |
| 71 | "departments": [], |
| 72 | "is_economic_buyer": false, |
| 73 | "is_champion": false, |
| 74 | "is_user": false |
| 75 | } |
| 76 | ], |
| 77 | "hard_disqualifiers": [], |
| 78 | "hard_qualifiers": [], |
| 79 | "crm_access": { |
| 80 | "tool": "HubSpot | Salesforce | CSV export | none", |
| 81 | "access_method": "", |
| 82 | "tables_or_objects": [] |
| 83 | }, |
| 84 | "existing_customer_source": { |
| 85 | "tool": "HubSpot | Salesforce | CSV | none", |
| 86 | "access_method": "" |
| 87 | }, |
| 88 | "qualification_prompt_path": "path/to/lead-qualification/prompt.md or null" |
| 89 | } |
| 90 | |
| 91 | |
| 92 | **If `lead-qualification` capability already has a saved qualification prompt:** Reference it directly — don't rebuild ICP criteria from scratch. |
| 93 | |
| 94 | **On subsequent runs:** Load config silently. |
| 95 | |
| 96 | |
| 97 | |
| 98 | ## Step 1: Load ICP Criteria & Parse Leads |
| 99 | |
| 100 | ### Process |
| 101 | Load the client's ICP config (or qualification prompt from `lead-qualification` capability) |
| 102 | Parse the inbound lead list — accept any format: |
| 103 | Output from `inbound-lead-triage` (already normalized) |
| 104 | Raw CSV with any column structure |
| 105 | Pasted list of names/emails/companies |
| 106 | CRM export |
| 107 | Identify what data is available vs. missing per lead: |
| 108 | **Have:** Fields present in the input |
| 109 | **Need:** Fields required for qualification but missing |
| 110 | **Gap report:** "X leads have company name, Y have title, Z have nothing but email" |
| 111 | |
| 112 | ### Output |
| 113 | Parsed lead list with available/missing field inventory |
| 114 | Gap report for the user |
| 115 | |
| 116 | ### Human Checkpoint |
| 117 | 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?" |
| 118 | |
| 119 | |
| 120 | |
| 121 | ## Step 2: CRM & Pipeline Check |
| 122 | |
| 123 | ### Process |
| 124 | For each lead, check against existing data sources to identify overlaps: |
| 125 | |
| 126 | **Check 1 — Existing customer?** |
| 127 | Search customer database by company domain/name |
| 128 | If match found: Flag as `existing_customer` with customer details (plan, account owner, contract status) |
| 129 | This is NOT a disqualification — it's a routing flag (upsell vs. new business) |
| 130 | |
| 131 | **Check 2 — Already in pipeline?** |
| 132 | Search your CRM (HubSpot, Salesforce, CSV) for the company in active deals |
| 133 | If match found: Flag as `in_pipeline` with deal details (stage, owner, last activity) |
| 134 | Critical: Sales rep should know before reaching out that a colleague already has this account |
| 135 | |
| 136 | **Check 3 — Previous engagement?** |
| 137 | Search outreach logs for the email/company |
| 138 | If match found: Flag as `previously_contacted` with history summary (when, what channel, outcome) |
| 139 | |
| 140 | **Check 4 — Known from signal composites?** |
| 141 | Search your CRM or signal tracking system for the company |
| 142 | If match found: Flag as `signal_flagged` with signal type and date |
| 143 | |
| 144 | ### Output |
| 145 | Each lead tagged with: |
| 146 | `pipeline_status`: `new` | `existing_customer` | `in_pipeline` | `previously_contacted` |
| 147 | `pipeline_detail`: One sentence explaining the overlap (or null) |
| 148 | `signal_flags`: Any signal composite matches |
| 149 | |
| 150 | ### Handling Overlaps |
| 151 | **Existing customer:** Don't disqualify. Mark separately. Might be expansion/upsell. |
| 152 | **In pipeline:** Don't disqualify. Flag for sales rep coordination. Note the existing deal owner. |
| 153 | **Previously contacted but no response:** Still qualify. The inbound signal means they're now warmer. |
| 154 | **Previously contacted and rejected:** Still qualify the inbound. People change their minds. Note the prior context. |
| 155 | |
| 156 | |
| 157 | |
| 158 | ## Step 3: Company Qualification |
| 159 | |
| 160 | ### Process |
| 161 | For each lead's company, evaluate against every ICP company dimension: |
| 162 | |
| 163 | **Dimension 1 — Company Size** |
| 164 | Check employee count against ICP range |
| 165 | Sources: enrichment data, LinkedIn company page, web search |
| 166 | Score: `match` | `borderline` | `mismatch` | `unknown` |
| 167 | Note: If the lead is from a subsidiary or division, evaluate the relevant unit, not the parent company |
| 168 | |
| 169 | **Dimension 2 — Industry** |
| 170 | Check against target and excluded industry lists |
| 171 | Be smart about classification: "AI-powered HR platform" matches both "AI/ML" and "HR Tech" |
| 172 | Score: `match` | `adjacent` (related but not core target) | `mismatch` | `unknown` |
| 173 | |
| 174 | **Dimension 3 — Company Stage** |
| 175 | Seed, Series A, Series B+, Growth, Public, Bootstrapped |
| 176 | Sources: SixtyFour or Orthogonal, news, enrichment data |
| 177 | Score: `match` | `borderline` | `mismatch` | `unknown` |
| 178 | |
| 179 | **Dimension 4 — Geography** |
| 180 | Check HQ location and/or the specific person's location |
| 181 | For remote-first companies, check where the majority of the team is |
| 182 | Score: `match` | `borderline` | `mismatch` | `unknown` |
| 183 | |
| 184 | **Dimension 5 — Use Case Fit** |
| 185 | Based on what the company does, could they plausibly use the product? |
| 186 | This is the most nuanced dimension — requires understanding both the product and the company's operations |
| 187 | Sources: company website, product description, job postings (hint at internal tools/processes) |
| 188 | Score: `strong_fit` | `moderate_fit` | `weak_fit` | `no_fit` | `unknown` |
| 189 | |
| 190 | ### Output |
| 191 | Each lead gets a `company_qualification` block: |
| 192 | |
| 193 | { |
| 194 | "company_size": { "score": "", "value": "", "reasoning": "" }, |
| 195 | "industry": { "score": "", "value": "", "reasoning": "" }, |
| 196 | "stage": { "score": "", "value": "", "reasoning": "" }, |
| 197 | "geography": { "score": "", "value": "", "reasoning": "" }, |
| 198 | "use_case": { "score": "", "value": "", "reasoning": "" }, |
| 199 | "company_verdict": "qualified | borderline | disqualified | insufficient_data" |
| 200 | } |
| 201 | |
| 202 | |
| 203 | |
| 204 | |
| 205 | ## Step 4: Person Qualification |
| 206 | |
| 207 | ### Process |
| 208 | For each lead's contact person, evaluate against buyer persona criteria: |
| 209 | |
| 210 | **Dimension 1 — Title/Role Match** |
| 211 | Check title against buyer persona title lists |
| 212 | Handle variations: "VP of Marketing" = "Vice President, Marketing" = "VP Marketing" |
| 213 | Be smart about title inflation at small companies (a "Director" at a 10-person startup ≠ "Director" at a 10,000-person enterprise) |
| 214 | Score: `exact_match` | `close_match` | `adjacent` | `mismatch` | `unknown` |
| 215 | |
| 216 | **Dimension 2 — Seniority Level** |
| 217 | Map to: Individual Contributor, Manager, Director, VP, C-Level, Founder |
| 218 | Check against ICP seniority requirements |
| 219 | Score: `match` | `too_junior` | `too_senior` | `unknown` |
| 220 | |
| 221 | **Dimension 3 — Department** |
| 222 | Engineering, Product, Marketing, Sales, Operations, Finance, HR, etc. |
| 223 | Check against ICP department targets |
| 224 | Score: `match` | `adjacent` | `mismatch` | `unknown` |
| 225 | |
| 226 | **Dimension 4 — Authority Type** |
| 227 | Based on title + seniority, classify: |
| 228 | `economic_buyer` — Can sign the check |
| 229 | `champion` — Wants it, can influence the decision |
| 230 | `user` — Would use it daily, can validate need |
| 231 | `evaluator` — Tasked with research, limited decision power |
| 232 | `gatekeeper` — Can block but not approve |
| 233 | `unknown` |
| 234 | |
| 235 | **Dimension 5 — Right Person, Wrong Company (or Vice Versa)** |
| 236 | If company qualifies but person doesn't: Flag as `right_company_wrong_person` — this is a referral opportunity |
| 237 | If person qualifies but company doesn't: Flag as `right_person_wrong_company` — rare for inbound, but possible with job changers |
| 238 | |
| 239 | ### Output |
| 240 | Each lead gets a `person_qualification` block: |
| 241 | |
| 242 | { |
| 243 | "title_match": { "score": "", "value": "", "reasoning": "" }, |
| 244 | "seniority": { "score": "", "value": "", "reasoning": "" }, |
| 245 | "department": { "score": "", "value": "", "reasoning": "" }, |
| 246 | "authority_type": "", |
| 247 | "person_verdict": "qualified | borderline | disqualified | insufficient_data", |
| 248 | "mismatch_type": "null | right_company_wrong_person | right_person_wrong_company" |
| 249 | } |
| 250 | |
| 251 | |
| 252 | |
| 253 | |
| 254 | ## Step 5: Use Case Fit Assessment |
| 255 | |
| 256 | ### Process |
| 257 | This step connects the company's likely needs to your product's actual capabilities. It goes deeper than Step 3's company-level use case check. |
| 258 | |
| 259 | **Infer the lead's intent** from their inbound action: |
| 260 | Demo request message → What did they say they need? |
| 261 | Content downloaded → What topic were they researching? |
| 262 | Webinar attended → What problem were they trying to solve? |
| 263 | Free trial signup → What feature did they try first? |
| 264 | Chatbot conversation → What questions did they ask? |
| 265 | |
| 266 | **Map intent to product capabilities:** |
| 267 | Does the product actually solve what they seem to need? |
| 268 | Is this a primary use case or a stretch? |
| 269 | Are there known limitations that would disappoint them? |
| 270 | |
| 271 | **Assess implementation feasibility:** |
| 272 | Based on company size and stage, can they realistically implement? |
| 273 | Do they likely have the technical resources / team to adopt? |
| 274 | Any known blockers for companies like this? (e.g., "banks need SOC2 and we don't have it yet") |
| 275 | |
| 276 | ### Output |
| 277 | |
| 278 | { |
| 279 | "inferred_intent": "", |
| 280 | "intent_source": "", |
| 281 | "product_fit": "strong | moderate | weak | unknown", |
| 282 | "product_fit_reasoning": "", |
| 283 | "implementation_feasibility": "easy | moderate | complex | unlikely", |
| 284 | "known_blockers": [] |
| 285 | } |
| 286 | |
| 287 | |
| 288 | |
| 289 | |
| 290 | ## Step 6: Score & Verdict |
| 291 | |
| 292 | ### Scoring Logic |
| 293 | |
| 294 | Combine all dimensions into a final qualification verdict. |
| 295 | |
| 296 | **Composite Score Calculation:** |
| 297 | |
| 298 | | Dimension | Weight | Possible Values | |
| 299 | |-----------|--------|-----------------| |
| 300 | | Company Size | 15% | match=100, borderline=50, mismatch=0, unknown=30 | |
| 301 | | Industry | 20% | match=100, adjacent=60, mismatch=0, unknown=30 | |
| 302 | | Company Stage | 10% | match=100, borderline=50, mismatch=0, unknown=30 | |
| 303 | | Geography | 10% | match=100, borderline=50, mismatch=0, unknown=30 | |
| 304 | | Use Case Fit | 25% | strong=100, moderate=60, weak=20, no_fit=0, unknown=30 | |
| 305 | | Person Title/Role | 15% | exact=100, close=75, adjacent=40, mismatch=0, unknown=30 | |
| 306 | | Person Seniority | 5% | match=100, too_junior=20, too_senior=60, unknown=30 | |
| 307 | |
| 308 | **Hard overrides (bypass the score):** |
| 309 | Any hard disqualifier present → `disqualified` regardless of score |
| 310 | Any hard qualifier present → `qualified` regardless of score (but still show the full breakdown) |
| 311 | Existing customer → Route separately, don't score as new lead |
| 312 | |
| 313 | **Verdict thresholds:** |
| 314 | **Score ≥ 75:** `qualified` — Pursue actively |
| 315 | **Score 50-74:** `borderline` — Qualified with caveats, may need manual review |
| 316 | **Score 30-49:** `near_miss` — Not qualified now, but close enough to consider (referral or nurture) |
| 317 | **Score < 30:** `disqualified` — Does not fit ICP |
| 318 | |
| 319 | **Sub-verdicts for routing:** |
| 320 | `qualified_hot` — Score ≥ 75 AND Tier 1/2 urgency from triage |
| 321 | `qualified_warm` — Score ≥ 75 AND Tier 3/4 urgency |
| 322 | `borderline_review` — Score 50-74, needs human judgment call |
| 323 | `near_miss_referral` — Score 30-49 AND right_company_wrong_person (referral opportunity) |
| 324 | `near_miss_nurture` — Score 30-49, might fit in the future |
| 325 | `disqualified_polite` — Score < 30, needs polite decline |
| 326 | `disqualified_competitor` — Competitor employee |
| 327 | `existing_customer_upsell` — Existing customer with expansion signal |
| 328 | |
| 329 | ### Output |
| 330 | Each lead gets: |
| 331 | |
| 332 | { |
| 333 | "composite_score": 0-100, |
| 334 | "verdict": "", |
| 335 | "sub_verdict": "", |
| 336 | "top_qualification_reasons": [], |
| 337 | "top_disqualification_reasons": [], |
| 338 | "summary": "One sentence: why this lead is/isn't a fit" |
| 339 | } |
| 340 | |
| 341 | |
| 342 | |
| 343 | |
| 344 | ## Step 7: Output CSV |
| 345 | |
| 346 | ### CSV Structure |
| 347 | |
| 348 | Produce a CSV with ALL input fields preserved plus qualification columns appended: |
| 349 | |
| 350 | **Core qualification columns:** |
| 351 | `qualification_verdict` — qualified | borderline | near_miss | disqualified |
| 352 | `qualification_sub_verdict` — qualified_hot | qualified_warm | borderline_review | near_miss_referral | near_miss_nurture | disqualified_polite | disqualified_competitor | existing_customer_upsell |
| 353 | `composite_score` — 0-100 |
| 354 | `summary` — One sentence qualification reasoning |
| 355 | |
| 356 | **Pipeline check columns:** |
| 357 | `pipeline_status` — new | existing_customer | in_pipeline | previously_contacted |
| 358 | `pipeline_detail` — One sentence on the overlap |
| 359 | `signal_flags` — Any signal composite matches |
| 360 | |
| 361 | **Company qualification columns:** |
| 362 | `company_size_score` — match | borderline | mismatch | unknown |
| 363 | `industry_score` — match | adjacent | mismatch | unknown |
| 364 | `stage_score` — match | borderline | mismatch | unknown |
| 365 | `geography_score` — match | borderline | mismatch | unknown |
| 366 | `use_case_score` — strong | moderate | weak | no_fit | unknown |
| 367 | |
| 368 | **Person qualification columns:** |
| 369 | `title_match_score` — exact_match | close_match | adjacent | mismatch | unknown |
| 370 | `seniority_score` — match | too_junior | too_senior | unknown |
| 371 | `authority_type` — economic_buyer | champion | user | evaluator | gatekeeper | unknown |
| 372 | `mismatch_type` — null | right_company_wrong_person | right_person_wrong_company |
| 373 | |
| 374 | **Use case columns:** |
| 375 | `inferred_intent` — What they seem to need |
| 376 | `product_fit` — strong | moderate | weak | unknown |
| 377 | `implementation_feasibility` — easy | moderate | complex | unlikely |
| 378 | |
| 379 | ### Save Location |
| 380 | The current working directory or wherever the user prefers (e.g., `leads/inbound-qualified-[date].csv`). |
| 381 | |
| 382 | ### Summary Report |
| 383 | |
| 384 | After producing the CSV, present a summary: |
| 385 | |
| 386 | |
| 387 | ## Inbound Lead Qualification: [Period] |
| 388 | |
| 389 | **Total leads processed:** X |
| 390 | **Qualified:** X (Y%) — X hot, X warm |
| 391 | **Borderline (manual review):** X (Y%) |
| 392 | **Near miss:** X (Y%) — X referral opportunities, X nurture |
| 393 | **Disqualified:** X (Y%) |
| 394 | |
| 395 | **Pipeline overlaps:** |
| 396 | - Existing customers: X (route to CS) |
| 397 | - Already in pipeline: X (coordinate with deal owner) |
| 398 | - Previously contacted: X (now warmer — re-engage) |
| 399 | |
| 400 | **Top qualification reasons:** |
| 401 | 1. [reason] — X leads |
| 402 | 2. [reason] — X leads |
| 403 | |
| 404 | **Top disqualification reasons:** |
| 405 | 1. [reason] — X leads |
| 406 | 2. [reason] — X leads |
| 407 | |
| 408 | **Data quality:** |
| 409 | - Leads with full data: X |
| 410 | - Leads with partial data (some dimensions scored as 'unknown'): X |
| 411 | - Leads needing enrichment: X |
| 412 | |
| 413 | **CSV saved to:** [path] |
| 414 | |
| 415 | |
| 416 | |
| 417 | |
| 418 | ## Handling Edge Cases |
| 419 | |
| 420 | **Lead with only an email (no name, no company):** |
| 421 | Extract company domain from email |
| 422 | If corporate domain: look up the company, proceed with company qualification (person qualification will be mostly "unknown") |
| 423 | If personal email (gmail, yahoo): Score as `insufficient_data`, recommend enrichment or manual review |
| 424 | |
| 425 | **Same company, multiple leads:** |
| 426 | Qualify the company once, apply to all leads from that company |
| 427 | Person qualification runs individually for each |
| 428 | Flag the multi-contact opportunity: "3 people from [Company] came inbound — potential committee buy" |
| 429 | |
| 430 | **Contradictory signals:** |
| 431 | Company is strong fit but person is completely wrong (e.g., intern at a perfect company) |
| 432 | Score honestly. The sub-verdict `right_company_wrong_person` routes this to referral handling in `disqualification-handling` |
| 433 | |
| 434 | **Borderline calls:** |
| 435 | When the score is 50-74 and could go either way, lean toward qualifying for inbound leads |
| 436 | Rationale: they came to YOU. The intent signal tips borderline cases toward "worth a conversation" |
| 437 | Note this lean in the reasoning: "Borderline on [dimension], but inbound intent suggests pursuing" |
| 438 | |
| 439 | **Scoring with missing data:** |
| 440 | Unknown dimensions score at 30 (not 0, not 50) — absence of data is mildly negative but not disqualifying |
| 441 | If >3 dimensions are "unknown", the lead is `insufficient_data` regardless of score — recommend enrichment first |
| 442 | |
| 443 | |
| 444 | |
| 445 | ## Tools Required |
| 446 | |
| 447 | **CRM access** — to check pipeline, existing customers, outreach history |
| 448 | **Web search** — for company research when enrichment data is sparse |
| 449 | **Enrichment tools** — SixtyFour or Orthogonal, LinkedIn scraper, or similar (optional, enhances accuracy) |
| 450 | **Read/Write** — for CSV I/O and config management |
| 451 |