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 model scores the profiles (Gaussian Process Regressor on profile embeddings) so the expensive steps go to the most promising candidates first β explore/exploit over the pool
- An LLM classifies each candidate the model selects, and each decision is fed back into the model
- 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 point of the scoring layer is cost: searching the licensed source is free, so the system can afford to look at a lot and spend paid lookups only on the best fits. (The learning loop is an active experiment β it is not yet shown to beat picking at random, and no claim is made that it does.)
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.
OpenOutreach sends email from a mailbox you own and control, under your own sending identity. It sends two kinds of email, and you should know about both before you run it:
- Your outreach β personalized emails to the leads you target, on your behalf, as part of your own campaigns. This is the whole point of the tool.
- A promotion for OpenOutreach itself β the tool ships with a freemium campaign that advertises OpenOutreach, sent from your mailbox as if from you, to recipients unrelated to your own leads. It takes its turn in the sending rotation alongside your own campaigns, so a share of the sending is the project's rather than yours. This is one of the ways the project funds itself for cold-start users, alongside affiliate links and sponsorships.
Both kinds send from your mailbox under your identity, and both are your responsibility under anti-spam law. The freemium promotion has been part of the project since the beginning. On an install you run yourself it can be disabled by editing the source (the GPLv3 licence permits this). Full detail β how the rotation works, where the content comes from, what is and isn't logged, and your responsibilities β is in the Legal Notice (Β§4).
| # | 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.
The BetterContact and IceMail links above are affiliate links β signing up through them supports OpenOutreach, at no markup to you. You can sign up for either service directly instead; IceMail in particular is only a suggestion, since any SMTP mailbox you own works.
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. |
| π― Pay Only For What Resolves | Search against the licensed source is free; a confidence gate rations the paid lookups, billed only on a verified hit. Cost scales with qualified leads, not with how much you searched. |
| π 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. |
| π Sends On Your Hours | Cold email leaves MonβFri, 08:00β20:00 in your own timezone, spaced minutes apart from each mailbox. Replies are answered whenever they arrive. |
| πΎ 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 conversations β the AI agent reads the thread and composes replies. Nobody is chased: it writes when they write back. |
The daemon runs a short cycle that asks the deals what they need β there is no queue table and nothing is scheduled in advance. Each pass walks one ordered list and stops at the first thing it can do, so priority is that order:
| # | Step | What it does |
|---|---|---|
| 1 | check a lookup | Polls an in-flight work-email job: hit β READY_TO_EMAIL, miss β NO_EMAIL_BETTERCONTACT, still running β ask again later on the same job. |
| 2 | answer a reply | Runs the AI agent over a deal whose newest message is inbound β replies, closes the deal, or honours an unsubscribe. |
| 3 | send a first email | Sends one AI-written opener to a READY_TO_EMAIL lead, then parks the deal at EMAILED. |
| 4 | rank the pool | Promotes the qualified leads the model is confident about. |
| 5 | buy an address | Free hub-cache hit resolves immediately; otherwise fires a paid provider job and parks the deal at FINDING_EMAIL. |
| 6 | top up | Discovers and qualifies more leads. |
Steps 5 and 6 share one gate: never spend money, and never spend an LLM call qualifying, for someone there is no room to email today.
Discover β qualify β gate β find email β email. One LLM pass turns your campaign into opening search keywords; from there the keyword vocabulary grows by counting the words that appear in profiles the LLM has accepted, and the walk keeps firing the most promising set. 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 NO_EMAIL_BETTERCONTACT 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. Which profile to evaluate next is a balance-driven choice:
- 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: a campaign with no acceptances yet has nothing to fit on, so the ICP is also written out as a handful of synthetic ideal profiles and embedded as the model's positives. Each real acceptance retires one of them, so the invented evidence thins out at the rate ground truth replaces it. 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: the daemon cycle, Campaign/SiteConfig,
β β # LLM factory, onboarding, ML + discovery/qualify
β β # pipeline, the outreach agent
β βββ emails/ # discovery/enrichment client, Mailbox + SMTP/IMAP,
β β # sender, the mail pass, the pipeline steps
β βββ crm/ # Lead + Deal models
β βββ chat/ # model-less migration anchor
β βββ 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.

