TL;DR
A B2B agency came to me with a cold outreach problem: they were spending 20+ hours per week manually researching prospects and sending one-off emails. I rebuilt their entire outreach motion using Apollo, Clay, Instantly, and n8n โ and within 30 days they were booking 150+ demos per month with zero manual effort. Here's the exact build, step by step.
The Starting Point
The agency was a 6-person B2B SaaS consulting firm. Their entire outbound motion was: one account manager spent Monday mornings pulling a LinkedIn search, exporting to CSV, manually cleaning it in Excel, and then sending individual "personalized" emails from Gmail. It took roughly 4 hours per week to build a list of 60 contacts. They averaged about 12 replies and 3-4 calls booked per month.
When they came to me, they had two asks: (1) do this faster, and (2) make it feel personal. The second part is harder than most people think.
Their existing stack was: Apollo (barely used), HubSpot CRM, Gmail. That was it. No automation, no sequences, no enrichment. Just raw manual effort.
Five days later, they had a system that was running 200+ contacts per day, personalizing every message with AI, and routing hot replies directly into HubSpot with a Slack alert. Here's how I built it.
The Tools We Used
Before the build, it's worth explaining why each tool is in the stack and what it does. I'll be honest about the trade-offs.
Apollo is the prospect database. 275M+ contacts, good filtering by job title, company size, industry, tech stack, and funding stage. We use it to pull raw prospect lists โ names, emails, company data โ and export into Clay for enrichment. Apollo's native sequences are okay, but we replaced them with Instantly for much better deliverability.
Clay is the enrichment and personalization layer. You can pull in data from 50+ sources (LinkedIn, Clearbit, BuiltWith, company news, job postings) and then run AI prompts against all that data to generate custom lines, subject lines, or pain-point hooks. This is where the "personalization at scale" actually happens โ and it's genuinely good.
Instantly handles email sending and deliverability. Multiple inbox rotation, warm-up, send limits, reply detection. This is where cold email deliverability actually lives โ you absolutely need proper inbox rotation and warm-up if you're sending volume.
n8n is the glue. It connects everything together: Clay โ Instantly โ HubSpot โ Slack. Every positive reply, every demo booked, every lead that matches our criteria gets routed automatically through n8n workflows. This is the piece most people skip โ and it's what turns a "cold email tool" into an actual system.
Step 1: Build the Prospect List in Apollo
The agency's ICP (Ideal Customer Profile) was: SaaS companies, 10โ200 employees, Series AโB funded, based in North America, with a VP of Sales or Head of Revenue title. That's a tight filter โ which is exactly what you want.
In Apollo, I built a saved search with these filters:
- Industry: Software, SaaS, Computer Software
- Employee count: 10โ200
- Funding: Series A, Series B
- Geography: United States, Canada
- Job title (keywords): "VP Sales", "Head of Revenue", "Chief Revenue Officer", "Director of Sales"
- Not already in HubSpot (exclusion list imported from CRM export)
This pulled about 4,200 contacts. I set up a recurring export schedule in Apollo โ 200 new contacts per day automatically exported to a Google Sheet that feeds into Clay. No manual pulling. The system replenishes itself.
One critical step most people skip: set up an exclusion list. Import your entire CRM contact list into Apollo's "Do Not Contact" list. You don't want to cold email someone who's already a client or a previous prospect who said no.
Step 2: Enrich and Personalize with Clay
The Google Sheet from Apollo feeds directly into a Clay table. From there, I set up the following enrichment columns โ each one pulls automatically when a new row appears:
- LinkedIn Profile Scrape โ pulls their recent posts, job title history, and bio
- Company News (Clearbit + web search) โ finds recent funding announcements, product launches, or hiring surges
- Tech Stack (BuiltWith) โ reveals what CRM, marketing tools, and sales tools they're currently using
- Job Postings โ if they're hiring 3+ sales reps, they're likely building outbound capacity
Then the most important column: the AI personalization line. This is a Claude prompt that takes all the enriched data and writes a 1-sentence custom opening line for each prospect. The prompt is roughly:
You are writing a personalized opening line for a cold email. Use the following information about the prospect:
- Name: {{first_name}} {{last_name}}
- Title: {{job_title}} at {{company_name}}
- Recent LinkedIn post: {{linkedin_post}}
- Company news: {{company_news}}
- They are hiring: {{hiring_signal}}
Write ONE sentence (max 20 words) that references something specific and recent about them or their company.
Do NOT use generic phrases like "I noticed" or "I came across your profile."
Be direct, specific, and human.
The output from this prompt becomes the {{custom_line}} variable in the email template. Approximately 85% of these lines are good enough to send as-is. The other 15% get flagged for manual review using a confidence score column.
Step 3: Write the Email Sequences
The agency wanted a 4-touch sequence. I wrote the templates with deliberate intentionality about each touch's job:
- Email 1 (Day 0) โ The offer. Lead with the custom line, then one sentence on what we do, then one sentence on the outcome, then a soft ask for a 20-minute call. 5 sentences total.
- Email 2 (Day 4) โ A relevant result. One short case study stat. "Helped [similar company type] add 8 new clients in 30 days by [specific method]. Worth 15 minutes?"
- Email 3 (Day 8) โ The pivot. Different angle, different pain point. If the first two emails focused on new revenue, this one focuses on time cost: "How much time does your team spend on manual prospecting per week?"
- Email 4 (Day 14) โ The close. "I'll leave you alone after this. If timing is wrong, no problem โ reply 'not now' and I'll check back in Q3. If it's right, 20 minutes this week?"
Subject lines are short, lowercase, and non-salesy: "quick q", "re: outbound at {{company_name}}", "{{first_name}} โ a quick idea". Open rates on these averaged 48% across the first 30 days.
Step 4: Set Up Instantly for Deliverability
Deliverability is where most cold outreach falls apart. If your emails land in spam, nothing else matters. The setup in Instantly:
- Inbox rotation: 5 sending accounts across 3 domains. Each account sends max 30 emails/day. Total: 150 emails/day, scaling to 200+ after warm-up completes.
- Domain setup: Separate sending domains from the main domain. Main domain: agencyname.com. Sending domains: agencynameoutreach.com, tryagencyname.com, agencynameai.com. SPF, DKIM, DMARC configured on all.
- Warm-up: All new inboxes went through Instantly's warm-up for 3 weeks before sending. During warm-up, Instantly automatically sends and replies to emails to build reputation. This is non-negotiable.
- Import from Clay: Clay exports enriched contacts directly to Instantly via a webhook. New contacts appear in campaigns automatically โ no manual importing.
The sequence templates from Step 3 are loaded into Instantly as campaign sequences. Instantly handles scheduling, timing optimization, reply detection, and automatic removal of bounces and unsubscribes.
Step 5: Connect Everything in n8n
This is the step most "outreach tutorials" completely skip. Sending emails is not a system โ it's just email software. The system is what happens after someone replies.
I built three n8n workflows for this client:
Workflow A: Reply Router
Instantly webhook fires when any reply is received. n8n classifies the reply using a Claude AI node into one of four categories: Interested, Not Now, Wrong Person, Unsubscribe. Depending on classification:
- Interested โ Create HubSpot deal, assign to sales rep, send Slack alert with full context
- Not Now โ Tag in Instantly for re-engagement in 90 days, update HubSpot contact
- Wrong Person โ Ask for referral to correct contact (optional auto-reply), close sequence
- Unsubscribe โ Remove from all active sequences, add to do-not-contact list
Workflow B: Daily Reporting
Every morning at 8am, n8n pulls campaign stats from Instantly API (sends, opens, replies, demos booked) and posts a formatted summary to the agency's #outbound Slack channel. No dashboards to log into โ the numbers come to you.
Workflow C: Calendar Sync
When a prospect books a demo via the Calendly link in the email, n8n automatically creates the HubSpot deal, attaches the meeting notes template, and sends a personalized confirmation sequence to the prospect with pre-call prep materials.
Step 6: CRM Sync and Alerts
The final piece is keeping HubSpot in sync without manual data entry. Every prospect that enters the Clay table gets created as a HubSpot contact with all enriched data attached โ company size, funding stage, tech stack, LinkedIn URL, custom enrichment notes. This happens automatically via a Clay โ HubSpot integration in n8n before the prospect is even contacted.
The sales team opens HubSpot in the morning and sees: new contacts added overnight, hot replies from yesterday highlighted in a deal view, demos booked for this week in their calendar. Everything is there. Nothing was entered manually.
Want this built for your business?
Book a free 30-minute call. We'll map your ICP, review your current outreach, and show you exactly what this system would look like for your specific business.
The Results After 30 Days
Here are the real numbers from the first 30 days after going live:
To put those numbers in context: before this system, they were booking 3-4 demos per month. The system increased that by roughly 40x, while reducing the time their team spent on outreach from 20+ hours/week to under 2 hours/week (reviewing Slack alerts and taking calls).
The 4.2% positive reply rate is also notably above benchmark. Industry average for cold email is 1โ2%. The difference is almost entirely attributable to the Clay personalization layer โ when people see a message that references something specific and recent about them or their company, they reply at a much higher rate.
The 8 new clients in 30 days represented approximately $240,000 in new ARR. The system cost $4,200 to build. That's a 57x ROI in the first month.
What It Cost to Build
Full transparency on the build and ongoing costs:
- Build cost (one-time): $4,200 โ covers system architecture, Clay table setup, n8n workflow builds, Instantly configuration, HubSpot integration, testing, and handoff documentation
- Apollo: $149/month (Basic plan with contact export credits)
- Clay: $149/month (Starter plan, 2,000 enrichment credits/month)
- Instantly: $97/month (Growth plan, 5 email accounts)
- n8n: Self-hosted on a $20/month VPS โ free to run unlimited workflows
- Claude API: ~$40/month at current usage volume
- Total ongoing cost: ~$455/month
At 8 new clients per month and assuming a $30,000 average contract value, the system is generating $240,000/month in new revenue for $455/month in running costs. The math is not subtle.
What I'd Do Differently
A few things I'd change on the next build:
- Start with 3 sending domains, not 1. We originally set up one domain and had to wait 3 extra weeks for warm-up on the additional domains. Set up all domains on Day 1 and warm them up in parallel.
- Build the reply classification AI before launch. We added the Claude reply router in Week 2, not Week 1. During Week 1, the sales team had to manually classify replies. That's 20 minutes/day they shouldn't have had to spend.
- Add LinkedIn touchpoints. The system is email-only. Adding a LinkedIn connection request or comment touchpoint after Email 1 would increase reply rates further. I've seen this add 1.5โ2% to positive reply rate in subsequent builds.
- Include a "book call" link in Email 1. We added it starting in Email 2. Moving it to Email 1 might convert some of the most engaged prospects before they reach Email 2. Worth A/B testing.
Overall: this is one of the most repeatable systems I build for clients. The tools are reliable, the ROI is fast, and the ongoing maintenance is minimal once it's running. If you have a clear ICP and a compelling offer, this system will work.