Eliminate the manual research-to-pitch loop. URL in → personalized email out.
OutboundFlow automates the full B2B outreach workflow: crawl a prospect's website, analyze their business situation with AI, and generate a personalized email — all without human research.
Built for the AI Workflow Automation Challenge 2026.
Traditional B2B outreach is broken: reps spend 4-8 hours per week manually researching prospects, then send generic emails that read like templates. OutboundFlow fixes both problems:
- Crawls the prospect's website — extracts headline, description, tech stack, CTAs, nav items, and contact info using Playwright (with a requests fallback for simpler sites)
- Analyzes fit with Gemini AI — produces a structured fit score (0-100), pain points, value props, and personalization hooks specific to that company
- Writes the email — generates a subject line and 5-sentence body that references something real from the prospect's own website
Every step degrades gracefully: if Gemini is unavailable, deterministic heuristics run instead. The pipeline always completes.
┌─────────────────┐ ┌──────────────────┐ ┌────────────────────┐ ┌───────────────┐
│ Lead CSV/URL │───▶│ Crawler Agent │───▶│ Analyzer Agent │───▶│ Pitch Builder │───▶ Email
│ │ │ (Playwright + │ │ (Gemini AI + │ │ (Gemini AI + │
│ │ │ requests) │ │ stub fallback) │ │ templates) │
└─────────────────┘ └──────────────────┘ └──────────────────┘ └───────────────┘
│
SMTP Delivery
| Module | Role | Lines |
|---|---|---|
agent/crawler.py |
Playwright + requests website intelligence extractor | 219 |
agent/analyzer.py |
Gemini fit scoring + deterministic fallback | 157 |
agent/pitch_builder.py |
Gemini personalized email + template fallback | 120 |
outbound_flow.py |
CLI orchestrator + SMTP delivery | 273 |
pip install -r requirements.txt
playwright install chromium
# Demo mode (3 fixture leads, no API key required)
python outbound_flow.py --demo
# Analyze a single URL
python outbound_flow.py --url https://example.com --demo
# Full pipeline with leads CSV
export GEMINI_API_KEY="your-key"
export SMTP_HOST="smtp.example.com"
export SMTP_USER="you@example.com"
export SMTP_PASS="password"
export SENDER_NAME="Your Name"
export SENDER_EMAIL="you@example.com"
python outbound_flow.py --leads fixtures/leads.csv --output output/run.jsonEach lead produces a structured JSON result:
{
"url": "https://example.com",
"contact_email": "hello@example.com",
"intel": {
"company_name": "Acme Corp",
"headline": "Scale your sales pipeline",
"fit_score": 78,
"fit_tier": "hot"
},
"analysis": {
"fit_score": 78,
"pain_points": ["Manual prospect research consuming 4-8 hours per rep"],
"personalization_hooks": ["Their headline 'Scale your sales pipeline' signals growth focus"],
"recommended_tier": "professional"
},
"pitch": {
"subject": "quick question about Acme's outreach workflow",
"body": "I noticed your headline...",
"_source": "gemini"
},
"status": "sent",
"duration_s": 4.2
}- Model:
gemini-2.5-flash-lite(low latency, sufficient for structured extraction) - Temperature: 0.2 for analysis (deterministic), 0.6 for pitch (creative variety)
- Schema enforcement: JSON schema in system prompt + regex cleanup prevents parse failures
- Graceful degradation: heuristic stub runs when API is unavailable
OutboundFlow removes human work at every stage:
- Research: replaced by Playwright crawler (JS-rendered pages supported)
- Qualification: replaced by Gemini fit scoring
- Copywriting: replaced by Gemini pitch generation with site-specific hooks
- Delivery: SMTP with retry logic built into the orchestrator
A rep using this tool goes from a URL to a sent email in ~6 seconds per lead.
Run python outbound_flow.py --demo for a full offline demo using 3 fixture companies. No API key required — the stub analyzer and template pitch builder run the complete pipeline.
Built by vøiddo — a small studio shipping AI-flavoured products, free dev tools, Chrome extensions and weird browser games.