Building with Claude Episode 5

The pipeline that runs itself: how we track prospects on a $5/month server

February 2026 14 min read

We've sent 146 outreach emails to 54 companies. 33 people opened them. Five are now in active discovery calls.

Six weeks ago, none of this existed. We had a spreadsheet with company names and a vague plan to "do outreach." The first 9 cold emails got zero replies. We had a pipeline problem and an outreach quality problem, and we didn't have the tools to tell which was which.

So we built the tools. Then the tools started building the pipeline for us. Here's the system that now runs our entire sales operation: 12 automated workflows, three enrichment sources, an AI quality reviewer, and an agent that remembers what it tried last time.

In this article:

Short on time? This article explains the full architecture. If you'd rather skip the how and just get this built for your business, book a free discovery workshop.

What the system looks like

The whole thing runs on one server. $4.35/month. If you're not technical, here's the short version: five programs running on a single cheap computer in a data center, talking to each other. No special hardware. No IT team. The diagram below shows how it all connects.

Outbound engine
We find them
Research → Enrich (3 sources) → Draft → AI Review → Send
Track opens/clicks → Follow-ups → Rewrite loop
Perplexity Lusha Hunter OpenRouter Brevo
Inbound engine
They find us
Website quiz / Booking form / LinkedIn
Score → Route → Auto-reply → Nurture sequences
OpenRouter Brevo
NocoDB (CRM)
8 tables: companies, contacts, pipeline, interactions, scoring, ops_policy, agent_memory, opportunities
All data lives here. Both engines read and write to the same database.
Orchestrated by n8n (12 workflows) on a single server. $4.35/month.

Two engines, one database. The outbound engine is where we go find potential clients: research companies, find contact info across three data sources, draft personalized emails, run them through an AI quality gate, send them, track who opens what, and auto-generate follow-ups that learn from previous attempts. The inbound engine is where potential clients come to us: someone takes our quiz, fills out a booking form, or connects on LinkedIn, and the system scores them, creates a record, and sends an appropriate auto-reply. Both engines use the same email and AI services. Both read and write to the same CRM.

No Salesforce. No HubSpot. No $200/month CRM subscription.

Where the data lives

NocoDB is a self-hosted Airtable alternative. We picked it for four reasons: zero per-seat pricing, SQL access when we need it, and our prospect data stays on our own server, and the UI is pretty much the same as Airtable!

The database tracks everything:

As of this writing: 54 companies researched, 90 contacts with verified emails, 59 active pipeline entries, and 136 logged interactions. Five deals in active discovery calls. Total pipeline value: $131K on paper, $42K weighted by stage probability. Plus two tables that make the automation smarter: ops_policy stores the messaging rules that the AI reads before drafting anything, and agent_memory stores what the search engine and follow-up engine tried last time so it doesn't repeat itself.

The tables are all linked. Click on a contact, see their company's pain points, every email you've sent them, their lead score, and your last interaction. That's what you get from enterprise CRMs. We built it for free.

What runs automatically

Twelve automated workflows handle the grunt work. You don't need to understand how they're built to see the value. Here's what happens without us touching anything:

Every morning at 7am, a workflow runs a comprehensive search across 22 Google News queries, three regional business publication RSS feeds, and a web search phase targeting startup databases and accelerator portfolios. The queries cover funding rounds, hiring signals, accelerator cohort announcements, and GCC expansion news. An AI model reads each result, classifies the company by industry and growth stage, scores how likely they are to need what we offer, and checks for duplicates against existing records. High-scoring companies get added to the pipeline automatically with a decision-ready summary of why they qualified, and the enrichment workflow fires immediately.

When a new company enters the pipeline, an enrichment workflow finds decision-maker contacts using three stacked sources. First, Perplexity (via OpenRouter) researches the company and returns contact names, titles, and LinkedIn URLs. Then Lusha does a bulk person lookup to find verified emails with A+ confidence. For any contacts Lusha misses, Hunter fills the gap with email pattern matching and verification. No single source covers everyone, but three sources together get us to 60-80% coverage. The workflow tracks which sources contributed to each contact, filters out generic addresses, and handles name-order dedup.

When it's time to reach out, a composition workflow drafts personalized emails using the company's specific pain points, the contact's role, and relevant case studies. But here's the key: the drafting rules aren't hardcoded. They come from an ops_policy table in the database. When we want to change our email style, update our CTAs, or add a new case study reference, we edit a NocoDB record instead of touching workflow code. A post-processing step strips any code fences the LLM wraps around its output, replaces em dashes with commas, normalizes CTAs to approved phrasing, and adds our city to the signature for local contacts.

