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 →Lead-list builders, virtual assistants and small list agencies building B2B prospect lists for US clients, mostly from Google Maps scrapes.
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.
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.
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.
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.
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.
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.
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.
=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.
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.
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.