---
name: moltsets-hubspot-bulk-list-enrichment
description: Use this skill to run the full MoltSets enrichment waterfall across a saved HubSpot list and write email, phone, title, and firmographic data straight back to the CRM.
---

# HubSpot Bulk List Enrichment

Run your enrichment waterfall across an entire saved HubSpot list and write the results back to the CRM. Pull every member of the list with pagination, check your MoltSets token budget up front, enrich each contact for email, mobile phone, title, and firmographics, throttle to respect HubSpot's write limits, and batch the updates back. This is the CSV waterfall workflow, sourced from and returned to HubSpot directly.

## Triggers

"Enrich my 'Q3 Prospects' HubSpot list with email, phone, and firmographics and write it back", "run the full enrichment waterfall on this HubSpot list, fill blanks only", "check my MoltSets budget, then bulk-enrich this HubSpot segment". Use when the user wants to enrich a whole HubSpot list or segment in place.

## 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 contact and company properties

## Chain

```
HubSpot saved list or segment
  -> hubspot/search-crm-objects (paginate)   (pull all members)
  -> MoltSets get_usage                       (pre-flight: tokens + daily results remaining)
  -> per-contact waterfall:
       linkedin_to_best_email
       linkedin_to_mobile_phone
       reverse_linkedin_lookup / search_business_profile_by_name
  -> throttle to HubSpot 100 req / 10s
  -> hubspot/update-object (batched)          (write enriched fields, source + date)
```

## Inputs

- **HubSpot list** - the saved list or segment to enrich
- **Fields to enrich** - any combination of email, mobile phone, title, seniority, and firmographics
- **Budget cap** - a token ceiling for the run, checked against `get_usage` before starting
- **Overwrite policy** - fill blanks only, or refresh selected fields
- **Acceptable risk scores** - which A-F deliverability grades to keep (recommended: A, B, C and F; D excluded)

## Risk scores - confirm before enriching

Every email MoltSets returns carries a deliverability risk score - a grade from A to F. Ask which grades to keep before running anything:

> "MoltSets grades email deliverability risk from A (best) to F (no data). Which grades should I keep? I'd recommend **A, B, C and F** - and dropping **D**, since D is a confirmed bounce, complaint or spam trap."

| Grade | Meaning | Best practice |
| --- | --- | --- |
| A | Strongest engagement signal available | Safe to send immediately |
| B | Solid | Fine in regular sends; on a new or warming domain, send a smaller batch before scaling |
| C | Deliverability can't be confirmed | Segment separately from A/B, warm at low volume, watch engagement, suppress non-responders after 1-2 attempts |
| D | Confirmed bounce, complaint or spam trap | Never send - fastest way to trip spam traps and damage sender reputation for the whole list |
| F | No data - unknown risk, not "safe" | Re-verify before sending, or treat like C |

Use whatever set the user confirms. Treat the grade as a filter, not a guarantee - it lowers risk, it doesn't remove it. Pair it with the user's own sending domain reputation and list hygiene.

## Steps

1. Pull every member of the HubSpot list, paginating through the full set.
2. Call `get_usage` first to read tokens remaining and the daily results limit, then compare that against the list size and your budget cap.
3. For each contact, run the waterfall: `linkedin_to_best_email` for email, `linkedin_to_mobile_phone` for a verified mobile, and `reverse_linkedin_lookup` (or `search_business_profile_by_name` when there is no LinkedIn URL) for title, seniority, and firmographics.
4. Skip fields that are already populated unless the overwrite policy says to refresh them.
5. Throttle write-back to stay inside HubSpot's limit of 100 requests per 10 seconds, batching updates where possible.
6. Write all enriched fields back with a source and date stamp.

Before any write-back, every found address is checked against the accepted grade set. Out-of-range grades are reported in the table with their true score and skipped - never written to the CRM.

## Output

| Name | Company | Email | Risk | Mobile | Title | Seniority | Industry | Fields Filled | Action |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |

Show the risk score on every row that has an email, including grades outside the accepted set - flag those in `Action` (e.g. "held - grade D") rather than dropping them silently. Only emails inside the accepted set are written back to the CRM.

```
List size:               X
Contacts enriched:       X
Emails found:            X/N (XX%)
Mobiles found:           X/N (XX%)
Titles filled:           X/N (XX%)
MoltSets tokens used:    X
Daily results remaining: X

Email risk scores:
  A: X   B: X   C: X   D: X   F: X
  kept (accepted grades):  X
  filtered (excluded):     X
```

## Tips

- Run the pre-flight coverage check on a sample of 20 to 50 contacts first to estimate cost before committing the full list.
- MoltSets only charges tokens when data is returned, so a low match rate does not burn your budget on misses.
- Watch the daily results limit as well as your token balance; a large list can hit the daily cap before the token cap.
- Batch write-back rather than updating one contact at a time, and keep the run inside HubSpot's 100 requests per 10 seconds limit.
