Cold Outreach
Setup (one time)
Fill in references/config.md with your sender identity, product one-liner, target profile,
and subject line. Set two environment variables:
export RESEND_API_KEY="your-key" # free key at https://resend.com
export JINA_API_KEY="your-key" # optional; free key at https://jina.ai (Reader also works keyless)
Core Workflow
- Research — deep-dive a prospect using parallel agents (page scraping + web search).
- Evaluate — rate the prospect 1-10 on fit signal, size, and contact accessibility.
- Draft — personalize the template with a prospect-specific hook.
- Preview — send the draft to your own inbox (from config) for a visual review.
- Send — after explicit confirmation, send to the target via Resend.
- Log — update
ledger/prospects.md with send date, recipient, and follow-up notes.
Research Protocol
Launch 2-3 parallel research agents:
Agent 1 — Site scrape: scrape the prospect's website for team members, roles, emails,
bios, and the pages most relevant to what you sell. Use the jina-image-search skill or
raw jina endpoints — Reader (r.jina.ai) works keyless; Search (s.jina.ai) needs
JINA_API_KEY (or use the built-in WebSearch tool instead).
Agent 2 — External research: search each decision-maker by name on public profiles
(LinkedIn, industry directories, review sites). Find reviews, ratings, awards, talks,
publications, and the company's external reputation.
Agent 3 (optional) — Depth on the buying signal: scrape the pages that indicate whether
they have the problem you solve, and identify the specific gap your product fills.
Fit Evaluation
Rate prospects 1-10:
| Factor |
Weight |
What to look for |
| Buying signal |
High |
Evidence they have the exact problem you solve |
| Size |
Medium |
The size band where your offer lands best (define it in config) |
| Contact accessibility |
High |
A direct decision-maker email >> a generic inbox >> a contact form only |
| Readiness |
Medium |
No incumbent solution = easier; an entrenched competitor = harder |
| Reputation |
Low |
Public ratings as a tiebreaker |
8-10: strong target. 5-7: moderate. 1-4: low priority.
Who to Send To
- The person who owns the problem you solve day-to-day.
- A direct, named email over a generic inbox (
firstname@company.com > info@company.com).
- Skip
admin@/noreply@. For a generic inbox at a larger org, add a bold Attn: [team] line using their actual internal team name.
Email Template
Read references/email-template.html and references/email-template.txt. Fill the
placeholders from references/config.md and the prospect research.
Personalization rules
- Replace
[prospect specific thing] with something concrete from their site (a 30-second skim).
- Reference their actual content, work, or details — show you looked.
- Do NOT personalize the subject line. For B2B cold email, a generic, low-key subject
generally out-performs a personalized one; keep it short and non-salesy (set it in config).
Template style rules
- Inline styles only (email clients strip
<style> tags); plain-text version always included.
- System font stack, ~15px, line-height 1.6, near-black text; one clear link, not a loud button.
- Keep it short and text-first for deliverability — avoid heavy images on a first send.
Sending Protocol
Send via the Resend API — see scripts/send-email.sh (reads RESEND_API_KEY; takes the
from-address, subject, recipient, and bodies so nothing is hardcoded).
- From / subject: from
references/config.md.
- Always send both HTML and plain-text versions.
- Always confirm the recipient with the user before the real send.
- For previews, send to your own address (config) with a "(test)" subject prefix.
Tracking
After each send, update ledger/prospects.md: add/refresh the prospect's row (name, contact,
size, signal), mark SENT [date] with recipient + role, and note the next follow-up.
Follow-Up Sequence
3-4 days after the initial send, up to two follow-ups, each hitting a different angle
(a different pain point, a proof point, or a short nudge). Stop after two; never spam.
1---2name: cold-outreach3description: Research a prospect, evaluate fit, draft a personalized cold email, preview it to yourself, send it via Resend, and track it in a bounded ledger. Use when the user asks to "research a company/prospect", "check out this lead", "draft a cold email", "send cold outreach", "outreach to this business", "deep dive on this prospect", "add to my prospect list", or "follow up". Config-driven: you set your sender identity, product, and ideal customer in references/config.md — the skill stays generic across industries.4---56# Cold Outreach78<objective>9Run personalized 1:1 cold-email outreach for whatever you're selling. Covers the full10workflow: deep prospect research (parallel agents — web search + page scraping + public11profiles), a 1-10 fit rating, a personalized draft, a **mandatory preview to your own inbox12before any real send**, sending via the Resend API, and tracking in a bounded ledger. You13define who you are and what you sell in `references/config.md`; the skill reads it each run.14NEVER send without a preview confirmation.15</objective>1617<context>18@references/config.md19@ledger/prospects.md20</context>2122<execution_context>23- 🟢 Auto: research, evaluation, draft generation, preview-to-self send24- 🟡 ASK on: which recipient to target if there are multiple candidates, custom personalization, follow-up timing25- 🔴 NEVER: send to a generic inbox without a specific Attn line; send to the real recipient without a preview + explicit "yes send it"; modify the ledger without an explicit request26- Mandatory self-preview: ALWAYS send the draft to your own address (from config) with a "(test)" subject prefix BEFORE the real send27- History: append-only `ledger/prospects.md` (one row per prospect; status tracked via cell updates)28</execution_context>2930## Setup (one time)3132Fill in `references/config.md` with your sender identity, product one-liner, target profile,33and subject line. Set two environment variables:3435```bash36export RESEND_API_KEY="your-key" # free key at https://resend.com37export JINA_API_KEY="your-key" # optional; free key at https://jina.ai (Reader also works keyless)38```3940## Core Workflow41421. **Research** — deep-dive a prospect using parallel agents (page scraping + web search).432. **Evaluate** — rate the prospect 1-10 on fit signal, size, and contact accessibility.443. **Draft** — personalize the template with a prospect-specific hook.454. **Preview** — send the draft to your own inbox (from config) for a visual review.465. **Send** — after explicit confirmation, send to the target via Resend.476. **Log** — update `ledger/prospects.md` with send date, recipient, and follow-up notes.4849## Research Protocol5051Launch 2-3 parallel research agents:5253**Agent 1 — Site scrape**: scrape the prospect's website for team members, roles, emails,54bios, and the pages most relevant to what you sell. Use the `jina-image-search` skill or55raw jina endpoints — Reader (`r.jina.ai`) works keyless; Search (`s.jina.ai`) needs56`JINA_API_KEY` (or use the built-in `WebSearch` tool instead).5758**Agent 2 — External research**: search each decision-maker by name on public profiles59(LinkedIn, industry directories, review sites). Find reviews, ratings, awards, talks,60publications, and the company's external reputation.6162**Agent 3 (optional) — Depth on the buying signal**: scrape the pages that indicate whether63they have the problem you solve, and identify the specific gap your product fills.6465## Fit Evaluation6667Rate prospects 1-10:6869| Factor | Weight | What to look for |70|--------|--------|------------------|71| Buying signal | High | Evidence they have the exact problem you solve |72| Size | Medium | The size band where your offer lands best (define it in config) |73| Contact accessibility | High | A direct decision-maker email >> a generic inbox >> a contact form only |74| Readiness | Medium | No incumbent solution = easier; an entrenched competitor = harder |75| Reputation | Low | Public ratings as a tiebreaker |7677**8-10**: strong target. **5-7**: moderate. **1-4**: low priority.7879## Who to Send To80811. The person who owns the problem you solve day-to-day.822. A direct, named email over a generic inbox (`firstname@company.com` > `info@company.com`).833. Skip `admin@`/`noreply@`. For a generic inbox at a larger org, add a bold **Attn: [team]** line using their actual internal team name.8485## Email Template8687Read `references/email-template.html` and `references/email-template.txt`. Fill the88placeholders from `references/config.md` and the prospect research.8990### Personalization rules91- Replace `[prospect specific thing]` with something concrete from their site (a 30-second skim).92- Reference their actual content, work, or details — show you looked.93- **Do NOT personalize the subject line.** For B2B cold email, a generic, low-key subject94 generally out-performs a personalized one; keep it short and non-salesy (set it in config).9596### Template style rules97- Inline styles only (email clients strip `<style>` tags); plain-text version always included.98- System font stack, ~15px, line-height 1.6, near-black text; one clear link, not a loud button.99- Keep it short and text-first for deliverability — avoid heavy images on a first send.100101## Sending Protocol102103Send via the Resend API — see `scripts/send-email.sh` (reads `RESEND_API_KEY`; takes the104from-address, subject, recipient, and bodies so nothing is hardcoded).105106- **From / subject**: from `references/config.md`.107- Always send both HTML and plain-text versions.108- Always confirm the recipient with the user before the real send.109- For previews, send to your own address (config) with a "(test)" subject prefix.110111## Tracking112113After each send, update `ledger/prospects.md`: add/refresh the prospect's row (name, contact,114size, signal), mark **SENT [date]** with recipient + role, and note the next follow-up.115116## Follow-Up Sequence1171183-4 days after the initial send, up to two follow-ups, each hitting a different angle119(a different pain point, a proof point, or a short nudge). Stop after two; never spam.120121<saved_rules_format>122Accumulate learnings in `references/lessons.md` (durable). Format:123`- {topic}: {rule} — set {YYYY-MM-DD}`124e.g. "channel: direct email beats generic inbox", "subject: never personalized", "timing:125Tuesday morning best open rate", "skip: prospects with an entrenched incumbent".126Surface relevant rules at the start of a run.127</saved_rules_format>128129<recovery_protocol>130- Interrupted mid-research → check which agents completed; resume only the missing ones.131- Interrupted mid-draft → reload the prospect research; regenerate the draft.132- Interrupted mid-send → check Resend for the last send id; verify it actually sent before retrying (avoid duplicate sends).133</recovery_protocol>134135<error_handling>136- Scrape returns blocked/empty → fall back to web search; never block on one source.137- Resend rate limit → sleep and retry once.138- No direct email → require explicit user go before sending to a generic inbox.139- Bounce / hard fail → mark the row `BOUNCED [date]`; do not retry without confirmation.140</error_handling>141142<success_criteria>143- [ ] Prospect research completed (multi-agent output)144- [ ] Fit rating assigned (1-10) with rationale145- [ ] Draft personalized with a prospect-specific hook146- [ ] Preview sent to your own inbox with a "(test)" prefix147- [ ] User confirmed before the real send148- [ ] Ledger row appended/updated with SENT [date]149- [ ] Follow-up notes added150</success_criteria>