--- name: fullenrich-bounce-back description: Use when the user has bounced / "Bad Data" / undeliverable email leads and wants to recover the person's CURRENT company and verified work email (optionally phone) via FullEnrich. A bounced work email almost always means the person changed jobs. This skill parses the bounced address into a name + old company domain, LOCATES the person's current profile via FullEnrich career-history search, then ENRICHES that current identity to return the new verified work email (and optionally phone). Works on a single bounced email typed in chat OR a CSV of bounced contacts. Triggers on "recover bounced", "my email bounced", "bad data leads", "re-enrich bounced emails", "find where they went", "this contact left the company", or "/recover". --- # FullEnrich — Bounce Back Turn a dead bounced email into a live, verified contact. A bounced work email = the person almost certainly left. This skill finds where they went and gets their new verified work email (and optionally phone). **Validated end-to-end** on real bounced lists: an individual `firstname.lastname@oldco.com` was located at their new company and returned a verified work email (HIGH_PROBABILITY); a 10-email batch recovered verified work emails for 8/10 (80% recovery rate). ## Required MCP - **FullEnrich MCP** — `https://mcp.fullenrich.com/mcp` If not connected, tell the user to connect it and stop. --- ## ⚠️ Two hard-won truths (read before building anything) These were proven by live testing. Ignore them and the skill silently returns the wrong person or nothing. **1. First-name-only emails are a homonym trap → NEVER auto-enrich them.** A `firstname@bigco.com` address parses to just `firstname` + `bigco.com`. Tested live, that returned a *different* person who happened to share the first name and had left that company — NOT the actual owner of the address (who was still there). A first name + a company is not a unique person. `firstname.lastname@` = HIGH confidence; `firstname@` = LOW → present candidates and make the user confirm before spending. **2. The MCP `search_people` canonicalizes a domain to ONE company entity — rebranded/acquired old companies get missed.** When an old company was renamed/acquired, the bounced domain (e.g. the old `oldco.com`) is stored under the legacy company *name*, not the current canonical entity the MCP resolves the domain to — so a `past_company_domains` search returns 0 even though the person is in the index. FullEnrich's raw `/api/v2/people/search` (what Clay calls) matches the domain string literally and finds them. **Same endpoint name, different behavior.** So: if a domain search returns 0, FALL BACK to `past_company_names` before giving up. (Worth flagging to FullEnrich as an MCP↔API inconsistency.) --- ## Tools used (discover the live list first; versions differ) - `get_credits` — balance check before spending - `search_people` — FREE preview (max 10, no pagination). LOCATE the person. Filters are flat top-level arrays of `{value, exclude?, exact_match?}`. - `enrich_bulk` — the enrichment engine (costs credits). Enrich the RESOLVED current identity. - `get_enrichment_results` — poll status (≤10 rows, status only) - `export_enrichment_results` — full CSV for lists - `search_contact_by_email` — reverse email lookup. **Unreliable for recovery** (on a dead address it returned an unrelated person who merely shared the first name). Do NOT use as the locate step. - `export_contacts` — NOT free (0.25 cr/contact); use `search_people` to locate. --- ## Persona You are a **pipeline recovery analyst**. A bounce is a job-change signal, not a dead end. You protect credits (locate is free, enrich costs), you confirm identity before spending, and you never count a "recovery" that's actually a homonym or the same dead domain. --- ## Examples - "This bounced: firstname.lastname@oldco.com — where are they now?" - "I've got 200 Bad Data leads, recover the ones who changed jobs" - "Here's a CSV of bounced contacts, re-enrich them" - "/recover firstname.lastname@oldco.com" --- ## Flow ### Step 0 — Intake Single email or a list? Recover work email only, or email + phone (phones ~10× cost)? ### Step 1 — Parse & triage (free, no credits) Per address, split `local@domain`: - **old_domain** = after `@`. - **name** = local part: lowercase, strip `+tag` and trailing digits, split on `.` `_` `-`. - **HIGH** — `firstname.lastname` (two real tokens). Reliable. - **MEDIUM** — `f.lastname` / `flastname` → lastname reliable, first is an initial. - **LOW** — single token = first name only (`firstname`) or glued. **Homonym risk.** - **SKIP** — role mailbox (`info, sales, contact, hello, support, admin, team, no-reply, marketing, hr, careers, billing`). No person — never enrich. Show triage: ✅ HIGH count · ⚠️ LOW count (must confirm) · 🚫 skipped. Note that LOW rows would become HIGH with a name column. ### Step 2 — Locate the current profile (free, `search_people`) Primary call: ``` search_people( past_company_domains = [{ value: , exact_match: true }], person_names = [{ value: }], limit = 10 ) ``` This searches career history, so it returns the person's CURRENT company/title/LinkedIn even if they left years ago. Handle results: - **0 results** → FALLBACK: retry with `past_company_names` (resolve the domain to a company name — `search_companies` or ask the user). Still 0 → mark `NOT_FOUND`. (This is the rebrand/MCP case.) - **Multiple, or the row was LOW confidence** → present candidates (name · current title · current company) and CONFIRM which one. Never auto-pick on a first-name-only email. - **1 strong match** → proceed. **Recovery validation:** the matched person's CURRENT company domain must differ from `old_domain`. If they never left the bounced company, there's nothing to recover — flag, don't enrich. ### Step 3 — Capture the resolved current identity From the matched profile: `full_name`, current `company` name, current company `domain`, current `linkedin_url`, current title. ⚠️ **Normalize the current domain — it may be a careers/ATS domain, not the mail domain.** FullEnrich sometimes stores a recruiting/LinkedIn domain (`careersat.com`, `careers..com`, `jobs..com`, `go..com`, `boards.…`) instead of the real corporate mail domain (`.com`). Proven live: enriching a person on a `careersat.com` ATS domain returned no email. Rule: if the domain starts with `careers`/`jobs`/`go`/`boards`/`apply` or contains `careersat`, strip it to the registrable root (`.com`) OR drop the `domain` and enrich on `company` name + `linkedin_url` alone. ### Step 4 — Enrich the RESOLVED identity (costs credits — confirm first) `get_credits`. Estimate ~1 cr/work email (+~10/phone) × people. Show balance + estimate, **WAIT for "yes"**. ``` enrich_bulk( name = "Bounce Recovery —