home / skills / openclaw / skills / ironclaw-outreach-sequencer
This skill designs and runs multi-step outreach sequences across LinkedIn and email, personalizing messages from lead data to boost responses.
npx playbooks add skill openclaw/skills --skill ironclaw-outreach-sequencerReview the files below or copy the command above to add this skill to your agents.
---
name: outreach-sequencer
description: Create and manage multi-step outreach sequences ā LinkedIn messages, cold emails, and follow-ups with personalization. Use when asked to "send outreach", "create email sequence", "follow up with leads", "start a drip campaign", "send LinkedIn messages", "personalized outreach", or any automated multi-step communication workflow.
metadata: { "openclaw": { "emoji": "šØ" } }
---
# Outreach Sequencer ā Multi-Step Personalized Campaigns
Design, schedule, and execute multi-step outreach sequences across LinkedIn and email. Each message is personalized per lead using their profile data from DuckDB.
## Sequence Templates
### Template 1: LinkedIn Connection + Message
```
Day 0: Send LinkedIn connection request (with note)
Day 1: If accepted ā Send intro message
Day 3: If no reply ā Follow-up message
Day 7: If no reply ā Break-up / value-add message
```
### Template 2: Cold Email Sequence
```
Day 0: Initial cold email
Day 3: Follow-up (reply to original thread)
Day 7: Value-add email (case study, resource)
Day 14: Break-up email ("closing the loop")
```
### Template 3: Multi-Channel
```
Day 0: LinkedIn connection request
Day 2: Cold email (if not connected on LinkedIn)
Day 4: LinkedIn message (if connected) OR email follow-up
Day 7: Final touch (whichever channel they engaged on)
```
## Personalization Engine
Each message is generated per-lead using their DuckDB profile data. Use these variables:
| Variable | Source | Example |
|----------|--------|---------|
| `{first_name}` | Name field (split) | "Jane" |
| `{company}` | Company field | "Acme Corp" |
| `{title}` | Title field | "CTO" |
| `{mutual}` | Shared connections/background | "Stanford" |
| `{trigger}` | Why reaching out now | "saw your Series A" |
| `{value_prop}` | What you offer them | "AI-powered analytics" |
| `{pain_point}` | Their likely challenge | "scaling engineering team" |
### Personalization Rules
- **Never use generic openers** like "I hope this finds you well"
- **Reference something specific**: recent post, company news, shared background
- **Keep LinkedIn messages under 300 chars** (connection note limit)
- **Keep cold emails under 150 words** (respect attention)
- **Vary language across leads** ā don't send identical messages to people at the same company
- **Match tone to seniority**: C-suite gets concise/strategic, ICs get technical/peer-level
### Message Generation Pattern
```
1. Read lead profile from DuckDB
2. Identify personalization hooks:
- Shared background (school, company, location)
- Recent company news (web search if needed)
- Role-specific pain points
3. Select message template for sequence step
4. Generate personalized message
5. Store message + status in DuckDB
```
## Execution
### LinkedIn Messages (via Browser)
```
browser ā open LinkedIn messaging
browser ā search for recipient
browser ā open conversation
browser ā type personalized message
browser ā send
ā Update DuckDB status: "Sent"
```
### Email (via gog CLI)
```bash
gog gmail send \
--to "{email}" \
--subject "{subject}" \
--body "{personalized_body}" \
--account [email protected]
```
For follow-ups (reply to thread):
```bash
gog gmail reply \
--thread-id "{thread_id}" \
--body "{follow_up_body}"
```
## Sequence Status Tracking
Track in DuckDB with these status fields:
| Field | Values | Notes |
|-------|--------|-------|
| Outreach Status | Queued, Sent, Replied, Converted, Bounced, Opted Out | Main status |
| Sequence Step | 1, 2, 3, 4 | Current step in sequence |
| Last Outreach | date | When last message was sent |
| Next Outreach | date | When next step is due |
| Outreach Channel | LinkedIn, Email, Both | Active channel |
| Reply Received | boolean | True if they responded |
| Thread ID | text | Gmail thread ID for email chains |
```sql
-- Find leads due for next sequence step
SELECT "Name", "Email", "Outreach Status", "Sequence Step", "Next Outreach"
FROM v_leads
WHERE "Outreach Status" = 'Sent'
AND "Reply Received" = false
AND "Next Outreach" <= CURRENT_DATE
ORDER BY "Next Outreach";
```
## Cron Integration
Set up automated sequence execution:
```
Schedule: Every 2 hours during business hours (9am-5pm Mon-Fri)
Action:
1. Query leads due for next step
2. For each due lead:
a. Generate personalized message for their current step
b. Send via appropriate channel
c. Update status + advance step
d. Set next outreach date
3. Report: "Sent 12 messages (8 LinkedIn, 4 email). 3 replies received."
```
### Cron Job Setup (for OpenClaw)
```json
{
"name": "Outreach Sequencer",
"schedule": { "kind": "cron", "expr": "0 9,11,13,15 * * 1-5", "tz": "America/Denver" },
"sessionTarget": "isolated",
"payload": {
"kind": "agentTurn",
"message": "Run outreach sequence check. Query DuckDB for leads with Next Outreach <= today. Send personalized messages for their current sequence step. Update statuses. Report results.",
"timeoutSeconds": 300
}
}
```
## Safety & Compliance
- **Daily send limits**: Max 50 LinkedIn connection requests/day, 100 messages/day
- **Email limits**: Max 100 cold emails/day (avoid spam flags)
- **Opt-out handling**: If someone replies "not interested" / "unsubscribe", immediately set status to "Opted Out" and never contact again
- **Bounce handling**: If email bounces, mark as "Bounced" and try alternate email patterns
- **CAN-SPAM compliance**: Include sender identity, physical address option, and opt-out mechanism in emails
- **LinkedIn ToS**: Keep connection notes professional, don't spam InMails
- **Cool-down**: If a lead hasn't replied after full sequence, wait 90 days before any re-engagement
## Analytics
After each sequence run, track:
```
Active Sequences: 85 leads
āāā Step 1 (Initial): 20 leads
āāā Step 2 (Follow-up): 35 leads
āāā Step 3 (Value-add): 18 leads
āāā Step 4 (Break-up): 12 leads
ā
Outcomes:
āāā Replied: 23 (27% reply rate)
āāā Converted: 8 (9.4% conversion)
āāā Opted Out: 3 (3.5%)
āāā Bounced: 2 (2.4%)
āāā No Response (completed): 15 (17.6%)
```
This skill designs, schedules, and executes multi-step outreach sequences across LinkedIn and email with per-lead personalization. It reads lead profiles from DuckDB, generates tailored messages, sends them via browser or gog CLI, and updates sequence status. The skill enforces send limits, opt-out rules, and tracking to maintain compliance and deliverability.
The skill queries DuckDB for leads due for the next outreach step, extracts personalization hooks (name, company, triggers, mutuals), and selects the appropriate template for the sequence step. It generates a personalized message for each lead, sends LinkedIn messages via automated browser actions or emails via gog CLI, and records status, thread IDs, and next outreach dates back into DuckDB. A cron job can run the pipeline periodically to advance sequences, respect daily limits, and compile a summary report.
How are personalization variables populated?
Variables come from DuckDB lead profiles and optional web checks for recent company news; fields include first_name, company, title, mutual, trigger, value_prop, and pain_point.
How does the skill handle opt-outs and bounces?
Opt-outs are set to Opted Out immediately and excluded from future runs; bounces are marked Bounced and alternate emails can be tried per configured rules.
What limits does the skill enforce to stay compliant?
It enforces daily limits (e.g., LinkedIn connection and message caps, email send caps), requires unsubscribe options in emails, and observes a 90-day cool-down after no response.