Cold email outreach

End-to-end cold email outreach orchestration.

How to use it

  1. Hit Copy the whole skill.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/outreach/capabilities/cold-email-outreach#main ~/.claude/skills/cold-email-outreach

For one project only, change the path to .claude/skills/cold-email-outreach.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text375 lines
cold-email-outreach/SKILL.md375 lines13.4 KBpushed 96d agoRawView on GitHub

Cold Email Outreach

The final mile of the outbound pipeline. Takes leads from wherever the user has them, builds email sequences, loads campaigns into the user's chosen outreach tool, and launches.

Tool-agnostic: Asks the user which outreach platform they use. Defaults to Smartlead if they have MCP tools configured. Falls back to CSV export for any other tool or manual workflow.

When to Use

Use this skill when:

  • User says "launch a campaign", "send outreach", "email these leads", "set up cold email"
  • User has a list of leads and wants to run an outbound email campaign
  • User wants to create and configure a campaign in Smartlead or another outreach tool

Supported Outreach Tools

This skill does NOT assume a specific tool. It asks first, then adapts.

Tool Integration How It Works
Smartlead (default) MCP tools (mcp__smartlead__*) Full automation: create campaign, add sequences, import leads, allocate mailboxes, configure schedule, launch
Instantly CSV import Generate CSV matching Instantly's import format, user uploads manually
Lemlist CSV import Generate CSV with Lemlist-compatible columns
Apollo CSV import Generate CSV matching Apollo sequence import format
Manual / Other CSV + instructions Export leads + emails as generic CSV, provide setup instructions

Tool selection logic:

  1. Ask user in Phase 0: "Which outreach tool do you use?"
  2. If Smartlead → use MCP tools for full automation
  3. If Instantly / Lemlist / Apollo → generate tool-specific import CSV
  4. If Other or unknown → generate generic CSV (email, first_name, last_name, company, title, subject, body per touch) and ask user for their tool's import requirements

Prerequisites

Environment Variables

For Smartlead (full automation):

SMARTLEAD_API_KEY=your_api_key_here

All Smartlead API calls go to https://server.smartlead.ai/api/v1 with ?api_key=$SMARTLEAD_API_KEY appended. Rate limit: 10 requests per 2 seconds.

For CSV-based tools: No env vars needed.

Phase 0: Intake

Ask all questions at once. Organize by category. Skip any already answered.

Campaign Goal

  1. What's the objective? (book meetings, drive demo requests, get replies, nurture)
  2. What's the outreach angle or hook? (hiring signal, competitor displacement, event-based, pain-based, cold database)
  3. What should we name this campaign?

Outreach Tool

  1. Which outreach tool do you use? (Smartlead / Instantly / Lemlist / Apollo / Other / Just give me a CSV)

Lead Source

  1. Where are your leads? Accept any of these:
    • CSV file — read the file, map columns to required fields
    • Pasted list — names, emails, companies pasted directly
    • CRM export — Salesforce, HubSpot, or other CRM data
    • Database query — if the user has a database, help them query it
    • Upstream output — data from a prior task in this conversation
  2. Any exclusions? (specific companies, recently contacted leads, certain titles)
  3. Max campaign size? (default: 200)

Minimum required per lead: email address. Nice to have: first_name, last_name, company, title.

Sequence Design

  1. How many touches? (default: 3)
  2. Timing between touches? (default: Day 1 / Day 5 / Day 12)
  3. Personalization tier? (Tier 1: merge fields only / Tier 2: segment-specific / Tier 3: unique per lead)