Before any email sends, an approval workflow runs the draft through an AI reviewer that reads from our internal style guide. The style guide defines what good outreach looks like for our market: the right length, the right tone, approved call-to-action phrasing, formatting rules, and compliance checks for first-touch cold email. If the draft passes, it sends automatically. If it fails, the workflow deletes the draft, records the specific feedback, and queues a rewrite. The follow-up engine picks up the rewrite flag, generates a new version that addresses the reviewer's specific feedback, and sends it back through the approval loop. After three failed attempts, it escalates to manual review.

The whole approval flow is driven by two checkboxes in NocoDB. Check approved to let the AI handle it. Check manual_review plus approved to review the draft yourself before it goes out.

Every pipeline entry also carries an action_required status: Awaiting Reply, Needs Email, Needs Follow-up, Review Draft, or Needs Contacts. A single NocoDB view groups all entries by this status, giving us a dashboard of exactly what needs attention. When we sit down to review, we open that view, scan the Review Draft entries, read the AI's work, and either approve or add feedback. The system picks up the feedback and rewrites. The view is designed so that checking in on the entire pipeline takes five minutes instead of scrolling through 60 records.

After emails go out, the system tracks delivery, opens, and clicks through Brevo webhooks. If someone opens your email three times, the system bumps them from "cold" to "warm" in the pipeline.

Every day, the follow-up engine checks for stale conversations: contacts who received an email five or more days ago with no response. Before drafting, it reads its own memory from previous runs to see which angles and content assets it already used for each contact. Then it drafts personalized follow-ups that reference the original email, adjusting the angle each time. Third attempt? It writes a polite breakup email.

When someone replies, an AI classifier reads the response and figures out the intent: interested, asking a question, raising an objection, or just an out-of-office. Interested replies trigger an alert. Pipeline stages update automatically.

When someone takes our quiz on the website, the system creates a contact record, looks up the company from their email domain, scores their AI readiness, enriches the company through the full pipeline, and enters them into the appropriate follow-up sequence.

All twelve workflows follow the same patterns: credentials stored securely (not hardcoded), the system talks to the database over an internal private network, and shared error-checking functions that tell us when something fails instead of silently dropping records.

Why the emails weren't working

This is the part we didn't expect. The infrastructure was fine. Delivery rate: 100%. People were opening them. For the first 9 cold emails: zero replies.

We spent a full session diagnosing this. The answer wasn't in the pipeline. It was in the emails themselves.

We built a persona evaluation system: four synthetic personas (a brand strategist, a startup founder, an SMB business owner, and a storytelling expert) that read each draft and score it on seven dimensions. The first three evaluate conversion: would this make someone reply or click? The storytelling expert evaluates narrative quality: does the story hold together, feel authentic, and stick in memory? We use all four for blog posts and the three conversion personas for outreach emails. Each persona explains their first three seconds of reading, what kills the draft for them, and whether they'd actually take action.

The first evaluation was sobering. Our best email scored 24 out of 35 from the brand strategist. The SMB owner gave most emails 10 out of 35. Only one persona out of three said they'd take any action.

Three problems:

We were asking for too much. "Can we schedule 15 minutes?" sounds reasonable to the sender. To the recipient, it's a stranger asking for a meeting. We switched to interest-based questions: "Is that the kind of bottleneck you're seeing, or am I off base?" That asks for a thought, not a calendar slot.

Links killed trust. Cold email deliverability drops when you include links. Recipients treat linked emails from unknown senders as suspicious. We removed all links from first-touch emails.

No urgency. The emails that scored highest all had a timing hook: a regulatory deadline, a conference coming up, an award just received. Without urgency, even a well-written email gets filed as "interesting, maybe later" and never comes back.

We iterated three times. Each batch was scored by the same conversion personas on the same rubric:

Batch 1
Batch 2
Batch 3
1/3
personas would act
Avg score: ~22/35
2/3
personas would act
Top email: 34/35
3/3
personas would act
Top email: 34/35
Scored by 3 conversion personas (Gemini 3.1 Pro) on 7 email-specific dimensions

The biggest single improvement was a logistics email. It went from 18/35 to 29/35 after we changed three things: pivoted the urgency from a 2027 deadline to an imminent July pilot, replaced a cross-industry case study with one from their own sector, and swapped consulting jargon for plain business language.

Are synthetic personas a substitute for real market feedback? No. But they catch obvious mistakes before you burn real contacts. We now run them as a standard part of every outreach batch and every blog post.

Update: the Batch 3 emails worked. We sent them on a Tuesday evening. By Wednesday morning, the reply monitor workflow caught an incoming email, classified it as "interested," auto-upgraded the pipeline entry from "Outreach" to "Discovery Call," set the temperature to "Hot," and alerted us. The CEO of a Dubai events agency wrote back: "Would love to explore further." Twelve hours from cold email to qualified lead, with zero manual intervention until the human step of replying.

