The complete OpenClaw autonomous SDR playbook — from detecting real-time LinkedIn job postings to booking qualified meetings, running 100% self-hosted on your own machine.
This playbook teaches you to deploy a fully autonomous OpenClaw AI agent that monitors LinkedIn job postings in real time, identifies companies actively hiring for roles that signal a pain point your product solves, researches each company and decision-maker, then sends a hyper-personalized cold email — all without you lifting a finger.
Ubuntu 22.04+, macOS 13+, or any VPS/cloud instance. 2GB RAM minimum, 4GB recommended.
v18+ required. Run node --version to confirm. Use nvm if needed.
A dedicated sending domain (not your main). Warmed up for ≥14 days. Google Cloud project for Pub/Sub.
OpenAI or Anthropic key (LLM backbone), Apollo.io API key, Slack bot token, Calendly API token.
# Option A: Official one-liner (recommended) curl -fsSL https://openclaw.ai/install.sh | bash # Option B: npm global install npm install -g openclaw@latest # Verify installation openclaw --version # → openclaw v2026.2.23
openclaw onboard # The wizard will prompt you for: # ✓ LLM provider + API key (OpenAI / Anthropic / local Ollama) # ✓ Gmail OAuth2 credentials # ✓ Workspace name → "linkedin-sdr" # ✓ Gateway port (default: 18789) # ✓ Slack webhook URL
openclaw start # Gateway running at http://localhost:18789 # Control UI available at http://localhost:18789/ui # To run as a persistent background service: openclaw start --daemon # Or with PM2: pm2 start openclaw -- start && pm2 save
| Component | Type | Purpose in this Workflow | Install |
|---|---|---|---|
| Gmail Channel | Channel | Outbound email sending + inbound reply monitoring via Google Pub/Sub | openclaw channel add gmail |
| Browser Tool | Tool | Headless Chromium — scrapes LinkedIn job postings + Apollo/company pages | Built-in (enable in config) |
| bankr Skill | Skill | Headless email login + send with randomized timing for deliverability | See below ↓ |
| Cron Tool | Tool | Schedules LinkedIn scrape every 4 hrs + follow-up sequence triggers | Built-in |
| Memory Tool | Tool | Persists lead state (contacted, replied, booked) to avoid duplicates | Built-in |
| Slack Channel | Channel | Hot reply alerts → your phone in <90 seconds | openclaw channel add slack |
| Shell Tool | Tool | Runs Apollo CLI lookups, CSV exports, CRM sync scripts | Built-in |
# Install bankr skill from OpenClaw community skills library openclaw skill install https://github.com/BankrBot/openclaw-skills/tree/main/bankr # Install botchan skill (multi-agent routing helper) openclaw skill install https://github.com/BankrBot/openclaw-skills/tree/main/botchan # Verify installed skills openclaw skill list # → bankr@1.2.0 ✓ # → botchan@0.9.1 ✓
# 1. Create Google Cloud Pub/Sub topic gcloud pubsub topics create openclaw-gmail-replies gcloud pubsub subscriptions create openclaw-sub \ --topic=openclaw-gmail-replies \ --push-endpoint=http://YOUR_SERVER:18789/webhooks/gmail # 2. Grant Gmail push permission gcloud pubsub topics add-iam-policy-binding openclaw-gmail-replies \ --member=serviceAccount:gmail-api-push@system.gserviceaccount.com \ --role=roles/pubsub.publisher # 3. Register in OpenClaw config (~/.openclaw/config.json)
{
"workspace": "linkedin-sdr",
"gateway_port": 18789,
"channels": {
"gmail": {
"enabled": true,
"pubsub_topic": "projects/YOUR_PROJECT/topics/openclaw-gmail-replies",
"watch_labels": ["INBOX"],
"sender_email": "outreach@yourdomain.com"
},
"slack": {
"enabled": true,
"webhook_url": "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK",
"alert_channel": "#sdr-hot-replies"
}
},
"tools": {
"browser": { "enabled": true, "headless": true },
"cron": { "enabled": true },
"memory": { "enabled": true, "backend": "sqlite" },
"shell": { "enabled": true, "whitelist": ["node", "curl", "python3"] }
}
}
This agent runs on a cron schedule, uses the browser tool to search LinkedIn Jobs, and pipes new postings into the research queue.
--- name: linkedin-signal-scraper description: Monitors LinkedIn job postings for hiring signals every 4 hours tools: [browser, cron, memory, shell] cron: "0 */4 * * *" --- ## System Prompt You are a B2B lead intelligence agent. Your job is to find companies actively posting jobs that signal a pain point our product solves. ## Job Keywords to Monitor Search LinkedIn Jobs for these exact title patterns (one search per run): - "Head of Sales Operations" OR "RevOps Manager" - "VP of Customer Success" OR "Customer Success Manager" - "Sales Development Representative" (bulk hiring = scaling GTM) - "Go-To-Market Lead" For each job posting found: 1. Extract: company name, job title, company size, location, posting date, job URL 2. Check memory: skip if company already in contacted_leads list 3. Score signal strength (1-10) based on: seniority, urgency language, number of roles 4. If score ≥ 7: add to research_queue in memory 5. If score 4-6: add to warm_queue 6. Log results to shell: node log-leads.js ## Browser Instructions Navigate to: https://www.linkedin.com/jobs/search/?keywords=QUERY&f_TPR=r86400 (r86400 = last 24 hours only — avoid re-processing old postings) Extract all job cards on page 1. Do not login to LinkedIn.
--- name: lead-research-agent description: Enriches leads from research_queue with Apollo + web research tools: [browser, shell, memory] trigger: memory_queue:research_queue --- For each lead in research_queue: ## Step 1: Apollo.io Enrichment Call Apollo API to find decision-maker contact: curl -X POST https://api.apollo.io/v1/people/search \ -H "x-api-key: $APOLLO_API_KEY" \ -d '{"q_organization_name": "{{company_name}}", "person_titles": ["VP Sales", "CRO", "Head of Revenue", "CEO", "Founder", "VP Operations"]}' Extract: first_name, last_name, email, linkedin_url, title, headline ## Step 2: Company News Research (browser) Search: "{{company_name}} news site:techcrunch.com OR site:businesswire.com" Look for: recent funding, product launches, new hires, expansions Extract the most relevant news item from last 90 days. ## Step 3: Job Posting Deep Read (browser) Navigate to the LinkedIn job URL. Extract: - Full job description text - "Nice to have" vs "Required" sections - Tech stack mentioned - Team size hints ("join our 5-person team") - Pain language ("currently using spreadsheets", "manual process") ## Step 4: Compile Research Profile Save to memory under lead_profiles:{{company_domain}}: { "contact": {...apollo_data...}, "company_news": "...", "job_signal": "...", "pain_points": [...], "personalization_hooks": [...], "signal_score": N } Move lead from research_queue → write_queue in memory.
--- name: sdr-copywriter-agent description: Writes 3-touch hyper-personalized cold email sequences from lead profiles tools: [memory] trigger: memory_queue:write_queue model: gpt-4o --- You are an elite B2B cold email copywriter. Write emails that feel like they were written by a thoughtful human who spent 20 minutes researching. Never sound like a robot. Never use "I hope this email finds you well." ## Lead Context (injected from memory) - Contact: {{contact.first_name}} {{contact.last_name}}, {{contact.title}} - Company: {{company_name}} - Job Signal: {{job_signal}} - Recent News: {{company_news}} - Pain Points: {{pain_points}} - Personalization Hooks: {{personalization_hooks}} ## Email 1 — The Signal-Based Opener (Day 1) Subject: max 8 words, reference the job posting or news item Body: - Line 1: Hyper-specific observation about their job posting - Line 2: Connect posting → implicit pain → your solution (1 sentence) - Line 3: Social proof (metric or client name) - CTA: Soft — "Worth a 15-min chat?" - Max 5 sentences total. NO fluff. ## Email 2 — The Value-Add Follow-up (Day 4) Subject: Re: [Email 1 subject] OR new angle Body: - New insight or resource relevant to their pain - One-sentence pitch - Different CTA: Calendly link ## Email 3 — The Breakup (Day 10) Subject: "Closing the loop, {{first_name}}" Body: 2 sentences. Assume bad timing. Leave door open. No pitch. Just human. ## Output Format Return JSON with keys: email1_subject, email1_body, email2_subject, email2_body, email3_subject, email3_body
--- name: email-sender-agent description: Sends email sequences via bankr skill with human-like timing tools: [memory, cron] skills: [bankr] trigger: memory_queue:send_queue --- For each lead in send_queue: 1. Retrieve email sequence from memory: lead_sequences:{{lead_id}} 2. Send Email 1 via bankr skill: bankr.send({ to: "{{contact.email}}", from: "{{sender_name}} <outreach@yourdomain.com>", subject: "{{email1_subject}}", body: "{{email1_body}}", delay_seconds: random_between(30, 180) // humanize sending }) 3. Schedule follow-ups via cron: - Email 2: now + 4 days + random_hours(0, 8) - Email 3: now + 10 days + random_hours(0, 8) 4. Update memory: contacted_leads:{{company_domain}} = { status: "sequence_active", email1_sent: timestamp, thread_id: "{{gmail_thread_id}}" } 5. Log to shell for CRM sync.
| Job Signal Detected | Implied Pain | Email Angle |
|---|---|---|
| "Head of Sales Operations" posted | RevOps broken, pipeline visibility missing | Reference the ops chaos that triggers this hire |
| "5x Customer Success Managers" posted | Churn risk, scaling CS manually | Connect to manual processes slowing their CS team |
| "VP of Revenue / CRO" posted | Revenue growth stalled, needs strategy overhaul | Reference growth plateau + new revenue motion needed |
| "10 SDRs" being hired | Top-of-funnel broken, scaling outbound manually | Show how you 10x that SDR output with AI |
| "Go-To-Market Lead" posted at Series A | No GTM playbook, founder still selling | Founder-to-scalable-sales transition pain |
Subject: Saw you're building out RevOps at Acme Hi Sarah, Noticed Acme just posted for a Head of Sales Operations — usually means pipeline visibility has become a genuine bottleneck at your growth stage. We help Series B companies like yours get full-funnel reporting in place in under 2 weeks, without a 6-month RevOps hire — Rippling saved $180k in Year 1 using this approach. Worth a 15-min chat this week? [Your Name]
Subject: Re: Saw you're building out RevOps at Acme Hi Sarah, Sharing a quick 5-min read that might be timely — our breakdown of the 3 pipeline reporting mistakes most Series B teams make when scaling RevOps: [Link] If any of those land, I think we could save you 3+ months of the typical implementation timeline. Happy to show you a quick demo → https://cal.com/auralynxai/45min [Your Name]
Subject: Closing the loop, Sarah Hey Sarah — I'll assume the timing isn't right and won't bug you again. If RevOps ever becomes a priority, you know where to find me. [Your Name]
// Contact variables (from Apollo enrichment) {{contact.first_name}} // "Sarah" {{contact.last_name}} // "Chen" {{contact.title}} // "VP of Sales" {{contact.linkedin_headline}} // "Scaling GTM @ Acme" // Company variables {{company_name}} // "Acme Corp" {{company_size}} // "51-200 employees" {{company_funding_stage}} // "Series B" // Signal variables (extracted from job posting) {{job_title_posted}} // "Head of Sales Operations" {{job_pain_language}} // "manual processes", "spreadsheets" {{job_tech_stack}} // "Salesforce, HubSpot" {{signal_urgency}} // "immediate start", "ASAP" // Research variables {{company_recent_news}} // "raised $12M Series B, Jan 2026" {{personalization_hook}} // Best hook chosen by research agent {{pain_category}} // "revops_broken" | "churn_risk" | etc.
--- name: reply-handler-agent description: Classifies inbound replies and triggers appropriate actions tools: [memory, shell] channels: [gmail, slack] trigger: channel:gmail:pubsub_push --- On every Gmail Pub/Sub push event: ## 1. Match to Active Sequence Check if sender email matches any lead in contacted_leads memory. If no match: ignore (not our outreach thread). ## 2. Classify Reply Intent Analyze reply body with LLM classification: Classify into one of: - POSITIVE: "yes", "interested", "let's chat", "send calendar" - MAYBE: "not right now", "follow up next quarter", "send more info" - OBJECTION: "we already have X", "not our priority", price concern - UNSUBSCRIBE: "remove me", "stop emailing", "unsubscribe" - OUT_OF_OFFICE: auto-reply detected ## 3. Act on Classification If POSITIVE: - Cancel pending follow-up crons for this lead - Send Slack alert to #sdr-hot-replies (within 60 seconds): "🔥 HOT REPLY from {{name}} @ {{company}}: '{{reply_snippet}}'" - Auto-reply with personalized email including Calendly link: "Hey {{first_name}}, great! Here's a link to grab time: https://calendly.com/yourlink/30min — looking forward to it!" - Update memory: lead status → "meeting_requested" If MAYBE: - Pause sequence (cancel Email 2/3 crons) - Schedule re-engagement cron for specified date + 7 days buffer - Send Slack alert to #sdr-warm-replies If OBJECTION: - Send to Slack #sdr-objections for human review - Pause sequence pending human response If UNSUBSCRIBE: - IMMEDIATELY cancel all crons for this lead - Add to do_not_contact list in memory - Log for compliance audit trail If OUT_OF_OFFICE: - Extract return date if present - Reschedule Email 2 to: max(original_date, return_date + 2_days)
Cron fires → LinkedIn scrape → new posting found → research queue populated within 4 hrs of posting.
Apollo lookup + company news + job deep-read → lead profile built → email sequence generated → Email 1 sent with 30–180s random delay.
Email 2 auto-fires from cron (if no reply detected). New angle, value resource, Calendly CTA.
Email 3 fires. Human, 2-sentence breakup. Leaves door open. Sequence ends.
Pub/Sub fires in <90 seconds → intent classified → Slack alert + personalized auto-reply with Calendly sent instantly.
Booking confirmed → OpenClaw updates memory → Slack celebrates → CRM entry created via shell script.
Based on 2026 data from Instantly.ai, Smartlead, AiSDR, and Auralynx AI client deployments using signal-based outreach vs. generic cold email:
Generic cold email (no signal) achieves ~1–3% reply rates in 2026. Signal-based outreach (LinkedIn job posting as trigger) consistently achieves 8–15% because:
| Metric | Generic Blast | Signal-Based (This Playbook) | Lift |
|---|---|---|---|
| Open Rate | 20–30% | 45–65% | +2.2x |
| Reply Rate | 1–3% | 8–15% | +5–8x |
| Meeting Rate | 0.2–0.5% | 2–5% | +6–10x |
| Spam Complaints | High (blasting) | Very Low (relevant) | Safer |
| Cost per Meeting | $120–$400 | $15–$60 | -75% |
Run a "Router Agent" using the botchan skill that dispatches leads to specialized sub-agents based on company size, industry, or pain category. Enterprise leads get a different copywriter persona than SMB leads. Deploy 3 parallel writer agents for 3x throughput with no additional infrastructure.
# Create named agents in your workspace openclaw agent create --name "router" --skill botchan openclaw agent create --name "researcher" --skill lead-research-agent openclaw agent create --name "writer-enterprise" --skill sdr-copywriter-enterprise openclaw agent create --name "writer-smb" --skill sdr-copywriter-smb openclaw agent create --name "sender" --skill email-sender-agent openclaw agent create --name "reply-handler" --skill reply-handler-agent # Wire them together openclaw workspace wire linkedin-sdr \ --flow "scraper → router → researcher → writer-* → sender → reply-handler"
Add a "Performance Analyst" agent that reads your Gmail sent/reply data weekly, identifies which subject line patterns have highest open rates, and auto-updates the copywriter agent's SKILL.md with winning formulas. Your agent literally gets better every week without you touching it.
Set up 3–5 warmed sending domains. OpenClaw's bankr skill can rotate across them automatically — configure in the email-sender skill. This allows 150–300 emails/day safely without triggering Gmail's sending limits on any single domain.
{
"sending_domains": [
{ "email": "tanveer@yourdomain.co", "daily_limit": 40 },
{ "email": "tanveer@yourdomain.io", "daily_limit": 40 },
{ "email": "tanveer@yourdomain.ai", "daily_limit": 40 }
],
"rotation_strategy": "round-robin",
"send_window": { "start": "08:00", "end": "17:00", "timezone": "America/New_York" }
}
Add Telegram channel alongside Slack so you get hot reply alerts on your phone even when not logged into Slack. OpenClaw supports Telegram, WhatsApp, Discord, Signal, and iMessage as native channels — add them in 2 minutes.
openclaw channel add telegram # Paste your bot token when prompted # Add to reply-handler-agent channels: [gmail, slack, telegram]
Create a private GitHub repo for your custom skills. Use openclaw skill install https://github.com/YOUR_ORG/private-skills/skill-name with a PAT. Keep your best-performing prompts, signal categories, and personalization logic proprietary and version-controlled.
| Week | Emails/Day | Activity |
|---|---|---|
| Week 1–2 | 5–10 | Manual warmup tool (Instantly, Smartlead warmup, or Mailreach). Real sends between real inboxes. |
| Week 3 | 15–25 | Continue warmup pool + first 5–10 real outreach emails manually reviewed. |
| Week 4 | 25–40 | Enable OpenClaw automated sending. Maintain warmup pool in parallel. |
| Week 5+ | 40–60 | Full automation. Monitor spam rates in Google Postmaster Tools daily. |
# SPF — authorize Google to send for your domain TXT @ "v=spf1 include:_spf.google.com ~all" # DKIM — add via Google Workspace Admin → Apps → Gmail → Authenticate email # Google generates the key. Add the TXT record provided. # DMARC — start with p=none to monitor, then move to p=quarantine TXT _dmarc "v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com; pct=100" # Custom tracking domain (optional but recommended for deliverability) CNAME track "tracking.yourdomain.com"
Include physical address in footer. Honor unsubscribe within 10 days (OpenClaw auto-handles via UNSUBSCRIBE intent classifier). No deceptive subjects.
B2B cold email is permitted under "legitimate interest" when there's a genuine business reason. Document your basis. Respond to data deletion requests within 30 days.
All lead data stays on your machine (self-hosted). No SaaS vendor sees your prospect list. OpenClaw memory is local SQLite by default.
--- name: deliverability-monitor cron: "0 9 * * 1" # every Monday 9am --- Check Google Postmaster Tools API for each sending domain: - Spam rate: alert via Slack if > 0.1% (PAUSE if > 0.3%) - Domain reputation: alert if drops below HIGH - IP reputation: monitor for spamhaus listings Alert format: "⚠️ DELIVERABILITY ALERT: {{domain}} spam rate {{rate}}% — investigate immediately before next send window."
| Issue | Likely Cause | Fix |
|---|---|---|
| LinkedIn scraper returns empty results | IP rate-limited by LinkedIn | Add 10–30s random delay between page loads. Rotate residential proxy. Use LinkedIn's public job search (no login required) URL format. |
| Gmail Pub/Sub not triggering | Watch expiry (7-day TTL) | Add a weekly cron to re-call Gmail watch API. Check IAM permissions on Pub/Sub topic. |
| Emails landing in spam | Domain not warmed / DKIM missing | Pause sending. Verify DNS records. Check Postmaster Tools. Resume warmup for 1 week. |
| Apollo API returning no emails | Credits exhausted or title mismatch | Broaden title search. Check Apollo credit balance. Add Hunter.io or Prospeo as fallback enrichment. |
| OpenClaw gateway not starting | Port 18789 in use | Run lsof -i :18789 and kill conflicting process, or change port in config. |
| bankr skill failing to send | Gmail OAuth token expired | Run openclaw channel refresh gmail to re-authenticate. |
You now have the complete blueprint for an autonomous LinkedIn Signal SDR system that runs 24/7 on your own infrastructure. No per-seat fees. No data leaks to SaaS vendors. No SDRs burning time on research. Just a tireless agent that monitors signals, crafts personalized outreach, and books meetings while you sleep.
Add a skill that creates HubSpot/Salesforce contacts and deal stages automatically based on sequence progression and reply intent.
For high-signal leads (score 9–10), run a simultaneous LinkedIn connection request + DM sequence via browser tool. True multi-channel.
Feed your best-performing emails into a custom fine-tuned model. Your agent starts writing in your voice — indistinguishable from human outreach.
Add locale detection to the copywriter agent. Auto-write in German, French, or Spanish for EU prospects based on company HQ country.
Train a small classifier on your reply history to predict which leads will convert before emailing them. Prioritize the top 20% for human-assisted outreach.
Add a Crunchbase/PitchBook API skill that triggers outreach within 24 hours of a funding announcement — the hottest possible buying signal.