kevinbadi/ai-os-skills · Archived

linkedin-connect

Send LinkedIn connection requests with personalized messages via browser automation. Uses pre-scraped leads from linkedin_leads table (populated by Apify during onboarding). Trigger when asked to send LinkedIn connections or run LinkedIn outreach.

First seen Apr 8, 2026

Installation

$ npx skills add kevinbadi/ai-os-skills --skill linkedin-connect

Stronger alternatives

This repository is archived — consider an actively maintained alternative.

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from kevinbadi/ai-os-skills · top by installs.

npx skills add kevinbadi/ai-os-skills

Browse all from kevinbadi/ai-os-skills

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Also listed on

Alternate registries and mirrors of this skill.

Repository health

Stars 55
License MIT
Default branch main
Open issues 0
Status Archived

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 6,212 B
  • docs SUMMARY.md 271 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 4 installs

SKILL.md

LinkedIn Connect

Send personalized LinkedIn connection requests to pre-scraped leads from your database.

How It Works

  1. Onboarding → Apify scrapes LinkedIn profiles based on your targeting → linkedin_leads table
  2. This skill → Reads from linkedin_leads → Sends connection requests via browser automation
  3. Tracking → Marks leads as connection_sent = TRUE → Won't contact twice

Prerequisites

  • Chrome with CDP running (auto-starts via Clawdbot)
  • Logged into LinkedIn (cookies at cookies/linkedin-*.json)
  • DATABASE_URL env var pointing to your Insforge DB
  • Leads in linkedin_leads table (populated by initial scrape or linkedin-profile-scraper skill)

Quick Usage (Recommended)

Send connections to pre-scraped leads

# Send to 20 uncontacted leads from DB
node skills/linkedin-connect/scripts/batch-connect.js --limit 20

# Filter by campaign (e.g. leads from a specific scrape)
node skills/linkedin-connect/scripts/batch-connect.js --campaign "onboarding_initial" --limit 20

# Custom message template
node skills/linkedin-connect/scripts/batch-connect.js --limit 20 \
  --message "Hey {{firstName}}, saw your work at {{company}} — would love to connect!"

# Dry run (preview which leads would be contacted)
node skills/linkedin-connect/scripts/batch-connect.js --limit 20 --dry-run

Message Templates

Variable Source
{{firstName}} First name from DB
{{lastName}} Last name from DB
{{fullName}} Full name
{{company}} current_company from DB
{{headline}} headline from DB
{{title}} current_title from DB

CLI Options

Flag Default Description
--limit 20 Max connection requests per run
--campaign Filter leads by campaign_name
--message Default template Message with {{variables}}
--delay-min 8 Min seconds between requests
--delay-max 15 Max seconds between requests
--dry-run false Preview leads, don't send
--cdp-port 18800 Chrome CDP port

Safety

  • Cap at 20-25/day — LinkedIn flags aggressive behavior
  • Random delays between requests (8-15s default)
  • Real browser automation, not API calls
  • Automatically detects weekly invitation limit and stops
  • Leads marked connection_sent = TRUE won't be contacted again

Database Schema

Reads from linkedin_leads table:

SELECT * FROM linkedin_leads 
WHERE connection_sent = FALSE 
ORDER BY created_at DESC 
LIMIT 20;

Updates after each request:

UPDATE linkedin_leads 
SET connection_sent = TRUE, connection_sent_at = NOW() 
WHERE id = $1;

Output

{"sent": 15, "skipped": 2, "errors": 0, "hitWeeklyLimit": false}
  • sent — Connection requests successfully sent
  • skipped — Leads skipped (already connected, no connect button, etc.)
  • errors — Failed attempts
  • hitWeeklyLimit — LinkedIn's weekly limit reached, stop processing

Cron Schedule (Recommended)

Run daily with 20 leads max:

0 10 * * * node skills/linkedin-connect/scripts/batch-connect.js --limit 20

Alternative: Single Profile

For one-off connections (not recommended for scale):

node skills/linkedin-connect/scripts/linkedin-connect.js \
  --url "https://www.linkedin.com/in/someone/" \
  --message "Hey, would love to connect!"

Flow Diagram

┌─────────────────────────────────────────────────────────────────┐
│  ONBOARDING                                                      │
│  User fills out LinkedIn targeting (titles, keywords, location)  │
└──────────────────────────┬──────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│  INITIAL SCRAPE (Apify)                                          │
│  harvestapi~linkedin-profile-search → linkedin_leads table       │
└──────────────────────────┬──────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│  LINKEDIN CONNECT (This Skill)                                   │
│  batch-connect.js reads from DB → sends connection requests      │
│  Marks connection_sent = TRUE after each                         │
└──────────────────────────┬──────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│  LINKEDIN MESSAGE AGENT (Optional)                               │
│  Monitors accepted connections → sends follow-up DMs             │
└─────────────────────────────────────────────────────────────────┘