# Score new HubSpot leads by reading their company website

> Every hour, new inbound leads get researched on their own site, scored for fit, and only the hot ones reach your sales channel.

- Workflow type: agent
- Services: Kernel, HubSpot, Slack
- Categories: Sales
- Published: 2026-08-07

## What it does

- Every hour on weekdays, picks up the leads that arrived since the last run and skips anyone using a personal email address like gmail.com or outlook.com.
- Opens each company's real website in a cloud browser and reads the homepage, the pricing page and the careers page, so prospect sites that a basic scraper cannot read still get researched properly.
- Works out what the company sells, roughly how big it is, whether pricing is self-serve or enterprise only, and whether they are hiring for roles that signal real budget.
- Saves a short qualification summary and a fit score onto the lead, files the full writeup as a note for the rep, and messages your sales channel only for leads that clear your score threshold.

## What you'll need

- A HubSpot account you can connect, with permission to update contacts and add notes.
- Two custom fields on your HubSpot contacts, one number for the fit score and one long text for the qualification summary. The workflow fills both in and uses the summary field to remember which leads it has already done.
- A Kernel account for the cloud browser that visits each prospect's site. The free plan runs up to five browsers at once, which is plenty to start.
- A Slack workspace and the channel where your reps want hot leads flagged.
- A short description of what a good lead looks like for you, so the fit score reflects your definition and not a generic one.

## Prompt

Every hour on weekdays, research brand new inbound leads by actually visiting their company website, then score them so my reps only chase the ones worth chasing. Use a cron trigger on an hourly schedule, Monday to Friday. Build this as an agent workflow, because judging what a company sells, how big it is and whether it has budget depends entirely on what each site turns out to say.

Track the timestamp of the last successful run in workflow state. On each run, use HubSpot Search Contacts with a filter on createdate greater than that stored cursor to pull contacts created since the last run. If no cursor exists yet, use the last hour as the opening window. Add a second filter so only contacts whose qualification summary property is still empty come back, which guarantees the same lead is never researched twice even if a run overlaps or retries. Sort by createdate ascending and cap the batch at 20 contacts per run, so a bulk list import cannot burn a day of browser time in a single tick.

At the end of the run, advance the cursor to the createdate of the newest contact actually processed rather than to the current time. That way anything above the per-run cap gets picked up on the next run instead of being silently skipped.

For each contact, work out the company domain. Prefer the domain on the associated company record when one is set, and fall back to the email domain otherwise. Skip the contact entirely when there is no email at all, or when the domain is a free or personal mail provider. Treat at least gmail.com, googlemail.com, outlook.com, hotmail.com, live.com, msn.com, yahoo.com, ymail.com, icloud.com, me.com, mac.com, aol.com, proton.me, protonmail.com, gmx.com, mail.com, yandex.com, hey.com, fastmail.com and duck.com as free mail, and keep that list somewhere I can edit.

Open exactly one browser for the entire batch, not one per lead. Call Kernel Create Browser Session once at the start of the run, reuse that same session for every contact, and call Kernel Delete Browser Session at the very end. Delete the session even when the run fails partway through, because an abandoned session keeps costing money until it idles out. One session per lead is the single easiest way to make this workflow expensive, so do not do it.

For each qualifying lead, use Kernel Execute Playwright Code in Browser against that session. Load the homepage first and wait for the page to settle, since prospect sites are frequently JavaScript heavy and return almost nothing useful to a plain page fetch. Read the homepage navigation and footer links to discover the real pricing and careers URLs rather than assuming that /pricing and /careers exist, then visit each one you find. Return the visible text of each page along with the list of URLs actually loaded. If the homepage will not load at all, record that failure for the lead and move on.

From those pages, judge four things. First, what the company sells, in one plain sentence. Second, rough size, using whatever is visible such as team page headcount, the number of open roles, or the scale of the customer logos. Third, whether pricing is self-serve, meaning public tiers with a sign-up button, or enterprise, meaning contact sales only or no pricing published at all. Fourth, whether they are hiring for roles that imply budget for what we sell, which is the strongest single signal in this page set and the whole reason the careers page is worth loading. Never state anything the pages did not actually support. Say the signal was not visible rather than guessing.

Turn that judgment into a fit score from 0 to 100 using a fixed rubric, so scores stay comparable between runs, and put the rubric in an editable block at the top of the workflow. As a starting point: up to 40 points for how closely what they sell matches my ideal customer profile, up to 25 for company size being in range, up to 20 for hiring signals that imply budget, and up to 15 for the pricing model matching the way we sell.

Write the result back with HubSpot Update Contact into the two custom contact properties this workflow owns: a number property for the fit score and a long text property for a two or three sentence qualification summary. Both properties need to exist in HubSpot before the first run, and the summary property is the same one the search filter checks for emptiness, so writing it is what marks the lead as done.

Then use HubSpot Create Note associated with that contact, holding the full research writeup: what they sell, size signals, pricing model, hiring signals, the score together with a one line explanation of how it was reached, and a list of the pages actually visited at the bottom. This is the record a rep reads just before calling, so keep it scannable and keep every claim in it traceable to a page that was really loaded.

Only when the score is above my threshold, which should default to 70 and be easy to change, post to my sales channel using Slack Send a Message. Keep it short: company name, what they sell, the score, the single strongest reason it scored well, and links to both the site and the HubSpot record. Leads below the threshold are still scored and still get their summary and note, they just do not interrupt anyone.

Guardrails: if a single lead fails, whether the site is down, a page times out or the Playwright code throws, record the failure for that lead and carry on with the rest of the batch rather than failing the whole run. One bad site must never abort the shared browser session for every lead queued behind it.

## How to customize

- Change the hourly cadence, or narrow it to business hours only if your inbound goes quiet overnight.
- Raise or lower the fit score threshold that decides which leads are worth interrupting your sales channel for.
- Adjust the scoring rubric itself, so company size, hiring signals or pricing model count for more or less depending on how you sell.
- Add pages to the reading list, such as customers or news, or cap how many leads get researched per run to keep browser costs predictable.

## FAQ

### Will this work on HubSpot Free?

Yes. Searching contacts, updating their fields and attaching notes are available on every HubSpot tier. The workflow checks on a schedule rather than waiting for an instant notification, so you do not need a paid plan or any developer setup to run it.

### Why read the website instead of buying a data provider?

Data vendors are good at firmographics like headcount and industry, but they rarely tell you whether a company sells self-serve or enterprise, and almost never tell you what roles it is hiring for right now. Those are two of the strongest budget signals available and both of them live on the prospect's own site.

### What stops the same lead being researched twice?

Before doing any research, the workflow only picks up leads whose qualification summary is still empty, so anything already done is passed over even if a run overlaps or retries. Leads on personal email domains are skipped before any browsing happens.

### Will my sales channel get a message for every new lead?

No, and that is the point. Only leads scoring above your threshold get posted to Slack. Everything else is still scored and still gets its summary and research note on the record, it just does not interrupt anyone.

### Is it expensive to run a browser for every lead?

It opens a single browser and reuses it across the whole batch instead of starting a fresh one per lead, and shuts it down at the end of the run. You can also cap how many leads get researched in a single run so a large list import cannot run up a surprise bill.

Use this prompt in General Input: https://www.generalinput.com/prompts/score-new-hubspot-leads-by-reading-their-company-website