---
name: moltsets-hubspot-email-backfill
description: Use this skill to find HubSpot contacts with missing, bounced, or role-based emails, enrich them through the MoltSets waterfall, and write verified addresses back to the CRM.
---

# HubSpot Email Backfill

Fill the email gaps in your HubSpot contact database. Point it at a segment of contacts with missing, hard-bounced, or role-based addresses (info@, sales@), and it resolves each contact through the MoltSets email waterfall, validates the result, dedupes against your existing records, and writes the verified address back to HubSpot with a source and timestamp. Output is a clean before-and-after table plus a fill-rate summary.

## Triggers

"Find and fix contacts in HubSpot with missing or bounced emails", "backfill verified business emails for this HubSpot segment". Use when the user wants to repair or complete email coverage on a HubSpot segment.

## 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 properties only

## Chain

```
HubSpot contact segment or saved view
  -> hubspot/search-crm-objects        (contacts where email is empty, bounced, or role-based)
  -> resolve identifier per contact    (LinkedIn URL, or name + company domain)
  -> MoltSets waterfall:
       linkedin_to_best_email          (when a LinkedIn URL is on the record)
       search_business_email_by_name   (when only name + company domain exist)
  -> validate + dedupe against existing contacts
  -> hubspot/update-object             (write verified email, enrichment source + date)
```

## Inputs

- **HubSpot segment** - which contacts to target (missing email, hard-bounced, or role-based addresses)
- **Email type** - business only, or best available (business with a personal fallback)
- **Overwrite policy** - fill blanks only, or also replace invalid and bounced addresses
- **Write-back fields** - the email property plus optional enrichment source and date properties
- **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 the target contacts from HubSpot using your filter (missing, bounced, or role-based email).
2. For each contact, pick the strongest identifier already on the record: a LinkedIn URL if present, otherwise name plus company domain.
3. Run the MoltSets waterfall: `linkedin_to_best_email` for records with a LinkedIn URL, `search_business_email_by_name` for records with only a name and domain.
4. Where email type matters, use `linkedin_to_business_email` to force a work address with no personal fallback.
5. Dedupe each found address against your existing contacts so you do not create conflicts.
6. Write the verified email back to HubSpot, stamping an enrichment source and date for auditing.

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 | Existing Email | Found Email | Type | Risk | Source Tool | 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.

```
Contacts scanned:         X
Missing/invalid emails:   X
Emails found:             X/N (XX%)
Written back to HubSpot:  X
MoltSets tokens used:     X

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

## Tips

- MoltSets only charges tokens when data is returned, so misses cost nothing and you do not need to pre-filter.
- Run `search_linkedin_profile` with `count_only: true` on a sample first to gauge match rate before scaling up.
- Keep a dry-run step that shows proposed changes before writing, especially when replacing existing addresses.
- Throttle write-back to stay inside HubSpot's limit of 100 requests per 10 seconds on large segments.
