Execute LinkedIn outreach campaigns by sending connection requests and messages. Use when user wants to run a campaign, execute outreach, check campaign status, send messages, or track campaign progress. Can be invoked with optional campaign_id and action (run, status, pause, resume).
Execute LinkedIn outreach campaigns by performing due actions and tracking progress. Uses a manual check-in approach where users invoke this skill periodically to process pending actions.
If campaign_id not provided:
.business_growth/sales/campaigns/Load the campaign's CAMPAIGN.md and LIST.md files from the campaign folder (.business_growth/sales/campaigns/<campaign_id>/).
Based on action parameter or ask user:
| Action | Description |
|---|---|
run |
| Execute all due actions for leads |
status | Show campaign progress without actions |
pause | Set campaign status to paused |
resume | Set campaign status to running |
Display campaign summary:
Process each lead in the target list:
For each lead, check if execution file exists at:
.business_growth/sales/campaigns/campaign_<name>/leads/<lead_name>/execution.md
Lead Naming: Generate meaningful snake_case names for leads based on their name and company (e.g., john_smith_acme, sarah_jones_techcorp). Keep names concise, lowercase with underscores.
If not exists, create it:
# Execution: <Lead Name>
## Lead Info
- **Name**: <name>
- **LinkedIn**: <url>
- **Company**: <company>
- **Campaign**: campaign_<name> # e.g., campaign_q1_outreach_fintech
## Status
- **Current**: pending
- **Current Step**: 1
- **Next Action**: connection_request
- **Next Action Time**: <now>
## Action Log
<!-- Actions will be logged here -->
Read execution file and check:
pending or in_progress?If all true, action is due.
Based on action type:
Connection Request:
Message:
Important: Replace template tokens with lead data:
{{first_name}} → Lead's first name{{company}} → Lead's company{{title}} → Lead's title{{custom}} → Custom personalization from research.md if existsUpdate execution.md:
## Status
- **Current**: in_progress
- **Current Step**: 2
- **Next Action**: message
- **Next Action Time**: <calculated based on sequence timing>
## Action Log
### <timestamp>
- **Step**: 1
- **Type**: connection_request
- **Content**: <actual message sent>
- **Outcome**: sent
- **Screenshot**: <reference if taken>
Connection Accepted (see references/CHECK_CONNECTION_ACCEPTS.md for full procedure):
Reply Received:
repliedFailed Action:
failed with reasonTrack actions taken and advise on limits:
When approaching limits:
After processing all due actions, provide summary:
## Campaign Execution Summary
**Campaign**: <name>
**Execution Time**: <timestamp>
### Actions Taken
- Connection Requests Sent: X
- Messages Sent: Y
- Total Actions: Z
### Lead Status Breakdown
- Pending: X leads
- In Progress: Y leads
- Replied: Z leads (🎉)
- Completed: W leads
- Failed: V leads
### Next Check-In
Recommend checking back in: <calculated time>
Reason: <rate limit cooldown / sequence timing>
### Leads Requiring Attention
- <Lead Name>: <reason - e.g., "Replied to connection request">
Update CAMPAIGN.md performance metrics section with current counts.
| Status | Meaning |
|---|---|
pending | Not yet started |
in_progress | Sequence in progress, awaiting next step |
replied | Lead replied, stop automation |
completed | All steps executed |
failed | Error occurred, needs review |
| Tool | Purpose |
|---|---|
tabs_context_mcp | Get browser context |
navigate | Go to LinkedIn profiles |
read_page | Verify page state |
find | Locate buttons and inputs |
form_input | Enter message text |
computer | Click, scroll, screenshot |
Common issues and responses:
| Issue | Response |
|---|---|
| Profile not found | Mark as failed, log reason |
| Connect button unavailable | May already be connected, verify |
| Rate limit warning | Stop execution, report to user |
| Login required | Ask user to log in manually |
| Message failed to send | Retry once, then mark failed |
This skill is designed for periodic manual invocation:
This approach: