Enterprise-grade B2B lead generation & cold outreach engine β fully automated, end-to-end.
Feed it a single company domain β Get personalized outreach emails delivered to verified decision-makers at lookalike companies. Zero manual steps.
Quick Start β’ Architecture β’ Pipeline Stages β’ Demo β’ Engineering β’ Roadmap
Traditional outbound prospecting is manual, fragmented, and time-intensive:
| Manual Workflow | Time Spent |
|---|---|
| π Researching lookalike companies | ~45 min |
| π€ Finding decision-maker contacts | ~60 min |
| π§ Resolving verified work emails | ~30 min |
| βοΈ Writing & sending personalized emails | ~90 min |
| Total per campaign | ~3β4 hours |
This pipeline reduces it to a single command that executes in under 2 minutes.
βββββββββββββββββββββββ
β π Seed Domain β
β (e.g. wise.com) β
ββββββββββββ¬βββββββββββ
β
ββββββββββββββββΌβββββββββββββββ
β STAGE 1 β Company Discovery β
β CUFinder API (Ocean) β
β Discovers lookalike domains β
ββββββββββββββββ¬βββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββ
β STAGE 2 β Prospect Finder β
β Prospeo Search Person API β
β Extracts C-Suite / VP / Dir β
ββββββββββββββββ¬βββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββ
β STAGE 3 β Email Enrichment β
β Prospeo Enrich Person API β
β Resolves verified work email β
ββββββββββββββββ¬βββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββ
β π‘οΈ SAFETY CHECKPOINT β
β CLI Approval Gate β
β Human confirms recipients β
ββββββββββββββββ¬βββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββ
β STAGE 4 β Email Delivery β
β Brevo Transactional SMTP β
β Jinja2 HTML template render β
βββββββββββββββββββββββββββββββ
Each stage's output feeds directly into the next β no CSV exports, no copy-pasting, no intermediate tools required.
Automated_outreach_platform/
β
βββ π main.py # CLI entrypoint & pipeline orchestrator
β
βββ π services/ # Modular API integration layer
β βββ ocean.py # Stage 1 β Lookalike company discovery (CUFinder)
β βββ prospeo.py # Stage 2 β Decision-maker extraction (Prospeo)
β βββ eazyreach.py # Stage 3 β Email verification & enrichment (Prospeo)
β βββ brevo.py # Stage 4 β Transactional email delivery (Brevo)
β
βββ π templates/ # Email template assets
β βββ outreach_template.html # Jinja2 HTML cold-outreach template
β
βββ π models/ # Data model definitions
β βββ contact.py # Contact data structures
β
βββ π utils/ # Shared utility functions
β βββ helpers.py # Helper utilities
β
βββ π screenshots/ # Pipeline demonstration captures
β βββ pipeline_output.jpg # Pipeline execution (2-company run)
β βββ pipeline_output_1.png # Pipeline execution (5-company run)
β βββ safety-checkpoints.png # Safety gate β single contact
β βββ safety-checkpoints-2.png # Safety gate β multi-contact batch
β βββ Brevo_analyst.jpeg # Brevo real-time delivery dashboard
β βββ statistics.jpeg # Brevo campaign statistics & metrics
β
βββ π requirements.txt # Python dependencies
βββ π .env.example # python-dotenv environment template
βββ π .env # Local credentials (python-dotenv, git-ignored)
What makes this implementation production-grade rather than a weekend script:
Email copy lives in a standalone templates/outreach_template.html file β not hardcoded Python strings. Marketing can edit the template without touching business logic. Jinja2 handles personalization tokens ({{ first_name }}, {{ company_name }}, {{ title }}).
Every pipeline parameter is tunable from the command line. Run quick 2-company test iterations to conserve API credits, or full 10-company campaigns:
python main.py wise.com -c 2 -m 1 # fast test: 2 companies, 1 contact each
python main.py wise.com -c 10 -m 5 # full campaign: 10 companies, 5 contacts eachBefore any email leaves the system, the pipeline pauses and displays a formatted summary table of every recipient (name, seniority, email). Requires explicit y confirmation β preventing accidental mass emails.
Rate limits, timeouts, and API failures for individual companies are caught and logged β the pipeline skips the failing target and continues processing the rest. A single flaky API call never kills the entire campaign.
Windows CMD/PowerShell terminals using CP1252/ASCII encoding crash on emoji output. This build dynamically reconfigures stdout to UTF-8 and wraps all output in a safe_print() fallback that strips non-BMP characters on legacy terminals.
Tracks LinkedIn URLs and resolved emails across the entire run. If the same person appears from multiple company queries, they receive exactly one email β protecting sender domain reputation.
Parses Prospeo's nested job_history array to identify the current role's seniority. Filters out Analysts, Seniors, and Associates β only C-Suite, VPs, Directors, and Founders get through.
| Detail | Value |
|---|---|
| API | CUFinder /v2/fcl |
| Input | Seed company domain |
| Output | List of { name, domain } for lookalike companies |
| Error Handling | Timeout protection, non-JSON response fallback, self-domain exclusion |
| Detail | Value |
|---|---|
| API | Prospeo /search-person |
| Input | Company domains from Stage 1 |
| Output | Decision-makers with { name, title, seniority, linkedin_url, company } |
| Filters | C-Suite, Vice President, Founder/Owner, Director |
| Smart Parsing | Extracts seniority from nested job_history[].current field |
| Detail | Value |
|---|---|
| API | Prospeo /enrich-person |
| Input | LinkedIn URLs / Person IDs from Stage 2 |
| Output | Verified work email addresses |
| Safeguards | Only VERIFIED status emails pass through, rate-limit delay (1s), deduplication |
| Detail | Value |
|---|---|
| API | Brevo /v3/smtp/email |
| Input | Enriched contacts from Stage 3 |
| Output | Transactional emails with Brevo messageId tracking |
| Template | Jinja2-rendered HTML with personalization tokens |
| Fallback | Inline template if outreach_template.html is missing |
Shows Stage 1 β 3 with 2 lookalike companies (Adyen, Airwallex) discovered for the seed domain wise.com:
Full campaign targeting 5 companies (Adyen, Airwallex, Google, Klarna, Monzo). Note Klarna hitting a rate limit β the pipeline gracefully skips it and continues:
Interactive confirmation gate showing 1 queued recipient before email dispatch:
Batch confirmation for 6 verified decision-makers across multiple companies. All emails dispatched successfully with Brevo message IDs:
Live SMTP delivery dashboard showing 6 events, 6 delivered, 0 bounced β 100% deliverability:
Brevo statistics panel showing 7 total emails sent with 100% delivery rate, 14.29% estimated open rate, 0% bounce rate:
- Python 3.10+
- API keys for: CUFinder, Prospeo, Brevo
- A verified sender domain on Brevo (e.g.,
caliver.me)
git clone https://github.com/Subodh26oct/Automated_outreach_platform.git
cd Automated_outreach_platformpip install -r requirements.txtcp .env.example .envEdit the .env file with your credentials (loaded automatically via python-dotenv):
CUFINDER_API_KEY=your_cufinder_api_key_here
PROSPEO_API_KEY=your_prospeo_api_key_here
BREVO_API_KEY=your_brevo_api_key_here
SENDER_EMAIL=name@domain.me
SENDER_NAME=Company Name# Quick test β 2 companies, 1 contact per company
python main.py wise.com -c 2 -m 1
# Full campaign β 5 companies, 3 contacts each
python main.py wise.com -c 5 -m 3
# View all CLI options
python main.py --help| Layer | Technology | Purpose |
|---|---|---|
| Language | Python 3.10+ | Core runtime |
| CLI | argparse |
Command-line interface & flag parsing |
| HTTP | requests |
API communication layer |
| Templating | Jinja2 |
Decoupled HTML email rendering |
| Config | python-dotenv |
Secure credential management via .env |
| Company Discovery | CUFinder API | Lookalike company extraction |
| Prospect Intelligence | Prospeo API | Decision-maker search + email enrichment |
| Email Delivery | Brevo SMTP API | Transactional email dispatch with tracking |
Features planned for upcoming iterations to evolve this into a full SaaS-grade outreach platform:
| Priority | Feature | Description |
|---|---|---|
| π΄ P0 | Multi-Sequence Campaigns | Automated follow-up sequences (Day 1 β Day 3 β Day 7) with smart stop-on-reply |
| π΄ P0 | CRM Integration | HubSpot / Salesforce sync to auto-log outreach activities and update deal stages |
| π P1 | AI-Powered Personalization | LLM-generated email copy tailored per recipient using company news + LinkedIn activity |
| π P1 | A/B Testing Engine | Template variant testing with statistical significance tracking on open/reply rates |
| π‘ P2 | Web Dashboard | React/Next.js dashboard for campaign management, analytics visualization, and team collaboration |
| π‘ P2 | Webhook-Based Tracking | Real-time open/click/reply event processing via Brevo webhooks |
| π’ P3 | Multi-Channel Outreach | LinkedIn InMail + Twitter DM integration alongside email campaigns |
| π’ P3 | Domain Warm-Up Module | Automated sender reputation building for new domains to maximize inbox placement |
| π’ P3 | Rate Limit Intelligence | Adaptive request throttling per API provider with token bucket algorithm |
| π΅ P4 | Team Collaboration | Multi-seat accounts with role-based access, campaign sharing, and audit logging |
| π΅ P4 | CSV/Webhook Export | Pipeline output export to CSV, Google Sheets, or custom webhook endpoints |
| Decision | Rationale |
|---|---|
| Prospeo for enrichment instead of Eazyreach | Prospeo already provides verified email resolution via /enrich-person, avoiding an additional API dependency while maintaining the same data quality |
| argparse over click | Zero additional dependencies β argparse ships with Python stdlib, keeping the install lightweight |
| Jinja2 templates over f-strings | Clean separation of concerns β email copy is editable by non-developers without touching Python code |
| Sequential email sending | Deliberate choice over async/parallel to respect Brevo rate limits and maintain predictable delivery ordering |
| 1-second enrichment delay | Built-in rate-limit protection between Prospeo enrichment calls to prevent 429 errors |
- API Credits: CUFinder and Prospeo have free-tier usage limits. Use
-c 2 -m 1for testing to conserve credits. - Sender Verification: Your
SENDER_EMAILdomain must be verified in Brevo's dashboard before emails will deliver successfully. - Compliance: This tool is for legitimate B2B outreach only. Ensure compliance with CAN-SPAM, GDPR, and local regulations.
Subodh AI & Software Engineer
Built with β and Python β from seed domain to signed deal.





