marcosmodly/marketing-skill/email-outreach
Claude Code and agent skill by marcosmodly/marketing-skill
- community
Checking that the SKILL.md file is still in the repository.
Writes personalized cold emails to new prospects: researches each one against the ideal customer profile, never contacts anyone twice, and queues drafts for approval. Use whenever someone wants cold emails, prospecting, or outreach to people who don't know them yet, even a handful. Not for existing clients; opted-in subscribers are email-sequence.
Install
npx vskill@latest install marcosmodly/marketing-skill/email-outreachSKILL.md
Email Outreach
Purpose
Turn "find prospects and email them" into a repeatable daily job rather than a one-off batch: research real prospects against a defined ICP, write each one an email that could not be sent unchanged to anyone else, check every candidate against a permanent contact log so nobody gets emailed twice (or ever again, once they've unsubscribed or replied) — keeping that log accurate on its own by reading real Gmail replies and bounces instead of relying on someone remembering to update it — time each send to the prospect's own local business hours, hold every draft to a deliverability and compliance bar before it ships, and re-confirm the underlying strategy at least once a month instead of running the same angle forever unexamined. This skill drafts and queues only — it never sends anything, even when a connected Gmail account makes sending technically one tool call away.
Step-by-step process
Plugin root: if a path below still shows an unexpanded CLAUDE_PLUGIN_ROOT placeholder (Claude Code fills it in; other agents such as Codex don't), resolve it before using any of them: take the output of printenv CLAUDE_PLUGIN_ROOT if it prints a path, otherwise walk up from this file's folder to the first folder that contains references/brand-voice.md, and if neither works, ask the user where this plugin lives. Use that absolute path in every file path and shell command below.
- Check onboarding status. Read
${CLAUDE_PLUGIN_ROOT}/references/brand-voice.md. If it doesn't exist, or its first line is <!-- MARKETING-SKILL:UNCONFIGURED -->, pause and ask the user this plugin's 4 setup questions (priority task; content types to produce; target audience + tone; default output format — same as /marketing-skill:marketing-setup) before continuing, then save the answers into that file and flip the marker to CONFIGURED with today's date. Otherwise, read it for tone, audience, and banned words to apply below. If the file is unconfigured but the user already said to skip setup or use the defaults, don't ask: use its placeholder defaults for this run, say so in one line, and leave the marker as it is.
- Check outreach-strategy status. Read
${CLAUDE_PLUGIN_ROOT}/references/outreach-strategy.md.
- If it doesn't exist, or its first line is
<!-- MARKETING-SKILL:OUTREACH-UNCONFIGURED -->, run full guided setup before researching or drafting anything: ask for the Ideal Customer Profile/segment(s), the value proposition/angle per segment, the offer and primary CTA, sender identity and compliance (a real physical mailing address — required, don't invent or skip past it; from name; reply-to if different), the daily outreach volume target and whether the sending mailbox is new or established (new → propose a ramp schedule instead of jumping to target volume), the send-time window preference (default: the file's placeholder), the follow-up cadence, and the suppression window. Write the answers in under the file's existing headings and set the marker to <!-- MARKETING-SKILL:OUTREACH-STRATEGY (last refreshed: YYYY-MM-DD) --> using today's date.
- Otherwise, parse that date. If it's 30 or more days old, or the
user explicitly asks for a strategy review, run the Monthly Strategy Refresh below before continuing to step 3. If it's fresh, proceed straight to step 3 using the file's current settings.
Monthly Strategy Refresh:
- Run `python3 ${CLAUDE_PLUGIN_ROOT}/scripts/results.py --since
<last refresh date> (it reads state/outreach-log.md`, never the network) and use its Cold email section: emails sent since the last refresh, the reply, bounce, and unsubscribe rates, and the subject-line A/B call. That call is a significance test, not a glance at two percentages: under 30 sends a side it says "too few to tell", and a gap that could be chance is "no clear winner".
- Show the user that tally alongside the current ICP/segment(s),
angle, offer/CTA, sender identity, daily volume, send-time window, and follow-up cadence.
- Ask whether anything should change — segment, angle, offer, sender
identity, volume, send-time window, cadence, or suppression window — and whether to standardize on a subject-line variant, which is only on the table when results.py says one gets more replies; otherwise say why not and keep testing. "No changes, keep as-is" is a valid answer; don't force a change that isn't warranted.
- Rewrite the relevant section(s) with any changes, append one new
dated bullet to Performance Notes summarizing the tally (including the variant split) and what — if anything — changed because of it, and update the marker's date to today. Never delete prior Performance Notes entries.
- Report this refresh in today's output (see "Strategy Status" below)
before moving on to that day's batch in the same run.
- Sync the inbox (Gmail reply/bounce/unsubscribe detection). Check
whether Gmail MCP tools are connected in this session (runtime check, same pattern as the prospecting-tool check in step 6 — never assumed). If connected: read ${CLAUDE_PLUGIN_ROOT}/state/outreach-log.md and, for every row still Sent with no terminal outcome yet, look up its thread using the id stored in Notes (or search_threads by Email if none was stored) and apply the Automatic status detection rules documented in that file's own header — a reply with opt-out language becomes Unsubscribed/Do-Not-Contact, a plain reply becomes Replied, a bounce notification becomes Bounced, and anything genuinely ambiguous is left Sent and reported as ambiguous rather than guessed at. Update the file with whatever was resolved. If Gmail isn't connected, skip this step and say so in the output — the log's suppression accuracy then depends on manual updates until it is.
- Confirm scope for today's run.
- Batch size — default to the strategy file's Daily Outreach Volume
(or its warm-up ramp value, if still ramping) unless the user overrides it for this run.
- Specific named prospect(s) the user wants included directly (skip
straight to step 6's research for just those, using whatever the user already gave you), versus "find me N more" (full research flow in step 6).
- Research method — free by default. Unless the user's request for
this run explicitly asks for paid/verified enrichment (e.g. "use Vibe Prospecting," "get me verified emails," "pull real contact details this time"), research this batch with the free WebSearch/ WebFetch path in step 6, even when Vibe Prospecting is connected. Don't offer or switch to the paid path unprompted — if it's relevant to mention (e.g. the free pass came up thin, or the user seems to want higher-confidence data), say plainly that paid enrichment is available on request, then wait to actually use it until they ask.
- Any one-off override to the strategy defaults for this run only
(e.g. a different segment or offer just for today) — apply it to this batch without rewriting references/outreach-strategy.md; that file only changes during setup or an actual refresh.
- If the user only asked to check for replies/bounces/unsubscribes
("sync my outreach inbox," "any replies yet?") with no request for a new batch, stop after step 3's report instead of continuing to research or draft anything.
- Pull due follow-ups first. Read
${CLAUDE_PLUGIN_ROOT}/state/outreach-log.md (now current thanks to step 3). Any row with a Next Follow-Up date of today or earlier, and a Status that isn't one of the permanent-suppression values (Replied, Bounced, Unsubscribed, Do-Not-Contact), is due — include these first, counted against the batch size from step 4, before pulling any new prospects.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/email-outreach/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/marcosmodly/marketing-skill/email-outreach)