Since then, we've had four more conversations move to discovery. The 22.6% open rate across 146 emails puts us in a healthy range for cold B2B outreach, and the system is now generating follow-up drafts that reference previous angles without repeating them.

The persona that gave us the toughest feedback was the SMB owner: "I move boxes, not patients. Block sender." That's what you get when you send a healthcare email to a logistics company. Targeting matters more than copywriting.

What it costs

Our stack
Server: $4.35/mo
Domain: ~$1/mo
Email (Brevo): $0
CRM (NocoDB): $0
Automation (n8n): $0
AI calls (OpenRouter): $15-30/mo
Enrichment (Lusha + Hunter): $0
Total: ~$20-35/month
SaaS equivalent
HubSpot Starter: $20-50/mo
Instantly (email): $30-97/mo
Apollo (prospecting): $49-99/mo
Clay (enrichment): $149-349/mo
Zapier (automation): $20-69/mo
 
 
Total: $268-664/month

Both Lusha and Hunter have free tiers. Lusha gives you 100 credits per month; Hunter gives you 25 searches. For a solo consultant or small team doing 15-20 outreach emails per week, the free tiers cover the enrichment. Perplexity runs through OpenRouter, so the cost is bundled into the AI line item at roughly $0.01 per company research query.

The self-hosted stack costs 5-10% of the SaaS equivalent. The trade-off: it took about a week of focused sessions to build, and we handle our own maintenance. In practice, that means checking on the server once a week and updating containers when needed. It's not zero-effort, but it's not a second job either. For a solo consultant or a small team running lean, that trade-off makes sense. And if you don't want to manage it yourself, that's exactly the kind of setup we build for clients.

What we changed and what's still missing

The original version of this blog described 10 workflows and a system that found contacts using Hunter alone. Since then, we've rebuilt significant parts of the stack. Here's what we changed and why.

We added three-layer enrichment. Hunter alone covers maybe 40% of contacts for well-known companies and drops to 10% for pre-seed startups. Adding Perplexity for intelligence (names, titles, LinkedIn, company context) and Lusha for verified emails (A+ confidence) pushed our coverage to 60-80% for funded companies. Pre-seed startups are still hard, but two out of three sources finding something is better than one source finding nothing.

We built an approval flow with an AI reviewer. The original system required us to manually review every email. Now, two checkboxes in NocoDB control the entire flow. The AI reviewer runs eight quality checks before sending. If a draft fails, the system automatically rewrites it using the reviewer's specific feedback. After three failed rewrites, it escalates to us. This means we can approve a batch of 15 emails in 5 minutes instead of reading each one.

We made the messaging rules data-driven. The LLM prompts used to have hardcoded rules about CTAs, links, and tone. Now they read from an ops_policy table. When we want to update our case studies, change our CTA style, or add a new content asset, we edit a database record. Every workflow picks up the change on its next run.

We gave the follow-up engine memory. WF-Follow-Up now writes a summary after each run: which contacts it drafted for, which angles it used, which content assets it referenced. Before the next run, it reads the last three summaries. This prevents the system from sending "just wanted to follow up" with the same talking points three times.

We added post-processing to catch LLM formatting issues. LLMs sometimes wrap output in code fences, insert em dashes, or use CTAs we haven't approved. Every drafting workflow now strips these automatically before storing the draft.

What we'd still improve:

The persona evaluation system is powerful but manual. We run it through a separate script, not through n8n. Integrating it as a pre-send quality gate (in addition to the AI reviewer's 8 checks) would catch targeting and positioning issues, not just formatting ones.

LinkedIn is still a gap. We can't programmatically post, comment, or track engagement there. Our LinkedIn content is created manually and posted by hand. This is the biggest missing piece for inbound lead generation.

The enrichment still has blind spots for pre-seed startups (10-30% email coverage) and for contacts who changed jobs recently. Lusha sometimes returns an email from a previous employer.

The pipeline is running. Five discovery calls from 146 emails, on infrastructure that costs less than a single SaaS subscription. The evaluation system that predicted engagement actually predicted engagement. And the AI reviewer catches formatting and compliance issues that would have gone out to real prospects.

The system we built to solve our own problem is the same system we help clients build. Two paths depending on where you are:

I want to build it myself
20+ files: workflow specs, database schema, deployment config, Claude Code rules and skills. Everything described in this article.
Get the starter kit
Free download, email required
I want this built for me
We set up the full pipeline for your business in 1-2 weeks. You get the system, the training, and ongoing support. Starting from $3,000.
Book a discovery workshop
Free 30-min call, no commitment

Want to know where you stand?

Take our AI readiness quiz. 10 questions, 2 minutes. You'll get a personalized recommendation for where to start with automation.