# Build local prospect lists and review them before they hit your CRM

> Let reps search any business category and city, see which businesses are already in HubSpot, and add only the ones worth keeping.

- Workflow type: app
- Services: Apify, HubSpot, Google Sheets
- Categories: Sales
- Published: 2026-08-14

## What it does

- Search by business category, city, minimum star rating and minimum review count, and get a fresh list of local businesses in seconds instead of waiting for a weekly scrape to run
- Every result is checked against your CRM before the list appears, so anything you already have is clearly badged and left unticked
- Tick the businesses worth keeping and add them to HubSpot in one go, each with a note holding the rating, review count and phone number
- Send the same selection to a shared Google Sheet, and every push is logged in the app so two reps never work the same street twice

## What you'll need

- An Apify account with a Google Maps scraper actor, such as the popular Google Maps Extractor from the Apify store
- A HubSpot login that can create companies, notes and tasks
- A Google account and a shared spreadsheet to hold the team working list
- Nothing else for your reps: they just open the app and search

## Prompt

I want an app my SDR team opens to build local prospect lists on demand, instead of waiting for a weekly scrape to run and then deduping a CSV by hand. The people using it are sales reps, not analysts, so the whole job happens on one screen: search, review, push.

The main screen is a search form with four inputs: business category (for example "dentist" or "HVAC contractor"), city, minimum star rating, and minimum review count. When the rep hits Search, a handler runs an Apify Google Maps scraper Actor using Run Actor Synchronously and Get Dataset Items, passing the category and city as the search terms. Use compass~crawler-google-places (the Google Maps Extractor) as the default Actor and make the Actor ID configurable in app settings. Note that the Apify REST API needs the tilde form of the Actor ID, not the forward slash form shown in the Apify Store URL.

Cap each run with maxItems, defaulting to around 100, so a broad search cannot burn through Apify credits, and pass a timeout. The synchronous endpoint returns dataset items directly as an array rather than wrapped in a data envelope. It also times out at roughly five minutes, so if a run exceeds that, fall back to Run Actor (Async), poll Get Actor Run until the status is terminal, and then read the rows with Get Dataset Items. Show a progress state while the search runs. Apply the minimum rating and minimum review count filters to the rows that come back.

Before the results table renders, every row must be checked against HubSpot with Search Companies. Match on the website domain first, normalizing by stripping the protocol and any www prefix, and fall back to a company name search when a business has no website. This check happens up front rather than after the fact: any business already in the CRM is badged "already in HubSpot" and left unticked, and everything else is ticked by default. Reviewing before pushing is the entire point of this app, so never create records straight off a search.

Render the results as a sortable table with a tick box on each row plus business name, star rating, review count, phone, website and full address. Every column sorts, so a rep can order by review count or rating and work the strongest listings first. Show a running count of how many rows are currently ticked.

A Push button takes the ticked rows and, for each one, creates the business in HubSpot with Create Company, setting name, domain, phone, city and address. It then attaches the scraped detail with Create Note holding the star rating, review count, phone number and the search that produced the row (category, city and date), associated to the company just created. Include an optional toggle for filing a follow up with Create Task against the same company, with a due date the rep picks, defaulting to three business days out. Push rows one at a time and keep a per row result so a single failure does not lose the batch, then show a summary of created, skipped and failed when it finishes.

Model every pushed business as a company with an attached note. Do not try to create contacts.

A second button, Append to working list, sends the same ticked selection to a shared Google Sheet using Append Values, writing one row per business with the same columns plus the rep name and the date. This is the team shared working list, so it always appends and never overwrites.

Saved searches are per user. Each rep's searches are stored with their four inputs so they can rerun one with a single click, and recent searches appear on the main screen. Every push is logged in the app with the rep, the businesses pushed and the timestamp, and there is a Push log view listing that history alongside the search behind it. When a search returns, also check the push log and flag any business a teammate has already pushed, so two reps never work the same street twice.

## How to customize

- Set the default minimum rating and review count so weak listings never reach the table
- Swap in a different Google Maps scraper, or pull extra fields like opening hours and business category
- Choose whether a follow up task is created on every push or only when the rep asks for one
- Point the shared working list at a different spreadsheet or a different tab per team

## FAQ

### Will this work on HubSpot Free?

Yes. The app creates companies, notes and tasks, and all three are available on the free HubSpot CRM. You do not need a paid Sales Hub seat to use it.

### How does it know a business is already in our CRM?

It checks each business against HubSpot before the results appear, matching on the website address first and falling back to the business name when there is no website. Anything it finds is badged as already in HubSpot and left unticked so you do not create a duplicate.

### Does it add contacts, or just companies?

Each business is added as a company record with the scraped detail saved as a note against it. That fits how local prospecting actually works, where you start with a business name, a phone number and an address rather than a named person.

### How long does a search take?

Most searches finish in well under a couple of minutes. The app shows progress while the scrape runs, and caps how many results a single search pulls back so a very broad search cannot run away with your scraping credits.

### Can two reps use it at the same time?

Yes. Saved searches are private to each rep, and every push is recorded in a shared log with the rep name and date, so the team can see what has already been worked before starting a new patch.

Use this prompt in General Input: https://www.generalinput.com/prompts/build-local-prospect-lists-and-review-them-before-they-hit-your-crm