Complete step-by-step operational playbook for Jamie Schneiderman. Venture-backed SaaS founders who've plateaued -- from Sales Navigator filters to tiered Instantly + HeyReach campaigns with dossier-based personalization.
6 new sending domains purchased January 2026, fully warmed up and actively sending with replies coming in. Domains: unstuckyourbusinessconsultants.com, withunstuckyourbusiness.com, tryunstuckyourbusiness.com, unstuckyourbusinesspartners.com, unstuckyourbusinessgrowth.com, growunstuckyourbusiness.com. Campaigns can launch immediately.
215 leads in HeyReach rated 1-3/5, zero 4/5 or 5/5. Root cause: no revenue/funding verification, industry too broad (Financial Services founders slipping through). Fix: This playbook adds Crunchbase verification + tighter industry filters to prevent this going forward.
All leads cross-referenced against existing HeyReach campaigns (215 active) and Instantly DNC lists. Crunchbase as verification layer to confirm funding stage and revenue -- NOT primary source. Expandi personal emails prioritized -- founders read personal inbox. MillionVerifier OK only.
Every number below is real. This is what happened when we ran this SOP for Jamie in March 2026.
| Step | Input | Output | Hit Rate | Cumulative Reachable | What This Step Added |
|---|---|---|---|---|---|
| Phase 1: Sales Nav + HeyReach Scrape | 7 segments | 5,187 leads | -- | 0 | Raw data, no emails yet |
| Phase 1B: Crunchbase + Prospeo Founders | 3,257 domains | 2,997 founders | -- | 0 | Raw data, no emails yet |
| Phase 2: Dedup + Qualify | 8,184 raw | 6,180 unique | 75.5% | 0 | Removed 2,004 dupes/bad fits |
| Step 4: Expandi (LinkedIn email enrichment) | 6,180 | 2,692 emails | 43.6% | 2,692 | First 2,692 reachable by email |
| Step 5: Apollo (~4,000 credits) | 3,488 misses | 2,114 emails | 60.6% | 4,806 | +2,114 more emails (+78.5% vs Expandi alone) |
| Step 6: Prospeo (106 credits) | 1,374 Apollo misses | 313 emails | 31.3% | 5,119 | +313 emails Apollo missed |
| Step 8: MillionVerifier | 5,119 emails | 3,935 verified | 76.9% | 3,935 email | Removed 1,173 + 11 Prospeo bad = 1,184 risky/invalid |
| Step 9A: Dedup LinkedIn-only leads | 1,062 (after Prospeo) | 1,562 | -- | 3,935 + 1,562 | 302 recovered by Prospeo, rest deduped + qualified |
| Step 9B: Tier LinkedIn-only | 1,562 | T1: 295 / T2: 1,217 / T3: 50 | -- | 3,935 + 1,562 | 295 high-priority LinkedIn targets |
| Step 9C: Research T1 LinkedIn-only | 487 T1 (incl. Prospeo) | 487/487 personalized (100%) | 97.1% hook rate | 3,935 + 1,562 | Personalized connection requests + email outreach |
| TOTAL REACHABLE | 5,497 | 5,497 leads | 3,935 email + 1,562 LinkedIn |
HeyReach scraping is free. Qualify before enriching to avoid wasting credits. Jamie's previous leads rated 1-3/5 because filters were too loose -- this plan tightens them.
All lead source URLs (Sales Navigator, Crunchbase, Apollo, etc.) are tracked in one master Google Sheet. Every URL you build in Step 1 must be saved here before scraping. Open the "Jamie - Unstuck" tab, find the matching sub-search row, and paste the URL. This is the single source of truth for all lead scraping URLs across all clients.
How to build each search (do this for every sub-search in the tables below):
Go to linkedin.com/sales/search/people (Sales Navigator Lead Search)
You will see a search bar at the top and filter panels on the left sidebar. DO NOT type anything into the top search bar -- leave it blank always.
On the left sidebar, click "Company headcount". Check the box for the headcount range listed in the sub-search table (e.g., 11-50). Click "Show results".
Click "Current job title" in the sidebar. A text box appears. Type or paste the INCLUDE titles: CEO OR Founder OR Co-Founder OR Chief Executive. Press Enter. They will appear as green pills (green = included). Confirm the toggle at the top of the title filter says "Include."
Now add the EXCLUDE titles. There are two ways to do this. Method A: Click the "Include" dropdown at the top of the title filter and switch it to "Exclude". Now type or paste: GTM OR Growth OR Advisor OR Board OR Consultant OR Coach OR Fractional OR Intern OR Associate. Press Enter. They will appear as red pills (excluded). Switch the dropdown back to "Include" when done. Method B: Type the values while still on "Include." They appear as green pills. Then for EACH one, click the circle-with-line-through-it icon (looks like a stop sign, next to the X on the green pill). The pill turns red = excluded. Either method works. You will know it is correct when all exclude titles are red and all include titles are green.
Click "Geography" in the sidebar. Type United States and select it from the dropdown. (Add Canada as a second geography run later if needed.)
PAUSE. Scroll down to the segment tables below. Find the segment you are currently building (Segment 1, 2, or 3). Each segment has a bold line that says "Industry filter for all Segment X sub-searches" with the exact industries to input. Read that line, then come back here and continue.
Click "Industry" in the sidebar. Type and select the industries from the segment table you just read. For example, Segments 1-2 use: Software Development and Technology, Information and Internet. They will appear as green pills (included). Now add the exclude: type Financial Services and press Enter. It will appear as a green pill. Click the circle-with-line-through-it icon (stop sign icon, next to the X) on the green pill. It turns red, confirming it is excluded. Alternatively, switch the dropdown to "Exclude" first, then type the industry.
Click "Posted on LinkedIn" in the sidebar. If the sub-search says "ON," toggle this to Yes. If "OFF," leave it untouched (default = all).
Click "Seniority level" in the sidebar. Check only the boxes listed in the sub-search table. For Jamie, this is Owner only. Do NOT check CXO -- Jamie only works with founders, not C-suite executives like COOs or CFOs. CXO inflates results by 5-6x with wrong-fit leads.
CHECK THE RESULT COUNT in the top-right area of the results. If it says "2,500+ results", you must split further -- go back and narrow headcount or add the "Posted on LinkedIn" filter. If it shows a number under 2,500, you are good.
Copy the full URL from your browser's address bar. The URL contains all your filter selections. Open the Lead Source URL Tracker (Jamie tab), find the matching sub-search row, and paste the URL into the "Sales Nav URL" column. Also enter the actual result count in the "Actual Count" column.
Repeat steps 1-11 for each sub-search in the segment tables below.
Shared base filters (quick reference):
| Filter | Value | Where to Find It |
|---|---|---|
| Geography | United States | Left sidebar > Geography |
| Title INCLUDE | CEO OR Founder OR Co-Founder OR Chief Executive | Left sidebar > Current job title > Include |
| Title EXCLUDE | GTM OR Growth OR Advisor OR Board OR Consultant OR Coach OR Fractional OR Intern OR Associate | Left sidebar > Current job title > Exclude |
| Industry | Varies per segment -- see each segment's Complete Filter Set below | Left sidebar > Industry |
| Top keyword bar | LEAVE BLANK ALWAYS | Top of page -- do not type here |
Critical fix from past campaigns: Excluding "Financial Services" industry and "GTM"/"Growth"/"Coach" titles. These were flooding Jamie's lists with wrong-fit leads.
LinkedIn Sales Navigator caps every search at 2,500 results. HeyReach and Expandi enforce this -- you cannot scrape more than 2,500 from a single search URL. If a search returns more than 2,500, you MUST split it further using these volume controls:
1. Headcount split -- break "11-200" into "11-50" and "51-200" (two separate searches)
2. "Posted on LinkedIn" toggle -- ON = only people who've posted recently (smaller, more active set). OFF = everyone else. Two searches per segment.
3. Seniority filter -- narrow from "Owner+CXO+VP+Director" to just "Owner"
4. Geography split -- break "USA" into East Coast / West Coast, or specific states
Check the result count BEFORE scraping. If it says "2,500+ results," your search is too broad -- split it.
The sweet spot. Smaller SaaS companies (typically Series A) who've proven PMF but growth has stalled. Board pressure to hit metrics.
| Filter | Value | How to Set |
|---|---|---|
| Company Headcount | 11-50 | Left sidebar > Company headcount > check "11-50" |
| Geography | United States | Left sidebar > Geography > type and select |
| Title INCLUDE | CEO OR Founder OR Co-Founder OR Chief Executive | Current job title > Include dropdown > paste |
| Title EXCLUDE | GTM OR Growth OR Advisor OR Board OR Consultant OR Coach OR Fractional OR Intern OR Associate | Current job title > switch to Exclude > paste (red pills) |
| Industry INCLUDE | Software Development + Technology, Information and Internet | Industry filter > type each one > green pills |
| Industry EXCLUDE | Financial Services | Industry filter > type > click stop-sign icon > red pill |
| Seniority | Owner | Seniority level > check Owner ONLY (not CXO) |
| Posted on LinkedIn | Varies per sub-search (see table below) | Left sidebar > Posted on LinkedIn |
| Top keyword bar | LEAVE BLANK | Do not type anything in the top search bar |
| # | Sub-Search | Posted | Est. Count | Sales Nav URL |
|---|---|---|---|---|
| 1a | SaaS Early Stage -- Posted (11-50) | ON | ~1,200 * | Build search |
| 1b | SaaS Early Stage -- Not Posted (11-50) | OFF | ~1,800 * | Build search |
~3,000 raw across 2 sub-searches. After dedup: ~300-400 unique qualified leads. Heavy overlap between Posted/Not Posted -- that's expected.
Different plateau. Larger SaaS companies (typically Series B) with more resources and team, but growth per dollar invested is declining. Strategy problem hiding behind busy work.
| Filter | Value | How to Set |
|---|---|---|
| Company Headcount | 51-200 | Left sidebar > Company headcount > check "51-200" |
| Geography | United States | Left sidebar > Geography > type and select |
| Title INCLUDE | CEO OR Founder OR Co-Founder OR Chief Executive | Current job title > Include dropdown > paste |
| Title EXCLUDE | GTM OR Growth OR Advisor OR Board OR Consultant OR Coach OR Fractional OR Intern OR Associate | Current job title > switch to Exclude > paste (red pills) |
| Industry INCLUDE | Software Development + Technology, Information and Internet | Industry filter > type each one > green pills |
| Industry EXCLUDE | Financial Services | Industry filter > type > click stop-sign icon > red pill |
| Seniority | Owner | Seniority level > check Owner ONLY (not CXO) |
| Posted on LinkedIn | Varies per sub-search (see table below) | Left sidebar > Posted on LinkedIn |
| Top keyword bar | LEAVE BLANK | Do not type anything in the top search bar |
| # | Sub-Search | Posted | Est. Count | Sales Nav URL |
|---|---|---|---|---|
| 2a | SaaS Growth Stage -- Posted (51-200) | ON | ~800 * | Build search |
| 2b | SaaS Growth Stage -- Not Posted (51-200) | OFF | ~1,200 * | Build search |
~2,000 raw across 2 sub-searches. After dedup: ~200-300 unique qualified leads.
Not all stuck founders are SaaS. IT services, telecom, and consulting companies hit the same plateau. Jamie's frameworks apply to any venture-backed tech-adjacent company.
Software Development and Technology, Information and Internet. This segment uses COMPLETELY DIFFERENT industries to avoid duplicate leads.| Filter | Value | How to Set |
|---|---|---|
| Company Headcount | Varies per sub-search: 11-50 or 51-200 | Left sidebar > Company headcount > check one range |
| Geography | United States | Left sidebar > Geography > type and select |
| Title INCLUDE | CEO OR Founder OR Co-Founder OR Chief Executive | Current job title > Include dropdown > paste |
| Title EXCLUDE | GTM OR Growth OR Advisor OR Board OR Consultant OR Coach OR Fractional OR Intern OR Associate | Current job title > switch to Exclude > paste (red pills) |
| Industry INCLUDE | IT Services and IT Consulting + Telecommunications | Industry filter > type each one > green pills |
| Industry EXCLUDE | Financial Services | Industry filter > type > click stop-sign icon > red pill |
| Seniority | Owner | Seniority level > check Owner ONLY |
| Posted on LinkedIn | Varies per sub-search (see table below) | Left sidebar > Posted on LinkedIn |
| Top keyword bar | LEAVE BLANK | Do not type anything in the top search bar |
| # | Sub-Search | Headcount | Posted | Est. Count | Sales Nav URL |
|---|---|---|---|---|---|
| 3a | IT Services + Telecom -- Posted (11-50) | 11-50 | ON | Verify * | Build search |
| 3b | IT Services + Telecom -- Posted (51-200) | 51-200 | ON | Verify * | Build search |
| 3c | IT Services + Telecom -- Not Posted (11-50) | 11-50 | OFF | Verify * | Build search |
Raw count: Verify in Sales Nav. After dedup: ~150-250 unique qualified leads.
Do this for each sub-search URL you saved in Step 1:
Log in to app.heyreach.io. Make sure you are in the correct workspace (check the workspace name in the top-left corner).
In the left sidebar, click "Lead Lists"
Click the "+ Create New List" button (top right)
Give the list a name that matches the sub-search. Example: Jamie - SaaS Series A - Posted 11-50 (1a). Use the sub-search ID from the tables above so you can track it later.
Select "Import from Sales Navigator URL" (NOT "Upload CSV" -- that's a different option)
Paste the full Sales Nav URL you copied in Step 1. Click "Import".
HeyReach will show a progress bar. Scraping takes 5-15 minutes depending on list size. You can start another sub-search while this one runs -- HeyReach allows multiple imports at once.
When status changes to "Completed", click on the list name to open it.
Click the "Export" button (top right of the list view). Select "Download as CSV".
The CSV will contain: First Name, Last Name, Company Name, Job Title, LinkedIn Profile URL. Save the file as Jamie_Raw_1a.csv (matching the sub-search ID).
Repeat steps 3-10 for all remaining sub-searches (1b, 2a, 2b, 3a, 3b, 3c).
Track A (Step 3A): Clean and dedup your Sales Nav leads from HeyReach. Track B (Steps 3B-3C): Source funded startup companies from Crunchbase, then use Prospeo to find the founders' personal LinkedIn profiles. Both tracks produce separate lead lists that merge at Expandi in Phase 3.
Clean, filter, and split your HeyReach leads before uploading to Expandi. This is a 3-part process: dedup across segments, filter to only founders/CEOs, then split into parts under 2,500 for Expandi upload.
Open your terminal and type claude to start Claude Code
Drag all your raw CSVs from Step 2 into the Claude Code window (one per sub-search segment). You can drag them all at once.
Copy the prompt below and paste it into Claude Code. Hit Enter.
This is critical. HeyReach exports contain ALL titles from Sales Nav -- Partners, Managing Partners, Presidents, VPs, etc. You MUST filter down to only decision-makers before spending Expandi credits.
Expandi has a ~2,500 lead limit per CSV upload. If your filtered list exceeds 2,500, split it into parts.
Purpose: Build a list of Series A and Series B funded companies that match Jamie's ICP. This is a sourcing step -- Crunchbase gives you the companies, then Step 3C finds the founders. Crunchbase does NOT have founder contact info -- it only has company-level data (funding, revenue, headcount).
Part 1: Install Instant Data Scraper (one-time setup)
Open Google Chrome. Go to Instant Data Scraper on Chrome Web Store
Click "Add to Chrome" > "Add Extension". This is Instant Data Scraper (free, no credit limits, no account needed).
You will see a small Instant Data Scraper icon in your Chrome toolbar (top right). If you don't see it, click the puzzle piece icon and pin it.
Part 2: Set up Crunchbase search with exact Jamie ICP filters
Go to crunchbase.com/discover/organization.companies. Log in if prompted. You will see the Companies tab selected at the top left (next to Contacts and Investors). Below it is a row of filter category cards: Overview, Contacts, Predictions, Insights, Competitors, Financials, Company Status, Deals, Notes, Lists, Tags, Partner Filters. Each card has a small ⊕ icon on the right side.
Open the Overview card: Click the ⊕ icon on the "Overview" card. A panel opens showing: Description Keywords, Headquarters Location, Industry, Number of Employees, Founded, Actively Hiring, and more.
Set Industry: In the Overview panel, find the "Industry" search box. Type Software and select it from the dropdown. It appears as a blue pill with an X. (For Jamie, "Software" alone is sufficient -- it captures SaaS, software dev, and tech companies without pulling in irrelevant results.)
Set Headquarters Location: In the same Overview panel, find the "Headquarters Location" search box. Type Canada and select it (blue pill). Then type United States and select it (blue pill). Both should appear as removable pills.
Set Number of Employees: In the same Overview panel, find "Number of Employees". This is a slider with two drag handles (NOT checkboxes). Drag the left handle to 11 and the right handle to 100. The numbers display above the slider as you drag. This targets companies with 11-100 employees.
Close the Overview panel by clicking the X in the top right of the panel. Your Overview card should now show "Overview: Canada, United States, +3" (indicating 3 additional filters active).
Open the Financials card: Click the ⊕ icon on the "Financials" card. A panel opens showing: Last Funding Date, Last Funding Type, Last Funding Amount, Total Funding Raised, Valuation, Investors.
Set Last Funding Type: In the Financials panel, find "Last Funding Type" on the right side. You will see checkboxes: Pre-Seed, Seed, Series A, Series B, and a "+ More Options" link. Check Series B. (For a separate search, you can also check Series A -- run them as separate saved searches to stay under the 1,000 export limit.)
Set Last Funding Date (optional): In the same Financials panel, find "Last Funding Date" on the left side. You will see radio buttons: Past 30 Days, Past 60 Days, Past 90 Days, Past Year, Custom Date Range. Select "Past Year" to target companies that raised within the last 12 months. Or leave it unset to capture all recently-funded companies regardless of when they raised.
Close the Financials panel. Your Financials card should now show "Financials: Series B".
Open the Company Status card: Click the ⊕ icon on the "Company Status" card. A panel opens showing: Type, Operating Status, M&A Status, and IPO Status.
Set Type: Check For Profit (uncheck Non-profit).
Set Operating Status: Check Active (uncheck Closed).
Set IPO Status: Check Private (uncheck Public and Delisted -- you want pre-IPO companies only).
Close the Company Status panel. Your card should show "Company Status: For Profit, Active, +1".
Save the search: Click "Save Changes" (top right, next to the green "Sync" button) or click the 🔖 pin icon next to the search title to save it to My Dashboard > Saved Searches. Name it descriptively, e.g., Jamie software, 11 to 100 employees, Series B, for-profit, Canada/USA.
| Filter Card | Filter Name | Value to Set | UI Control |
|---|---|---|---|
| Overview | Industry | Software | Search box > type > select pill |
| Overview | Headquarters Location | Canada, United States | Search box > type > select pills |
| Overview | Number of Employees | 11 to 100 | Drag slider handles (left=11, right=100) |
| Financials | Last Funding Type | Series B (or Series A for second search) | Checkbox |
| Financials | Last Funding Date | Past Year (optional) | Radio button |
| Company Status | Type | For Profit | Checkbox |
| Company Status | Operating Status | Active | Checkbox |
| Company Status | IPO Status | Private | Checkbox |
After setting all filters, check the result count at the top left of the results table (e.g., "1-50 of 765 results"). The results table shows columns: Organization Name, employee count, Headquarters Location, Description, Website, LinkedIn, Contact Email, Full Description, Estimated Revenue Range, Founded Date. Your target is under 1,000 results. If it shows more than 1,000, tighten filters (see warning below) before proceeding to Part 3.
Part 3: Scrape the results with Instant Data Scraper
Make sure you are on the Crunchbase search results page and the results table is visible (showing Organization Name, employee count, etc.).
Click the Instant Data Scraper icon in your Chrome toolbar. A popup window opens showing a preview of the scraped data from the current page. It auto-detects the table columns (Organization Name, Headquarters Location, Description, Website, LinkedIn, Contact Email, etc.).
If Instant Data Scraper does not detect the table, scroll down the Crunchbase page first so the table fully loads, then click the icon again.
Click "Locate 'Next' button" (blue button, top left of the popup). Instant Data Scraper will highlight the Crunchbase "Next >" pagination link. If it highlights the correct button, you are ready. If it highlights the wrong element, click "Locate 'Next' button" again until it finds the right one.
Set the delay between pages: Min delay: 2 sec, Max delay: 20 sec. This prevents Crunchbase from rate-limiting you. Leave the "Infinite scroll" checkbox unchecked (Crunchbase uses pagination, not infinite scroll).
Click "Start crawling". Instant Data Scraper will automatically: scrape the current page (50 rows), click "Next", wait 2-20 seconds, scrape the next page, and repeat through all pages. The status shows: Pages scraped, Rows collected, and Working time. Let it run until it reaches the last page.
When it finishes (or you click "Stop crawling"), click the "CSV" button (green, top right of popup) to download all collected data as a CSV. Save as Jamie_Crunchbase_Companies.csv. You can also click "XLSX" for Excel format or "COPY ALL" to paste into Google Sheets.
Part 3B: Clean Your Raw Crunchbase CSV
The CSV from Instant Data Scraper has raw CSS class names as column headers. The cleaner below fixes this automatically -- drop your raw CSV in and it renames columns, removes junk, and shows a preview.
Output: A clean CSV of funded companies with proper column names (Company Name, Website, Funding Type, Total Funding, Employees, etc.). You will use this in Step 3C.
The problem: Crunchbase gives you funded companies but NOT the people running them. You can't load company URLs into HeyReach or Expandi -- those tools need personal LinkedIn profile URLs.
The solution: Use Prospeo's Search Person API to find CEOs, Founders, and Co-Founders at each company by domain. Prospeo returns their name, title, and personal LinkedIn URL -- exactly what you need for outreach.
Step-by-step:
1. Open your terminal and type claude to start Claude Code
2. Drag in your clean Crunchbase CSV from Step 3B (the one with proper column names)
3. Copy the prompt below and paste it into Claude Code. Hit Enter.
4. Claude extracts the company domains, calls the Prospeo API in batches, filters results to only CEOs/Founders/Co-Founders, and outputs a clean CSV with personal LinkedIn URLs.
5. This takes 20-40 minutes depending on how many companies (rate limits). Claude handles the waiting automatically.
Expected results: ~3,000 founders/CEOs across ~1,700 companies (55-60% hit rate). This is a separate lead list from your Sales Nav leads -- these are guaranteed funded startup founders.
Jamie_CB_Founders_Clean.csv -- founders/CEOs with personal LinkedIn URLs, ready to load into Expandi as its own segment.| List | Source | What It Contains | Size |
|---|---|---|---|
| Track A | Sales Nav + HeyReach | SaaS founders/CEOs, deduped + filtered, split into 2 parts for upload | 4,232 (2 x 2,116) |
| Track B | Crunchbase + Prospeo | CEOs/Founders at Series A/B funded companies with LinkedIn URLs | 2,997 |
Both lists go into Expandi as separate segments in Phase 3. Track A = "SaaS Growth Founders" (split into Part 1 and Part 2). Track B = "CB Founders Series A/B". This lets you measure which source converts better and tailor messaging accordingly.
Your two lead lists from Phase 2 -- Track A (Sales Nav leads) and Track B (Crunchbase funded founders) -- both go into Expandi as separate segments. Expandi finds personal Gmail/Outlook addresses from LinkedIn profiles. After Expandi, Apollo backfills the misses using its 5K monthly credits. Prospeo runs third on whatever Apollo missed. Each tool catches leads the previous one couldn't find.
This is exactly what happened at each step. Every number is real.
| Step | Tool | Input | Emails Found | Hit Rate | Still Missing |
|---|---|---|---|---|---|
| 4 | Expandi | 6,180 leads | 2,692 | 43.6% | 3,488 |
| 5 | Apollo (4K credits) | 3,488 leads | 2,114 | 60.6% | 1,374 |
| 6 | Prospeo | Not yet run -- tested 50% hit rate on 10-lead sample. Rate limited, pending re-run. | |||
| Total after enrichment | 6,180 | 4,806 | 77.8% | 1,374 | |
| 8 | MillionVerifier | 4,806 emails | 3,633 verified OK | 75.6% | 1,173 failed |
| Track | Total Leads | Expandi Found | Apollo Found | Verified OK | No Email |
|---|---|---|---|---|---|
| Track A (Sales Nav) | 3,335 | 1,329 (40%) | 1,084 (32%) | 1,796 | 2,006 |
| Track B (Crunchbase) | 2,845 | 1,363 (48%) | 1,030 (36%) | 1,837 | 1,482 |
| Combined | 6,180 | 2,692 | 2,114 | 3,633 | 3,488 |
Why Expandi first: Expandi finds personal Gmail/Outlook addresses from LinkedIn profiles. Founders read personal inbox more than corporate. Personal emails get 2-3x higher reply rates.
Log in to app.expandi.io
In the left sidebar, click "People" > "Import" > "Upload CSV"
Select your first file. For Track A, upload Jamie_Deduped_Clean_Updated_Part1.csv first.
Map columns CAREFULLY -- this is the most important step:
| CSV Column | Map to Expandi Field | Priority |
|---|---|---|
| Profile URL / LinkedIn URL | profile_link | CRITICAL -- without this, nothing works |
| First Name | first_name | Required |
| Last Name | last_name | Required |
| Full Name | name | Required |
| Job Title | job_title | Required |
| Company / Company Name | company_name | Required |
| Company Website | dynamic placeholder | Optional (for personalization) |
Name the list clearly so you can tell lists apart later. Examples: Jamie - SaaS Growth Founders Part 1 - Mar 2026, Jamie - CB Founders Series A/B - Mar 2026
Leave "Auto-refresh" and "Auto-assign to campaign" unchecked. Click "Confirm".
Repeat for each remaining CSV: Part 2 of Track A, and Track B (Jamie_CB_Founders_Clean.csv).
Expandi processes the lists in the background. Email enrichment happens automatically -- wait 1-4 hours for large lists.
When complete, export each list from Expandi as CSV. The export includes all original fields PLUS the enriched email, phone, location, and company data from LinkedIn.
Expected hit rate: ~50% will have emails found. Jamie's results: Track A = 1,329 of 3,335 (40%), Track B = 1,363 of 2,845 (48%).
After Expandi, recombine your split files and (for Track B) merge back the Crunchbase funding data that Expandi doesn't carry.
The Expandi export has emails and LinkedIn data but lost the Crunchbase funding data (revenue, total funding, last raise, founded year, growth score). Merge it back by matching on company website domain.
Jamie_SaaS_Growth_Founders_Master.csv (Track A) + Jamie_CB_Founders_Master.csv (Track B with funding data)Before spending credits on email backfill, remove anyone you have already contacted. Check against ALL outreach history: Instantly campaigns, HeyReach LinkedIn outreach, and any manual sends.
| List | Total | With Email | Missing Email |
|---|---|---|---|
| Track A -- Sales Nav Founders | 3,335 | 1,329 (40%) | 2,006 |
| Track B -- CB Founders (with funding data) | 2,845 | 1,363 (48%) | 1,482 |
| Total | 6,180 | 2,692 | 3,488 need backfill |
Jamie_SalesNav_Founders_Uncontacted.csv + Jamie_CB_Founders_Uncontacted.csv -- these are your final clean lists ready for email backfill in Steps 5-7.Go to app.apollo.io and log in
Click "People" in the left sidebar
Click "Import" > "Upload CSV". Select your uncontacted list (leads WITHOUT email from Expandi).
Map columns: First Name, Last Name, Company, LinkedIn URL. Click "Import".
Once imported, select all contacts. Click "Enrich" or "Find Emails" (each lookup costs 1 Apollo credit -- you will NOT be charged if no email is found).
When enrichment completes, filter by contacts that have an email. Export as CSV: Jamie_Apollo_Found.csv.
Filter by contacts with NO email. Export: Jamie_Apollo_Missing.csv.
| Jamie's Actual Apollo Results (March 2026) | |||
|---|---|---|---|
| Metric | Track A (Sales Nav) | Track B (Crunchbase) | Combined |
| Input (Expandi misses) | 2,006 | 1,482 | 3,488 |
| Emails found | 1,084 | 1,030 | 2,114 |
| Hit rate | 54% | 70% | 60.6% |
| Credits used | ~4,000 (close to monthly cap) | ||
| Still missing email | 922 | 452 | 1,374 |
Actual hit rate: 60.6% -- Apollo found emails for nearly 2 out of 3 Expandi misses. Crunchbase leads had a higher hit rate (70%) because company data was richer.
Jamie_Apollo_Found.csv (2,114 leads with email) + Jamie_Apollo_Missing.csv (1,374 leads, no email found)| Metric | Value |
|---|---|
| Input | 1,374 Apollo misses (deduped + qualified subset: 1,864) |
| Leads processed | 1,000 (hit daily rate limit at batch 22/38) |
| Emails found by Prospeo | 313 |
| Hit rate (processed) | 31.3% |
| MillionVerifier pass | 302 verified (11 rejected as bad/invalid) |
| MV breakdown | 99 good (31.6%) + 204 catch-all (65.2%) + 10 bad (3.2%) |
| Credits used | 106 Prospeo ($0.34/email) + 313 MV |
| Tier breakdown | T1: 192 | T2: 110 |
| T1 with personalization | 192/192 (merged from Exa research) |
Go to app.prospeo.io and log in
Click "Enrich" in the top navigation
Click "Bulk Enrich" > "Upload CSV". Select your Jamie_Apollo_Missing.csv file (1,374 leads without email).
Map the "LinkedIn URL" column. Prospeo uses LinkedIn URLs as the primary lookup method. If a lead has no LinkedIn URL, it falls back to "First Name" + "Last Name" + "Company Website".
Click "Start". Processing takes 15-30 minutes for ~1,400 leads.
When complete, click "Download Results". The CSV will have an "Email" column.
Split the results: rows WITH email = Jamie_Prospeo_Found.csv. Rows WITHOUT = Jamie_No_Email_Final.csv.
The API endpoint is POST https://api.prospeo.io/bulk-enrich-person with header X-KEY: your_api_key.
Sends up to 50 leads per batch. The script at 7-Scripts/waterfall_enrich.py handles batching, rate limiting, and output automatically.
Run: python3 7-Scripts/waterfall_enrich.py --prospeo-only
x-daily-reset-seconds header).Actual hit rate: 31.3% on processed leads. Lower than Apollo (60.6%) because these are the hardest-to-find contacts -- two tools already failed on them. Still recovered 312 new emails for 106 credits.
Credit cost: 106 credits for 312 emails = $0.34/email. Extremely efficient since Prospeo only charges for successful matches.
Jamie_Prospeo_Found.csv (313 emails) -- these go through MillionVerifier in Step 7 before being added to campaign CSVs. Jamie_Prospeo_Missed.csv (remaining leads go to LinkedIn-only pipeline in Step 9)Before doing anything else, remove leads that already exist in your email campaign CSVs or Instantly. Many of these leads have email addresses in the campaign files -- you don't want to LinkedIn-message someone you're already emailing.
| Jamie's LinkedIn-Only Dedup Results (March 2026) | ||
|---|---|---|
| Stage | Count | Notes |
| Starting pool (no email) | 3,488 | CB: 1,482 + SalesNav: 2,006 |
| Removed (already in campaigns) | -1,488 | Already being emailed via Instantly |
| After dedup | 2,000 | CB: 782 + SalesNav: 1,218 |
Filter out leads that don't match Jamie's ICP. Same criteria as Step 9 but applied before tiering to avoid wasting research time on bad fits.
Disqualify leads with bad titles: intern, student, retired, former, freelance, consultant, professor, advisor, board member, volunteer, assistant, coordinator, analyst, associate, recruiter
Disqualify leads in wrong industries: staffing, recruiting, real estate, construction, healthcare, banking, insurance, airline, mining, oil, gas, agriculture, food, restaurant, hospitality, retail, fashion, fitness, entertainment, government, military, nonprofit, legal, accounting, architecture
Disqualify leads at large companies: 500+ employees (Jamie targets 11-100)
Keep everyone else -- even partial matches go to T2/T3.
| Jamie's ICP Qualification Results (March 2026) | ||
|---|---|---|
| Category | Count | Notes |
| Input (after dedup) | 2,000 | |
| Qualified (good title, not excluded) | 1,814 | Founders/CEOs in acceptable industries |
| Marginal (partial match) | 50 | Good industry but not founder title, kept for T2/T3 |
| Disqualified -- bad title | 26 | Advisors, interns, board members |
| Disqualified -- wrong industry | 110 | Healthcare, construction, legal, etc. |
| Moving forward | 1,864 | Qualified + marginal |
Score each lead using the same ICP scoring as Step 9. Higher score = better fit = higher tier.
| Signal | Points |
|---|---|
| Founder/CEO/President title | +30 |
| Software/SaaS/Tech industry | +20 |
| 11-200 employees | +15 |
| Series A or B funding | +15 |
| $1M-$50M last funding amount | +10 |
| Growth score >= 7 (CB only) | +5 |
| Jamie's LinkedIn-Only Tiering Results (March 2026) | ||||
|---|---|---|---|---|
| Tier | Score | Count | Source | Action |
| T1 | >= 50 | 487 | CB: 227, SN: 260 | Research + personalize, then priority HeyReach campaign |
| T2 | 20-49 | 1,327 | CB: 494, SN: 833 | Standard HeyReach campaign, no individual research |
| T3 | < 20 | 50 | SN: 50 | Low priority. Upload last or skip. |
| Total | 1,864 | |||
Run Exa web searches on each T1 lead to find personalization hooks: podcast appearances, press mentions, funding announcements, blog posts. This is the same research process as Steps 10-11 for the email leads.
| Metric | Count | Rate |
|---|---|---|
| Total T1 leads researched | 487 | -- |
| Podcast mentions found | 380 | 78.0% |
| Press mentions found | 93 | 19.1% |
| Fallback personalization | 14 | 2.9% |
| Total with hooks (podcast or press) | 473 | 97.1% |
| Total personalized (all types) | 487 | 100% |
Go to app.heyreach.io and log in
Click "Lists" > "Create List" > "Upload CSV"
Upload Jamie_LinkedIn_Only_T1_Personalized.csv first. Name it: Jamie - LinkedIn Only T1 - Mar 2026
Column mapping:
| CSV Column | HeyReach Field | Notes |
|---|---|---|
| linkedin_url | LinkedIn URL | CRITICAL -- without this, nothing works |
| first_name | First Name | Maps to built-in {FIRST_NAME} |
| last_name | Last Name | Maps to built-in {LAST_NAME} |
| company_name | Company | Maps to built-in {COMPANY} |
| title | Position | Maps to built-in {POSITION} |
| personalization_line | Click "Add custom variable" | Becomes {PERSONALIZATION_LINE} in message editor |
Important: When uploading, click "Add custom variable" at the bottom of the column mapping screen. Map the personalization_line column to a new custom variable called PERSONALIZATION_LINE. This becomes {PERSONALIZATION_LINE} in the message editor alongside the built-in variables ({FIRST_NAME}, {COMPANY}, {POSITION}, etc.).
Repeat for T2 (without personalization) and T3 as separate lists.
Create a new campaign. Name: Jamie - LinkedIn Only T1 - [Month]
Add the T1 list. Set campaign type to connection request + follow-up.
Sequence: Connection request with note > Wait 3 days > Follow-up message 1 (after accept) > Wait 5 days > Follow-up message 2
Daily limit: 20-25 connection requests per sender account.
Hi {FIRST_NAME}, {PERSONALIZATION_LINE}. I host a podcast for venture-backed founders who've hit that growth ceiling between 1 and 10M. Would love to connect.
Hi {FIRST_NAME}, saw you're running {COMPANY} in the SaaS space. I host a podcast for venture-backed founders who've hit that growth ceiling between 1 and 10M. Would love to connect.
Thanks for connecting {FIRST_NAME}. Quick question -- have you hit a point where pushing harder on growth actually made things worse? That's a pattern I keep seeing with Series A/B founders. Would love to hear your take, even if it's just a 2 min voice note.
Hey {FIRST_NAME}, no worries if you're slammed. I'm interviewing a few founders this month for the podcast about that exact "stuck" moment. Zero prep, just a real conversation. Would that interest you?
Expected results: At 30-40% connection acceptance on 487 T1 leads, expect 145-195 new connections. At 20-30% reply rate on follow-ups, that's 30-60 conversations from leads that would otherwise have been lost entirely.
Jamie's new domains are actively sending -- protect their reputation. Every bounce hurts deliverability. Verify aggressively -- OK status ONLY.
Take your merged Jamie_All_Emails_For_Verification.csv (from the Claude Code step above).
Go to millionverifier.com and log in
Click "Bulk Verifier" in the top menu
Click "Upload File". Select your merged CSV.
MillionVerifier will ask which column contains the email addresses. Select the email column. Click "Start Verification".
Verification takes 5-30 minutes. When complete, you will see a breakdown: OK, Catch-All, Risky, Unknown, Invalid, Disposable.
Click "Download Results". The CSV will have a new "Result" column next to each email.
Open the results CSV. Filter the "Result" column to show ONLY "ok". Delete every other row.
DO NOT keep "catch-all" (spam traps hide here). DO NOT keep "risky" or "unknown." Only "ok" status. No exceptions.
Save as Jamie_Verified_Master.csv.
The API endpoint is GET https://api.millionverifier.com/api/v3/?api=YOUR_KEY&email=EMAIL
Single email verification -- loop through your CSV, 0.1s between calls to be polite.
The response JSON has a quality field: "good", "risky", "bad", or "unknown".
Keep "good" only. "risky" with result: "catch_all" can be kept for LinkedIn-aware domains but monitor bounce rates.
| Metric | Expandi + Apollo Batch | Prospeo Batch | Total |
|---|---|---|---|
| Input | 4,806 | 313 | 5,119 |
| Passed (good + catch-all) | 3,633 | 302 | 3,935 |
| Rejected (bad/invalid) | 1,173 | 11 | 1,184 |
| Pass rate | 75.6% | 96.5% | 76.9% |
Actual pass rate: 76.9% overall. Prospeo emails passed at 96.5% (much higher than Expandi+Apollo's 75.6%).
Jamie_Verified_Master.csv -- 3,935 clean, verified emails ready for tiering. Leads without email go to the LinkedIn-only pipeline.T1 hyper-personalized = 15-25% reply. T2 segment-personalized = 5-10%. T3 volume = 2-5%. Concentrate dossier research on T1 where $15K deals close.
Scoring signals (use what's available per track):
| Signal | Points | Available In |
|---|---|---|
| Title Signals | ||
| Founder + CEO combo title | +25 | Both tracks |
| Founder / Co-Founder | +20 | Both tracks |
| CEO only | +15 | Both tracks |
| Industry Signals | ||
| SaaS / Software / Tech / AI / Cloud / Data | +30 | Both tracks |
| Adjacent (Marketing, Consulting, E-commerce, Financial Services) | +15 | Both tracks |
| Company Size | ||
| 11-200 employees (sweet spot) | +25 | Both tracks |
| 2-10 employees | +15 | Both tracks |
| 201-500 employees | +10 | Both tracks |
| Funding (Track B only) | ||
| Venture-backed Series A/B | +40 | Track B |
| $1-10M ARR range | +25 | Track B |
| Raised in last 12 months | +20 | Track B |
| Total funding $1-50M | +10 | Track B |
| Location & Legitimacy | ||
| English-speaking market (US, UK, Canada, Australia) | +10 | Both tracks |
| Has company website | +5 | Both tracks |
| Has phone number | +5 | Both tracks |
| Tier | Score (Track B) | Score (Track A) | Target Volume | Treatment |
|---|---|---|---|---|
| T0 | Hand-selected from T1 pool -- highest VIP Score + Workshop Fit + Reachability | 10-20 | MANUAL ONLY. Dedicated Sherlock dossier page, Loom audit, direct outreach by Jamie. Not in Instantly or HeyReach. | |
| T1 | 120+ | 90+ (tech founder, right size, English-speaking) | ~300-650 | Dossier + hyper-personalized + LinkedIn |
| T2 | 80-119 | 50-89 | ~1,500-2,500 | Segment-personalized templates |
| T3 | <80 | <50 | ~500-1,000 | Volume play, generic but targeted |
jamie.dopaminedigital.io/vip-pipeline/ with Loom audit scripts, multi-channel outreach plans, and customized messaging. In Airtable, T0 leads are marked: Tier=T0, Priority=Urgent, Outreach Queue=Manual, Lead Status="VIP - Manual Outreach", with Subject Hook and Personalization Line cleared (Jamie uses the full dossier instead).Plateau signals: "hiring freeze" in blog, flat team size on LinkedIn, job posts removed, founder posting about "refocusing." These are personalization gold -- "I noticed [Company] seems to be at an inflection point..."
634 T1 leads enriched with FireCrawl + Exa. Results:
Track B (263 T1): 99% hooks, 27% press, 37% podcasts, 26% hiring, 82% LinkedIn posts, 66% website signals
Track A (371 T1): 98% hooks, 12% press, 16% podcasts, 60% LinkedIn posts
Cost: ~2,074 FireCrawl credits + ~$9.51 Exa. Track B produces richer signals (funded companies have more press/content).
Sherlock ran for ~12 hours on Mac Mini, completing 95 deep-dive dossiers (~7.5 min each). Stopped early -- full 634 would have taken 3+ days, and the podcast invite template works without heavy personalization. The 95 dossiers cover the highest-value T1 leads.
Dossiers location: ~/Downloads/Jamie-Lead-Gen/6a-Sherlock-Dossiers/ (95 markdown files, copied from Mini)
Key learning: Deep dossiers are overkill for podcast invite outreach. FireCrawl + Exa hooks from Steps 10-11 give enough for a one-liner. Reserve Sherlock deep dives for top 50-100 leads only -- not the full T1 pool.
What this does: For each T1 lead's company website, FireCrawl scrapes the site and extracts structured signals -- hiring activity, team size, blog freshness, product updates. Claude Code runs the script and writes the results back to your CSV.
How it works (what Claude Code does behind the scenes):
1. Map the site -- FireCrawl's /map endpoint gets all pages on the domain in one call (1 credit). This finds the about, careers, blog, and team pages automatically.
2. Scrape key pages -- From the sitemap, it picks the 2-3 most useful pages (about/team, careers/jobs, blog/news) and scrapes them as markdown (1 credit each).
3. Extract signals -- Claude reads the scraped content and extracts: current team size, open job postings (hiring = growth), blog last updated date (stale = plateau), product launches, and any "refocusing" language.
4. Write to CSV -- Adds columns to your T1 file: Hiring_Active (yes/no/unknown), Blog_Last_Updated, Team_Size_Estimate, Website_Signals (free text summary).
What this does: Exa is an AI-powered web search. It finds things Google misses -- podcast appearances, niche press coverage, conference talks, and recent company news. This is where your best personalization hooks come from.
How it works:
1. Search for the founder -- Exa neural search for "[Founder Name] [Company Name]" finds podcast episodes, interviews, LinkedIn posts, and press mentions.
2. Search for the company -- Second search for "[Company Name] launch OR funding OR pivot OR growth" finds recent news, product announcements, and pivot signals.
3. Extract hooks -- Claude reads the Exa results (titles + URLs + text snippets) and pulls out the best personalization angles: "I heard your episode on [podcast]", "Saw [Company] just launched [feature]", "Congrats on the Series A".
4. Write to CSV -- Adds columns: Podcast_Appearances, Recent_Press, Personalization_Hook (the best opening line), Hook_Source_URL (link to the source).
What this does: Sherlock is a deployed OpenClaw agent running Opus on the Mac Mini. It gets ALL the enrichment data from Steps 10-11 as starting context, then uses its own web search, browser, and scraping tools to go deeper. It doesn't rediscover what Exa already found -- it follows threads, reads podcast transcripts, discovers pivot stories, corrects wrong data, and writes genuine intelligence briefs.
Proven results (Mar 6, 4 deep dives completed):
Matthew Peters / Envive AI (ICP 8.3/10): Corrected CEO title (he's Chief Architect), found ELMo paper (18,000+ citations), identified "invisible co-founder" pain signal. 14 sources, 12/15 searches.
Pratap Ranade / Arena (ICP 8.5/10): Discovered $62M double-raise pivot, Palantir acquisition backstory, ~$25.7M revenue (not in our data), active Substack. 15/15 searches.
Ben Borton / PodPlay (ICP 8.0/10): $8M Series A, spun out of PingPod ($19M Sequoia Heritage). 1M+ users, 200+ venues. Done 4+ niche podcasts but zero general founder shows -- media gap flagged.
Rob Hayden / Renew (ICP 8.8/10): $33M raised, created "retention management" category. Only 2 media appearances despite funding -- enormous media gap. Soundbite identified: "Renters don't churn from renting, they churn from relationships."
How it works:
1. Feed Sherlock the enriched lead data -- All CSV columns (name, company, title, funding, headcount, industry) PLUS the FireCrawl signals (hiring, website intel) PLUS the Exa signals (press, podcasts, hooks, LinkedIn posts). Sherlock starts from a strong position.
2. Sherlock investigates independently -- Using web_search (Brave API), web_fetch, and browser tools, Opus decides what to research. It might search for a founder's podcast appearance, scrape the episode page, read what they said, then search for their company's recent pivot. Each lead gets a unique research path.
3. Sherlock writes the brief -- A full intelligence memo saved as markdown: executive summary, ICP fit score table, company profile with pivot history, decision-maker profile with career timeline, pain signals with confidence levels, podcast fit assessment with objection reframes, recommended approach with specific hooks.
4. Batch script collects results -- Extracts summary columns (Email_Opening, Outreach_Angle, ICP_Fit_Score, Plateau_Score, Pain_Signal) from each brief and writes them back to the CSV.
Scale tiers (DEPLOYED -- running now):
| Deep dive | Top 50 per track (100 total) | Full 15-search investigation, complete dossier (~3 min each) | ~5 hrs |
| Quick scan | Next 150 per track (300 total) | 5 searches, executive summary + top pain signals + email opener (~1 min) | ~5 hrs |
| Synthesis | Remaining ~234 T1 | No web searches -- analyzes existing FireCrawl + Exa data into brief format | ~1 hr |
| Total | 634 T1 leads | Autonomous overnight batch on dedicated Mac Mini | ~11 hrs |
6 warmed domains active since January 2026, already generating replies. 18 sending accounts across 6 domains = 540 emails/day max capacity. Monitor spam scores weekly in Instantly -- pull back volume on any domain that dips below 95%.
T1: ~100-150 at 15-25% = 15-37 replies. T2: ~350-400 at 5-10% = 17-40 replies. T3: ~400-500 at 2-5% = 8-25 replies. Total: 40-100 conversations. Ramp: Week 1 at 10/day/domain (180/day), Week 2 at 20/day/domain (360/day), Week 3+ at 30/day/domain (540/day). Each lead gets a 3-email sequence over 7 days = actual runtime is ~3-4 weeks per batch.
All 10 email campaigns ACTIVE in Instantly and 4 LinkedIn campaigns in HeyReach. T1 was split into Personalized (leads with Sherlock/Haiku hooks) and Non-Personalized (generic template) for both SaaS and Funded segments. Claude Haiku generated 69 personalized hooks from Sherlock dossiers; rule-based fallback covered 383 more. ASCII sanitized, names/companies cleaned of LinkedIn artifacts, cross-file email dedup applied. 18 whitelisted sending accounts distributed across 10 campaigns. Files in ~/Downloads/Jamie-Lead-Gen/10-Instantly-Campaigns/final/
Take verified, tiered leads from Phase 5 and Sherlock dossiers from Phase 6. Run through the rebuild_csvs.py pipeline which: (1) generates personalized hooks via Claude Haiku from dossier data, (2) applies rule-based fallback hooks for leads without dossiers, (3) sanitizes all content to ASCII-only, (4) cleans LinkedIn artifacts from names and companies, (5) deduplicates emails across all files, and (6) outputs both Instantly email CSVs and HeyReach LinkedIn CSVs.
Personalization pipeline (T1 only):
1. Claude Haiku + Sherlock Dossiers (69 leads): generate_hooks.py sends each dossier's executive summary to Claude Haiku, returns subject_hook + personalization_line pairs saved to dossier_hooks.json.
2. Rule-Based Pattern Matching (383 leads): Regex patterns extract hooks from funding rounds, industry, company stage, and title keywords for leads without dossiers.
3. No Hook / Generic Template (370 leads): Email uses generic Approach B/C template -- no subject_hook or personalization_line columns populated.
Data cleaning pipeline (all tiers):
1. ASCII sanitization: Em dashes to hyphens, smart quotes to straight quotes, accented characters to ASCII equivalents, emojis stripped. Non-ASCII in subject lines triggers spam filters.
2. Name cleaning: Strips LinkedIn profile emojis, country flags, event tags ("[Speaker]", "(Hiring)"), parenthetical aliases.
3. Company cleaning: Removes taglines after dashes/pipes, truncates descriptions over 50 chars at word boundary.
4. Garbage hook filter: 25+ rules catch LinkedIn artifacts ("Name's Post"), dossier note fragments, truncated text, hashtag spam, URL-only content. Failed hooks are removed so the lead falls back to generic template.
5. Cross-file email dedup: T1 emails processed first; any T1 email appearing in T2/T3 files is removed from T2/T3 (lead keeps highest tier placement).
Email campaign CSVs (Instantly) -- 3,829 leads across 10 campaigns:
| Campaign File | Tier | Leads | Personalization |
|---|---|---|---|
| Jamie_Recently_Funded_T1_Personalized.csv | T1 | 100 | Sherlock dossier + Claude Haiku hooks (subject_hook + personalization_line) |
| Jamie_SaaS_SeriesA_T1_Personalized.csv | T1 | 142 | Sherlock dossier + Claude Haiku hooks (subject_hook + personalization_line) |
| Jamie_SaaS_SeriesA_T1.csv | T1 | 415 | Rule-based hooks + generic (no personalization_line) |
| Jamie_Recently_Funded_T1.csv | T1 | 163 | Rule-based funding hooks (no personalization_line) |
| Jamie_SaaS_SeriesA_T2.csv | T2 | 653 | companyName only |
| Jamie_Recently_Funded_T2.csv | T2 | 1,079 | companyName only |
| Jamie_Tech_Founders_T2.csv | T2 | 370 | companyName only |
| Jamie_SaaS_SeriesA_T3.csv | T3 | 102 | companyName only |
| Jamie_Recently_Funded_T3.csv | T3 | 282 | companyName only |
| Jamie_Tech_Founders_T3.csv | T3 | 523 | companyName only |
| TOTAL (Email) | 3,829 | 10 campaigns, 18 whitelisted accounts, cross-file deduped |
LinkedIn campaign CSVs (HeyReach) -- 1,575 leads across 4 campaigns:
| Campaign File | HeyReach Campaign | Leads | Notes |
|---|---|---|---|
| Jamie_LinkedIn_Only_T1_Personalized.csv | Jamie - T1 Personalized - Mar 2026 | 73 | Sherlock dossier leads, personalized connection messages |
| Jamie_LinkedIn_Only_T1.csv | Jamie - T1 LinkedIn - Mar 2026 | 294 | Multi-channel with email (connection request fires first) |
| Jamie_LinkedIn_Only_T2.csv | Jamie - T2 LinkedIn - Mar 2026 | 1,197 | LinkedIn-only outreach, blank connection note |
| Jamie_LinkedIn_Only_T3.csv | Jamie - T3 LinkedIn - Mar 2026 | 11 | Low volume, LinkedIn-only |
| TOTAL (LinkedIn) | 1,575 | 4 campaigns, merged by tier (not segment) |
Email CSV columns (camelCase for Instantly auto-mapping):
T1: email, firstName, lastName, companyName, title, linkedin_url, subject_hook, personalization_line, tier
T2/T3: email, firstName, lastName, companyName, title, linkedin_url, tier
LinkedIn CSV columns:
first_name, last_name, company_name, title, linkedin_url, personalization_line
Only 6 columns -- all enrichment columns stripped. HeyReach needs the LinkedIn URL to match profiles. Name/company/title map to HeyReach built-ins ({FIRST_NAME}, {COMPANY}, {POSITION}). The personalization_line column must be mapped as a custom variable during upload -- it becomes {PERSONALIZATION_LINE} in the message editor.
generate_hooks.py (Claude Haiku hook generation), rebuild_csvs.py (full CSV pipeline). Run from ~/Downloads/Jamie-Lead-Gen/10-Instantly-Campaigns/1. Instantly (Email): Upload 8 email CSVs. Create one campaign per CSV file. Map columns automatically (camelCase names match Instantly fields). Set sequences per the Campaign Playbook -- Approach A for T1 (uses {{subject_hook}} + {{personalization_line}}), Approach B/C for T2/T3.
2. HeyReach (LinkedIn): Upload 5 LinkedIn CSVs. Create one campaign per CSV. T1 campaigns are multi-channel (LinkedIn connection request fires first, email starts 2-3 days later). T2 campaigns are LinkedIn-only. Max 20 connection requests/day. All templates in Campaign Playbook.
3. Airtable (Master Database): Push all leads to Airtable at the same time as Instantly/HeyReach uploads. Airtable serves as the master lead database for tracking status, replies, and pipeline progression across both channels. Include all columns from the email CSVs plus a channel field (email, linkedin, or both).
HeyReach CSVs use only 6 columns in snake_case. Custom CSV columns become template variables (e.g. personalization_line becomes {PERSONALIZATION_LINE}). HeyReach also has built-in variables from LinkedIn: {FIRST_NAME}, {COMPANY}, {POSITION}.
first_name, last_name, company_name, title, linkedin_url, personalization_line
All enrichment columns (email, tier, ICP scores, etc.) are stripped -- HeyReach only needs the LinkedIn URL to match profiles and the name/company for templates.
| Channel | T1 | T2 | T3 | Total |
|---|---|---|---|---|
| Instantly (Email) | 820 | 2,102 | 907 | 3,829 |
| HeyReach (LinkedIn) | 367 | 1,197 | 11 | 1,575 |
CSVs are built. The next step is configuring and launching campaigns in Instantly and HeyReach. The Campaign Playbook is the single source of truth for:
Email templates -- T1 personalized (subject_hook + personalization_line), T2/T3 generic, follow-up sequences
LinkedIn scripts -- blank connection request, follow-up messages after accept
Spam-safe rules -- no links in Email 1, under 100 words, under 50 char subjects, ASCII only
Campaign operations -- 30/account/day hard cap, 6-campaign structure, account allocation, ramp schedule
Email + LinkedIn coordination -- parallel pacing, weekly send plan, channel offset timing
Subject line A/B tests -- personalized subject_hook vs generic variants, split test framework
VCs have portfolio companies that are stuck. They need advisors to recommend. But: founders DISTRUST VC recommendations. Jamie needs to build independent credibility first -- podcast appearances, case studies, social proof. VCs are a medium-term play, not immediate.
Subject: Resource for portfolio companies that have plateaued
Hi {{first_name}},
Quick question, do any of your portfolio companies feel stuck? Growing but not as fast as the model predicted?
I work with venture-backed SaaS founders specifically on this plateau problem. 2-4 week intensive focused on finding the 1-2 strategic blind spots holding them back.
If you ever need an outside advisor to recommend, happy to share my approach.
Fractional executives working inside SaaS companies see the plateau daily. They handle execution, Jamie handles strategy. Cross-referral opportunity -- zero competition.
Hi {{first_name}}, I noticed we work with similar companies (venture-backed SaaS, post-PMF). I focus on strategy (why growth stalled), sounds like you focus on {{their_specialty}}. Our clients often need both. Open to a referral relationship?
EOS gives companies process and structure. But sometimes the issue is strategic -- wrong market, wrong positioning, wrong GTM. Jamie is the complement: strategy on top of structure.
Subject: When EOS isn't enough, the strategy layer
Hi {{first_name}},
I keep meeting founders who've implemented EOS but are still stuck. The process is great, but sometimes the issue is strategic. Wrong market, wrong positioning, wrong go-to-market.
That's where I come in. I work with venture-backed SaaS founders on exactly this. Would love to be a referral option for your clients who need strategy, not just structure.
| Tool | Credits Used | Cost | What You Get |
|---|---|---|---|
| Sales Navigator | Included in subscription | ~99/mo | Unlimited searches + filter access |
| HeyReach (scraping) | Included in plan | Existing plan | Unlimited Sales Nav URL imports + CSV downloads |
| Expandi | ~2,000-3,000 lookups | Existing plan | ~1,000-1,500 personal emails found |
| Prospeo | ~800-1,200 lookups | ~29/mo (1K credits) | ~300-500 additional emails |
| Apollo | ~400-600 lookups | ~$109/mo (5K credits incl. 2.5K add-on) | ~100-200 additional emails |
| Exa | ~200-300 searches | Existing plan | ~30-80 emails + T1 research data |
| MillionVerifier | ~1,500-2,000 verifications | ~15-20 one-time | ~1,000+ OK-status emails |
| Crunchbase Pro | Search + spot-check | ~49/mo | 1,000 per export, 2,000 exports/mo. Tighten filters to stay under 1K. |
| FireCrawl | ~100-150 pages | Existing plan | T1 company data |
Total incremental cost: ~100-140 for this entire 1,000-lead build. Most tools are already on existing plans.
Biggest credit waste: Enriching leads that don't fit. Old approach: scrape 8K leads, enrich all of them, then qualify. That burns 8K Expandi credits on leads where 70% get rejected.
This pipeline's fix: Qualify BEFORE enriching (Step 3 before Step 4). Only ~2-3K qualified leads hit Expandi. Saves 5,000+ wasted lookups.
Second biggest waste: Researching leads with dead emails. Old approach: build dossiers, then verify. This pipeline verifies BEFORE tiering (Step 8 before Step 9). No dossier time wasted on bounced emails.
Third waste: Using expensive tools when cheap ones work. Waterfall order matters: Expandi (included) catches 40-60%, then Prospeo (cheap), then Apollo (moderate), then Exa (most expensive per lead). Reverse this order and you spend 3x more.
| Folder | Contents | Key Files |
|---|---|---|
| 1-Raw-Scrapes/ | HeyReach exports + Sales Nav cleaned CSVs | 5 files |
| 2-Crunchbase-Sources/ | CB company exports, domain lists, Prospeo founder lookups | 13 files |
| 3-Dedup-Clean/ | Deduped master files (original + updated parts) | 5 files |
| 4-Enrich/ | Enriched leads -- CB + SalesNav + combined master | 4 files |
| 5-Verify/ | MillionVerifier OK-only files (campaign-ready emails) | SalesNav_Founders_Verified_OK.csv (1,816), CB_Founders_Verified_OK.csv (1,845) |
| 6-Uncontacted-Ready/ | Uncontacted leads deduped against existing contacts | 2 files |
| 6a-Sherlock-Dossiers/ | 95 deep-dive markdown intelligence briefs from Sherlock | 95 .md files (copied from Mac Mini) |
| 7-Scripts/ | Python scripts, enrichment logs, strategy docs | t1_enrichment.py, filter_jamie_leads.py |
| 8-Old-Tests/ | Early test batches, ICP filtering, rejected leads | 13 files (archival) |
| 9-Airtable-Exports/ | Mastersheet database dumps from Airtable | 2 files |
| 10-Instantly-Campaigns/ | Final campaign CSVs for Instantly + HeyReach | 10 email CSVs (3,829 leads) + 4 LinkedIn CSVs (1,575) + rebuild_csvs.py + generate_hooks.py + push_to_campaigns.py |
| Step | Action | Tool | Input | Output |
|---|---|---|---|---|
| 0 | VERIFY DOMAIN HEALTH | Instantly | 6 active domains | Confirm all scoring 95%+ deliverability |
| 1 | Build 9-12 Sales Nav sub-searches (each under 2,500) | Sales Navigator | Filters from tables above | Search URLs |
| 2 | Scrape each sub-search URL | HeyReach | 7 Sales Nav URLs | 7 CSVs (~8.8K raw, heavy overlap) |
| 3A | Dedup + qualify (remove bad titles/industries) | Claude Code + Google Sheets | Raw CSVs merged | ~2-3K unique qualified leads |
| 3B | Source funded companies from Crunchbase | DataScraper + Crunchbase + Sheets | ICP filters from Step 3B | Funded company CSV with revenue/headcount data |
| 4 | Find personal emails | Expandi | Qualified CSV | ~1,000-1,500 with emails |
| 5 | Fill Expandi gaps | Prospeo | Expandi misses | +200-400 emails |
| 6 | Fill Prospeo gaps | Apollo | Prospeo misses | +100-200 emails |
| 7 | Last-resort search | Exa | Apollo misses | +30-80 emails |
| 9 | No-email leads to LinkedIn | HeyReach | No-email CSV | 200-500 LinkedIn-only campaigns |
| 8 | Verify all emails | MillionVerifier | All enriched merged | ~1,000+ OK emails |
| 9 | Tier leads T1/T2/T3 | Claude Code | Verified CSV | 678 T1 / 2,102 T2 / 907 T3 |
| 10 | Scrape T1 websites | FireCrawl | T1 CSV | Company data + hiring signals |
| 11 | Company intel search | Exa | T1 CSV | News, podcasts, hooks (629 enriched) |
| 12 | Deep research (top T1) | Sherlock (OpenClaw) | FireCrawl + Exa | 95 deep dossiers (stopped early -- overkill for podcast invite) |
| 13 | Build campaign CSVs + deploy to Instantly | Claude Code + Python + Instantly API | Verified + tiered CSVs + dossiers + Claude Haiku | 10 Instantly campaigns (3,829 leads) + 4 HeyReach campaigns (1,575 LinkedIn). T1 split into Personalized + Non-Personalized for both SaaS and Funded. 18 whitelisted accounts distributed. |
| 14 | Upload T1 to HeyReach | HeyReach | T1 CSVs | LinkedIn connection sequences (blank note) |
| Continue to Campaign Playbook → | ||||
fix_airtable_records.py, repush_missing_to_airtable.py, clean_personalization.py, push_remaining.py, clean_and_manifest.py. Each one exists because a validation wasn't run before pushing. The validation code exists - it just wasn't enforced.| Stage | In | Out | Drop | What Was Wasted |
|---|---|---|---|---|
| Raw scrape (both tracks) | ~8,800 | 6,180 | 30% | Expected overlap from sub-search design |
| Title cleanup (post-scrape) | 6,180 | ~5,225 | 15% | Minor cleanup - Sales Nav filters did the heavy qualification |
| Enrichment (3 tools) | ~5,225 | 5,119 emails | 2% | 1,061 leads with no email found anywhere |
| MillionVerifier | 5,119 | 3,935 | 23% | 1,184 bad emails = wasted enrichment credits |
| ICP qualification | 3,935 | 3,633 | 8% | Wrong-fit leads that made it through title filter |
| Sherlock (T1 only) | 95 run | 69 usable hooks + 15 T0 VIPs | 27% | Research depth too high - full briefs when lighter pass would suffice |
| Raw to campaign-ready | ~8,800 | 3,829 | 57% | Main leaks: bad emails (23%), Sherlock depth, remediation script overhead |
| What Happened | What Should Happen | Impact |
|---|---|---|
| Sherlock full-depth dossiers (7.5 min/lead x 95) | Lighter research pass (~3 min/lead) - still finds T0 candidates + hooks | ~7 hours saved (5h vs 12h) |
| No manual T1 review before Sherlock | 15-min manual T1 review to flag obvious non-fits before spending compute | Could cut Sherlock run by 20-30% |
| Cross-track dedup (Sales Nav vs Crunchbase) at Step 9 | Cross-track dedup BEFORE enrichment | Unknown overlap enriched twice |
| Waterfall: Expandi (43.6%) then Apollo (60.6%) | Test Apollo first - higher hit rate on this ICP | May reduce total enrichment calls needed |
build_campaigns.py had wrong column names, so rebuild_csvs.py was written to fix it, then add_website_to_csvs.py added more columns. One consolidated script with validation gates would have prevented all three.push_to_campaigns.py auto-distributes accounts but doesn't filter against the whitelist. 2 non-whitelisted accounts got assigned. Build the whitelist into the script.sum(daily_limits) and warn if it exceeds total_accounts * 30.datetime.now() - timedelta(days=1).Same output quality. Half the steps. No remediation scripts.
| Step | Action | Tool | Key Change from v1 |
|---|---|---|---|
| 1 | ICP + Segment Design Sales Nav sub-searches + Crunchbase filters. Explicit exclusion review before scraping. | Sales Nav + Crunchbase | Add pre-scrape exclusion checklist (Financial Services, CXO, etc.) |
| 2 | Scrape (parallel tracks) Sales Nav via HeyReach + Crunchbase via DataScraper. Cross-track dedup immediately. | HeyReach + DataScraper | Cross-track dedup BEFORE enrichment, not after |
| 3 | Title Cleanup + Cross-Track Dedup Quick title filter (remove non-founders that slipped through Sales Nav). Dedup Sales Nav vs Crunchbase leads before enrichment. | Claude Code + Python | Cross-track dedup moved earlier. Sales Nav filters handle main qualification. |
| 4 | Waterfall Enrichment Prospeo (or Apollo) first, then backfill. Domain pre-check before reveals. Hard credit caps enforced in script. | Prospeo + Apollo | Reorder based on hit rate data. Domain pre-check catches bad domains before credits spent. |
| 5 | Verify MillionVerifier on all found emails. Track which enrichment source had the highest invalid rate. | MillionVerifier | Add per-source quality metrics to inform future waterfall ordering |
| 6 | Tier + Manual T1 Review Score into T0/T1/Volume. 15-minute manual T1 review is a hard gate before Step 7. | Claude Code | Collapse T2+T3 into "Volume." Manual review gate is non-negotiable. |
| 7 | Sherlock (lighter depth) + Exa Sherlock runs on all T1 at reduced depth (~3 min/lead instead of 7.5). Surfaces T0 VIP candidates + produces hooks. Exa backfills podcast/press data for leads Sherlock missed. Manual T1 review first. | Sherlock + Exa | Same coverage, half the runtime. ~5 hours instead of 12. Lighter research pass still finds T0s and hooks. |
| 8 | Build + Validate + Deploy (one script) CSV build, cross-file dedup, whitelist audit, workspace cap check, push to Instantly + HeyReach + Airtable. All validations are blocking gates. | Python + Instantly API + HeyReach API | One script replaces 3 build scripts + 5 fix scripts. Validations are gates, not afterthoughts. |
Estimated time savings: v1 took ~5 days end-to-end with fixes. v2 targets 2-3 days with zero remediation scripts. The pipeline script for Step 8 should be built once and reused across all clients - only the ICP filters and templates change.