Skip to content

timscheuerai/claude-gtm

Repository files navigation

Borex Email Outreach System

High-scale email outreach system: CSV import, enrichment, verification, AI personalization, and email sending.

Tech Stack

  • Database: Supabase (PostgreSQL)
  • Background Jobs: Trigger.dev (batch processing)
  • Email Sending: Instantly
  • Email Enrichment: Prospeo (bulk API), Icypeas (fallback)
  • Email Validation: Icypeas (bulk API)
  • AI Personalization: OpenAI (gpt-4o-mini)

Prerequisites

  • Node.js 18+
  • npm or pnpm
  • Accounts for: Supabase, Trigger.dev, Prospeo, Icypeas, OpenAI, Instantly

Setup

1. Install dependencies

npm install

2. Configure environment variables

cp .env.example .env

Edit .env and fill in your API keys:

Variable Description
SUPABASE_URL Your Supabase project URL
SUPABASE_SERVICE_KEY Supabase service role key
PROSPEO_API_KEY Prospeo API key for email enrichment
ICYPEAS_API_KEY Icypeas API key for email validation
OPENAI_API_KEY OpenAI API key for icebreaker generation
INSTANTLY_API_KEY Instantly API key
INSTANTLY_CAMPAIGN_ID Your Instantly campaign ID
TRIGGER_SECRET_KEY Trigger.dev secret key
ICEBREAKER_PROMPT AI prompt template for personalization

3. Set up database

Run the migrations in your Supabase SQL editor in order:

  1. supabase/migrations/001_initial_schema.sql
  2. supabase/migrations/002_remove_campaigns.sql
  3. supabase/migrations/003_add_enrichment_tracking.sql

4. Create a CSV mapping

Insert a mapping in Supabase that matches your CSV format:

INSERT INTO csv_mappings (name, field_mappings) VALUES (
  'Apollo Export',
  '{"Email": "email", "First Name": "first_name", "Last Name": "last_name", "Company": "company_name", "Title": "job_title", "Website": "website", "LinkedIn URL": "linkedin_url"}'
);

Usage

Import leads from CSV

node --loader ts-node/esm scripts/import.ts --file leads.csv --mapping "Apollo Export"

Run the enrichment pipeline

Start the Trigger.dev dev server:

npm run trigger:dev

Then trigger the pipeline:

# Full pipeline (enrich + verify)
npx trigger.dev run pipeline-orchestrator --payload '{"mode":"both"}'

# Enrichment only
npx trigger.dev run pipeline-orchestrator --payload '{"mode":"enrich"}'

# Verification only
npx trigger.dev run pipeline-orchestrator --payload '{"mode":"verify"}'

# Test with limited leads
npx trigger.dev run pipeline-orchestrator --payload '{"mode":"both","maxLeads":250}'

Personalize and push to Instantly

After enrichment completes:

node --loader ts-node/esm scripts/process.ts --steps personalize,push

Test icebreaker generation

Preview icebreakers with 3 sample leads:

node --loader ts-node/esm scripts/process.ts --test-icebreaker

Project Structure

/
├── trigger/           # Trigger.dev tasks
│   ├── enrich.ts      # Batch enrichment (50 leads)
│   ├── verify.ts      # Batch verification
│   └── orchestrator.ts # Pipeline orchestrator
├── lib/               # API clients
│   ├── supabase.ts    # Database
│   ├── prospeo.ts     # Email enrichment
│   ├── icypeas.ts     # Email validation
│   ├── openai.ts      # AI personalization
│   └── instantly.ts   # Email sending
├── scripts/           # CLI tools
│   ├── import.ts      # CSV import
│   └── process.ts     # Personalize + push
└── supabase/
    └── migrations/    # Database schema

Deployment

Deploy Trigger.dev tasks to production:

npm run trigger:deploy

License

Private - All rights reserved

About

high scale email infra

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors