B2B Lead Generation Pipeline
A script that turns Google Maps into a sales prospect list: 10,230 Manhattan businesses, 4,418 with emails, mailed as 11 category sequences through lemlist.
- Client
- Wallniture
- Year
- 2026
- Role
- Design and build
- Category
- Software / Development
- Scope
- Data pipeline · Web scraping · Cold outreach · Cost control
- Stack
- Python · Google Places API · asyncio/httpx · SQLite · openpyxl · lemlist · Claude MCP
- Skills
- Claude Code
- Growth Management
- Marketing
- E-Commerce
A script that turns Google Maps into a sales prospect list, and the campaign that mails it.
It sweeps Manhattan on a 40-tile map grid, searching 14 business types that fit our product catalogue: boutiques, coffee shops, wine bars, salons, galleries. For every business it finds, it pulls the name, address, phone and website from the Google Places API, then crawls that website to scrape the email, Instagram handle and contact page: data Google does not provide.
Before exporting, it cleans the list. Duplicates found under multiple keywords are merged, and chains are collapsed (four or more locations on one domain become a single row), so fifteen Sephora branches do not pad the file. The output is a filterable Excel sheet.
It found 10,230 unique Manhattan businesses, 4,418 of them with emails and 5,233 with Instagram profiles.
Every mail goes out through lemlist
The whole campaign is sent on lemlist, and I run lemlist from Claude over MCP rather than through the dashboard.
That changes what a campaign costs to build. I describe the segment in a sentence; Claude creates the campaign, imports the leads with their per-lead variables, writes the sequence steps and sets it live. There are no CSV round-trips and nobody clicks through a builder eleven times.
Eleven is the number that matters here. The list splits into 11 category segments and each one gets its own sequence, written to its own room and using our own product photography: Pour it, pair it, show it off to wine bars, Make the wall part of the welcome to restaurants, a wall of trailing pothos to plant shops. Every frame comes from the Wallniture image library I direct, so a recipient sees the product doing their job rather than sitting on a white background.
Details that made it work
- Google caps searches at 60 results, so dense tiles automatically split into quadrants and re-search. That is what keeps Midtown from coming back half empty.
- A built-in spend tracker prices each API call and hard-stops at a set dollar limit. Smart field-masking keeps most calls on Google’s free tier.
- SQLite stores every stage, so runs resume after an interruption and monthly refreshes only pay for businesses that are actually new.
- Adding a new city means writing a new JSON file of map tiles. The code stays as it is.
- Adding a twelfth segment takes a paragraph to Claude instead of an afternoon in a campaign builder.




