---
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

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

## Output

| Name | Company | Existing Email | Found Email | Type | Source Tool | Action |
| --- | --- | --- | --- | --- | --- | --- |

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