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

  1. Hit Copy the whole skill.
  2. 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.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/lead-generation/composites/inbound-lead-qualification#main ~/.claude/skills/inbound-lead-qualification

For 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.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text451 lines
inbound-lead-qualification/SKILL.md451 lines17.1 KBpushed 96d agoRawView on GitHub

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

  1. Load the client's ICP config (or qualification prompt from lead-qualification capability)
  2. 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
  3. 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_customer with 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_pipeline with 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_contacted with 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_flagged with signal type and date

Output

Each lead tagged with:

  • pipeline_status: new | existing_customer | in_pipeline | previously_contacted
  • pipeline_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 check
    • champion — Wants it, can influence the decision
    • user — Would use it daily, can validate need
    • evaluator — Tasked with research, limited decision power
    • gatekeeper — Can block but not approve
    • unknown

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.

  1. 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?
  2. 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?
  3. 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 → disqualified regardless of score
  • Any hard qualifier present → qualified regardless 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 triage
  • qualified_warm — Score ≥ 75 AND Tier 3/4 urgency
  • borderline_review — Score 50-74, needs human judgment call
  • near_miss_referral — Score 30-49 AND right_company_wrong_person (referral opportunity)
  • near_miss_nurture — Score 30-49, might fit in the future
  • disqualified_polite — Score < 30, needs polite decline
  • disqualified_competitor — Competitor employee
  • existing_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 | disqualified
  • qualification_sub_verdict — qualified_hot | qualified_warm | borderline_review | near_miss_referral | near_miss_nurture | disqualified_polite | disqualified_competitor | existing_customer_upsell
  • composite_score — 0-100
  • summary — One sentence qualification reasoning

Pipeline check columns:

  • pipeline_status — new | existing_customer | in_pipeline | previously_contacted
  • pipeline_detail — One sentence on the overlap
  • signal_flags — Any signal composite matches

Company qualification columns:

  • company_size_score — match | borderline | mismatch | unknown
  • industry_score — match | adjacent | mismatch | unknown
  • stage_score — match | borderline | mismatch | unknown
  • geography_score — match | borderline | mismatch | unknown
  • use_case_score — strong | moderate | weak | no_fit | unknown

Person qualification columns:

  • title_match_score — exact_match | close_match | adjacent | mismatch | unknown
  • seniority_score — match | too_junior | too_senior | unknown
  • authority_type — economic_buyer | champion | user | evaluator | gatekeeper | unknown
  • mismatch_type — null | right_company_wrong_person | right_person_wrong_company

Use case columns:

  • inferred_intent — What they seem to need
  • product_fit — strong | moderate | weak | unknown
  • implementation_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_person routes this to referral handling in disqualification-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_data regardless 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---
2name: inbound-lead-qualification
3version: 1.0.0
4description: >
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.
9tags: [lead-generation]
10---
11 
12# Inbound Lead Qualification
13 
14Takes 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 
18Load 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 
33On 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```json
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
1011. Load the client's ICP config (or qualification prompt from `lead-qualification` capability)
1022. 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
1073. 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
117If >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
124For 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
145Each 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
161For 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
191Each 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
208For 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
240Each 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
257This 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 
2591. **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 
2662. **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 
2713. **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 
294Combine 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
330Each 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 
348Produce 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
380The current working directory or wherever the user prefers (e.g., `leads/inbound-qualified-[date].csv`).
381 
382### Summary Report
383 
384After producing the CSV, present a summary:
385 
386```markdown
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:**
4011. [reason] — X leads
4022. [reason] — X leads
403 
404**Top disqualification reasons:**
4051. [reason] — X leads
4062. [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 

Discussion

Alternatives

Also in Pipeline & forecast
Arbor — Autonomous Optimization via Hypothesis Tree RefinementAutonomously improve a real artifact (code, training recipe, agent harness, data pipeline, prompt) against an objective and an evaluator, using Hypothesis Tree Refinement (HTR) from the Arbor paper. Use this whenever someone wants to iteratively optimize something over many experiments without overfitting — e.g. "get my model's eval score up", "improve this agent/harness", "tune this pipeline", "beat the baseline on this benchmark", "run a search over approaches and keep the best", "do an MLE-bench / Kaggle-style optimization", or any long-horizon "make this artifact better and don't just memorize the dev set" task. Trigger it even when the user doesn't say "Arbor" or "hypothesis tree" but describes repeated experiment-and-evaluate loops, branching exploration of competing ideas, or worries about a dev/test gap. Runs Claude itself as the coordinator with subagent executors in isolated git worktrees; for the standalone `arbor` CLI tool see references/arbor-upstream.md.Science · MITFix How You Run Your TeamYou describe how you currently run your team, meetings, and week. You get back an honest scorecard and a short list of the exact changes that would make you a better manager.Business & ops · MITPredictable Revenue FrameworkBuild a scalable outbound B2B sales machine with specialized roles (SDR, AE, CSM). Use when the user mentions "outbound sales", "Cold Calling 2.0", "cold email sequences", "sales pipeline", "SDR process", "sales development", "build an outbound sales team", or "fill my pipeline". Also trigger when setting up a B2B SaaS sales team from scratch or building a lead-qualification framework to improve close rates. Covers the three lead types (seeds/nets/spears), role specialization, the referral-email method, ANUM qualification, and pipeline math. For offer design, see hundred-million-offers. For persuasion science, see influence-psychology.Sales & ecommerce · MITPipeline reviewPipeline analysis composite. Pulls deal/meeting data from any CRM or tracking system, analyzes the pipeline over a user-defined period (weekly, fortnightly, monthly, quarterly), and produces both an executive summary and a detailed diagnostic report. Covers volume, qualification rates, source effectiveness, stage velocity, stuck deals, and actionable recommendations. Tool-agnostic — works with any CRM (Salesforce, HubSpot, Pipedrive, Close, Supabase, CSV).Sales & ecommerce · MIT