AI-powered B2B cold outreach automation
Discover startups → Find decision-maker emails → Generate personalized cold emails → Track replies → Auto follow-ups
OutreachX runs a full AI outreach pipeline on demand:
Your query → AI discovers companies → Scrapes websites → Finds CEO/CTO/HR emails
→ Generates personalized cold emails → You review → Send → Track replies → Auto follow-ups
Three ways to input leads:
"YC India fintech startups after 2020"— AI discovers companies via SerpAPI + YC directory"email Razorpay, Groww, Sarvam AI"— direct company name targeting- Upload CSV / Excel / JSON — your existing database
| Layer | Technology |
|---|---|
| Frontend | Next.js 14, TypeScript, Tailwind CSS, shadcn/ui, Recharts |
| Backend | FastAPI, Python 3.11 |
| AI Orchestration | LangGraph (multi-agent StateGraph) |
| LLM | Groq — Llama 3.3 70B (fast inference, free tier) |
| Lead Discovery | SerpAPI + BeautifulSoup + YC directory scraper |
| Contact Finding | Hunter.io + email pattern guesser + LinkedIn builder |
| Email Sending | SendGrid + SMTP fallback |
| Tracking | Open/click/reply tracking pixel |
| Follow-ups | APScheduler (3-day cadence, 2 max follow-ups) |
| Database | PostgreSQL + SQLAlchemy async |
| Resume Parsing | pdfplumber + Groq extraction |
outreachx/
├── backend/
│ ├── app/
│ │ ├── agents/
│ │ │ ├── graph.py # LangGraph pipeline
│ │ │ ├── state.py # AgentState TypedDict
│ │ │ └── nodes/
│ │ │ ├── planner.py # Parses query, detects role/mode
│ │ │ ├── direct_input.py # "email Razorpay, Groww" → leads
│ │ │ ├── discovery.py # SerpAPI + YC scraper + CSV upload
│ │ │ ├── researcher.py # Website scraper + Groq hooks
│ │ │ ├── contact_finder.py # Hunter.io + pattern guesser + LinkedIn
│ │ │ ├── email_generator.py# Groq personalized emails
│ │ │ └── validator.py # Quality scoring 0–1
│ │ ├── api/routes/
│ │ │ ├── campaigns.py # Campaign CRUD + send
│ │ │ └── tracking.py # Open/click/reply tracking
│ │ ├── db/
│ │ │ ├── database.py # SQLAlchemy async engine
│ │ │ └── crud.py # All DB operations
│ │ ├── models/
│ │ │ ├── campaign.py
│ │ │ ├── lead.py
│ │ │ └── email.py
│ │ ├── services/
│ │ │ ├── email_sender.py # SendGrid + SMTP + HTML builder
│ │ │ ├── tracker.py # Event tracking store
│ │ │ └── followup.py # APScheduler follow-up queue
│ │ └── main.py # FastAPI app
│ ├── requirements.txt
│ ├── render.yaml # Render deployment config
│ └── .env.example
└── frontend/
├── app/
│ ├── page.tsx # Landing page
│ └── dashboard/
│ ├── page.tsx # Dashboard home + campaign runner
│ ├── campaigns/page.tsx # Campaign list
│ ├── leads/page.tsx # Leads table
│ ├── emails/page.tsx # Email review
│ ├── analytics/page.tsx # Funnel charts
│ └── settings/page.tsx # API keys + sender config
├── lib/api.ts # API client (connects to backend)
└── components/
cd backend
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env
# Edit .env — add your API keys (see below)
uvicorn app.main:app --reload
# API running at http://localhost:8000
# Docs at http://localhost:8000/docscd frontend
npm install
# Create .env.local
echo "NEXT_PUBLIC_API_URL=http://localhost:8000" > .env.local
npm run dev
# App running at http://localhost:3000| Key | Where to get | Free tier |
|---|---|---|
GROQ_API_KEY |
console.groq.com | ✓ Unlimited |
SERPAPI_API_KEY |
serpapi.com | 100 searches/month |
HUNTER_API_KEY |
hunter.io | 50 searches/month |
SENDGRID_API_KEY |
sendgrid.com | 100 emails/day |
DATABASE_URL |
supabase.com or local PostgreSQL | ✓ Free |
| Method | Endpoint | Description |
|---|---|---|
POST |
/agents/run |
Run full AI pipeline (no DB) |
POST |
/campaigns |
Create campaign + save to DB |
GET |
/campaigns |
List all campaigns |
GET |
/campaigns/{id} |
Campaign with leads + emails |
POST |
/campaigns/{id}/send |
Send approved emails |
GET |
/campaigns/{id}/stats |
Open/click/reply rates |
POST |
/emails/send |
Send single email |
GET |
/emails/stats |
Overall stats |
GET |
/track/open/{id} |
Open tracking pixel |
POST |
/track/reply/{id} |
Mark as replied |
GET |
/followups/queue |
View pending follow-ups |
POST |
/resume/parse |
Parse resume PDF/TXT |
- Push to GitHub
- render.com → New Web Service → connect repo
- Render auto-detects
render.yaml - Add environment variables in Render dashboard
- Create PostgreSQL on Render → copy URL → set as
DATABASE_URL(changepostgresql://→postgresql+asyncpg://) - Deploy — live at
https://outreachx-backend.onrender.com
cd frontend
npx vercel
# Follow prompts
# Set NEXT_PUBLIC_API_URL=https://outreachx-backend.onrender.comOr connect GitHub repo at vercel.com and set the env var in project settings.
User input (query / file / company names)
│
▼
Planner node — detects mode + target role (CEO/CTO/HR)
│
├── "email Razorpay, Groww" ──────► Direct Input node
├── CSV/Excel/JSON upload ─────────► Discovery node (parse file)
└── "YC India fintech 2021" ───────► Discovery node (SerpAPI)
│
▼
Researcher node
(scrapes websites, Groq hooks)
│
▼
Contact Finder
(Hunter.io → pattern guess)
│
▼
Email Generator
(Groq, resume-aware, role-aware)
│
▼
Validator
(scores 0–1, flags weak emails)
│
▼
Leads + Emails returned
User reviews in dashboard
│
▼
Send emails
(SendGrid / SMTP + tracking)
│
▼
Follow-up scheduler
(3 days, max 2 follow-ups)
Backend .env:
GROQ_API_KEY=gsk_...
SERPAPI_API_KEY=...
HUNTER_API_KEY=...
DATABASE_URL=postgresql+asyncpg://user:pass@host:5432/outreachx
SENDGRID_API_KEY=SG....
FROM_EMAIL=you@yourdomain.com
APP_ENV=developmentFrontend .env.local:
NEXT_PUBLIC_API_URL=http://localhost:8000
Built with LangGraph + Groq · Made by Harshita Yadav