---
name: moltsets-hubspot-company-firmographic-fill
description: Use this skill to fill missing industry, employee count, revenue, domain, and LinkedIn data on HubSpot company records using MoltSets firmographic lookups.
---

# HubSpot Company Firmographic Fill

Complete the firmographic picture on your HubSpot company records. Find companies missing industry, employee count, revenue, domain, or LinkedIn URL, pull those fields from MoltSets by domain, map them to your HubSpot picklists, and write them back. Better firmographics feed lead scoring, territory assignment, and segment building, so this is a foundational sweep to run before those systems depend on the data.

## Triggers

"Fill missing industry, size, and revenue on my HubSpot company records", "enrich companies in HubSpot that are missing firmographics before lead scoring runs". Use when the user needs complete firmographics on company records before scoring, routing, or segmentation.

## 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 - write to standard company properties

## Chain

```
HubSpot company records
  -> hubspot/search-crm-objects        (companies missing industry / size / domain / LinkedIn)
  -> MoltSets:
       search_companies                (domain -> industry, employee_range, revenue_range, LinkedIn)
       ip_to_company                   (optional: when only an IP is on the record)
  -> map industry + size to your HubSpot picklist values
  -> hubspot/update-object             (write firmographics, source + date)
```

## Inputs

- **HubSpot segment** - which companies to target (missing industry, missing size, or missing domain)
- **Field mapping** - how MoltSets industry, employee, and revenue ranges map to your HubSpot picklists
- **Overwrite policy** - fill blanks only, or refresh stale firmographics
- **Write-back fields** - industry, employee count and range, revenue range, LinkedIn URL, source and date

## `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 company records missing one or more firmographic fields from HubSpot.
2. Run `search_companies` with the company domain for an exact-match lookup returning industry, employee count and range, revenue range, and LinkedIn URL.
3. Use `ip_to_company` as a fallback when a record has only an IP address and no domain, which suits records sourced from web visitor identification.
4. Map the MoltSets industry, `employee_range`, and `revenue_range` values to your HubSpot picklists.
5. Write the firmographics back with a source and date stamp.

## Output

| Company | Domain | Old Industry | New Industry | Employees | Revenue | LinkedIn | Action |
| --- | --- | --- | --- | --- | --- | --- | --- |

```
Companies scanned:       X
Firmographics filled:    X/N (XX%)
Industry set:            X
Size + revenue set:      X
MoltSets tokens used:    X
```

## Tips

- Always prefer the `domain` filter over free-text `query` in `search_companies`, since domain is an exact match - and pass the stored URL as-is, full URLs are normalised automatically (`https://www.acme.com/about` → `acme.com`)
- `search_companies` also returns `linkedin_industry` and `naics_code` alongside the broad `industry` bucket - map those into their own properties if you have them, they're far more useful for segmentation than the 23-bucket value
- Treat a returned `country`/`state` with care on large accounts: company location is derived from where the team is based, and multinationals resolve to a single office. Don't overwrite a known HQ country with it

- Always prefer the `domain` filter over free-text `query` in `search_companies`, since domain is an exact match.
- The MoltSets industry list is fixed, so keep a mapping table from those values to your HubSpot industry picklist.
- Run this before any lead scoring or territory rules that depend on firmographics, so those systems have complete inputs.
- Throttle write-back to stay inside HubSpot's limit of 100 requests per 10 seconds.
