Automated lead discovery, enrichment, and outreach for Avelero.
Continuously finds fashion & textile brands that need a Digital Product Passport, enriches company and contact data, scores fit, drafts personalized outreach, and manages review + sending — all from one dashboard.
Fashion brands face mandatory EU Digital Product Passport (DPP) compliance from mid-2027, with vendor selection needing to happen in 2026 given 6–10 month lead times. Avelero provides a DPP platform that lets brands launch compliant passports in days. The go-to-market challenge is finding and reaching the right brands, at the right moment, at scale.
Avelero Leads is the engine that does it. Four independent async workers run in parallel — none waits on another. Each picks up work as it becomes available, processes it, and writes results back to Postgres. Companies flow from discovery through enrichment, contact finding, email generation, human review, and sending. A Next.js dashboard is the single control surface for the whole pipeline.
Note: the data shown below is illustrative demo data used only for these previews. In a live pipeline the generated emails and enriched company/contact records are considerably richer and more deeply personalized than these placeholders suggest.
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 1. Discovery │──▶│ 2. Enrichment│──▶│ 3. People │──▶│ 4. Email Gen │
│ SearXNG + │ │ scrape site │ │ contact find │ │ personalized │
│ LLM queries │ │ + DPP-fit │ │ + verify │ │ draft │
└──────────────┘ │ scoring │ └──────────────┘ └──────┬───────┘
└──────────────┘ │
┌──────────────┐ ┌─────▼────────┐
│ Email Sender │◀──│ Human Review │
│ rate-limited │ │ approve/reject│
│ SMTP rotation│ │ in dashboard │
└──────────────┘ └──────────────┘
- Campaign-driven discovery — Describe a target in plain language (e.g. "EU streetwear brands with sustainability initiatives"). Gemini generates search queries, a self-hosted SearXNG meta-search runs them, and results are parsed and deduplicated into the Companies table.
- Single-pass enrichment — Discovered companies are scraped (with fallback sources) and sent to Gemini for a one-call company profile, industry classification, and a DPP-fit score (1–10) against Avelero-specific criteria.
- Contact discovery (no LinkedIn scraping) — For enriched companies, the system finds people via search, generates email permutations from name + domain, and verifies addresses via SMTP/MX or an email-verification API. Higher-confidence enrichment uses the Prospeo API. No direct LinkedIn scraping.
- Email generation & review — Contacts trigger personalized drafts using company context, contact profile, and campaign targeting. Drafts land as Pending Review in the dashboard; a team member approves or rejects. Only approved emails are sent.
- Sending with safety rails — The sender dispatches approved emails over SMTP with round-robin sender rotation, randomized 3–8 minute delays, a per-sender daily cap, and a fail-rate hard stop.
| Layer | Stack |
|---|---|
| Pipeline | Python 3.10 · asyncio workers · supervised, graceful shutdown |
| LLM | Google Gemini (per-task model selection, sliding-window rate limiting) |
| Search | Self-hosted SearXNG meta-search · Brave Search fallback |
| Data | Supabase (Postgres) via asyncpg |
| Dashboard | Next.js 15 (App Router, React 19) · Tailwind · Supabase Auth |
| Enrichment | Prospeo (person data) · SMTP/MX + API email verification |
| Delivery | SMTP sender pool with rotation, delays, and safety rails |
Tables: campaigns, companies, contacts, emails, and the join tables that connect
them (company_campaigns, contact_campaigns, contact_campaign_links). Relations let
you navigate campaign → companies → contacts → emails in any direction.
git clone https://github.com/Avelero/Avelero-Leads.git
cd Avelero-Leads
# Python pipeline
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
(create .env: GEMINI_API_KEY, SUPABASE_DB_URL, SMTP_HOST, PROSPEO_API_KEYS)
# Web dashboard
cd web
(create web/.env.local: NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY)
npm installApply the SQL migrations in schema/ to your Supabase project, then run the pipeline and
the dashboard:
python3 -m src.main # pipeline workers
cd web && npm run dev # dashboard at http://localhost:3000Create a campaign in the dashboard with an Active status and a target description; the pipeline starts working it automatically.
Benchmarked across Gemini tiers and matched to each task:
| Task | Model | Why |
|---|---|---|
| Discovery queries | Flash-Lite | High-volume extraction |
| Company enrichment | Flash-Lite | Structured JSON, near-parity quality |
| Contact parsing | Flash-Lite | Pattern extraction |
| Email generation | Flash | Writing quality matters |
Single-pass enrichment (one LLM call instead of chained reports) and batching multiple companies per call cut token usage substantially versus the naive approach.
| Parameter | Value |
|---|---|
| Daily limit per sender | 10 (configurable) |
| Delay between sends | 3–8 min, randomized with jitter |
| Fail-rate threshold | 15% triggers a hard stop |
| Sending window | Business hours only |
| Required DNS | SPF, DKIM, DMARC |
The sender is disabled by default until SMTP credentials are configured, and can be hard
-killed with EMAIL_SEND_DISABLED=true.
Built for legitimate B2B outreach. It does not scrape LinkedIn directly, does not bypass authentication, and respects sending limits to avoid spam classification. Always configure SPF/DKIM/DMARC before sending, and comply with GDPR and applicable regulations when processing personal contact data.
Source-available under the PolyForm Noncommercial License 1.0.0. © Avelero. You may
read, run, fork, and modify the source for noncommercial purposes with attribution.
Commercial use — including selling it, or offering it as a paid or hosted service — is not
granted by this license. See LICENSE and NOTICE.



