# Outreach

> Draft personalized cold outreach to a candidate the hiring manager hasn't contacted yet. Pulls background from Ashby, personalizes the hook, checks calendar for a time to propose, and sends. Use when the user says "reach out to X", "outreach to X", "email X" for a new candidate, or when sourcing passive candidates from WAAS AI Sourcer or LinkedIn.

- Skill: `yc-software/outreach` (Agent Skill)
- Install (CLI): `npx skillmds@latest add yc-software/outreach`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yc-software/outreach/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity
- Author: yc-software (https://skillmd.com/u/yc-software)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/yc-software/outreach

---


> **Note:** Read `recruit-config/user.md` for the hiring manager's name, email, and preferences. Do not hardcode any user-specific values.


# Outreach — Cold Email to New Candidate

Draft personalized cold outreach to a candidate the hiring manager has never contacted. Starts a new thread.

**IMPORTANT**: Before drafting, read the config files:
- `recruit-config/user.md` — hiring manager email, Zoom link, office, Slack IDs, noise senders
- `recruit-config/ashby.md` — source IDs, archive reasons, email style, draft tool rules
- `recruit-config/waas.md` — WAAS pipeline stages, job IDs, MCP tools` — Slack/Gmail config, source IDs, archive reasons
- `recruit-config/CLAUDE.local.md` — Slack bot token (gitignored)
- `recruit-config/jobs/product-engineer.md` — outreach template, tone rules, candidate bar, Ashby job/stage IDs
- `recruit-config/jobs/technical-cos.md` — Technical Chief of Staff role playbook
- `recruit-config/jobs/community-builder-ops-engineer.md` — Community Builder and Operations Engineer role playbook
- `recruit-config/jobs/design-engineer.md` — Design Engineer role playbook

These files are the source of truth for all job-specific and tone details. Do not hardcode any of those values in this skill.

## When to use this vs `/reply`

| Situation | Use |
|-----------|-----|
| Candidate has an existing email thread | `/reply` |
| **New candidate, no prior contact** | **`/outreach` — this skill** |

## Input

- `/outreach Jane Doe`
- `/outreach John Smith, Candidate C`
- "reach out to Peter Urda"
- "email Jane" (routed from `/recruit` when no existing thread)

## Procedure

### Step 1: Read config
Read all three config files to get the current template, team facts, tone rules, and Ashby IDs.

### Step 2: Gather candidate background
1. **Ashby**: `candidate_search(name)` → email, company, school, position, LinkedIn, location
2. **If not in Ashby**: Ask the hiring manager to add them first (via Chrome Extension or WAAS export), or provide email manually
3. **Check for existing threads**: `gmail_query_emails` for any prior emails to/from this person. If a thread exists, redirect to `/reply` instead.

### Step 3: Check calendar for a time to propose
Check the hiring manager's calendar for available 30-min slots in the next 7 business days. Find an open slot and propose it. If multiple candidates are being outreached in the same batch, stagger the proposed times.

### Step 4: Personalize the hook
Write one sentence connecting the candidate's specific background to YC's work. Follow the hook pattern and tone rules from `product-engineer.md`.

### Step 5: Draft the outreach
Use the template from the job config file (`jobs/product-engineer.md`). Fill in the personalized hook and proposed time. Follow all style rules from the job config.

### Email formatting rule

**No hard line wrapping.** Write each paragraph as a single continuous line — let the email client handle wrapping. Never insert `\n` within a paragraph. Only use newlines between paragraphs.

### Step 6: Present for approval — DO NOT SEND YET

```
## Outreach: {Name}
**To:** {email}
**Subject:** Reaching out from Y Combinator
**Source:** {WAAS/Applied/J&J/Chrome Extension}
**Background:** {one-line summary}
**Proposed time:** {day and time} PT

---
{draft email}
---

**d)** draft — create in Gmail drafts
**s)** send
**e)** edit — tell me what to change
**?)** something else
```

For multiple candidates, present all drafts first, then ask "send all?" or let the hiring manager approve one by one.

### Step 7: Wait for approval

| User says | Action |
|-----------|--------|
| **d** | Create Gmail draft |
| **s** | Send email |
| **e** | Ask what to change, update, re-present |
| **?** | Ask the user what they want |

### Choosing the channel: Gmail vs WAAS messaging

Before drafting, determine the right channel:

1. **Check if the candidate has a WAAS short_id** — look in Ashby custom fields, or check if they came from a WAAS application email.
2. **Check for existing WAAS messages** via `candidate_messages_list(short_id)`.

| Situation | Channel |
|-----------|---------|
| Candidate has WAAS short_id and no prior email thread | **WAAS messaging** — messages appear as emails to the candidate |
| Candidate is in Ashby but not WAAS (sourced via Chrome Extension, J&J, etc.) | **Gmail** — new thread |
| Candidate has both WAAS and email threads | **Gmail** — use the existing email thread via `/reply` |

When using WAAS messaging:
- No draft concept — options become **s/e/?** (no "d")
- After sending, update WAAS status: `candidate_status_update(short_id, state: "reviewing", pipeline_stage: "Reached Out")`

### Step 8: Execute (only after approval)

1. **Send email**: `mcp__claude_ai_Gmail__gmail_create_draft(to, subject, body, contentType: "text/html")` → `gmail_send_draft(draftId)`
2. **Move in Ashby** (if applicable): `application_change_stage` to "Reached Out" stage (get ID from job config)
3. **Verify (MANDATORY)**: DO NOT report success until you have re-queried sent mail to confirm delivery. If you moved Ashby stage, check `application_info` to confirm. Report what you verified.

#### WAAS messaging channel
1. **Send message**: `candidate_message_send(short_id, message)`
2. **Update WAAS stage**: `candidate_status_update(short_id, state: "reviewing", pipeline_stage: "Reached Out")`
3. **Move in Ashby** (if also in Ashby): `application_change_stage` to "Reached Out" stage

### Step 9: After sending

Report what was done:
```
Sent outreach to {Name} ({email}) via {Gmail/WAAS}. Proposed {day/time} PT.
Ashby: moved to Reached Out.
WAAS: moved to Reached Out.
```

## Rules

1. **NEVER send without approval.** Always present first with d/s/e/? options.
2. **Always personalize the hook.** Never send the template verbatim without a personalized opening.
3. **Always read config files first.** Never hardcode team size, template, tone rules, or Ashby IDs.
4. **Always propose a specific time.** Check the hiring manager's calendar first.
5. **Stagger times for batch outreach.** Don't propose the same slot to two candidates.
6. **Check for existing threads first.** If there's already an email thread, use `/reply` instead.
7. **New email, not a thread reply.** This creates a new thread — no threadId.
8. **Move to Reached Out in Ashby after sending** (get stage ID from job config).

## Gmail & Calendar Rules

- **ASCII only in emails.** No em dashes, curly quotes, or unicode. Use `--` instead of em dashes and straight quotes. The plain-text Gmail MCP tool mangles unicode into garbage.
- **Phone screen calendar invites** use the title `<Candidate First Name> and Ryan` -- no "Phone Screen" label. Later stages (tech screen, onsite, partner) include the stage name.
- **Use `mcp__claude_ai_Gmail__gmail_create_draft`** (not `mcp__gmail-drafts__gmail_create_draft`) when creating email drafts. Set `contentType: "text/html"` and use `<p>` tags. The `gmail-drafts` tool only supports `text/plain` which hard-wraps lines at 78 characters, making emails look broken.
- **Never create calendar invites until the candidate confirms the time.** Send the outreach or scheduling email first, wait for the candidate to reply confirming, then create the calendar event. Sending an unsolicited calendar invite before confirmation is presumptuous and creates a bad impression.

## Follow-Up Email Rules

When drafting follow-up emails to candidates who haven't responded to initial outreach:

### Tone
- **Don't say "following up," "circling back," "bumping this," "last note from me," or "I know I've tried a couple times."** The recipient doesn't care about your outreach cadence. Get to the strongest lead immediately.
- **No hyperbole.** Don't use "exactly," "perfect fit," "ideal candidate," or superlatives about the candidate's background. Keep it grounded.
- **Don't flatter.** Don't say things like "exactly the depth we need" about their experience. It reads as recruiter-speak.

### Content
- **Follow the tone and content rules in the job playbook** (`recruit-config/jobs/`) for role-specific framing, hooks, and what to emphasize.
- **Personalize based on their background** — reference specific things they've built or done, not generic bullet points.

### Structure
- **Two paragraphs max.** First paragraph: the hook + why their background is relevant. Second paragraph: the ask.
- **The call-to-action must be on its own line**, separated from the body. Don't bury it in the middle of a paragraph.
- **Combine the call time and coffee offer in one line:** "Would Thursday at 9am or Friday at 11am work for a call? Also happy to grab coffee at our Dogpatch office if you're nearby."

### Process
- **Always check Gmail for prior outreach** before presenting candidates as "never contacted." Search by both email and name.
- **Use `contentType: "text/html"`** when creating drafts to avoid Gmail's plain text line wrapping.

## Tone Rules

- **"interesting fit" not "great fit"** -- softer, less presumptuous.
- **"you've had experience" not "you clearly know"** -- too strong.
- **Don't oversell specific background matches** -- keep it broader.
- **Tone down academic credentials** -- lead with builder/founder energy, not degrees.
- **"not sure if you'd be open to it, but..."** is a good soft pitch for non-obvious roles.
- **"saw your profile and loved your energy"** works as an opener for builder types.

## Outreach Framings by Candidate Type

- **Applied AI + startups**: "I'm learning more about startups than I could have possibly imagined"
- **Big AI company candidates (OpenAI, Meta AI)**: "you obviously don't need convincing on the AI front. But what I'd pitch you on is everything else."
- **YC alumni/founders**: "Since you already know YC from the founder side, thought it'd be worth sharing what we're building on the software team"
- **Reconnects**: "I might have reached out a while back, but things are moving fast here and wanted to reconnect" (say "might have" not "definitely did")
- **Non-traditional backgrounds**: "We're looking for people with non-traditional backgrounds who can think across disciplines and build"
- **YC as learning org**: "At its core, YC is a learning organization -- we teach founders how to build companies"
- **Unlimited AI tokens** as a consistent selling point across all candidate types.
- **Multi-role pitches**: Frequently pitch 2 roles in one email (PE + Technical CoS, or Community Builder + Technical CoS) -- works well for versatile candidates.

## Follow-up Cadence

- **First outreach**: personalized, reference their background
- **Follow-up (7 days)**: shorter, personalized nudge, suggest specific time (Thursday AM)
- **Last nudge (14+ days)**: very short, "last nudge from me", no pressure, just drop Zoom link
- **After 2 follow-ups with no reply**: archive in Ashby, reactivate if they reply later

## Fraud Detection

Watch for these signals in Ashby applications:
- LinkedIn URL is broken or just a few characters (e.g., `/in/c`)
- Unusual LinkedIn slug patterns
- Phone area code doesn't match claimed location
- Check Ashby's fraudStatus field if available in the UI
- Multiple candidates with identical IP addresses or user agents

