A Django + React app that automates B2B cold email lead generation. Describe your SaaS and target audience β AI generates targeted search queries, finds matching LinkedIn profiles via Google, extracts emails using multi-strategy hunting, and scores each lead for relevance.
- Create campaigns with your SaaS description and target audience
- AI generates targeted LinkedIn search queries optimized for email visibility
- Finds real LinkedIn profiles via Serper.dev (Google search API)
- Multi-strategy email extraction: Apollo.io β Serper search β LinkedIn page scrape β domain guessing
- AI batch-scores all leads in one call (0β100) with strict ICP rubric
- Profiles with visible emails are prioritized and score-boosted
- Lead status management (New β Contacted β Qualified β Rejected)
- Export leads to Excel (.xlsx) with one click
- Modern React + Tailwind dark UI
- Rate-limited AI calls with OpenRouter free models + Groq fallback
Backend
- Django 4.2+
- Serper.dev (Google Search API β 2500 free queries)
- OpenRouter free models (Llama 3.3 70B, Gemma, etc.)
- Groq API fallback (Llama 3.3 70B β 14,400 free req/day)
- openpyxl for Excel export
- SQLite (default, swap for Postgres in production)
Frontend
- React 18 + Vite
- Tailwind CSS v4
- Lucide icons
git clone https://github.com/your-username/leadmysaas.git
cd leadmysaaspython -m venv env
# Windows
env\Scripts\activate
# macOS/Linux
source env/bin/activatepip install -r requirements.txtcd frontend
npm install
cd ..Copy .env.example to .env and fill in your keys:
OPENROUTER_API_KEY=your_openrouter_api_key_here
GROQ_API_KEY=your_groq_api_key_here
SERPER_API_KEY=your_serper_api_key_here
APOLLO_API_KEY=your_apollo_api_key_here| Key | Where to get it | Free tier |
|---|---|---|
OPENROUTER_API_KEY |
openrouter.ai/keys | Free models available |
GROQ_API_KEY |
console.groq.com/keys | 14,400 req/day |
SERPER_API_KEY |
serper.dev | 2,500 free searches |
APOLLO_API_KEY |
app.apollo.io β Settings β API | 50 free exports/month |
python manage.py migratecd frontend
npm run build
cd ..python manage.py runserverVisit http://127.0.0.1:8000
Run both servers simultaneously:
# Terminal 1 β Django API
python manage.py runserver
# Terminal 2 β React dev server (proxies /api to Django)
cd frontend
npm run devThen open http://localhost:5173
- Click + New Campaign
- Fill in your SaaS description and target audience (be specific β e.g. "CTOs at B2B SaaS startups with 10β100 employees")
- Click Run AI Scrape β the pipeline will:
- Generate 5 targeted search queries optimized for email-visible profiles
- Find up to 50 real LinkedIn profiles via Serper
- Batch-score all profiles in one AI call
- Hunt emails for all good fits (score β₯ 60)
- Leads appear ranked by AI score β email-visible profiles float to the top
- Click Export Excel to download the full lead list as
.xlsx - Update lead status as you work through outreach
For each good-fit profile (score β₯ 60) the scraper tries 4 strategies in order:
- Apollo.io β matches name + company + LinkedIn URL against 275M+ contact database (50 free exports/month)
- Serper search β searches
"Name" "Company" emailand"Name" "Company" contact "@"to find publicly indexed emails - LinkedIn page scrape β fetches the public profile page and extracts any visible email
- Domain guessing β finds the company domain via Serper, then tries common formats:
[email protected],[email protected],[email protected]
leadmysaas/
βββ leads/
β βββ models.py # Campaign + Lead models
β βββ scraper.py # AI + Serper search + email hunting pipeline
β βββ views.py # REST API views + Excel export
β βββ urls.py # URL routes
β βββ templates/leads/ # SPA shell template
βββ frontend/
β βββ src/
β β βββ App.jsx
β β βββ pages/
β β β βββ Dashboard.jsx
β β β βββ CampaignDetail.jsx
β β βββ components/
β β βββ NewCampaignModal.jsx
β βββ vite.config.js
βββ leadmysaas/
β βββ settings.py
β βββ urls.py
βββ requirements.txt
βββ .env.example
βββ manage.py
- LinkedIn blocks direct scraping β this app uses Google search (
site:linkedin.com/in/) via Serper as a proxy - Email discovery rate depends on how publicly visible the person's email is β typically 20β40% of leads will have a confirmed email
- AI rate limiting is built in (8 calls/min max) with automatic fallback across providers
- Re-running a scrape on an existing campaign updates emails and scores on existing leads rather than creating duplicates
MIT