---
name: moltsets-hubspot-lookalike-account-builder
description: Use this skill to profile closed-won HubSpot accounts with MoltSets firmographics, then find similar companies not yet in HubSpot to build a net-new target account list.
---

# HubSpot Lookalike Account Builder

Turn your best existing customers into a net-new prospecting list. Profile a set of closed-won HubSpot accounts with MoltSets firmographics, work out the shared industry, employee range, and revenue range, then search for similar companies not already in HubSpot. The output is a target account list ready to hand to a rep or load into an outbound sequence.

## Triggers

"Build a lookalike target list based on my closed-won accounts in HubSpot", "find companies similar to my best customers that aren't in HubSpot yet". Use when the user wants net-new target accounts modelled on their closed-won customers.

## Requirements

- HubSpot remote MCP (mcp.hubspot.com) and the MoltSets MCP connected in the same client
- Custom objects are not reachable through HubSpot's remote MCP - create standard company records

## Chain

```
HubSpot closed-won accounts
  -> hubspot/search-crm-objects        (companies with an associated closed-won deal, optional filters)
  -> MoltSets:
       search_companies                (domain -> industry, employee_range, revenue_range)
  -> derive lookalike profile          (dominant industry, employee range, revenue range across the set)
  -> MoltSets:
       search_companies                (industry + employee_range + revenue_range -> candidate companies)
  -> exclude domains already in HubSpot
  -> hubspot/create-object             (optional: create the new companies as target accounts)
```

## Inputs

- **Seed accounts** - which closed-won accounts to profile (all, a segment, or a named list)
- **Profile weighting** - which firmographic fields matter most for the lookalike match (industry, size, revenue)
- **List size** - how many net-new accounts to return
- **Exclusions** - domains already in HubSpot, competitors, or a do-not-target list

## `search_companies` filters and best practice

Full request parameter set:

| Purpose | Param | Notes |
|---|---|---|
| Company name | `query` | Name only - domain, industry, size and revenue are keyword fields and aren't covered by it |
| Domain | `domain` | Exact match, beats `query` every time. Full URLs are normalised automatically ("https://www.acme.com/about" → "acme.com") |
| Industry (broad) | `industry` | 23 primary buckets plus long-tail values |
| Industry (niche) | `linkedin_industry` | ~50% filled. LinkedIn's own ~150 labels |
| Industry (code) | `naics_code` | ~50% filled. Any hierarchy level - "23" casts wide, "511210" goes narrow |
| Size | `employee_range` | Exact bands - "1-10" through "5001+" |
| Revenue | `revenue_range` | Exact bands - "Below $500k" through "Over $5B" |
| Location | `country` / `state` | Derived from where the team is based - see the caveat below |
| Paging | `limit` / `offset` | 10 default, 25 max (5 on the Free plan) |

**Filters are free precision.** Execution cost is driven by the free-text `query`, not the filters attached to it: `query` + any number of filters costs the same as `query` alone, and a filters-only call runs **~40x cheaper**. Most account lists are pure firmographics and need no free text at all:

```json
{ "industry": "Computer Software", "employee_range": "51-200", "revenue_range": "$10M - $20M" }
```

Reach for `query` only when matching a company by **name**. Billing is unchanged either way - tokens are charged per record returned.

**Use `domain` when you have one.** It's an exact match and always beats a free-text `query`. No need to strip the protocol or path first.

**Industry vocabularies overlap.** The `industry` enum carries the broad buckets *and* long-tail values - `"Computer Software"`, `"Insurance"`, `"Banks"`, `"Pharmaceuticals and Biotechnology"`, `"Aerospace and Defense"`, `"Electronics"`, `"Mining and Metals"`. A software company may be filed under `"Information Technology"` **or** `"Computer Software"`, so if a search comes back thinner than expected, try the neighbouring value. Shortening a `naics_code` is the cleanest way to widen.

**Location caveat.** `country` and `state` filter the company's location, but that location is derived from where the company's team is based. Accurate for the small companies that dominate the index - but **large multinationals are attributed to a single one of their offices**, which may not be the headquarters country. When targeting large or international accounts, combine location with other filters rather than relying on it alone. Exact stored values with standard capitalisation - `"Texas"`, not `"TX"`.

**Both range filters are heavily skewed.** `"1-10"` is the most common `employee_range` by a wide margin, and `"5001+"` returns very little. `"$500k - $1M"` is the most common `revenue_range`. Prefer the numeric bands over legacy `"Small"` / `"Mid-Market"` / `"Enterprise"` / `"Unknown"`, and always use `"$500k - $1M"` rather than the legacy `"$1 - $1M"` - same range, far fewer records.

**Skip the company pass when firmographics are the only reason for it.** `search_people` filters on `employee_range` and `revenue_range` directly, applied to the person's current employer, so one call often replaces two.

**Read `results.total` before paginating.** Results are `_score`-ranked, so the first page is the strongest; 25 max per call, increment `offset` by `limit`.

## Steps

1. Pull the closed-won accounts (or a filtered subset) from HubSpot.
2. Run `search_companies` by domain on each to get industry, employee range, and revenue range.
3. Aggregate the results into a lookalike profile: the dominant industry or industries, and the typical employee and revenue range across the seed set. Capture `linkedin_industry` and `naics_code` off the seed records too - they give a much tighter lookalike than the 23 broad `industry` buckets when the seed set clusters in a niche.
4. Run `search_companies` again using that profile as the filter - filters only, no `query`, which is both more precise and ~40x cheaper to execute. Match the profile's granularity: broad `industry` for a wide net, `linkedin_industry` or a 4-6 digit `naics_code` when the seed set is tightly clustered (shorten the NAICS code to widen).
5. Exclude any domain that already exists in HubSpot, and any domain on the exclusion list.
6. Return the ranked candidate list, and optionally create the new companies in HubSpot as target accounts.

## Output

| Company | Domain | Industry | Employees | Revenue | Match Reason | In HubSpot Already |
| --- | --- | --- | --- | --- | --- | --- |

```
Seed accounts profiled:      X
Dominant industry:           X
Employee range:              X
Revenue range:               X
Candidates found:            X
Net-new (not in HubSpot):    X
MoltSets tokens used:        X
```

## Tips

- If your closed-won accounts span multiple distinct industries, run the lookalike search per cluster rather than averaging across all of them.
- Use `domain` exclusion against your full HubSpot company list, not just the seed set, so you don't resurface existing customers or open deals.
- Pair this with the buying committee expansion skill once a lookalike account is created, to find the right contacts inside it.
