Describe your product. Define your target market. The AI finds the leads and emails them for you.
OpenOutreach is a self-hosted, open-source, email-first AI sales agent for B2B lead generation. It discovers leads from a licensed data provider, qualifies them on your own machine, and runs agentic email outreach from a mailbox you own — with zero platform-ToS surface: it is browserless, uses no social-network account, and does no scraping. Unlike other tools, you don't need a list of profiles to contact — you describe your product and your target market, and the system autonomously discovers, qualifies, and emails the right people.
How it works:
- You provide a product description and a campaign objective (e.g. "SaaS analytics platform" targeting "VP of Engineering at Series B startups")
- An LLM turns that into an ICP filter and pages matching firmographic profiles from a licensed discovery source (BetterContact Lead Finder) — no emails yet, billed nothing
- A Bayesian ML model (Gaussian Process Regressor on profile embeddings) learns which profiles match your ideal customer — an explore/exploit strategy balancing finding the best leads now vs. learning what makes a good lead
- An LLM classifies each candidate the model selects; the GP learns from every decision to pick better candidates over time
- Only the best-fit leads get a paid email lookup. A confidence gate rations a work-email resolution (one credit per verified hit); a hit routes the lead into agentic email — an AI agent sends a personalized opener from your mailbox, then reads replies and runs multi-turn follow-up
The system gets smarter with every decision: it explores broadly, then progressively focuses on the highest-value profiles as it learns your ideal customer profile from its own classification history.
Why choose OpenOutreach?
- 🧠 Autonomous lead discovery — No contact lists needed; AI finds your ideal customers from licensed data
- 📧 Email-first outreach — Resolves a work email per qualified lead and sends from your own mailbox, at email volume
- 🛡️ Zero platform-ToS surface — Browserless, no social-network account, no scraping — nothing to get banned
- 💾 Self-hosted + full data ownership — Everything runs locally; browse your CRM in a web UI
- 🐳 One-command setup — Dockerized deployment, interactive onboarding
- ✨ AI-powered messaging — LLM-generated personalized outreach and agentic replies (bring your own model)
Perfect for founders, sales teams, and agencies who want powerful automation without account bans or subscription lock-in.
| # | What | Example |
|---|---|---|
| 1 | An LLM API key | OpenAI, Anthropic, or any OpenAI-compatible endpoint |
| 2 | An email-finder API key (BetterContact) | Powers both discovery (Lead Finder) and enrichment (work-email resolution) |
| 3 | A sending mailbox | An app password for a mailbox you own (Gmail / Workspace / own-domain SMTP), or cold-email infra like IceMail |
| 4 | A product description + target market | "We sell cloud cost optimization for DevOps teams at mid-market SaaS companies" |
That's it. No social-network account, no spreadsheets, no lead databases, no scraping setup. The BetterContact key and a connected mailbox are both required — the key drives discovery and enrichment, and the mailbox is where outreach is sent from.
Pre-built images are published to GitHub Container Registry.
docker run --pull always -it -v ~/.openoutreach/data:/app/data ghcr.io/eracle/openoutreach:latestThe interactive onboarding walks you through the inputs above on first run — product/objective → LLM key (live-verified) → mailbox (paste an app password → SMTP auth-check) → BetterContact key → your email → country → newsletter/legal. All data persists in ~/.openoutreach/data on your host across restarts. The image is a slim Python runtime — no browser, no VNC.
For Docker Compose, build-from-source, and more options see the Docker Guide.
For contributors or if you prefer running directly on your machine.
git clone https://github.com/eracle/OpenOutreach.git
cd OpenOutreach
# Install deps, run migrations, and bootstrap CRM
make setupmake runThe interactive onboarding prompts for your LLM key, mailbox, BetterContact key, and campaign details on first run. Fully resumable — stop/restart anytime without losing progress.
OpenOutreach includes a full CRM web interface via Django Admin:
# Create an admin account (first time only)
python manage.py createsuperuser
# Start the web server
make adminThen open:
- Django Admin: http://localhost:8000/admin/
| Feature | Description |
|---|---|
| 🧠 Autonomous Lead Discovery | No contact lists needed — an LLM turns your product + objective into an ICP filter and pages matching profiles from a licensed discovery source. |
| 🎯 Bayesian Active Learning | Gaussian Process model on profile embeddings learns your ideal customer via explore/exploit, selecting the most informative candidates for LLM qualification. |
| 🔒 Licensed Discovery | Firmographic profiles come from a paid, licensed provider (BetterContact Lead Finder) — no scraping, no browser, no account. |
| 📧 Agentic Email Outreach | Resolves a work email per best-fit lead (one credit per hit), sends an AI-written opener from your own mailbox over SMTP, then reads replies (IMAP) and runs multi-turn follow-up. |
| 🔄 Stateful Pipeline | Tracks deal states (QUALIFIED → READY_TO_FIND_EMAIL → FINDING_EMAIL → READY_TO_EMAIL → EMAILED → COMPLETED/FAILED) in a local DB — fully resumable. |
| ⏱️ Send-Gated Spend | Paid email lookups ride on send capacity — a per-mailbox daily cap bounds how many leads enter the pipeline, so you never resolve more than you can send. |
| 💾 Built-in CRM | Full data ownership via Django Admin — browse Leads, Deals, and conversations. |
| 🐳 One-Command Deployment | Dockerized setup with interactive onboarding; a slim runtime with no browser and no VNC. |
| ✍️ AI-Powered Messaging | Agentic multi-turn follow-up conversations — the AI agent reads the thread, composes replies, and schedules future follow-ups. |
The daemon runs a continuous task queue backed by a persistent Task model. Four task types self-schedule follow-on work:
| Task Type | What it does |
|---|---|
| find_email | Submits a work-email lookup for a ranked, qualified lead — a free hub-cache hit resolves immediately; otherwise it fires a paid provider job and parks the deal at FINDING_EMAIL. |
| collect_email | Polls the in-flight lookup (self-chaining backoff): hit → READY_TO_EMAIL, miss → FAILED (blank outcome, ML-skipped), couldn't-run/timeout → back to the queue. |
| follow_up | Runs the AI agent over an emailed deal — reads replies, decides send/wait/complete, and re-arms the next follow-up. |
Sends one AI-written opener to a READY_TO_EMAIL lead from your mailbox pool, then parks the deal at EMAILED. |
Discover → qualify → gate → find email → email. An LLM turns your campaign into an ICP filter (cached on the Campaign); discovery pages matching profiles into embedded Leads. Qualification runs the GP + LLM loop over the stored firmographic text. The GP confidence gate promotes QUALIFIED → READY_TO_FIND_EMAIL, rationing the paid lookup so only the best-fit leads cost a credit. A hit sends an opener; a miss ends the deal as FAILED with a blank outcome (so the ML labeler skips it — an unfindable address is not a fit signal).
The qualification loop in detail:
Discovered profiles are embedded (384-dim FastEmbed vectors) from the licensed firmographic payload. The backfill chain decides which profile to evaluate next using a balance-driven strategy:
- When negatives outnumber positives → exploit: pick the profile with highest predicted qualification probability (fill the pipeline with likely positives)
- Otherwise → explore: pick the profile with highest BALD (Bayesian Active Learning by Disagreement) score (seek the most informative label)
All qualification decisions go through the LLM. The GP model selects which candidate to evaluate next and gates promotion from QUALIFIED to READY_TO_FIND_EMAIL. Every LLM decision feeds back into the model, making candidate selection progressively smarter.
Cold start: With fewer than 2 labelled profiles, the model can't fit — candidates are selected in order and qualified via LLM. As labels accumulate, the GP gets better at selecting high-value candidates. When the unlabelled pool empties, discovery pages a fresh batch.
Configure behavior via Django Admin (SiteConfig + Campaign).
├── docs/ # architecture, configuration, docker, templating, testing
├── openoutreach/ # single source package; Django apps nested inside
│ ├── settings.py # Django settings (SQLite at data/db.sqlite3)
│ ├── core/ # engine app: daemon, task queue + scheduler,
│ │ # Campaign/SiteConfig/Task, LLM factory, onboarding,
│ │ # ML + discovery/qualify pipeline, the two agents
│ ├── emails/ # discovery/enrichment client, Mailbox + SMTP/IMAP,
│ │ # sender, the four task handlers
│ ├── crm/ # Lead + Deal models
│ ├── chat/ # ChatMessage (per-Deal conversation)
│ └── legacy/ # model-less migration-history anchor (retired channel)
├── manage.py # Django management (no args defaults to rundaemon)
├── local.yml # Docker Compose
└── Makefile # Shortcuts (setup, run, admin, test)
Join for support and discussions: Telegram Channel
Got a specific use case, feature request, or questions about setup?
Book a free 15-minute call — I'd love to hear your needs and improve the tool based on real feedback.
This project is built in spare time to provide powerful, free open-source growth tools. Your sponsorship funds faster updates and keeps it free for everyone.
| Tier | Monthly | Benefits |
|---|---|---|
| ☕ Supporter | $5 | Huge thanks + name in README supporters list |
| 🚀 Booster | $25 | All above + priority feature requests + early access to new campaigns |
| 🦸 Hero | $100 | All above + personal 1-on-1 support + influence roadmap |
| 💎 Legend | $500+ | All above + custom feature development + shoutout in releases |
GNU GPLv3 — see LICENCE.md
By using this software you accept the Legal Notice. It covers the third-party services you connect (data provider, email-finder, mailbox), your responsibilities as data controller and sender under data-protection and anti-spam law, the optional freemium promotional campaign, automatic newsletter subscription for non-opt-in jurisdictions, the central contacts store, and liability disclaimers.
Use at your own risk — no liability assumed.