Sending Config (skip if CSV export)

  1. Which email accounts should send? (list accounts or "use all available")
  2. Sending schedule? (default: Mon-Fri 8am-5pm in recipient's timezone)
  3. Daily send limit per account? (default: 30/day)
  4. Track opens and clicks? (default: opens yes, clicks no)

Phase 1: Lead Ingestion

Parse Leads

Accept leads from whatever source the user provides:

  • CSV file: Read the file. Flexibly match columns:
    • email (required) — also matches Email, email_address
    • first_name — also matches firstname, first, First Name
    • last_name — also matches lastname, last, Last Name
    • company_name — also matches company, organization, Company
    • Any extra columns become custom fields
  • Pasted data: Parse whatever format the user provides. Extract emails, names, companies.
  • CRM/Database: Help the user query or export, then parse the result.

Validate & Deduplicate

  • Remove rows without a valid email
  • Deduplicate by email (keep first occurrence)
  • Report: total rows, valid, invalid, duplicates removed

Present & Confirm

Show a sample table (10-15 leads) with:

  • Name, Title, Company, Email

Tell user: total eligible leads, how many were invalid/removed.

Ask user to confirm or adjust before proceeding.

Phase 2: Sequence Design

Present the sequence plan as a table before writing any copy:

Touch Day Email Type Framework CTA
1 1 Cold intro Signal-Proof-Ask 15-min call
2 5 New angle / asset PAS Resource offer
3 12 Social proof BAB Open to chat?

Get user approval on the structure before generating copy in Phase 3.

Phase 3: Email Generation

Write the email copy directly using these guidelines.

Email Structure Formula

Every cold email follows this skeleton:

Hook (1 sentence) → Evidence (1-2 sentences) → Offer (1 sentence)

Word count targets:

  • Cold intro (Touch 1): 50-90 words
  • Follow-up (Touch 2-3): 30-50 words
  • Breakup (final touch): 20-40 words

By Personalization Tier

Tier 1 (Generic): Generate one template per touch with merge fields ({first_name}, {company}, {title}). Same template for all leads.

Tier 2 (Segment): Generate one template per segment per touch. Segments are defined by role, industry, or signal type. Swap pain points and proof points between segments.

Tier 3 (Deep): Generate unique email per lead per touch. Cap at 50 leads — recommend Tier 2 above that volume.

Hard Rules

  1. No filler openers. Never "I hope this finds you well"
  2. No "just checking in" follow-ups. Every touch adds a new reason to reply
  3. Under 150 words per email. Most should be 80-120.
  4. One CTA per email. Always low-friction.
  5. No selling in the first sentence. Lead with them, not you.
  6. Subject lines under 50 chars. No caps, no exclamation marks, no emoji.
  7. Sign off with name only. No "Best regards."

Review Loop

  1. Generate sample emails for 3-5 leads first
  2. Present to user for review
  3. Iterate until approved (max 3 rounds)
  4. Generate remaining emails after approval

Phase 4: Campaign Setup

If Smartlead (MCP Automation)

Full automation via MCP tools. Execute in this order:

Step 1: Find and allocate mailboxes

mcp__smartlead__get_email_accounts

Returns all email accounts with id, from_email, from_name, daily_sent_count, is_smtp_success, is_imap_success.

To find free mailboxes (not already assigned to active campaigns):

  1. Fetch all campaigns: mcp__smartlead__get_campaigns
  2. For each campaign with status ACTIVE or STARTED, fetch its email accounts: mcp__smartlead__get_campaign_email_accounts
  3. Build a set of all email_account_id values currently assigned to active campaigns
  4. A mailbox is "free" if its id is NOT in the active set AND is_smtp_success = true AND is_imap_success = true
  5. Sort free mailboxes by daily_sent_count ascending (prefer least-used)
  6. Select the requested number of free mailboxes

If fewer free mailboxes than requested, tell the user and ask how to proceed.

Present available/selected accounts to user for confirmation.

Step 2: Create campaign

mcp__smartlead__create_campaign
  name: {campaign_name}

Save the returned campaign_id.

Step 3: Add sequence steps

mcp__smartlead__save_campaign_sequences
  campaign_id: {campaign_id}
  sequences: [
    { seq_number: 1, subject: "...", email_body: "...", seq_delay_details: { delay_in_days: 0 } },
    { seq_number: 2, subject: "...", email_body: "...", seq_delay_details: { delay_in_days: 4 } },
    { seq_number: 3, subject: "...", email_body: "...", seq_delay_details: { delay_in_days: 7 } }
  ]

Merge variable mapping: Convert {first_name}{{first_name}}, {company}{{company}} (Smartlead uses double-brace syntax).

Note: Blank subject on emails 2+ makes them send as replies in the same thread.

Step 4: Import leads (batch 100)

mcp__smartlead__add_leads_to_campaign
  campaign_id: {campaign_id}
  lead_list: [{ email: "...", first_name: "...", last_name: "...", company_name: "...", ... }]

Smartlead accepts max 100 leads per call. Chunk the list and call for each batch. Extra columns become custom_fields.

Step 5: Assign sending accounts

mcp__smartlead__add_email_accounts_to_campaign
  campaign_id: {campaign_id}
  email_account_ids: [...]

Step 6: Set schedule

mcp__smartlead__update_campaign_schedule
  campaign_id: {campaign_id}
  schedule: {
    timezone: "America/New_York",
    days_of_the_week: [1, 2, 3, 4, 5],
    start_hour: "08:00",
    end_hour: "18:00",
    min_time_btw_emails: 10,
    max_new_leads_per_day: 20
  }

days_of_the_week: 0=Sunday, 1=Monday, ..., 6=Saturday.

Step 7: Configure settings

mcp__smartlead__update_campaign_settings
  campaign_id: {campaign_id}
  settings: {
    track_settings: [],
    stop_lead_settings: "REPLY_TO_AN_EMAIL",
    send_as_plain_text: false,
    follow_up_percentage: 100
  }

Allowed track_settings: DONT_TRACK_EMAIL_OPEN, DONT_TRACK_LINK_CLICK, DONT_TRACK_REPLY_TO_AN_EMAIL Allowed stop_lead_settings: REPLY_TO_AN_EMAIL, CLICK_ON_A_LINK, OPEN_AN_EMAIL

If CSV-Based Tool (Instantly, Lemlist, Apollo, Other)

Step 1: Generate CSV

Columns depend on personalization tier:

Tier 1 (same template for all):

  • CSV columns: email, first_name, last_name, company, title, custom_field_1 (signal/hook)
  • Separate file with sequence templates (subjects + bodies with merge fields)

Tier 2/3 (per-segment or per-lead emails):

  • CSV columns: email, first_name, last_name, company, title, touch_1_subject, touch_1_body, touch_2_subject, touch_2_body, touch_3_subject, touch_3_body

Step 2: Save file

Save to the current working directory:

{campaign-name}-{YYYY-MM-DD}.csv

Step 3: Provide tool-specific import instructions

Instantly:

  • Upload CSV → Sequences → Create new sequence
  • Map columns: Email → email, First Name → first_name, etc.
  • Paste sequence templates into each step
  • Set delays between steps

Lemlist:

  • People → Import → Upload CSV
  • Map custom variables to columns
  • Create campaign → add email steps → insert variables

Apollo:

  • Sequences → Create Sequence → add email steps
  • Contacts → Import → Upload CSV
  • Add imported contacts to sequence

Other / Manual:

  • Provide the CSV path and explain the column structure
  • Ask user what format their tool expects, adjust if needed

Phase 5: Review & Launch

Present campaign summary:

Campaign: {name}
Leads: {count}
Sequence: {touches} touches over {days} days
Sending: {accounts} accounts × {daily_limit}/day = {daily_volume} emails/day
Estimated completion: {date}
Tool: {smartlead/instantly/etc.}

Hard Approval Gate

Do NOT activate the campaign without explicit user confirmation. Present the summary, then ask: "Ready to launch? Type 'yes' to activate."

  • Smartlead: mcp__smartlead__update_campaign_status → set status to START
  • CSV tools: Tell user the file is ready for import, provide the file path

Smartlead API Reference

All endpoints use base URL https://server.smartlead.ai/api/v1 with ?api_key= query param.

Endpoint Method Purpose
/campaigns/create POST Create a new campaign
/campaigns GET List all campaigns
/campaigns/{id} GET Get campaign by ID
/campaigns/{id}/schedule POST Set campaign schedule
/campaigns/{id}/settings POST Update tracking/stop settings
/campaigns/{id}/sequences POST Save email sequences
/campaigns/{id}/leads POST Add leads (max 100 per call)
/campaigns/{id}/email-accounts GET List mailboxes on a campaign
/campaigns/{id}/email-accounts POST Assign mailboxes to campaign
/campaigns/{id}/status POST Change campaign status (START/PAUSED/STOPPED)
/campaigns/{id}/analytics GET Top-level campaign analytics
/email-accounts/ GET List all email accounts (offset/limit)

Cost

Component Cost
Smartlead campaign setup Free (API included with Smartlead plan)
CSV export Free
Email copy generation Free (LLM reasoning)

Error Handling

Error Fix
SMARTLEAD_API_KEY not set Ask user to add it to .env or export it
Smartlead rate limit (429) Wait 2 seconds and retry
Lead upload fails Check email format, retry batch
No free mailboxes Show all accounts, ask user which to use
Campaign creation fails Check API key validity
1---
2name: cold-email-outreach
3description: >
4 End-to-end cold email outreach orchestration. Handles goal alignment, lead
5 ingestion from any source (CSV, paste, CRM export, database), sequence design,
6 email generation, campaign setup in the user's chosen outreach tool, and launch.
7 Tool-agnostic — supports Smartlead (full MCP automation), Instantly, Lemlist,
8 Apollo, or manual CSV export.
9tags: [outreach]
10---
11 
12# Cold Email Outreach
13 
14The final mile of the outbound pipeline. Takes leads from wherever the user has them, builds email sequences, loads campaigns into the user's chosen outreach tool, and launches.
15 
16**Tool-agnostic:** Asks the user which outreach platform they use. Defaults to Smartlead if they have MCP tools configured. Falls back to CSV export for any other tool or manual workflow.
17 
18## When to Use
19 
20Use this skill when:
21- User says "launch a campaign", "send outreach", "email these leads", "set up cold email"
22- User has a list of leads and wants to run an outbound email campaign
23- User wants to create and configure a campaign in Smartlead or another outreach tool
24 
25## Supported Outreach Tools
26 
27This skill does NOT assume a specific tool. It asks first, then adapts.
28 
29| Tool | Integration | How It Works |
30|------|------------|--------------|
31| **Smartlead** (default) | MCP tools (`mcp__smartlead__*`) | Full automation: create campaign, add sequences, import leads, allocate mailboxes, configure schedule, launch |
32| **Instantly** | CSV import | Generate CSV matching Instantly's import format, user uploads manually |
33| **Lemlist** | CSV import | Generate CSV with Lemlist-compatible columns |
34| **Apollo** | CSV import | Generate CSV matching Apollo sequence import format |
35| **Manual / Other** | CSV + instructions | Export leads + emails as generic CSV, provide setup instructions |
36 
37**Tool selection logic:**
381. Ask user in Phase 0: "Which outreach tool do you use?"
392. If **Smartlead** → use MCP tools for full automation
403. If **Instantly / Lemlist / Apollo** → generate tool-specific import CSV
414. If **Other or unknown** → generate generic CSV (`email`, `first_name`, `last_name`, `company`, `title`, `subject`, `body` per touch) and ask user for their tool's import requirements
42 
43## Prerequisites
44 
45### Environment Variables
46 
47**For Smartlead (full automation):**
48```
49SMARTLEAD_API_KEY=your_api_key_here
50```
51All Smartlead API calls go to `https://server.smartlead.ai/api/v1` with `?api_key=$SMARTLEAD_API_KEY` appended. Rate limit: 10 requests per 2 seconds.
52 
53**For CSV-based tools:** No env vars needed.
54 
55## Phase 0: Intake
56 
57Ask all questions at once. Organize by category. Skip any already answered.
58 
59### Campaign Goal
601. What's the objective? (book meetings, drive demo requests, get replies, nurture)
612. What's the outreach angle or hook? (hiring signal, competitor displacement, event-based, pain-based, cold database)
623. What should we name this campaign?
63 
64### Outreach Tool
654. Which outreach tool do you use? (Smartlead / Instantly / Lemlist / Apollo / Other / Just give me a CSV)
66 
67### Lead Source
685. Where are your leads? Accept any of these:
69 - **CSV file** — read the file, map columns to required fields
70 - **Pasted list** — names, emails, companies pasted directly
71 - **CRM export** — Salesforce, HubSpot, or other CRM data
72 - **Database query** — if the user has a database, help them query it
73 - **Upstream output** — data from a prior task in this conversation
746. Any exclusions? (specific companies, recently contacted leads, certain titles)
757. Max campaign size? (default: 200)
76 
77**Minimum required per lead:** email address. Nice to have: first_name, last_name, company, title.
78 
79### Sequence Design
808. How many touches? (default: 3)
819. Timing between touches? (default: Day 1 / Day 5 / Day 12)
8210. Personalization tier? (Tier 1: merge fields only / Tier 2: segment-specific / Tier 3: unique per lead)
83 
84### Sending Config (skip if CSV export)
8511. Which email accounts should send? (list accounts or "use all available")
8612. Sending schedule? (default: Mon-Fri 8am-5pm in recipient's timezone)
8713. Daily send limit per account? (default: 30/day)
8814. Track opens and clicks? (default: opens yes, clicks no)
89 
90## Phase 1: Lead Ingestion
91 
92### Parse Leads
93 
94Accept leads from whatever source the user provides:
95 
96- **CSV file:** Read the file. Flexibly match columns:
97 - `email` (required) — also matches `Email`, `email_address`
98 - `first_name` — also matches `firstname`, `first`, `First Name`
99 - `last_name` — also matches `lastname`, `last`, `Last Name`
100 - `company_name` — also matches `company`, `organization`, `Company`
101 - Any extra columns become custom fields
102- **Pasted data:** Parse whatever format the user provides. Extract emails, names, companies.
103- **CRM/Database:** Help the user query or export, then parse the result.
104 
105### Validate & Deduplicate
106 
107- Remove rows without a valid email
108- Deduplicate by email (keep first occurrence)
109- Report: total rows, valid, invalid, duplicates removed
110 
111### Present & Confirm
112 
113Show a sample table (10-15 leads) with:
114- Name, Title, Company, Email
115 
116Tell user: total eligible leads, how many were invalid/removed.
117 
118Ask user to confirm or adjust before proceeding.
119 
120## Phase 2: Sequence Design
121 
122Present the sequence plan as a table before writing any copy:
123 
124| Touch | Day | Email Type | Framework | CTA |
125|-------|-----|-----------|-----------|-----|
126| 1 | 1 | Cold intro | Signal-Proof-Ask | 15-min call |
127| 2 | 5 | New angle / asset | PAS | Resource offer |
128| 3 | 12 | Social proof | BAB | Open to chat? |
129 
130Get user approval on the structure before generating copy in Phase 3.
131 
132## Phase 3: Email Generation
133 
134Write the email copy directly using these guidelines.
135 
136### Email Structure Formula
137 
138Every cold email follows this skeleton:
139 
140```
141Hook (1 sentence) → Evidence (1-2 sentences) → Offer (1 sentence)
142```
143 
144**Word count targets:**
145- Cold intro (Touch 1): 50-90 words
146- Follow-up (Touch 2-3): 30-50 words
147- Breakup (final touch): 20-40 words
148 
149### By Personalization Tier
150 
151**Tier 1 (Generic):** Generate one template per touch with merge fields (`{first_name}`, `{company}`, `{title}`). Same template for all leads.
152 
153**Tier 2 (Segment):** Generate one template per segment per touch. Segments are defined by role, industry, or signal type. Swap pain points and proof points between segments.
154 
155**Tier 3 (Deep):** Generate unique email per lead per touch. Cap at 50 leads — recommend Tier 2 above that volume.
156 
157### Hard Rules
158 
1591. **No filler openers.** Never "I hope this finds you well"
1602. **No "just checking in" follow-ups.** Every touch adds a new reason to reply
1613. **Under 150 words per email.** Most should be 80-120.
1624. **One CTA per email.** Always low-friction.
1635. **No selling in the first sentence.** Lead with them, not you.
1646. **Subject lines under 50 chars.** No caps, no exclamation marks, no emoji.
1657. **Sign off with name only.** No "Best regards."
166 
167### Review Loop
168 
1691. Generate sample emails for 3-5 leads first
1702. Present to user for review
1713. Iterate until approved (max 3 rounds)
1724. Generate remaining emails after approval
173 
174## Phase 4: Campaign Setup
175 
176### If Smartlead (MCP Automation)
177 
178Full automation via MCP tools. Execute in this order:
179 
180**Step 1: Find and allocate mailboxes**
181 
182```
183mcp__smartlead__get_email_accounts
184```
185 
186Returns all email accounts with `id`, `from_email`, `from_name`, `daily_sent_count`, `is_smtp_success`, `is_imap_success`.
187 
188To find **free mailboxes** (not already assigned to active campaigns):
189 
1901. Fetch all campaigns: `mcp__smartlead__get_campaigns`
1912. For each campaign with status `ACTIVE` or `STARTED`, fetch its email accounts: `mcp__smartlead__get_campaign_email_accounts`
1923. Build a set of all `email_account_id` values currently assigned to active campaigns
1934. A mailbox is "free" if its `id` is NOT in the active set AND `is_smtp_success` = true AND `is_imap_success` = true
1945. Sort free mailboxes by `daily_sent_count` ascending (prefer least-used)
1956. Select the requested number of free mailboxes
196 
197If fewer free mailboxes than requested, tell the user and ask how to proceed.
198 
199Present available/selected accounts to user for confirmation.
200 
201**Step 2: Create campaign**
202 
203```
204mcp__smartlead__create_campaign
205 name: {campaign_name}
206```
207 
208Save the returned `campaign_id`.
209 
210**Step 3: Add sequence steps**
211 
212```
213mcp__smartlead__save_campaign_sequences
214 campaign_id: {campaign_id}
215 sequences: [
216 { seq_number: 1, subject: "...", email_body: "...", seq_delay_details: { delay_in_days: 0 } },
217 { seq_number: 2, subject: "...", email_body: "...", seq_delay_details: { delay_in_days: 4 } },
218 { seq_number: 3, subject: "...", email_body: "...", seq_delay_details: { delay_in_days: 7 } }
219 ]
220```
221 
222**Merge variable mapping:** Convert `{first_name}``{{first_name}}`, `{company}``{{company}}` (Smartlead uses double-brace syntax).
223 
224**Note:** Blank `subject` on emails 2+ makes them send as replies in the same thread.
225 
226**Step 4: Import leads (batch 100)**
227 
228```
229mcp__smartlead__add_leads_to_campaign
230 campaign_id: {campaign_id}
231 lead_list: [{ email: "...", first_name: "...", last_name: "...", company_name: "...", ... }]
232```
233 
234Smartlead accepts max 100 leads per call. Chunk the list and call for each batch. Extra columns become `custom_fields`.
235 
236**Step 5: Assign sending accounts**
237 
238```
239mcp__smartlead__add_email_accounts_to_campaign
240 campaign_id: {campaign_id}
241 email_account_ids: [...]
242```
243 
244**Step 6: Set schedule**
245 
246```
247mcp__smartlead__update_campaign_schedule
248 campaign_id: {campaign_id}
249 schedule: {
250 timezone: "America/New_York",
251 days_of_the_week: [1, 2, 3, 4, 5],
252 start_hour: "08:00",
253 end_hour: "18:00",
254 min_time_btw_emails: 10,
255 max_new_leads_per_day: 20
256 }
257```
258 
259`days_of_the_week`: 0=Sunday, 1=Monday, ..., 6=Saturday.
260 
261**Step 7: Configure settings**
262 
263```
264mcp__smartlead__update_campaign_settings
265 campaign_id: {campaign_id}
266 settings: {
267 track_settings: [],
268 stop_lead_settings: "REPLY_TO_AN_EMAIL",
269 send_as_plain_text: false,
270 follow_up_percentage: 100
271 }
272```
273 
274Allowed `track_settings`: `DONT_TRACK_EMAIL_OPEN`, `DONT_TRACK_LINK_CLICK`, `DONT_TRACK_REPLY_TO_AN_EMAIL`
275Allowed `stop_lead_settings`: `REPLY_TO_AN_EMAIL`, `CLICK_ON_A_LINK`, `OPEN_AN_EMAIL`
276 
277### If CSV-Based Tool (Instantly, Lemlist, Apollo, Other)
278 
279**Step 1: Generate CSV**
280 
281Columns depend on personalization tier:
282 
283**Tier 1 (same template for all):**
284- CSV columns: `email`, `first_name`, `last_name`, `company`, `title`, `custom_field_1` (signal/hook)
285- Separate file with sequence templates (subjects + bodies with merge fields)
286 
287**Tier 2/3 (per-segment or per-lead emails):**
288- CSV columns: `email`, `first_name`, `last_name`, `company`, `title`, `touch_1_subject`, `touch_1_body`, `touch_2_subject`, `touch_2_body`, `touch_3_subject`, `touch_3_body`
289 
290**Step 2: Save file**
291 
292Save to the current working directory:
293```
294{campaign-name}-{YYYY-MM-DD}.csv
295```
296 
297**Step 3: Provide tool-specific import instructions**
298 
299**Instantly:**
300- Upload CSV → Sequences → Create new sequence
301- Map columns: Email → email, First Name → first_name, etc.
302- Paste sequence templates into each step
303- Set delays between steps
304 
305**Lemlist:**
306- People → Import → Upload CSV
307- Map custom variables to columns
308- Create campaign → add email steps → insert variables
309 
310**Apollo:**
311- Sequences → Create Sequence → add email steps
312- Contacts → Import → Upload CSV
313- Add imported contacts to sequence
314 
315**Other / Manual:**
316- Provide the CSV path and explain the column structure
317- Ask user what format their tool expects, adjust if needed
318 
319## Phase 5: Review & Launch
320 
321Present campaign summary:
322 
323```
324Campaign: {name}
325Leads: {count}
326Sequence: {touches} touches over {days} days
327Sending: {accounts} accounts × {daily_limit}/day = {daily_volume} emails/day
328Estimated completion: {date}
329Tool: {smartlead/instantly/etc.}
330```
331 
332### Hard Approval Gate
333 
334**Do NOT activate the campaign without explicit user confirmation.** Present the summary, then ask: "Ready to launch? Type 'yes' to activate."
335 
336- **Smartlead:** `mcp__smartlead__update_campaign_status` → set status to `START`
337- **CSV tools:** Tell user the file is ready for import, provide the file path
338 
339## Smartlead API Reference
340 
341All endpoints use base URL `https://server.smartlead.ai/api/v1` with `?api_key=` query param.
342 
343| Endpoint | Method | Purpose |
344|----------|--------|---------|
345| `/campaigns/create` | POST | Create a new campaign |
346| `/campaigns` | GET | List all campaigns |
347| `/campaigns/{id}` | GET | Get campaign by ID |
348| `/campaigns/{id}/schedule` | POST | Set campaign schedule |
349| `/campaigns/{id}/settings` | POST | Update tracking/stop settings |
350| `/campaigns/{id}/sequences` | POST | Save email sequences |
351| `/campaigns/{id}/leads` | POST | Add leads (max 100 per call) |
352| `/campaigns/{id}/email-accounts` | GET | List mailboxes on a campaign |
353| `/campaigns/{id}/email-accounts` | POST | Assign mailboxes to campaign |
354| `/campaigns/{id}/status` | POST | Change campaign status (START/PAUSED/STOPPED) |
355| `/campaigns/{id}/analytics` | GET | Top-level campaign analytics |
356| `/email-accounts/` | GET | List all email accounts (offset/limit) |
357 
358## Cost
359 
360| Component | Cost |
361|-----------|------|
362| Smartlead campaign setup | Free (API included with Smartlead plan) |
363| CSV export | Free |
364| Email copy generation | Free (LLM reasoning) |
365 
366## Error Handling
367 
368| Error | Fix |
369|-------|-----|
370| `SMARTLEAD_API_KEY` not set | Ask user to add it to `.env` or export it |
371| Smartlead rate limit (429) | Wait 2 seconds and retry |
372| Lead upload fails | Check email format, retry batch |
373| No free mailboxes | Show all accounts, ask user which to use |
374| Campaign creation fails | Check API key validity |
375 

Discussion

Alternatives

Also in Email sequences