Local Business TAM from Directories
Local Business TAM from Directories is a six-step outbound play for email, calls and your CRM, from “Size the market before paying for it” to “Tier and load”. It uses Browserbase, Apify, Google Maps, Clay, Claude and seven more tools.
- Motion
- Outbound
- Channel
- Email, Call, CRM
- Steps
- 6
- Tools
- 12
The workflow
Local Business TAM from Directories
One search per region and category. Read the result count, scrape nothing.
BrowserbaseShows coverage, which categories are noise, and whether a term runs dry early.
Apify
Google MapsSearch the whole region, exclude cities afterwards. Maps lists locations, not companies.
Apify
Google MapsConfirm page 1 and page 2 differ before crawling. Resumable on region, category and offset.
BrowserbaseFind a site for address-only rows, then read the team page for the owner.
Clay
ClaudeOnly the misses move to the next provider. Nothing goes out unverified.
Prospeo
Findymail
BounceBanBefore anyone calls: the listing is not marked closed, the phone still connects, and the email is re-verified on the day it is sent.
Google Maps
ZeroBounce
Call, then emailNowThe phone came with the listing. A rep calls first, then the sequence starts.
Nooks
HubSpot
Smartlead
Email onlyAutoThe copy names the category and the city the business was found under.
Smartlead
Browserbase
Apify
Google Maps
Clay
Claude
Prospeo
Findymail
BounceBan
ZeroBounce
Nooks
HubSpot
Smartlead
The diagram as text
- 1
Size the market before paying for it
Directory totals (free and exact): One search per region and category. Read the result count, scrape nothing. Fetch: Browserbase.
Maps pilot (30 per term): Shows coverage, which categories are noise, and whether a term runs dry early. Run: Apify and Google Maps.
Hard dollar cap agreed before the full run. The cap is per search term.
- 2
Scrape two kinds of source
Google Maps (widest coverage): Phone, Website, Address and Rating. Search the whole region, exclude cities afterwards. Maps lists locations, not companies. With: Apify and Google Maps.
Industry directories (category detail): Category, Address and Paid listings. Confirm page 1 and page 2 differ before crawling. Resumable on region, category and offset. With: Browserbase.
- 3
De-duplicate across sources
Match on → Then
- Same website domain → Merged, richest copy kept
- Same name and street address → Merged across sources
- Directory or link-in-bio domain → Domain blanked, never matched
- One business, several cities → One row, every city kept
- 4
Enrich, then check it is still true
Website and owner: Find a site for address-only rows, then read the team page for the owner. Match: Clay. Read: Claude.
Email waterfall: Only the misses move to the next provider. Nothing goes out unverified. Find: Prospeo and Findymail. Verify: BounceBan.
Labeled connection: Then.
Freshness check (listings go stale): Before anyone calls: the listing is not marked closed, the phone still connects, and the email is re-verified on the day it is sent. Status: Google Maps. Verify: ZeroBounce.
- 5
Tier, then load
Tier 1: Several sites, strong reviews
Call, then email (now): The phone came with the listing. A rep calls first, then the sequence starts. Call: Nooks. Log: HubSpot. Send: Smartlead. Tool: Nooks.
Tier 2 and 3: Single site or thin data
Email only (auto): The copy names the category and the city the business was found under. Send: Smartlead. Tool: Smartlead.
Outcome: A deduped local TAM, tiered and reachable. Tools: HubSpot.
Feedback loop: The raw scrape is kept, so new filters and new tiers re-run on it at no cost.
The stack: Browserbase, Apify, Google Maps, Clay, Claude, Prospeo, Findymail, BounceBan, ZeroBounce, Nooks, HubSpot and Smartlead.
Open the diagram full size (1180 px wide)
The play in six steps
- 01
Step 1: Size the market before paying for it
Local businesses are thin or missing in B2B databases, but most directories will tell you how many listings exist before you scrape a single page.
- Fetch one result page per region and category with Browserbase and read the total. It costs nothing and it is exact.
- Run a Google Maps pilot on Apify at 30 places per search term. If every term fills all 30, there is more supply. If terms come back short, the full run will stop early.
- The cap is per term, not a total: multiply it by the number of terms to get the real size of the run.
- Agree a hard dollar budget before the full run starts.
- 02
Step 2: Scrape Google Maps
Maps has the widest coverage of local businesses and carries a phone, a website and an address on most rows.
- Use the Apify Google Maps actor with two or three phrasings of each search term.
- Search a whole state or region, then drop cities afterwards instead of narrowing the query.
- Pass a max spend so Apify stops charging at the budget.
- Filter on category. Broad terms pull in neighbouring trades.
- Maps lists locations, not companies. A business with five offices shows up five times.
- 03
Step 3: Add the industry directories
Trade and professional directories hold businesses Maps misses, plus category detail Maps never had.
- Fetch result pages with Browserbase. Server-rendered listings need no browser session and no LLM.
- Find the parameter that really changes the page: fetch page 1 and page 2 and confirm they differ before crawling.
- Category labels are exact strings. Test each one on a single fetch first.
- Make the crawl resumable on region, category and offset, with retries.
- Expect contact data only on paid listings. Free listings usually carry a name and an address.
- 04
Step 4: De-duplicate across sources and cities
The same business turns up in several sources, several categories and several neighbouring cities, and every duplicate is a wasted call.
- Match on website domain first, then on normalised name plus street address.
- Blank directory and link-in-bio domains before matching, or unrelated businesses collapse into one row.
- Keep the richest copy of each record, plus the full set of categories and cities it appeared under.
- Count rows with a CSV parser, not a line count. Descriptions carry line breaks.
- 05
Step 5: Enrich the website, the owner and the email
Directories rarely publish emails, so the contact layer is built downstream, and a listing that closed last month is worse than no listing.
- Resolve a website in Clay for rows that arrived with only a name and an address.
- Have Claude read the about or team page and name the owner or principal.
- Run the email waterfall in Clay: Prospeo first, Findymail on the misses, BounceBan on everything found.
- Run a freshness check before anything is sent:
- Drop listings Google Maps marks as permanently or temporarily closed
- Drop phone numbers that no longer connect
- Re-verify the email with ZeroBounce on send day, not the day it was found
- 06
Step 6: Tier and load
A local TAM is large and uneven, so the tier decides where a rep's time goes.
- Score on what the sources actually hold: number of locations, review count and rating, website quality, category fit.
- Tier 1 gets a call through Nooks and then an email. The number is a published business line, so a call is fair.
- Tier 2 and 3 get email only through Smartlead, naming the category and city they were found under.
- Load companies and contacts into HubSpot before the first send.
- Keep the raw scrape so filters can be re-run later at no cost.
Tools used
The twelve tools this play names. Each links to the other plays that use it.
Related plays
Public Records Signals
Government APIsFree, read-onlyDaily for declarations, weekly for filing phrase searches.
Portals with no APIReal browserThrottled, sessions recycled. Portals behind a CAPTCHA are out.
Browserbase
Firecrawl
One row per recordDate, source URL, verbatim excerptA record names a legal entity or a place, not your CRM account.
HubSpot
SalesforceCustomers, open deals and competitors come out first.

