Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Lead qualification engine with conversational intake. Asks structured questions to understand your qualification criteria, generates a reusable qualification prompt, then batch-enriches leads via Apify LinkedIn scraping and scores them with parallel processing. Outputs qualified/disqualified verdicts with confidence scores and reasoning to CSV or whatever output format the user prefers. Supports calibration mode for prompt refinement.
.claude/skills/gooseworks-ai-lead-qualification/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 276% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 131% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 207% | 0% |
Qualify leads against custom criteria through a structured intake process, then score lead lists in parallel with confidence ratings and reasoning.
No existing qualification prompt. Run intake to build one, save it, then qualify leads.
Trigger: User provides no qualification prompt file.
User references an existing qualification prompt file — skip intake, go straight to scoring.
Trigger: User tags or references a file in skills/lead-qualification/qualification-prompts/.
User has seen results and wants to adjust criteria. Update the saved prompt, re-run.
Trigger: User says something like "refine", "adjust", "that's wrong", or provides feedback on qualification results.
The goal is to build a complete picture of who the user considers qualified vs disqualified. Present questions in bulk rounds so the user can answer efficiently.
Present these questions as a numbered list. Tell the user: "Answer what's relevant, skip what's not. I'll follow up on anything I need to clarify."
Product & Campaign Context:
Company-Level Criteria:
Person-Level Criteria:
Behavioral & Situational Signals:
Dealbreakers & Instant Qualifiers:
Based on the user's answers, ask 5-10 targeted follow-ups to resolve ambiguity. Examples:
Present 3-5 hypothetical lead profiles that test boundary cases. Ask "Would you qualify this person?"
Example scenarios to construct (adapt based on the user's criteria):
This round catches implicit criteria the user hasn't articulated.
After intake is complete, synthesize all answers into a structured qualification prompt. Save it to:
skills/lead-qualification/qualification-prompts/[campaign-name].mdThe saved prompt MUST follow this structure:
markdown# Qualification Prompt: [Campaign Name] Generated: [date] ## Campaign Context - **Product:** [one-liner] - **Campaign Angle:** [specific angle] - **Problem Solved:** [what and for whom] ## Hard Disqualifiers (Instant No) - [list each with explanation] ## Hard Qualifiers (Instant Yes) - [list each with explanation] ## Company Criteria | Criterion | Qualified | Disqualified | Notes | |-----------|-----------|--------------|-------| | Size | [range] | [range] | | | Industry | [list] | [list] | | | Geography | [list] | [list] | | | Stage | [list] | [list] | | | Funding/Revenue | [range] | [range] | | ## Person Criteria | Criterion | Qualified | Disqualified | Notes | |-----------|-----------|--------------|-------| | Titles | [list] | [list] | | | Seniority | [level+] | [below level] | | | Department | [list] | [list] | | | Tenure | [minimum] | [below minimum] | | | Experience | [range] | [range] | | ## Behavioral & Situational Signals - [list signals that boost qualification] - [list signals that reduce qualification] ## Confidence Rules - **High Confidence:** Enough data available for company size, title, tenure, and at least one signal. - **Medium Confidence:** Missing one or two non-critical data points but core criteria are clear. - **Low Confidence:** Missing critical data points (e.g., no company size, unclear title). Still make a yes/no call but flag it. ## Edge Case Guidance - [specific guidance derived from Round 3 scenarios] - [any nuanced rules from the intake conversation] ## Qualification Reasoning Instructions When evaluating a lead, structure your reasoning as: 1. Check hard disqualifiers first — if any match, immediately disqualify. 2. Check hard qualifiers — if any match, lean strongly toward qualifying. 3. Evaluate company criteria against thresholds. 4. Evaluate person criteria against thresholds. 5. Factor in behavioral/situational signals as tiebreakers. 6. Assign confidence based on data completeness. 7. Write 2-3 sentence reasoning summarizing the decision.
Accept any of these input formats:
Detect the format automatically based on what the user provides.
When: The input contains a linkedin_url column (or LinkedIn URLs are available). Skip when: No LinkedIn URLs are present, or the user explicitly says to skip enrichment.
Before LLM qualification, batch-enrich all leads to gather structured profile data. This is MUCH faster and cheaper than per-lead web searches during qualification.
Run the enrichment script:
bashpython3 skills/lead-qualification/scripts/enrich_leads.py INPUT_CSV \ --output ENRICHED_CSV \ --cache-hours 24
Use --dry-run first to show the cost estimate without calling Apify.
What this does:
enriched_title, enriched_company, enriched_industry, enriched_location, enriched_connections, enriched_education, enriched_experience_years, enriched_headline, enriched_about, enrichment_statusAfter enrichment, use the enriched CSV as input for Steps 2-4. The enriched data lets the LLM qualification step work from structured fields instead of doing web searches, dramatically improving speed and consistency.
If enrichment fails for some profiles: They'll have enrichment_status: failed in the output. The LLM qualification step should fall back to web search for those leads only.
Before processing the full list, run the first 5-10 leads and present results to the user in a table.
If batch enrichment was run (Step 1.5), use the enriched columns (enriched_title, enriched_company, etc.) as the primary data source. Only fall back to web search for leads where enrichment_status is failed or no_url.
| # | Name | Title | Company | Qualified | Confidence | Reasoning |
|---|------|-------|---------|-----------|------------|-----------|
| 1 | ... | ... | ... | Yes | High | ... |
| 2 | ... | ... | ... | No | Medium | ... |
| ... |Ask: "Do these look right? Should I adjust any criteria before processing the full list?"
If the user flags issues:
Repeat until the user approves.
Once calibration is approved, process ALL remaining leads using parallel subagents. You MUST parallelize — do NOT process leads sequentially.
Parallelization protocol (mandatory):
For each batch, create a self-contained context package:
qualification-prompts/ file)enrichment_status=failed or no_url, do a quick web search. Spend no more than 30 seconds per lead on search."Use the Task tool to launch ALL batches simultaneously in a single message with multiple tool calls:
Task: "Qualify leads batch 1/N" Context: qualification prompt] + batch 1 lead rows]
Task: "Qualify leads batch 2/N" Context: qualification prompt] + batch 2 lead rows]
... (launch ALL at once — do NOT wait for batch 1 before launching batch 2)
Per-lead processing (within each batch agent):
enrichment_status: success or cached): use enriched_title, enriched_company, etc.enrichment_status: failed or no_url): do a quick web search (max 30 seconds)Default: CSV
Qualified — Yes / NoConfidence — High / Medium / LowReasoning — 2-3 sentence explanationIf the user prefers Google Sheets or another destination:
After output is complete, present a summary:
## Qualification Results: [Campaign Name]
**Total leads processed:** X
**Qualified:** X (Y%)
**Disqualified:** X (Y%)
**Confidence breakdown:**
- High: X leads
- Medium: X leads
- Low: X leads (may need manual review)
**Top disqualification reasons:**
1. [reason] — X leads
2. [reason] — X leads
3. [reason] — X leads
**Output:** [Google Sheet link or CSV path]
**Qualification prompt saved to:** skills/lead-qualification/qualification-prompts/[campaign-name].mdThe qualification agent should have access to:
scripts/enrich_leads.py for batch profile enrichment before qualificationharvestapi~linkedin-profile-scraper Apify actor ($3/1k profiles, no cookies)APIFY_API_TOKEN environment variable--dry-run first to preview costQualify leads for our outbound campaign. Here's the lead list: leads.csv→ Agent detects no saved prompt, starts intake, builds prompt, then qualifies.
Qualify these leads using @skills/lead-qualification/qualification-prompts/series-a-founders.md
— lead list: leads.csv→ Agent skips intake, goes straight to calibration + qualification.
Using the series-a-founders qualification prompt, qualify these people:
- https://linkedin.com/in/person1
- https://linkedin.com/in/person2
- https://linkedin.com/in/person3Those results look off — also disqualify anyone at a consulting firm, and lower the
tenure minimum to 3 months for Director+ titles.→ Agent updates the saved prompt and re-runs.
Other measured skills in the registry, with their headline benchmark lift.