Automation · 12 steps
Verified lead list automation: Sales Navigator search to an import-ready file
A saved people search goes in. A deduplicated, verified, import-ready lead file comes out, with every catch-all address held back.
Built by Matt Cruz, Modern Code Consulting
The problem
Most cold email lists go wrong before the first send. Scraped names come in messy, most rows have no email, the same person shows up twice and some of the people on the list are not buyers at all.
Load that straight into a sending tool and you pay for lookups on people you never should have emailed, and the bounces and catch-all addresses land on the domain you send from.
What I built
I built this to take a saved Sales Navigator people search and turn it into a file I would actually load into a campaign. It runs a small sample first, checks fit and cost per lead, and stops for the owner's go before any bulk credits get spent.
A Claude Code skill makes the fit calls row by row. Python scripts do the exact work, one per outside service: import and dedupe, fill the missing emails, verify every address and build the import file. Only addresses that verify ok make it into the file. Catch-alls stay on disk and never reach the sending tool.
How it works, step by step
A Claude Code skill runs the procedure and makes the fit calls. Five Python scripts do the exact work, one per outside service.
Stage 1 · Tune and sample
Tune the search on page one
SubstitutedScores the first page of 25 results for two versions of the search and keeps the one with more real buyers on it, before any credit is spent.
Sales Navigator, sales-nav-leads skill
Run a 50-profile sample first
SubstitutedScrapes 50 profiles, then pushes them through the whole funnel: normalise and dedupe, find the missing emails, verify every address.
vayne_sales_nav.py, anymailfinder_enrich.py, millionverifier_bulk.py
Stage 2 · Check, then ask
Check fit and cost per lead
RanReads the sample rows for fit, counts the email funnel by source and works out the cost of one sendable email, then checks all three against the skill's limits.
sales-nav-leads skill
Wait for the owner's go
Not runSends the sample numbers and the credit estimate for the full pull, then waits. Nothing bulk runs without an explicit go.
The owner
Stage 3 · Pull and clean the list
Scrape the full 60 profiles
SubstitutedRuns the same search for the 60 profiles asked for and downloads the export.
Vayne scraper
Normalise, dedupe, exclude
RanMaps the export's columns to the lead layout, removes repeated profiles and drops anyone at a company that was already in an earlier campaign.
vayne_sales_nav.py
Screen every company for fit
RanReads every row's title, company, size, location and company description, labels it on, border or off, and keeps one contact per company, so no lookup is paid for on a bad row.
sales-nav-leads skill
Stage 4 · Find and verify emails
Fill in the missing emails
SubstitutedLooks up only the rows that have no email, keeps only finds the service marks valid, and writes the rest to a no-email file.
anymailfinder_enrich.py, Anymailfinder
Verify every address
SubstitutedSends every email, whichever tool found it, through the verifier and writes the result next to each row.
millionverifier_bulk.py, MillionVerifier
Hold catch-alls, ship only ok
RanSplits the verified list: only addresses marked ok go into the sendable file. Catch-all, unknown and invalid rows stay on disk and never reach the sending tool.
millionverifier_bulk.py
Stage 5 · Build and load
Build the campaign import file
RanKeeps rows that are verified ok and on-fit, reduces each first name to a clean given name, fills the campaign's two merge fields and writes the four-column import file.
itmsp_import_ready.py
Upload to the live campaign
Not runWould add the 29 leads to the live sending campaign, skipping anyone already in the workspace. Sends would start at the next schedule window.
instantly_campaign.py, Instantly
The recorded run
This is a real run of the automation on an invented business: a backup tool sold to IT service providers. Use the tabs inside it to move between the overview, how it's built, the step-by-step run and the result.
What ran for real: The sender, people, companies and domains are invented. The import, dedupe, exclusion, catch-all split and import-file scripts ran for real, offline, on that data, and the fit reads were done row by row. No search, scrape, email lookup or verification was bought: those four steps used invented exports and vendor answers and are marked substituted. The owner's go and the live upload were not run. File paths are shown in the pipeline's usual relative layout.
The run is laid out for a desktop screen.
More automations
- Personalising a cold email listA messy scraped lead list goes in and a send-ready list comes out, with a natural first name, a company name a person would say and a one-line opener on every row.
- Cold email reply reviewEvery campaign's numbers and every reply go in, and the positive reply rate, what changed since last time and the lines of copy behind the replies come out.
- Paid deposit to project kickoffA client pays the deposit, the deal closes, a dated project plan is built and a kickoff document is ready, with no hand on the CRM.
- Keeping a long multi-agent build on trackA project board goes in, and any fresh session can pick the build up from one file and one board read.
Want something like this running in your business?
Book a free 15-minute call. Tell me where the hours and the leads are leaking, and I'll tell you what I'd automate first and what it would cost.
Book a free automation audit