Outreach Guide¶
ColdReach Phase 5 closes the loop: after finding emails you can generate a personalized cold email draft and track your outreach — all in one tool.
Prerequisites¶
# 1. Get a free Groq API key (14,400 tokens/min free)
# https://console.groq.com/
# 2. Add to .env
echo 'COLDREACH_GROQ_API_KEY=gsk_xxx' >> .env
# 3. Install Streamlit for the dashboard (optional)
pip install coldreach[dashboard]
# 4. Start the API server (needed for dashboard draft generation)
coldreach serve
Flow A — CLI Draft (fastest)¶
Find emails and draft in one command:
ColdReach will:
1. Find patrick@stripe.com (or the best match)
2. Scrape stripe.com for company context
3. Ask you two quick questions:
- Your name: Jane Smith
- What you want (one sentence): explore a partnership on embedded payments
4. Groq generates a subject + 3-sentence body
5. Show the draft with [c]opy / [s]ave / [q]uit
Skip the prompts by providing all flags upfront:
coldreach find --domain stripe.com --draft \
--name "Patrick Collison" \
--sender-name "Jane Smith" \
--intent "explore a partnership on embedded payments" \
--template partnership
Template types:
--template |
Best for |
|---|---|
auto |
Let ColdReach detect from your intent (default) |
job_application |
Applying for a role |
partnership |
Business collaboration |
sales |
Selling a product or service |
introduction |
Building a relationship, no specific ask |
Flow B — TUI Outreach tab (recommended)¶

The fastest workflow — no browser needed:
- Find tab (
f) → scan a domain → emails stream in - Select an email → press
d→ DraftPanel opens below - Company info appears immediately at the top (fetched in background)
- Fill Your name + What you want, choose Fast or Quality model
- Press Generate → 3 subject line variants appear + body
- Press
1,2, or3to pick a subject - Press
y→ full email copied to clipboard - Switch to Outreach tab (
o) → contact auto-added with statusdraft - After sending: press
s→ status becomessent - When they reply: press
R→ status becomesreplied
Stripe · fintech Stripe | Financial Infrastructure to Grow…
[Jane Smith ] [explore a payment integration partnership ]
[Auto] [Partner] [Job] [Sales] [Intro] · [Fast (8b)] [Quality]
[▶ Generate draft ] [↺ Regenerate]
Done — press 1/2/3 to pick subject, y to copy
┌─ subjects ────────────────────────────────────────────────────┐
│ A: Partnership on Stripe's embedded payments ← selected │
│ B: Quick question about your payment API (press 2) │
│ C: Exploring fintech collaboration (press 3) │
└───────────────────────────────────────────────────────────────┘
Body
┌───────────────────────────────────────────────────────────────┐
│ Hi Patrick, I've been following Stripe's recent expansion… │
│ [y: Copy] [Esc: Close] │
└───────────────────────────────────────────────────────────────┘
No Groq key? The panel still works — it shows a template skeleton with [PLACEHOLDER] fields you can fill manually.
Flow C — Dashboard (most visual)¶
Opens at http://localhost:8501 with three tabs:
📋 Contacts tab¶
- Shows all domains you've scanned (from the local cache)
- Each email shows: verification status, confidence score, discovery source
- Click Draft next to any email → jumps to the Compose tab pre-filled
✏️ Compose tab¶
Fill in: - Recipient email (pre-filled from Contacts click) - Company domain (pre-filled) - Your name - What you want — one sentence is enough; Groq does the rest - Email type — or leave on Auto
Click Generate Draft → the email appears on screen. Copy it with the code block and paste into Gmail, Outlook, or wherever you send from.
📤 Sent tab¶
- Mark emails as Sent or Replied manually
- View all saved drafts
- See your reply rate at a glance
Tracking data is stored in ~/.coldreach/outreach.json — just a local JSON file.
Flow C — Chrome Extension Draft¶
After finding emails on a job posting:
- Click ✏️ next to any email in the extension popup
- Fill in: your name, your one-sentence intent
- Click Generate — the draft streams in word-by-word
- Copy with one click → paste into Gmail
How Groq personalization works¶
ColdReach uses DSPy with Groq for structured email generation:
domain → scrape homepage/about page
→ extract: company name, description, industry, location
→ feed to Groq (llama-3.1-8b-instant or llama-3.3-70b-versatile)
→ structured output: { subject_a, subject_b, subject_c, body }
3 subject variants — Groq generates three distinct angles in one call: - A — specific, references the company or role - B — question or curiosity-driven - C — direct and minimal
Pick the one that fits your style. The TUI lets you switch with 1/2/3.
Model choice: | Model | Speed | Quality | Best for | |-------|-------|---------|----------| | Fast (llama-3.1-8b-instant) | ~2s | Good | Most drafts | | Quality (llama-3.3-70b-versatile) | ~8s | Excellent | High-value contacts |
What makes it not generic: - Company description comes from their actual website (not Wikipedia) - Template guidance tells Groq the tone, length, and what to avoid - Subjects are constrained to <60 chars, no clickbait - Body is capped at 4 sentences — forces clarity
What Groq DOESN'T know: - Your personal history with the company - Their current open roles - Internal contacts
You should review and edit every draft before sending.
Outreach tracking¶
Contacts and drafts are stored in ~/.coldreach/cache.db (same SQLite file as the email cache):
# View outreach contacts via SQLite
sqlite3 ~/.coldreach/cache.db "SELECT email, status, subject FROM outreach ORDER BY created_at DESC"
# Count by status
sqlite3 ~/.coldreach/cache.db "SELECT status, COUNT(*) FROM outreach GROUP BY status"
The TUI Outreach tab (o) gives you a full UI to manage this. Status flow:
API integration¶
The draft endpoint works with any HTTP client — useful for automation:
import httpx
resp = httpx.post("http://localhost:8765/api/v2/draft", json={
"email": "ceo@company.com",
"domain": "company.com",
"sender_name": "Jane Smith",
"sender_intent": "partnership discussion",
"email_type": "partnership",
})
for line in resp.text.split("\n"):
if line.startswith("data:"):
import json
payload = json.loads(line[5:])
if "body" in payload:
print(payload["subject"])
print(payload["body"])
Troubleshooting¶
"Groq API key required"
→ In the TUI, the draft panel will show a template skeleton — you can still draft manually.
→ For CLI/API: add COLDREACH_GROQ_API_KEY=gsk_xxx to your .env.
"Draft generation failed"
→ Check coldreach serve is running (coldreach status). Groq may be rate-limited —
wait 60s and try again (free tier: 14,400 tokens/min resets every minute).
Context is generic / wrong company
→ The site may be a JavaScript SPA that plain httpx can't render. Try:
coldreach find --domain company.com --crawl4ai --draft
Draft quality is poor → Be more specific in your intent. "I want to discuss business" → "I want to explore integrating your payment API into our B2B SaaS for the SMB segment."