Built from the biggest lists run in InstaMaps

Turn a scraped lead list into the list your client asked for

Scrapers cap each search, so a city becomes one search per ZIP code, and the exports overlap and spill past the radius. In Google Sheets™, a few formulas clean the addresses, catch the duplicates, keep the businesses inside the radius and add the county. Free.

Get the ZIP codes in your radius →
Free · official Census ZIP centres · CSV · no login
Built for

Lead-list builders, virtual assistants and small list agencies building B2B prospect lists for US clients, mostly from Google Maps scrapes.

What the generic tools get wrong

Scraper searches are capped, so you run one search per ZIP code, and neighbouring ZIPs return the same businesses.
The same business comes back as "123 Main St" and "123 Main Street", so Remove duplicates misses it.
The client asked for a radius, and a ZIP-by-ZIP search returns businesses outside it.
Free geocoding in Sheets stops partway through a long list with "Service invoked too many times for one day".

How you'd use it

  1. Get every ZIP code inside the client's radius from the free ZIP radius tool, and run one scraper search per ZIP.
  2. Remove exact duplicates first, before spending any lookups: Data → Data cleanup → Remove duplicates, on the place ID or phone column.
  3. Standardise the addresses with =CLEAN_ADDRESS(A2:A400), then remove duplicates again on the cleaned column, so "Main St" and "Main Street" now match. =CLEAN_ADDRESS(A2:A400, "check") adds a map link to spot-check any row.
  4. Keep only the radius: =WITHIN_RADIUS("78701", B2:B400, 25, "mi") lists the addresses inside it with their distance, nearest first. For whole rows, =ASK(A1:J2001, "within 25 miles of Austin") returns every matching row with its header.
  5. Add columns with =COUNTY(B2:B400), =ZIP(B2:B400), =CITY(B2:B400) and =STATE(B2:B400). They reuse the addresses the sheet has already looked up.
  6. Split the list between reps with =TERRITORY(B2:B400, 4), or give it a range of rep names instead of 4.
  7. Send the client a map: =INSTAMAP(A1:J401, "Roofers within 25 mi of Austin", "County"), one link that stays in step with the sheet.

Free tools for this job

ZIP codes in a radius →Every US ZIP code whose centre is inside the circle, nearest first, as a CSV for the scraper.Address list matcher →Compare two lists by location, so spelling differences don't hide a duplicate or a client's existing customer.Batch geocoder →Coordinates for a whole list on the web: US addresses free, up to 20,000 per list with an email.What county is this address in? →The county for any US address.
For example, a client wants roofing contractors within 25 miles of downtown Austin. The ZIP radius tool finds 62 ZIP codes within 25 miles of 78701, so the scrape runs 62 searches. The exports are merged, duplicates removed twice (exact, then on the cleaned address), the businesses outside 25 miles dropped, and a County column splits what is left, mostly Travis, Williamson and Hays, for one map each.

Questions

How do I get every ZIP code within 25 miles of a ZIP to search in a scraper?

Enter the ZIP and the radius in the free ZIP codes in a radius tool. It lists every US ZIP code whose centre is inside the circle, nearest first, from the Census ZIP centres, and downloads as a CSV you can feed to Outscraper, Apify or any scraper one search per ZIP. 25 miles around 78701 in Austin is 62 ZIP codes. A ZIP whose centre is just outside can still hold businesses inside the radius, so check each business's own distance after the scrape.

How do I remove duplicate businesses from a scraped Google Maps list when the addresses are written differently?

Do it in two passes. First remove exact duplicates on a column that never changes, such as the place ID or the phone number (Data → Data cleanup → Remove duplicates in Google Sheets™). Then standardise the addresses with =CLEAN_ADDRESS(A2:A400), which turns "123 main st" and "123 Main Street" into the same formatted address, and remove duplicates again on that column. To compare against a second list, use the address list matcher, which matches by location rather than spelling.

How do I filter a lead list to businesses within 25 miles of a ZIP code in Google Sheets?

With the free InstaMaps add-on, =WITHIN_RADIUS("78701", B2:B400, 25, "mi") lists every address in B2:B400 within 25 miles of that ZIP, with its distance, nearest first. To keep whole rows, =ASK(A1:J2001, "within 25 miles of Austin") returns the header and every row inside the radius, up to 5,000 rows. Distances are straight-line.

How do I add the county to a list of addresses in Google Sheets?

Install the free InstaMaps add-on and type =COUNTY(B2:B400) next to your address column; =ZIP, =CITY and =STATE work the same way. They reuse the addresses the sheet has already looked up, so adding a column after =GEOCODE doesn't look them up again. For a few addresses on the web, use what county is this address in.

How do I geocode 10,000 addresses in Google Sheets for free?

A formula takes 400 rows per range, because Google stops a formula after about 30 seconds. For a long list, use Extensions → InstaMaps → Add coordinates to this sheet: it writes plain latitude and longitude values, stops before Google's six-minute limit, and carries on where it left off when you run it again. =GEOCODE spends your own Google account's daily lookups first; Add coordinates tries InstaMaps' own address data first and uses your Google lookups for the rest. For a US list in one go, the free batch geocoder takes up to 20,000 addresses per list with an email.

Why does Google Sheets say "Service invoked too many times for one day: geocode"?

Google gives each account a daily number of address lookups from Apps Script, which is what geocoding scripts and add-ons in Sheets use. Google doesn't publish the figure; about 1,000 a day is typical for a personal account, and Google Workspace accounts get more. When it runs out, every lookup fails until the allowance resets, within a day. Three ways round it: keep results so a recalculation doesn't look the same address up twice (InstaMaps formulas remember every address in the sheet), split a long list across days, or run the rest through a batch geocoder such as our free web geocoder. If you run lists this size every week, Extensions → InstaMaps → Big lists puts you on early access for the plan we're building for big lists.

How do I count leads per county or ZIP code?

Add a County column with =COUNTY(B2:B400), then insert a pivot table (Insert → Pivot table) with County as the rows and COUNTA of the business name as the values. The same works with a =ZIP column for counts per ZIP code.

How do I split a lead list between sales reps by area?

=TERRITORY(B2:B400, 4) gives every row a territory number from 1 to 4, grouped by location and balanced by count. Pass a range of rep names instead of 4 to put names on the territories. =INSTAMAP(A1:J401, "Leads by rep", "Territory") then maps the split, up to 500 rows per map.

Can ChatGPT, Claude, Gemini or Copilot geocode a lead list in my Google Sheet?

Yes, with the free InstaMaps connector: your assistant can place a whole sheet by reference in one call, filter it to a radius, add facts such as the census tract, and write the results back as new columns. Sign in with Google; up to 5,000 tool calls a day. We have tested it end to end in Claude; ChatGPT, Gemini and Copilot take the same address, but we haven't run each of them ourselves yet.

What does InstaMaps not do for lead lists?

It doesn't scrape, skip trace, find or verify email addresses, or certify mailing addresses (CASS). It works on the list you already have: cleaning, de-duplicating, placing, filtering by distance, adding area columns, splitting and mapping it.

Turn a scraped lead list into the list your client asked for

Get the ZIP codes in your radius →