Skip to content

Latest commit

 

History

301 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Avelero Leads

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.

Python Next.js Supabase Gemini License


Overview

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.

Screenshots

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.

Operations dashboard — funnel stats + per-campaign progress Email review — approve or reject before anything sends
Dashboard Email review
High-priority leads — fit/relevance-scored, verified contacts Settings — tune the prompts that drive each worker
Leads Settings

How it works

 ┌──────────────┐   ┌──────────────┐   ┌──────────────┐   ┌──────────────┐
 │ 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 │
                                       └──────────────┘   └──────────────┘
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Architecture

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.

Quick start

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 install

Apply 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:3000

Create a campaign in the dashboard with an Active status and a target description; the pipeline starts working it automatically.

Model strategy

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.

Email safety

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.

Responsible use

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.

License

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.

Releases

Packages

Contributors

Languages