---
name: moltsets-attio-company-firmographic-fill
description: Fill missing industry, employee count, revenue, domain, and LinkedIn data on Attio company records using MoltSets firmographic lookups.
---

# Attio Company Firmographic Fill

## Triggers

- "Fill missing industry, size, and revenue on my Attio company records"
- "Enrich companies in Attio that are missing firmographics before lead scoring runs"

## What this skill does

Completes the firmographic picture on your Attio company records. It finds companies missing industry, employee count, revenue, domain, or LinkedIn URL, pulls those fields from MoltSets by domain, maps them to your Attio select attribute options, and writes 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.

## Chain

```
Attio company records
  to attio/query-records                (companies missing industry / size / domain / LinkedIn)
  to MoltSets:
      search_companies                  (domain -> industry, employee_range, revenue_range, LinkedIn)
      ip_to_company                     (optional: when only an IP is on the record)
  to map industry + size to your Attio select attribute options
  to attio/update-record                (write firmographics, source + date)
```

## Inputs

- **Attio segment** - which companies to target (missing industry, missing size, or missing domain)
- **Field mapping** - how MoltSets industry, employee, and revenue ranges map to your Attio select options
- **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`.

## How it works

1. Pulls company records missing one or more firmographic attributes from Attio
2. Runs `search_companies` with the company domain for an exact-match lookup returning industry, employee count and range, revenue range, and LinkedIn URL
3. Uses `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. Maps the MoltSets industry, `employee_range`, and `revenue_range` values to your Attio select attribute options
5. Writes 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

- Requires the Attio MCP (mcp.attio.com) and the MoltSets MCP connected in the same client
- 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 attributes 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
- The MoltSets industry list is fixed, so keep a mapping table from those values to your Attio select options
- Run this before any lead scoring or territory rules that depend on firmographics, so those systems have complete inputs
- This works the same way on custom objects as it does on the standard Companies object, since Attio's attribute model is uniform across both
- Batch writes where possible and stay inside Attio's per-workspace rate limits
