Prospecting desk that builds account lists from the live web
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
Build me a prospecting desk my SDR team opens every day to build target account lists from the live web instead of buying a stale list. It uses Hyperbrowser to find and read company websites, HubSpot as the CRM we push approved accounts into, and Google Sheets as the decision log. Nothing reaches HubSpot until a person clicks approve.
The app opens on two things side by side: a library of saved searches, and the review queue. A saved search is one of our ICP definitions written in plain language, for example "UK fintechs, 50 to 200 staff, currently hiring compliance people". Each saved search is stored in the app's own data with a name, the search description, optional must-have and must-not-have keywords, a target number of companies per run, the rep who created it, and the date of its last run plus how many rows that run produced. Saved searches are visible to the whole team but show their owner, and a rep can filter the library to just their own. Reps can create, edit, duplicate, and archive them.
Each saved search has a Find prospects button that kicks off a background agent. The agent turns the ICP definition into several web queries and runs them with the Hyperbrowser Search Web operation, collects candidate company sites from the results, and drops anything already on the suppression list, already in the review queue, or already found by a previous run of the same search. For each remaining company it starts a Hyperbrowser scrape with Start Scrape Job and polls Get Scrape Job Result for the home page and any obvious about, product, careers, and contact pages, then runs Start Extract Job with a schema and polls Get Extract Job Result to pull structured fields out of that content. Hyperbrowser scrape and extract jobs are asynchronous, so every job must be started and then polled until it completes before the agent writes anything. When a careers page is a JavaScript widget or an embedded job board that scraping cannot read, the agent falls back to Start Browser Use Task with an instruction like "open the careers page and list the current openings with titles and locations" and reads the answer back with Get Browser Use Task Result.
Every company the agent finishes becomes one row in the app's review queue, written back as the run progresses so the queue fills in while the rep watches. A row holds: company name, website domain, country and city, what they sell, who they sell to, an estimated headcount plus the signal it came from, careers page activity such as the number of open roles and the relevant titles, contact page details including a named person, role, email, and phone when the site publishes them, two or three short verbatim evidence quotes supporting the fit, the list of source URLs each field came from, the date the pages were read, the saved search and run that produced it, and a status of new, approved, rejected, or snoozed.
Reps work the queue like an inbox. Each card shows the extracted firmographics on one side and the evidence on the other: the quotes, the source links, and the date read, so a rep can check any claim in one click. Cards can be filtered by saved search, by status, and by owner, and sorted newest first. Every card has three actions: approve, reject with a short reason picked from a list such as wrong size, wrong market, already a customer, or no real signal, and snooze with a date, which hides the card until that date and then returns it to the queue. Show a small header count of new, snoozed, approved today, and rejected today.
Approving runs a handler that goes to HubSpot in order. First it calls Search Companies filtered on the website domain, and if that finds nothing, on the company name, so we never duplicate an account we already own. If a match comes back, the card is marked as an existing account, the app shows the rep which HubSpot record it matched, and nothing is created. If no match comes back it calls Create Company with name, domain, city, country, industry, and a short description from the extraction. Then, only when the site gave us a real named person with an email address, it calls Create Contact with that name, email, phone, and job title, associated to the new company. Finally it calls Create Note with the research summary, the evidence quotes, the source URLs, and the date read, associated to the company record so the next rep who opens that account sees where it came from. Show the rep the created HubSpot record links on the card once the push finishes, and if any step fails, keep the card in the queue with the error visible so they can retry rather than losing the work.
Every approve and every reject also appends one row to a Google Sheets log using Append Values, with the date, the rep, the saved search name, the company name and domain, the decision, the reject reason when there is one, the headcount and careers signals, whether it was already in HubSpot, and the source URLs. That sheet is how we see list quality over time, so also give the app a small stats strip reading from the app's own data: approval rate per saved search, rows found per run, and the most common reject reasons over the last thirty days. That view is what tells a manager which ICP definitions are actually working.
Two rules matter more than anything else. Nothing is written to HubSpot without a human clicking approve, so no part of the search agent may call any HubSpot create operation. And rejected companies go onto a persistent suppression list keyed by website domain, which every future run of every saved search filters against, so a company someone already turned down never resurfaces. Let a rep view the suppression list and remove an entry if they rejected something by mistake.
What does this prompt do?
- Keeps a library of saved searches, one per ideal customer profile, each owned by the rep who wrote it, so nobody rebuilds the same list twice
- Finds matching companies on the open web on demand, reads each company site, and files structured rows into a review queue with the quotes, links, and date behind every field
- Gives reps an inbox to work: approve, reject, or snooze each company, with the extracted details sitting next to the evidence
- Sends approved accounts to your CRM only after a person clicks approve, checking first so you never create a company you already own
- Logs every approve and reject to a spreadsheet so you can see whether list quality is improving, and keeps rejected companies from coming back on the next run
What do I need to use this?
- A Hyperbrowser account for reading and searching the web
- A HubSpot login that can create companies, contacts, and notes
- A Google account and a spreadsheet to use as the decision log
- A rough definition of who you sell to: industry, size, location, and the signals that mean now is a good time
How can I customize it?
- Change the fields pulled from each company site, for example funding news, tech mentions, office locations, or named partners
- Decide when a contact gets created: only when the site lists a real person and address, or also for generic team inboxes
- Set how long a snooze lasts and what your log sheet records, then add a simple score so the strongest accounts sort to the top of the queue
FAQs
Does anything get added to my CRM automatically?
How does it avoid creating accounts we already own?
What happens to companies a rep rejects?
Will this work on a free HubSpot account?
How long does a search take to come back?
Where do the contact details come from?
Related templates
Stage a batch of filings overnight, then approve each completed form from a screenshot before anything is ever submitted.
Pick a client and a date range to see sent, replies, meetings booked and the real deal value your cold email produced, campaign by campaign.
Work every partner tier decision from one board, with the revenue and commission numbers, clear promotion thresholds, and AI review briefs.
Open one board at month end to find every closed deal missing a commission, every commission with no deal behind it, and every amount that does not add up.
Review every conversation Fin closed as resolved, judge which ones actually stuck, and see what the gap is worth against your bill.
Work every return, damage and warranty claim in one queue, with the order, the delivery date and a policy-backed recommendation already on screen.
Give your reps a live list instead of a stale one
Build the prospecting desk where every account is researched on the open web, reviewed by a human, and only then written to your CRM.