Claude reads the excerpt and gives a one-line reason.

Owner alertThis weekRecord link, excerpt and matched sites, straight to the owner.
Slack
HubSpotThe right contact, then a checked email.
AI Ark
Prospeo
Findymail
BounceBanAdds weight to the account score. Never opens a message.
HubSpotSomething the buyer can check for themselves, with the source link at hand.
Smartlead
Nooks
SEC EDGAR
Browserbase
Firecrawl
Clay
HubSpot
Salesforce
Claude
Slack
AI Ark
Prospeo
Findymail
BounceBan
Smartlead
Nooks
Public Records Signals
5 steps · Email, Call, CRM





+8 moreCompetitor Post Engagers
Every competitor page that posts.
LinkedInThe people who post for them, reviewed monthly.
LinkedIn
New posts from the last 24 hoursDeduped by post id
Post engagersScraped once per postA comment counts for more than a reaction. The post travels with every engager.
Apify
Clay
Explorium
Prospeo
Findymail
BounceBanICP industry, headcount and region. Competitor staff and partners come out.


The titles that buy, not everyone who reacts.

Customers and open deals are removed.

“An opener written from the post topic”
The engagerDay 0A LinkedIn message, on the platform where they saw the post.
HeyReach
Their colleaguesDay 3The buying committee hears the same angle by email.
Smartlead
BounceBanon send day

LinkedIn
Apify
Clay
Explorium
HubSpot
Prospeo
Findymail
BounceBan
Claude
HeyReach
Smartlead
Slack
Competitor Post Engagers
6 steps · LinkedIn, Email, CRM





+6 moreContact Data Refresh Before Every Send
Contacts queued for next week's sendsLists and sequencesCompare the current LinkedIn role with the CRM record.
LinkedIn
ApifyRe-verify on send week, not on the day it was found.
BounceBan
ZeroBounceLook up carrier and line type, drop disconnected numbers.
TwilioThe new person in the same seat inherits the account context.
Apollo
Clay
Findymail
ProspeoA past champion who moved is often the warmest lead you have.
LinkedIn
FullEnrichAnything still unverified is held for the next cycle.



HubSpot
LinkedIn
Apify
BounceBan
ZeroBounce
Twilio
Clay
Apollo
Findymail
Prospeo
FullEnrich
Smartlead
Contact Data Refresh Before Every Send
4 steps · Email, LinkedIn, Call, CRM





+6 more