← vishwa— For B2B founders and consultants doing outreach —

How I used Claude Code to land a B2B consulting client

138 cold messages. 11 Looms. 1 client. The exact scripts, research prompts, and message templates — all of it.

138cold messages sent
11Loom follow-ups
1client closed
9%close rate on qualified leads
Download the 6 files free →
Research-First Stack pipeline
— Real reply, Jan 10 —
LinkedIn reply: Thanks Vish — very good. I'm happy to have a follow up call.

Loom sent after a research-first cold message. They replied the next day.

Six files. One working system.

Not a PDF of advice. The actual Claude Code project — directive file, execution scripts, and prompts — so you can run the same workflow on your own leads in an afternoon.

main.pyRun the full pipeline: Apollo CSV in → personalised messages out
research.pyClaude analyses each company — finds the one specific thing to lead with
write_messages.pyMessage writer with the two rules that force specificity over flattery
qualify_replies.pyReply classifier — positive signal, objection, or noise — so you only act on the ones worth your time
outreach.mdThe directive Claude reads to orchestrate the full flow
loom_template.mdThe 90-second Loom format that converted 1 in 11 qualified follow-ups

Five steps. No spray and pray.

Most cold outreach fails before it’s sent. You pull a list, write a template, swap in the first name. It reads like exactly that — and your reply rate shows it. This system inverts the order: research first, write second. Claude doesn’t write the emails. Claude orchestrates.

01
Pull from Apollo — with growth signals, not job titles~/execution/apollo_pull.py

The filter set that matters isn’t job title — it’s company motion. Headcount 10–50, seed to Series A, recent funding, relevant industry vertical. Companies in motion respond. Static lists don’t. The script exports a clean CSV with the columns Tavily needs downstream: company name, homepage URL, LinkedIn URL, contact name.

02
Research every company before writing a single word~/execution/tavily_research.py

Before Claude writes anything, Tavily scrapes: homepage, press mentions from the last 90 days, and any recent product or funding news. The raw results land in a single JSON file — no per-company files, no wasted credits. That JSON is what Claude reads when it writes the message. This is the step most people skip, and the one that does all the work.

03
Claude writes from the brief — not a fill-in-the-blank template~/execution/write_messages.py

The message template enforces two rules: reference something you couldn’t know from their homepage alone, and lead with what you’d change about their funnel — not what you offer. Claude enforces both. The result reads like you spent 20 minutes researching each company. You did. Your system did it for you.

Before and after — generic vs research-first message
04
Qualify replies before you context-switch~/execution/qualify_replies.py

When replies come in, Claude reads them: positive signal, objection, or noise. Positive signals get flagged for a same-day Loom. Objections get a short templated response. Noise gets archived. You only deal with the ones worth your time — which ends up being about 3–5% of total replies, but they’re all real.

05
The Loom converts where a second text message can’t~/loom_template.md

90 seconds. Screen share of their actual product or funnel. One specific thing you’d fix, with a reason. Direct ask at the end — that’s it. 11 of 138 warranted a Loom. 1 of 11 converted. A 9% close rate on qualified follow-ups isn’t magic — it’s what happens when you only send Looms to genuine signals, and when the Loom references work you actually did.

The project lives in Claude Code’s agentic environment. One directive file tells Claude what to do. Python scripts do the deterministic work. .tmp/ holds intermediates that get regenerated each run — you never commit them.

.antigravity/Outreach/
├── directives/
│   └── outreach.md              ← the SOP Claude reads each session
├── execution/
│   ├── main.py                  ← runs the full pipeline end-to-end
│   ├── url_finder.py            ← finds company homepage via Tavily
│   ├── scraper.py               ← scrapes and cleans homepage content
│   ├── research.py              ← Claude extracts the outreach angle
│   ├── write_messages.py        ← Claude drafts from the research brief
│   └── qualify_replies.py       ← routes replies by signal strength
├── output/
│   ├── leads.csv                ← Apollo export (your input)
│   └── messages.csv             ← personalised messages, ready to send
└── loom_template.md             ← the 90-second follow-up format
138 cold messages → 11 Looms → 1 client → 9% close rate
— Get the full system —

Get the exact files — free with your email.

Setup takes an afternoon. Runs entirely in Claude Code. Bring your own Apollo and Tavily API keys — both have free tiers that cover a first run.

Free. No spam. Unsubscribe anytime.

— How this was built —

This system runs on Claude Code

This isn’t a Claude chatbot workflow. It’s a 3-layer system built in Claude Code’s agentic environment. Claude reads the directive file, calls the Python scripts in order, handles errors, and updates the directive when it learns something. The deterministic parts — API calls, CSV parsing, file operations — are Python. The decisions are Claude. That separation is why it doesn’t compound errors the way pure-LLM pipelines do.