One agent, one bootstrap, five skills. Go from a blank page to a scored list of leads without a GTM department.
An agentic lead generation template for small B2B teams. Runs on OpenClaw (or any agent harness) with Orthogonal for the data plumbing. Not a SaaS. Not a product. A template you fork and adapt.
v0.1.2, demo skeleton. The skills in skills/ are playbooks your agent follows — written prompts, not standalone runnable scripts. The only standalone Python is skills/scoring/score.py. Everything else is "your agent reads the SKILL.md and does the work."
Use the 15-min prompt to test the shape of the loop with your own ICP. Clone the full loop once you've confirmed the shape fits and you want production volume + real data-source APIs.
This version has been reviewed by a live OpenClaw agent across three iterations. Full reports in reviews/. Known gaps tracked there too — nothing hidden.
Be honest with yourself about your ICP before cloning.
- Local SMB ICPs — cafés, restaurants, microbrasseries, artisan producers, independent retail. Contact info lives on websites; Pass 1 (Scrapegraphai) usually gets you what you need.
- Operator-led / founder-led ICPs where ground intelligence about the market beats raw data volume.
- ICPs with clear firmographic filters (size, geography, sector) that Orthogonal's wrapped APIs cover well.
- VP-level / enterprise B2B SaaS buyers — Orthogonal's person-email coverage on this segment is thin in current testing. In a Series A SaaS test on 12 candidate profiles, Crustdata person enrich returned 0 usable emails (see
reviews/2026-04-16-pepe-v011-rerun.md). The Pass 4 waterfall (v0.1.2) now falls through to Tomba, Hunter domain-search, and PDL — which recover some emails — but expect LinkedIn DMs to be the primary channel for VP-level outreach, not email. - ICPs requiring highly-specific behavioral signals (funding triggers, hiring triggers) — routing to Crustdata works, but coverage varies. For reliable VP SaaS email volume, plan to bring Apollo / ZoomInfo / Lusha (bring-your-own-key, future integration).
The 15-minute prompt lets you pressure-test the loop on your actual ICP before cloning. If the 15-min prompt produces a weak list on your ICP, the full loop will too — same shape, just more volume. Better to find out in 15 minutes than after a 2-hour setup.
ICP → list → enrich → score → sync → (outreach, elsewhere)
Built from the engine Alex Houdz runs for his own GTM work. The point is to get you a clean loop fast so you can spend time on the thing that actually matters: your ICP, your alpha, your judgment.
| Requirement | Why | How |
|---|---|---|
| OpenClaw (or any agent harness) | Runs the loop | https://openclaw.com |
| Orthogonal API key | Single key, 10+ data sources wrapped (local biz, company DB, email find, scraping, enrichment, LinkedIn) | https://orthogonal.com — sign up, top up your account. Pay-per-call, cents per row. The key handles payment for you, no crypto. |
| Google Sheets | Where leads land for human review | Your existing account |
| ChatGPT / any LLM with web browsing | Fills gaps Orthogonal doesn't cover | Any plan |
Optional alternate sources: Extruct, Clay, Apollo, Apify. The loop is provider-agnostic.
The template does NOT hard-code which data provider to use for each step. Instead, every skill that needs external data follows this rule:
- Search Orthogonal first:
POST https://api.orthogonal.com/v1/searchwith a natural-language prompt describing what you need. - Use the top-ranked matching API via
POST /v1/run. - Only fall back if nothing matches — Apify (planned, bring your own key), raw web scraping, or a user-supplied dataset.
Why: Orthogonal is a single key for 10+ verified B2B data APIs with one payment layer. Picking a provider by hand means rebuilding what the marketplace already did for you. The skill decides what it NEEDS; Orthogonal decides who answers it best.
When Orthogonal doesn't cover a signal (niche public data, a specific hiring board, a regional registry), Apify is the planned second-tier fallback. The enrichment and list-building skills call this out explicitly.
| Skill | What it does | Run order |
|---|---|---|
| icp-intake | Captures your ICP + the alpha insight that makes your targeting non-obvious. Writes config/scoring-config.yaml |
1 |
| list-building | Your agent picks the right source (Openmart, Serper, Crustdata, etc.) and pulls an initial candidate list | 2 |
| enrichment | Multi-pass loop: scrape → public data → geocode → person enrich → email verify | 3 |
| scoring | Config-driven. Reads scoring-config.yaml, outputs P1/P2/P3/REVIEW tiers with top-3 reasons per row |
4 |
| gsheet-sync | Pushes the scored list to a Google Sheet for human review. Pulls operator edits back in for re-scoring | 5 |
Note: The scoring model will be adapted to your ICP responses. Ask your Agent to explain you the model if you are curious.
The scoring skill is generic Python. What's specific to you is the config that icp-intake writes for your ICP. That config defines:
- Which fields matter (sector, size, digital presence, contact quality)
- How much each is worth (the weights)
- What disqualifies a lead (review triggers)
- Where the tier cutoffs are
So one skill, many ICPs. See config/scoring-config.example.yaml for a worked example (Quebec local food producers).
Open ChatGPT (Plus with browsing) or Claude (with web search on). Paste the prompt from prompts/lead-gen-in-15-min.md. Answer 4 questions. Get ~15 scored prospects with sources. No repo to clone, no API keys to manage.
This is the "see if it works for your business" path. Meant for founders and operators who just want to see the loop produce real leads before committing any time.
For higher volume and production use. Clone the template and wire it to OpenClaw (or Claude Code, or any agent harness):
Claude Code (one command):
/plugin marketplace add AlexHoudz/lead-gen-agent-loop
/plugin install lead-gen-agent-loopOpenClaw / manual install:
# 1. Clone
git clone https://github.com/AlexHoudz/lead-gen-agent-loop.git
cd lead-gen-agent-loop
# 2. Set your Orthogonal key
cp .env.example .env
# edit .env — paste your orth_live_... key
# 3. Point your agent at this directoryThen in your agent:
"Run icp-intake. My product is X. My target is Y. My alpha insight is [something only you know]."
"Run list-building. Pull 100 candidates."
"Run enrichment."
"Run scoring."
"Sync to gsheet <your-sheet-id>."
That's the whole loop. Review the P1 rows in the sheet, add your comments, pull the sheet back to re-score with overrides, then hand the winners to your outreach tool (Instantly, Zapmail, whatever).
lead-gen-agent-loop/
├── bootstrap/ # agent roles, architecture, schema, operating rules
├── operational/ # approval gates, conventions, Telegram, PARA workspace
├── business/ # scoring, state model, workflows, handoffs
├── system/ # runtime, integrations, tools baseline
├── skills/ # the 5 custom skills
│ ├── icp-intake/
│ ├── list-building/
│ ├── enrichment/
│ ├── scoring/ # + score.py (the generic scorer)
│ └── gsheet-sync/
└── config/ # scoring-config.yaml lands here (per ICP)
The 5 here are the floor, not the ceiling. Things you might add per client:
- Public data skills — road traffic, subvention databases, industry registries, census. Ask your agent to build a script for any public dataset you care about.
- Custom signals — reviews, funding news, hiring trends, seasonal indicators.
- Domain-specific scoring fields — Quebec SMBs care about road visibility; SaaS buyers care about tech stack. Add fields to your
scoring-config.yaml, the scorer picks them up.
- OpenClaw — the agent harness this was built against
- Orthogonal — the data-source layer, so we didn't rebuild plumbing
- Klaus — cloud hosting for OpenClaw
- The first customer (you know who you are) — the reason this exists
MIT. Fork it, ship it, share it.
DM Alex on LinkedIn or open an issue.