--- name: personalize-email description: Generate 1-3 personalized email variants for a single prospect. The composition bar adapts to the use case — cold_outbound demands a signal → pain → positioning chain; follow-ups / recaps / renewals lean on prior context and next-step framing. Supports cold_outbound, discovery_follow_up, demo_recap, re_engagement, renewal, expansion, objection_handling. Returns subject lines and mobile-readable bodies with a rationale chain. Use for sales prospecting, lead generation, account-based selling, buyer-intent-driven outreach, B2B prospecting. Triggers on phrases like "write a cold email", "personalize an email", "draft outreach", "follow up on this prospect", "email this prospect", "outbound to X", "send a chaser". --- # Personalize Email Generate personalized email variants. Calls `get_gtm_context(detailed: true)` unconditionally, resolves the prospect, runs a relationship-context pre-flight, pulls signals + CRM context, and composes 1-3 variants tuned to the chosen use case. Iteratively refinable. ## The bar — adapts by use case The composition bar depends on what the email is trying to do. Don't force a cold-outbound frame onto a follow-up. | Use case | Anchor for the variant | Pain-bridge required? | |---|---|---| | `cold_outbound` | **Signal → pain → positioning chain** (specific, recent, verifiable signal; concrete inferred pain; GTM-context value prop) | **Yes — mandatory** | | `re_engagement` | Fresh new signal since the last contact → reconnection frame | Yes (lightweight — the signal IS the reason to reach back) | | `discovery_follow_up` | Prior conversation reference → next-step framing | No (the prior touchpoint replaces the pain bridge) | | `demo_recap` | Recap of what was shown / heard → concrete next step | No | | `renewal` | Outcome recap → renewal moment + stakeholder ask | No (anchor is the contract, not a pain) | | `expansion` | Existing outcome → adjacent need / persona | Pain-bridge ON the adjacent need, not the existing relationship | | `objection_handling` | Acknowledge stated objection → reframe | No (the objection IS the anchor) | | `chaser` (treat as a `re_engagement` variant) | One new fact or framing since the last send → "still relevant?" | No | Universal — every variant: specific to *this* prospect (no template feel); concrete next action; honest about state; ≤ use-case length cap. The rule in one line: **never default to "let me find a pain" when the use case calls for "what happens next."** ## Always-on context: `get_gtm_context` Call `get_gtm_context(detailed: true)` first. Parse offerings into: ``` offering_profile = { offering, pain_points[], value_props[], proof_bank[], cta_ladder[] } ``` Anchor on **one** `offering_profile`. Pick **one** `value_prop`. Never invent stats or customer names — only what GTM context / proof_bank provides. ## Input - **Prospect identifier (required)** — ZI person ID / email / name+company / name+domain. - **Use case (default `cold_outbound`)** — drives length, framework, CTA, and bar (see above). - **Outreach context (recommended)** — natural-language goal ("competitive displacement against [vendor]", "follow up on last week's pricing conversation"). - **Prior touchpoint summary (recommended for follow-ups / recaps / chasers)** — what happened last + named participants + open thread. Without it, the skill falls back to `account_research` + `contact_research` to reconstruct. - **Sender info (optional)** — name, title, email, phone, signoff. Otherwise omit signature. - **User-supplied template/content (optional)** — wins over everything below. Use as skeleton; fill placeholders only. - **Variant count (optional)** — 1 / 2 / 3. Default: governed by persona-fit discipline. - **Preferred angle (optional)** — `curiosity` / `value-frame` / `urgency`. - **Recipient email** — required for sending. Refuse if unresolvable. ## Use-case routing | Use case | Length | Framework | CTA style | |---|---|---|---| | `cold_outbound` | 50–80 | AIDA or Becc Holland 4-line | Lowest-friction tease | | `discovery_follow_up` | up to 120 | PAS (pain known) | 15–20 min fit check | | `demo_recap` | 80–120 | Recap → next-step | Concrete next-step proposal | | `re_engagement` / `chaser` | 50–80 | Curiosity / new-signal hook | One-line ask | | `renewal` | 80–120 | Outcome-recap → renewal step | Tied to contract step | | `expansion` | 80–120 | Outcome-recap → adjacent need | Fit check on adjacency | | `objection_handling` | up to 120 | Acknowledge → reframe | Direct one-question response | Frameworks: **AIDA** (cold) · **PAS** (pain known) · **Challenger** (provocative insight) · **Becc Holland 4-line** (Premise / Hook / CTA / Push-Pull — cold + re-engagement). ## Signal → pain mapping (cold-outbound + re-engagement) Used when the use case requires a signal → pain bridge. For follow-ups / recaps / renewals, the bridge is the prior touchpoint or contract moment, not a new pain. | Signal | Recency | Implied pains | Buying window | |---|---|---|---| | **M&A — acquirer** | 90d | Integration complexity, redundant tooling, vendor consolidation, IT security review | 3–9mo post-close | | **M&A — acquiree** | 90d | Loss of autonomy, vendor contract review, rip-and-replace risk | 0–6mo post-close | | **New CEO / C-suite hire** | 30d | Strategy reset, 100-day plan, vendor relationship reset, budget reallocation | 60–180d | | **Funding round** | 90d | Enterprise-grade tool need, hiring acceleration, scaling pains. A: replace founder tools · B: process formalization · C+: enterprise readiness | 3–6mo | | **Hiring plans / surge** | 30d | Onboarding load, tooling gaps revealed by scale | 0–6mo | | **Layoffs / restructuring** | 60d | Cost pressure, consolidation, automation appeal. Sensitivity > urgency | 6–12mo | | **Product launch** | 90d | GTM readiness, sales/marketing alignment, enablement gaps | 0–6mo | | **Earnings / financial results** | 30d | Public commitments → execution pressure | 30–90d | | **Intent topic spike** | 14d | Active research; score 80+ + audience A/B = warm | 0–60d | | **Partnership announcement** | 60d | Co-sell pressure, competitive disruption to incumbent vendors | 3–6mo | | **Pain Point scoop** | 90d | ZI-curated pain — already the bridge | 0–90d | When multiple signals exist, choose by **(recency × buyer-relevance × stage-alignment)**. Recency weighted heavily — a 14-day signal beats a 60-day one. ## Personalization ladder — use **exactly one**, never stack | Tier | What | When | |---|---|---| | **P0** | Neutral trigger (role + market trend) | Last-resort fallback | | **P1** | Role/segment insight (ICP-level) | When company-specific signal is thin | | **P2** | Company-specific event (news / product / metric) | Default for cold_outbound | | **P3** | Individual-specific (quote, prior interaction, CRM note) | Strongest; re_engagement / discovery_follow_up | | **Tier 0 override** | User-supplied template content | Always wins; fill placeholders only | ## Proof-source hierarchy — use **exactly one**, in order 1. Direct prior result with this account/contact (from `contact_research` / CRM). 2. Peer / segment outcome (from `proof_bank`). 3. Product evidence without metrics (capability → expected outcome). 4. Fallback: generic capability statement. **Never invent stats or customer names.** If proof_bank is empty, drop to tier 3 or 4 — never fabricate. ## Tone calibration When tone isn't supplied, infer by seat: - **Executives** (C/EVP/SVP) — outcome-first, concise, numeric proof, direct CTA. - **Directors / Managers** — problem → approach → outcome → CTA. - **Practitioners / ICs** — workflow friction → concrete benefit → quick next step. Universal: ~Grade 8 reading level. Slightly casual; slightly unsure phrasing ("might be off-base, but…"). ## Anti-patterns — fail-fast checklist If any fires, regenerate. 1. **Generic congratulations.** Banned openers: "Congrats on", "Saw the news about your", "Hope this finds you well", "Loved your recent post about" (without naming + thesis). 2. **"Just checking in" / "circling back".** Dead. Use a signal or don't follow up. 3. **Self-introduction-first.** "We're a leading provider of…" / "Hi, I'm…" / "We help [persona]…" — lead with the prospect. 4. **"I noticed..." crutch.** Stating a public fact without doing something with it. 5. **Signal without payoff.** Naming a signal then jumping to product pitch — skips the bridge. 6. **Forcing a pain bridge on a non-cold use case.** Follow-ups, recaps, renewals don't need a freshly invented pain. The anchor is the prior touchpoint or contract moment. 7. **Generic praise.** "Love what you're building" / "Big fan." Must tie to a specific achievement. 8. **Meeting ask as primary CTA on cold.** Tanks reply rate. Use a tease. 9. **Length > use-case cap.** Emails over 150 words are 42% less likely to get a reply. 10. **AI-generated feel.** Hedging, em-dashes everywhere, abstract claims with no verifiable detail. 11. **Padded subject lines.** Long, punctuation, numbers, first-names, brackets. Keep to 2–6 lowercase words. 12. **Stale signals.** 90d most categories / 30d hires-exec moves / 14d intent. 13. **Multiple CTAs.** Exactly one per email. 14. **Bullets in emails <100 words.** Fragments the mobile read. 15. **Invented stats / customer names.** Hard rule. 16. **Personalization stacking.** One ladder tier only. ## Workflow ### 1. Pull GTM context (always) `get_gtm_context(detailed: true)` → `offering_profile`. If empty, flag. ### 2. Honor input data first **INPUT DATA FIRST, TOOLS LAST.** If user supplied template / sender info / recipient email / prior touchpoint summary / outreach context, use directly. Only call tools for missing data. ### 3. Resolve the prospect - ZI person ID → use directly. - Email → `enrich_contacts(email)`. - Name + company → `enrich_contacts(firstName/lastName/companyName)`; fall back to `search_contacts`. - Resolve the prospect's company ID. - **Recipient email required** — refuse if unresolvable. - **Multi-recipient rule** — use only the first; never reference others. **Stale-record handling.** If `lastUpdatedDate` >12mo OR current `companyName` doesn't match user-named company: use company-level signals only, skip `contact_research`, surface caveat, suggest verifying role. ### 3.5. Relationship-context pre-flight (mandatory) Tag the resolved company. **Wait for user confirmation when the label is anything other than `prospect`.** - **`competitor`** — matches `get_gtm_context.competitors`. **Hard-warn.** Surface and ask: reroute to partnership/displacement-defense, acknowledge intentional targeting, or refuse. - **`customer`** — in `get_gtm_context.customers` / `proof_bank`. Suggest switching use_case to `expansion` or `renewal`. - **`partner`** — in `get_gtm_context.partners` / `integration_partners`. Surface co-sell / integration angle. - **`prospect`** — default; proceed. **Pipeline-account check (specialization).** Run `account_research(zoominfoCompanyId, query="Open opportunities, active deal stages, named champions, last activity date")`. Open opp → `pipeline_account` → suggest `discovery_follow_up` / `expansion`. Renewal date within 90d → suggest `renewal`. Active engagement → suggest `discovery_follow_up`. ### 4. Pull signals in parallel Pull only what the use case needs: - **Always:** `enrich_companies` (companyId, fields: description, industries, employeeCount, revenue, ...). - **Cold / re-engagement / chaser:** `enrich_company_signals` (`signalTypes: ["NEWS", "SCOOP", "INTENT"]`) — returns recent news, scoops, and intent in one call. Rank and filter in step 5 (the news category, e.g. funding / M&A / product / leadership, is carried on each returned signal). - **Discovery follow-up / demo recap / renewal / expansion / objection_handling:** primarily `contact_research` + `account_research` for prior-touchpoint reconstruction; news/scoops only as supporting context. Always run `contact_research` for the prospect (unless record is stale), with a query tuned to the use case. `enrich_company_signals` resolves intent topics server-side, so there is no need to pre-resolve topics via `lookup` — request `INTENT` in `signalTypes` and triage the returned topics in step 5. ### 5. Pick the anchor - **Cold / re-engagement:** rank signals by `(recency × buyer-relevance × stage-alignment)`. Recency: 0-14d = 1.0 · 14-30d = 0.7 · 30-60d = 0.4 · 60-90d = 0.2 · >90d = drop. 80-90d signals carry an "on the cusp" caveat. Buyer-relevance: CFO ↔ funding/earnings/M&A · CRO ↔ hiring/product launch · CTO ↔ tech-stack/product · CEO ↔ all. Pick top + record runner-up. - **Follow-up / recap / renewal / expansion / objection:** the anchor is the prior touchpoint (or contract moment, or named objection). Pull it from prior-touchpoint summary first, then `contact_research` / `account_research`. If both are silent and no touchpoint can be reconstructed → refuse and surface the gap. **Refuse-to-produce gate (cold / re-engagement only).** Refuse when **two or more** hold: 1. **Signal layer thin** — no company-level signal ≤60d. 2. **`contact_research` GTM-irrelevant** — nothing returned, OR what was returned maps to no value prop. 3. **Positioning anchor weak** — no clean value prop in GTM context maps to the inferred pain. All three → refuse outright. One → proceed but flag. Route refusals to warming channels or a different prospect. ### 6. Bridge to the anchor (use-case-conditional) - **Cold / re-engagement:** use the signal → pain mapping to infer the pain: *"For [persona] at a company that just [signal], the dominant unsolved problem in the next 90 days is likely [specific pain] because [reason]."* Iterate if generic. - **Other use cases:** the anchor is the prior touchpoint / contract / objection. The body's job is to acknowledge, surface the next step, and remove friction — not to introduce a freshly imagined pain. ### 7. Anchor positioning in GTM context Map the inferred pain (cold/re-engagement) OR the prior touchpoint (other use cases) to one concrete claim from `offering_profile.value_props` — never the elevator pitch. Pick one proof source per the hierarchy. If no value prop maps, flag and offer to reroute. ### 8. Compose variants **Persona-fit discipline:** - **Strong fit** → 3 variants. - **Moderate fit** → 2 variants. - **Stretch fit** → 1 variant with strong opt-out CTA. Don't force volume. **Variant angles:** - **A — Curiosity.** Lead with observation / question; tease. - **B — Value-frame.** Concrete claim or stat tied to the anchor (pain for cold; outcome for follow-up; objection-reframe for objection). - **C — Urgency / window.** Timing implication. Cold: only when signal ≤30d and buying window tight. Renewal/expansion: tied to contract date. Length per use case. Apply chosen framework. Tone: slightly casual, slightly unsure. **Exactly one** each: personalization tier · anchor · value prop · proof source · CTA. ### 9. Subject lines 2–6 lowercase words. No punctuation / numbers / first-names / brackets. Three patterns — generate then pick strongest: 1. **Pain → Outcome** (cold). "pipeline gaps shorten replies" 2. **Trigger → Value** (cold / re-engagement). "post-close stacks" 3. **Recap → Next step** (follow-up / recap / renewal). "monday's pricing thread" 4. **Peer / Proof cue** (any). "how X improved reply rates" ### 10. Signature If `sender_info` available, emit with **two trailing spaces per line** for Markdown line breaks: ``` Best,␠␠ Jordan Smith␠␠ Senior Account Executive␠␠ jordan.smith@example.com ``` If no sender info → omit signature. Don't invent. ### 11. Self-check before output - ☑ Word count within use-case cap. - ☑ Subject 2–6 lowercase words. - ☑ Opens with personalized hook (no generic greeting). - ☑ Cold / re-engagement: signal → pain → positioning chain present and specific. Other use cases: prior-touchpoint anchor present. - ☑ Exactly one each: ladder tier · anchor · value prop · proof source · CTA. - ☑ ~Grade 8; mobile-readable. - ☑ No clichés, jargon, filler, invented stats. - ☑ Recipient email present. - ☑ Signature: two trailing spaces per line OR omitted entirely. - ☑ All 16 anti-patterns cleared (including #6 — pain not forced on non-cold use cases). ### 12. Rubric (final scoring) Score 0–2 per dimension. Bar: ≥8/10. Drop or regenerate failures. 1. **Specificity** — verifiable fact about *this* prospect. 2. **Anchor strength** — for cold: pain bridge; for follow-up: prior-touchpoint reference; for renewal: contract moment. 3. **Positioning** — specific GTM-context claim. 4. **Reciprocity** — gives insight / framing / opt-out before asking. 5. **Send-worthiness** — would a senior seller press send? ### 13. Present + offer iteration 1. Accept variant. 2. Different signal (runner-up) — cold / re-engagement. 3. Different persona at same company. 4. Tighter anchor. 5. Switch angle. 6. Adjust tone (casual / formal / direct). 7. Switch use case. Iterate from step 6. Track variant evolution. Terminate on accept or pivot. ## Fallback rules - **Contact lookup fails** → `Hi [First Name]` greeting; continue. - **No public/CRM history** → skip `contact_research`; company signals only. - **Company sparse** → role-based personalization (drop to P1). - **Sender info missing** → omit signature. - **GTM context fails** → generic capability statement (proof tier 4); surface gap. - **No signal passes recency floor (cold)** → refuse; route to warming. - **No prior touchpoint reconstructable (follow-up)** → refuse; ask the user for a summary. Never block on a single missing tool (recipient email is the hard gate). Never invent data. ## Output Format ### TL;DR — Email for [Prospect Name], [Title] at [Company] · Pass [N] *Use case: [restate]. Framework: [AIDA / PAS / Challenger / Becc Holland].* **Anchor.** [For cold: signal + age + one-liner. For follow-up: prior touchpoint summary. For renewal: contract moment. For objection: stated objection.] **Bridge.** [For cold: inferred pain in one sentence. For others: omit OR brief next-step framing.] **Positioning.** [Specific GTM-context value prop.] *Proof source:* [tier 1/2/3/4]. --- ### Variant A — [angle] **Subject:** [2–6 lowercase words] [Body within use-case cap.] ### Variant B — [angle] *(if persona fit ≥ moderate)* **Subject:** [2–6 lowercase words] [Body.] ### Variant C — [angle] *(if persona fit strong)* **Subject:** [2–6 lowercase words] [Body.] --- ### Rationale | | | |---|---| | Use case | [label] | | Anchor | [signal+age / touchpoint / contract / objection] | | Personalization tier | [P0–P3] | | Pain (cold/re-engagement only) | [pain] | | Value prop | [claim] | | Proof source | [tier 1–4] | | Framework | [AIDA / PAS / Challenger / Becc Holland] | | Rubric | A: [X/10] · B: [X/10] · C: [X/10] | ### Iteration options 1. Accept [variant] → hand off to sequencer. 2. Different signal — anchor on [runner-up]. 3. Different persona at the same company. 4. Tighter anchor. 5. Switch angle. 6. Casual / formal / direct. 7. Switch use case. ### Caveats (when relevant) - **Relationship flag** — if `competitor` / `customer` / `partner` / `pipeline_account`, variants assume user confirmed override. - **Thin signal** — variants on weak base; warm on another channel first. - **Empty signal (cold)** — 0 variants; route to warming. - **Stretch fit** — 1 variant only. - **Stale-signal cliff** (60–90d) — urgency angle unavailable. - **Edge-of-recency** (80–90d) — on the cusp. - **Stale prospect record** — verify role before sending. - **No prior touchpoint** (follow-up) — refused; ask for a summary. - **GTM-context gap** — positioning generic; update GTM context. - **Sender info missing** — signature omitted. ### Chain Targets - Hand to a sequencer (e.g., Outreach, Salesloft). - Multi-step sequence → run once per step with different signals + use cases. - Batch personalization → `personalize-at-scale` (future scope). - Different prospect at same company → re-run with new identifier.