Campaign Execution Skill
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.
Process
Step 1: Load Campaign
- Search for campaigns in
.business_growth/sales/campaigns/
- Display campaigns with status and progress
- Ask user to select campaign
Load the campaign's
and
files from the campaign folder (
.business_growth/sales/campaigns/<campaign_id>/
).
Step 2: Determine Action
Based on
parameter or ask user:
| Action | Description |
|---|
| Execute all due actions for leads |
| Show campaign progress without actions |
| Set campaign status to paused |
| Set campaign status to running |
Step 3: For "status" Action
Display campaign summary:
- Campaign name and status
- Total leads in target list
- Breakdown by execution status
- Recent activity log
- Pending actions count
Step 4: For "run" Action
Process each lead in the target list:
4a. Check/Create Execution File
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.,
,
). Keep names concise, lowercase with underscores.
If not exists, create it:
markdown
# 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 -->
4b. Check If Action Due
Read execution file and check:
- Is status or ?
- Is current date >= next action time?
- Has previous step completed successfully?
If all true, action is due.
4c. Execute Due Action
Based on action type:
Connection Request:
- Navigate to lead's LinkedIn profile
- Click "Connect" button
- Add personalized note from template
- Send connection request
- Take screenshot for verification
Message:
- Navigate to lead's profile or messaging
- Open message compose
- Enter personalized message from template
- Send message
- Take screenshot for verification
Important: Replace template tokens with lead data:
- → Lead's first name
- → Lead's company
- → Lead's title
- → Custom personalization from research.md if exists
4d. Log Action and Update Status
markdown
## 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>
4e. Handle Special Cases
Connection Accepted (see
references/CHECK_CONNECTION_ACCEPTS.md
for full procedure):
- Check accepts via LinkedIn Connections page (sorted by recently added) — NOT sent invitations
- Send Step 2 welcome message from campaign template
- Update execution status and calculate next action time
Reply Received:
- Set status to
- No more automated actions
- Flag for manual follow-up
Failed Action:
- Log error in execution file
- Set status to with reason
- Continue with next lead
Step 5: Rate Limit Management
Track actions taken and advise on limits:
- Connection requests: ~20-25/day
- Messages: ~50-100/day
- Profile views: ~30/hour
When approaching limits:
- Pause execution
- Inform user of limits reached
- Suggest resuming after cooldown period
- Calculate when safe to resume
Step 6: Report Progress
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">
Step 7: Update Campaign Metrics
Update
performance metrics section with current counts.
Execution Statuses
| Status | Meaning |
|---|
| Not yet started |
| Sequence in progress, awaiting next step |
| Lead replied, stop automation |
| All steps executed |
| Error occurred, needs review |
Browser Tools Used
| Tool | Purpose |
|---|
| Get browser context |
| Go to LinkedIn profiles |
| Verify page state |
| Locate buttons and inputs |
| Enter message text |
| Click, scroll, screenshot |
Error Handling
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 |
Manual Check-In Approach
This skill is designed for periodic manual invocation:
- User invokes skill when ready to execute
- All due actions are processed
- Summary provided with next check-in time
- User invokes again when ready
This approach:
- Respects LinkedIn rate limits
- Gives user control over timing
- Allows review between batches
- Avoids continuous automation flags