---
name: moltsets-attio-email-backfill
description: Find Attio person records with missing, bounced, or role-based emails, enrich them through the MoltSets waterfall, and write verified addresses back to the CRM.
---

# Attio Email Backfill

## Triggers

- "Find and fix person records in Attio with missing or bounced emails"
- "Backfill verified business emails for this Attio segment"

## What this skill does

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

## Chain

```
Attio person records (segment or saved view)
  to attio/query-records                (people where email is empty, bounced, or role-based)
  to resolve identifier per record      (LinkedIn URL, or name + company domain)
  to 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)
  to validate + dedupe against existing records
  to attio/update-record                (write verified email, enrichment source + date)
```

## Inputs

- **Attio segment** - which person records 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 attribute plus optional enrichment source and date attributes
- **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.

## How it works

1. Pulls the target person records from Attio using your filter (missing, bounced, or role-based email)
2. For each record, picks the strongest identifier already on file: a LinkedIn URL if present, otherwise name plus company domain
3. Runs 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, uses `linkedin_to_business_email` to force a work address with no personal fallback
5. Dedupes each found address against your existing records so you do not create conflicts
6. Writes the verified email back to Attio, stamping an enrichment source and date attribute 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.

```
Records scanned:          X
Missing/invalid emails:   X
Emails found:             X/N (XX%)
Written back to Attio:    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

- Requires the Attio MCP (mcp.attio.com) and the MoltSets MCP connected in the same client
- 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
- Attio's object model reaches custom objects the same way as People and Companies, so this pattern extends to any custom object with an email attribute
- Batch writes where possible and stay inside Attio's per-workspace rate limits on large segments
