All work
GTM lead-gen system, Boldys product

Email Leadgen

A cold-email system I co-built as a Boldys product. Each client gets their own Airtable base. They drop a list in, the system enriches every contact, writes a personalised 4-email sequence, launches the campaign in SmartLead, and drafts replies back in Airtable.

Apollo lead source CSV
Airtable enrich LinkedIn + website
AI sequence GPT-4.1-mini, 4 emails
SmartLead auto-launch + send
Replies categorised + drafted

How it works

Apollo CSV import

Client uses the Apollo filters and exclusion lists I pre-set, exports the seven required fields, drops the file into a dedicated Airtable view with only the import columns visible.

Auto-enrichment in parallel

Three jobs fire at once: Apify scrapes the contact's last LinkedIn post, Apify pulls profile headline + about, OpenAI analyses the company website.

4-email sequence written

Eight GPT-4.1-mini calls per contact, four emails plus four subjects, chained so each references what came before. Batched five at a time, self-re-triggers until the queue is empty.

Campaign auto-launches

Seven-step pipeline to SmartLead: create campaign, set schedule, attach inboxes, configure the 4-step sequence with delays, send leads in batches of 10, activate. One Airtable button.

Replies drafted in Airtable

SmartLead webhooks fire on lead category updates. A Leads Generated row is written with category and full reply text. GPT-4.1-mini drafts a personalised response waiting for one-click human send.

White-label per client

Each client gets their own Airtable base, SmartLead account, and data. One day a week of operator time runs the full program.

What it is

Email Leadgen is a productised B2B outbound system. Same Airtable base, same automations, same scripts replicated per client. I run the setup, manage Apollo filters and blacklists, and own the SmartLead infrastructure. The client only touches Apollo and Airtable. Every record, every status, every prompt sits in one place they can read.

It is not a one-off n8n flow with a UI bolted on. It is the same product shipped twice already, designed to be shipped a third, fourth, fifth time without rebuilding anything.

The 3-step client workflow

1. Find leads in Apollo

The client logs into Apollo with pre-set filters and blacklists, picks a list, exports the CSV.

2. Import into Airtable

Drop the CSV into the Contacts table through the import view, link the new contacts to a Sequence.

3. Hit Start

Set Email Status to Start. Enrichment, generation, campaign launch, sending, reply tracking, all automatic from there.

For a brand new sequence the client also flips Sequence Status to Start once, to create the SmartLead campaign. After that any new contact dropped into the same sequence flows through the live campaign automatically.

Architecture

Email Leadgen architecture Airtable sits at the centre with seven tables: Contacts, Sequences, Products, Company, Email Configuration, Configurations, and Leads Generated. On the left, Apollo feeds CSV imports into Airtable. On the right, Apify scrapes LinkedIn data, OpenAI generates emails and drafts replies, and SmartLead sends campaigns and posts reply webhooks back to Airtable. SOURCE DATABASE + ORCHESTRATION SERVICES Apollo CSV export Airtable database + automations + scripts Contacts Sequences Products Company Email Config Configurations Leads Generated 9 automations, 18 scripts, single-owner trigger fields Apify LinkedIn post + profile OpenAI emails, website, replies SmartLead campaigns + send + webhooks One Airtable base per client. No n8n. Same template replicated end to end.
Architecture: Airtable as the single hub, Apollo feeds it, three external services do the heavy lifting through bidirectional API calls and webhooks.

Why Airtable-only, no n8n

The first version of every email flow I built was an n8n graph. It works for one client. It breaks the moment you try to run two, then three. Each client wants a tweak, the graph forks, the maintenance compounds.

Airtable as the sole orchestrator solves three problems at once. The client sees every record, every status, every prompt in a tool they already understand. I replicate the base into a new client workspace in minutes, not hours. And the trigger logic stays auditable, every script names its single owner and the order matters, so the race conditions are visible instead of buried in nodes.

Real reply rates, not the SmartLead vanity number

SmartLead's dashboard counts every reply as positive, including out-of-office, wrong-person, not-interested. The reply rate looks great and means nothing.

I added a Campaign Stats table that syncs daily from SmartLead and breaks replies down by category, Interested, Meeting Request, Meeting Booked, Information Request, Bad Timing, Not Interested, Out of Office, Wrong Person, Do Not Contact. The client sees the truthful number alongside the inflated one and can compare sequences on what actually matters.