SkillHub

lead-gen-factory

v1.0.0

Run B2B lead research with lgf (Lead Gen Factory). Use when asked to find leads, prospect companies, research ICPs, find decision makers, or generate a lead list for any B2B target profile.

Sourced from ClawHub, Authored by Jordi Catafal

Installation

Please help me install the skill `lead-gen-factory` from SkillHub official store. npx skills add Catafal/lead-gen-factory

lgf — Lead Gen Factory

A CLI pipeline that takes a free-text ICP (Ideal Customer Profile) and returns a scored, deduplicated list of B2B leads as both CSV and structured JSON.

Prerequisites

Install lgf once (requires Python 3.12+):

# From the repo root
pip install -e .

# Or via pipx for isolated install
pipx install git+https://github.com/Catafal/lead-gen-factory.git

Verify installation:

lgf doctor

Required API keys (set in ~/.lgf/.env): - TAVILY_API_KEY — web search - OPENROUTER_API_KEY — LLM scoring + extraction


Core Command

lgf research --icp-text "<your ICP>" --json 2>/dev/null

The --json flag outputs a structured JSON envelope to stdout — perfect for AI agents to capture and process without touching the filesystem. All human-facing progress output goes to stderr (suppressed with 2>/dev/null).


Usage Patterns

1. Quick inline ICP (most common)

lgf research --icp-text "HR Directors at SaaS companies in Spain, 50-500 employees" --json 2>/dev/null

2. ICP from file (for complex profiles)

lgf research --icp icp_examples/skillia_spain.md --json 2>/dev/null

3. Narrow with a focus constraint

lgf research --icp-text "Tech companies in Madrid" --focus "only companies hiring L&D managers" --json 2>/dev/null

4. Filter by minimum ICP score

lgf research --icp-text "..." --min-score 8 --json 2>/dev/null

5. Dry-run — see search queries only (no crawling, no LLM calls)

lgf research --icp-text "..." --dry-run

6. Check current config

lgf config

JSON Output Schema

When --json is used, the envelope printed to stdout has this structure:

{
  "leads": [
    {
      "business": "Acme Corp",
      "first": "Ana",
      "last": "García",
      "email": "[email protected]",
      "linkedin": "https://linkedin.com/in/anagarcia",
      "website": "https://acme.com",
      "phone": null,
      "date": "2026-03-09",
      "place_of_work": "Acme Corp, Madrid",
      "icp_fit_score": 9,
      "icp_fit_reason": "HR Director at 120-person SaaS, exact ICP match",
      "source_url": "https://acme.com/team"
    }
  ],
  "count": 1,
  "output_file": "leads_20260309.csv",
  "icp": {
    "target_roles": ["HR Director", "People Director"],
    "company_size_min": 50,
    "company_size_max": 500,
    "industries": ["SaaS", "Tech"],
    "geographies": ["Spain"],
    "min_fit_score": 7
  }
}

Useful jq extractions

# All emails
lgf research --icp-text "..." --json 2>/dev/null | jq '.leads[].email'

# Count of leads found
lgf research --icp-text "..." --json 2>/dev/null | jq '.count'

# First lead's company + score
lgf research --icp-text "..." --json 2>/dev/null | jq '.leads[0] | {business, icp_fit_score}'

# Filter leads scoring 9+
lgf research --icp-text "..." --json 2>/dev/null | jq '[.leads[] | select(.icp_fit_score >= 9)]'

# LinkedIn URLs only
lgf research --icp-text "..." --json 2>/dev/null | jq '[.leads[].linkedin | select(. != null)]'

Writing a Good ICP

Include: - Roles: job titles of your decision makers (e.g. "HR Director", "L&D Manager", "CPO") - Company size: employee range (e.g. "50-500 employees") - Industries: sectors (e.g. "SaaS", "fintech", "consulting") - Geography: countries or cities (e.g. "Spain", "Barcelona", "LATAM") - Signals (optional): growth stage, tech stack, hiring activity

Example ICP text:

HR Directors and People Ops leads at B2B SaaS companies in Spain with 50-500 employees.
Focus on companies with active hiring in engineering or sales. Avoid BPO and consulting firms.

All Available Commands

Command Purpose
lgf research Full pipeline: search → crawl → extract → score → CSV
lgf validate-icp Parse and display an ICP without running the pipeline
lgf config Show effective configuration (API keys masked)
lgf config set KEY VALUE Update a setting in ~/.lgf/.env
lgf profile list List saved ICP profiles
lgf profile add <name> Save current ICP as a named profile
lgf doctor Health check: API keys + live connectivity
lgf init First-time setup wizard

Score Interpretation

Score Meaning
8–10 Strong ICP fit — prioritize these
6–7 Moderate fit — worth reviewing
< 6 Weak fit — pipeline default filter

Default min score is 7. Override with --min-score.