The 7-Step Cold Email Workflow That Booked 98 Sales Calls in One Month for Local Business Clients
How we booked 98 sales calls and generated $220K in pipeline in January using a Clay-based cold email workflow targeting local businesses.
Most people targeting local businesses with cold email are either pulling garbage data from Apollo or manually building lists that go stale before they even hit send. I've spent four months building and refining a workflow that fixes both problems, and in January alone it produced 98 booked sales calls and $220,000 in pipeline across three clients. One campaign alone generated 262 leads from roughly 8,000 contacts. Here's the exact seven-step framework.
Step 1: Identify Your Target Categories Using Google Business Profile Keywords
Before you touch any tool, you need to know precisely who you're going after. For local businesses, the right starting point isn't a job title search on Apollo. It's figuring out how customers find these businesses on Google.
I use a free tool called doton luca.com, which publishes a complete list of Google My Business profile categories. You might target only dentists, or you might target dentists, doctors, and anesthesiologists together. The beauty of this workflow is that you can load multiple keyword categories into a single table and run them all without splitting into separate batches. The personalization stays sharp regardless.
Step 2: Scrape Google Maps with Serd
Once you have your keywords, you need the actual business data. I use a scraper called Serd for this. It's significantly cheaper than alternatives like Outscraper or D7 Lead Finder, and the data accuracy is noticeably better.
The setup is straightforward: plug in your keyword (say, "CrossFit gym"), drop in the latitude and longitude coordinates for your target cities, specify which page of Google Maps results to scrape, and add your API key. A $50 credit load gives you enough to build roughly 100 lists. When the HTTP request returns a 200 status, you've got your results: business name, address, website, phone number, ratings count, hours, and coordinates. That's your raw material.
Step 3: Clean and Enrich Company Data in Clay
Raw scrape data has holes. Websites are missing. Company names have "LLC" or "Inc." tacked on. That's where Clay comes in, specifically its Workbooks feature, which almost nobody talks about but is genuinely one of the most useful things in the tool.
Inside Clay, I run the scraped data through several cleaning steps:
Normalize company names using Clay's native function to strip legal suffixes.
Find missing websites using a Claude/ChatGPT integration that browses the web to fill gaps Google Maps left behind.
Validate URLs to confirm the website actually loads. If a business doesn't have a working website, I skip them.
Filter out directory listings like google.com, manta.com, or instagram.com that slip through as "websites."
Score for franchise status using a ChatGPT prompt that estimates how many locations a business has. Anything that scores as a franchise gets excluded. I'm not wasting budget on a chain with 5,000 locations. I want the owner-operated gym or the dental practice on the verge of opening a second location.
Step 4: Find Decision Makers and General Emails
This is where the workflow earns its keep. For local businesses, you won't find the owner on Apollo or ZoomInfo. They're not there. So I use Clay's ChatGPT integration to visit the company website and search the broader web for founder names and contact information.
I also pull Facebook URLs alongside LinkedIn. For local businesses, Facebook is often where the owner is most active and where you'll find the email address they actually check. I then run a ChatGPT prompt against both the Facebook and company URLs to surface general contact emails.
Here's my take on general emails: everyone says don't use them. I disagree completely. For local businesses, the owner is often the one behind info@theirgym.com or hello@theirdentalpractice.com. We reach out to general emails constantly and the results are strong. The one caveat is filtering out obvious non-owner addresses: support@, payroll@, customerservice@. I have a formula that strips those out automatically before anything else runs.
📥 Best Email Verification Services
Stop bounces before they kill your domain. 6 verification services ranked by accuracy.
Step 5: Separate and Organize Your Lead Data
Once enrichment is done, you have two distinct types of contacts: general business emails and identified founders. Mixing them into one flat list is how you end up with broken personalization and embarrassing copy.
I push general emails into their own table and founders into a separate work email table. For the general email table, I create a "first name" field that reads as the business name plus "team," so the email opens with something like "Hey Grass Valley CrossFit team" instead of "Hey there." It reads naturally and it's specific enough to not feel like a blast.
For the founders table, I also use Apollo as a supplementary source. I take the validated domains from Clay, paste them into Apollo with the relevant job titles, and export a lead list. That data flows back into Clay and merges with the founder records I already identified.
Step 6: Verify Emails and Push to Campaign
Verification is non-negotiable. A high bounce rate will wreck your sending infrastructure faster than anything else.
My stack here: - Million Verifier for standard email validation. - Bounce Ban for catchall email validation (risky emails that standard verification can't confirm). - Email Guard to identify each prospect's email service provider (Google, Outlook, custom server). This matters because your sending infrastructure will land differently depending on the recipient's mail environment. Tracking it lets you monitor deliverability patterns.
Once emails are verified, Clay pushes them directly into Smartlead or Instantly with a condition: only push if the email is valid. Unverified or undeliverable addresses never enter the campaign. The whole push is automated.
Step 7: Monitor and Scale by Adding Data, Not Rebuilding
The only ongoing manual work is deciding when to scrape more. If I've already pulled pages one through seven of Google Maps results for "fitness center" in a given city, I go back to the base table, update the page number to eight, hit save and run, and the entire workflow executes automatically from that point forward. New locations, new keywords, same process.
This is what makes the workflow genuinely scalable. You're not rebuilding anything. You're feeding the top of the funnel and letting the automation handle the rest.
Key Takeaways
Use Google My Business profile categories (via doton luca.com) to define targeting, not generic job title searches.
Serd is the cheapest and most accurate Google Maps scraper available right now. $50 covers roughly 100 list builds.
Clay Workbooks let you run multi-step enrichment, deduplication, and validation in a single connected workflow.
Don't ignore general emails for local businesses. Filter out support/payroll/customer service addresses, but the owner is often behind the general inbox.
Franchise scoring via ChatGPT saves significant budget by excluding chains before enrichment costs are incurred.
Always verify with a two-layer approach: standard verification plus catchall validation. Never push unverified emails to your sending platform.
Scaling means adding new pages or keywords to the base table, not rebuilding the workflow from scratch.
Frequently Asked Questions
Why scrape Google Maps instead of just using Apollo or ZoomInfo for local business leads? Most local business owners aren't in Apollo or ZoomInfo at all. Those platforms index professional contacts at companies with a meaningful web presence. A gym owner or independent dentist often isn't listed. Google Maps gives you the actual business data, and the enrichment workflow finds the owner from there.
Is it really okay to cold email general business addresses like info@ or hello@? For local businesses, yes. The owner is frequently the person managing that inbox. The key is filtering out functional addresses like support@, payroll@, or customerservice@ before sending. Those are clearly not decision-makers. Everything else is fair game and, in practice, produces strong results.
How do you prevent high bounce rates from hurting deliverability? Two layers of verification: Million Verifier for standard validation, and Bounce Ban specifically for catchall emails that standard tools mark as risky. Then a hard condition in Clay that blocks any unverified or undeliverable address from being pushed to the sending platform. Bounce rate stays controlled.
What's the franchise score and why does it matter? It's a ChatGPT-generated estimate of how many locations a business has. If a business scores as a franchise with hundreds or thousands of locations, it gets excluded from the rest of the enrichment. The goal is owner-operated businesses where a single decision-maker can say yes. Reaching out to a franchise location is a waste of sending credits and a dead end for closing.
Your pipeline, rebuilt.
20-minute strategy call. We'll audit your ICP, show you which signals we'd track, and map out exactly what the first 120 days would look like. No commitment, no pressure, no pitch deck.