Back to skills
SkillHub ClubGrow & DistributeFull Stack

linkedin-connect

Send LinkedIn connection requests to a list of people via browser automation and track status in a CSV/TSV file. Use when the user wants to bulk-connect with a list of people on LinkedIn (founders, speakers, leads, etc.) from a spreadsheet or list containing LinkedIn profile URLs. Handles Connect button, Follow-mode profiles, already-connected detection, stale URL fallback via LinkedIn search and Google search, and incremental status tracking.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
3,131
Hot score
99
Updated
March 20, 2026
Overall rating
C0.0
Composite score
0.0
Best-practice grade
A88.4

Install command

npx @skill-hub/cli install openclaw-skills-linkedin-bulk-connect

Repository

openclaw/skills

Skill path: skills/10madh/linkedin-bulk-connect

Send LinkedIn connection requests to a list of people via browser automation and track status in a CSV/TSV file. Use when the user wants to bulk-connect with a list of people on LinkedIn (founders, speakers, leads, etc.) from a spreadsheet or list containing LinkedIn profile URLs. Handles Connect button, Follow-mode profiles, already-connected detection, stale URL fallback via LinkedIn search and Google search, and incremental status tracking.

Open repository

Best for

Primary workflow: Grow & Distribute.

Technical facets: Full Stack.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: openclaw.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install linkedin-connect into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/openclaw/skills before adding linkedin-connect to shared team environments
  • Use linkedin-connect for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: linkedin-connect
description: Send LinkedIn connection requests to a list of people via browser automation and track status in a CSV/TSV file. Use when the user wants to bulk-connect with a list of people on LinkedIn (founders, speakers, leads, etc.) from a spreadsheet or list containing LinkedIn profile URLs. Handles Connect button, Follow-mode profiles, already-connected detection, stale URL fallback via LinkedIn search and Google search, and incremental status tracking.
---

# LinkedIn Connect

Automates sending LinkedIn connection requests from a list and tracks results in a data file.

## ⚠️ Pre-flight Checklist — Confirm Before Starting

**Before doing anything else**, confirm all of the following with the user. Do not proceed until each item is confirmed.

### 1. Data File
Ask the user to provide their spreadsheet/CSV/TSV file and confirm it has (or can have) these columns:
- **Person/Founder Name** — full name of the person to connect with
- **Company/Brand Name** — their company or brand (used for search fallback)
- **LinkedIn Profile URL** — optional but highly recommended; reduces automation footprint

If the file lacks any column, tell the user which columns are missing and offer to add them.

### 2. Browser Setup
Ask which browser setup they're using:

**Option A — Chrome Browser Relay (recommended for accounts flagged for automation)**
- User must have the OpenClaw Browser Relay Chrome extension installed
- User opens LinkedIn in their regular Chrome browser and clicks the OpenClaw Relay toolbar icon on that tab (badge turns ON)
- Use `profile="chrome"` for all browser tool calls in this mode

**Option B — OpenClaw Isolated Browser (`openclaw` profile)**
- OpenClaw manages a separate Chrome instance
- On first use, navigate to `https://www.linkedin.com` and let the user log in; cookies persist across sessions
- Use `profile="openclaw"` for all browser tool calls in this mode

Confirm which option they've set up. Default to **Option A (Chrome Relay)** if the user's account has been flagged or warned about automation.

### 3. Ready Check
Only proceed once the user says:
- ✅ File is ready and accessible
- ✅ Browser is open with LinkedIn logged in (and relay is attached if Option A)

---

## Browser Profile

Set the `profile` variable based on user's choice in the Pre-flight Checklist:
- **Option A:** `profile="chrome"` — reuse the relay-attached tab; get `targetId` via `browser action=tabs`
- **Option B:** `profile="openclaw"` — OpenClaw-managed isolated Chrome instance

Do not mix profiles mid-run. Pick one and use it consistently for every browser tool call.

## Data File Setup

Ensure the tracking file has a `Connection Status` column. If missing, add it:

```python
import csv
rows = []
with open('file.tsv', 'r') as f:
    reader = csv.DictReader(f, delimiter='\t')
    fieldnames = reader.fieldnames + ['Connection Status']
    rows = list(reader)
with open('file.tsv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames, delimiter='\t')
    writer.writeheader()
    for row in rows:
        row['Connection Status'] = ''
        writer.writerow(row)
```

## Three-Tier Profile Discovery (Priority Order)

Always try in this order. Move to the next tier only if the current one fails.

### Tier 1 — Direct LinkedIn URL (fastest, zero ambiguity)
Navigate directly to the LinkedIn profile URL from the data file.
- ✅ URL loads → correct profile, proceed to connect
- ❌ Returns 404 → escalate to Tier 2
- Skip Tier 1 if no URL is in the data file for this person

### Tier 2 — Google Search (reliable fallback, preserves accuracy)
Search Google for `"Founder Name" "Brand/Company" linkedin`.
- Navigate to: `https://www.google.com/search?q=<Name>+<Company>+linkedin`
- Find the LinkedIn profile link in results (usually first result), click it
- Once on the profile, proceed to Connect step
- ⚠️ Only escalate to Tier 3 if Google can't find the right person or returns no LinkedIn result

### Tier 3 — LinkedIn People Search (last resort)
Run a LinkedIn people search for the founder + brand directly inside LinkedIn.
- Navigate to: `https://www.linkedin.com/search/results/people/?keywords=<Name>+<Company>`
- Look for inline `Connect` buttons first; otherwise open the profile from search results
- Confirm name + headline/company match before connecting
- ❌ No trustworthy match → mark `Profile Not Found`

See `references/browser-workflow.md` for detailed browser steps for each tier.

## Connecting on a Profile

Once on the correct profile, two patterns exist:

**Pattern A - Direct Connect button** visible on profile → click it → confirm dialog → `Send without a note`

**Pattern B - Follow mode** (no Connect button, only Follow + Message + More) → click `More actions` → use selector `.artdeco-dropdown__content--is-open` to get dropdown → click `Invite [Name] to connect` → confirm dialog → `Send without a note`

If neither Connect nor Invite is available → mark `Follow Only`.

## Status Values

| Status | Meaning |
|---|---|
| `Request Sent` | Connection request sent this session |
| `Already Connected` | 1st degree - no action needed |
| `Pending` | Request already sent previously |
| `Follow Only` | No Connect option available on this profile |
| `Profile Not Found` | All three tiers failed |
| `Skipped` | Intentionally skipped |

## Multi-founder Rows

When a TSV row has multiple founders, track per-founder status separated by ` | `:
```
Founder1Slug: Request Sent | Founder2Slug: Already Connected
```

## Rate Limiting & Anti-Detection

> ⚠️ LinkedIn flags accounts that jump directly between profile URLs. Always visit the feed between profiles — no exceptions.

- **Navigate to `/feed/` before every single profile**, without exception. See `references/browser-workflow.md` for the exact call. This is the primary anti-detection measure.
- Add a short natural pause (2–4 seconds) after loading the feed before navigating to the next profile.
- If >3 consecutive clean URLs return 404, pause for 10 seconds on the feed before continuing (then fall back to Google/LinkedIn search).
- Do not open new browser tabs — the relay breaks; reuse the same attached tab for every action.
- Aim for no more than 20–25 connection requests per session. Stop and tell the user if you're approaching this limit.

## Saving Progress

Use a `linkedin_progress.json` sidecar file:
```json
{ "statuses": { "https://www.linkedin.com/in/username/": "Request Sent" } }
```
Update the TSV from this dict every 10 profiles or at the end.

## References

- `references/browser-workflow.md` - Detailed browser steps for all three tiers and both connect patterns


---

## Referenced Files

> The following files are referenced in this skill and included for context.

### references/browser-workflow.md

```markdown
# LinkedIn Connect — Browser Automation Workflow

## Setup

```
# For Chrome Relay (Option A — recommended for flagged accounts):
browser action=tabs profile=chrome
→ note the targetId of the LinkedIn tab — reuse it throughout, never open new tabs

# For OpenClaw isolated browser (Option B):
browser action=tabs profile=openclaw
→ note the targetId of the LinkedIn tab — reuse it throughout
```

Use `profile=<PROFILE>` throughout — substitute with `chrome` or `openclaw` based on what the user confirmed in the pre-flight checklist.

---

## ⚠️ Mandatory Between Every Profile — No Exceptions

Always navigate to the feed before loading a new profile. **Never skip this step.** Jumping directly between profile URLs is the primary trigger for LinkedIn's automation detection. This step must happen even if the previous profile loaded fine.

```
browser action=navigate profile=<PROFILE> targetId=<TAB> targetUrl=https://www.linkedin.com/feed/
```

After the feed loads, wait 2–4 seconds (use `browser action=act request={"kind":"wait","timeMs":3000}`) before navigating to the next profile.

---

## Tier 1 — Direct URL

```
browser action=navigate profile=<PROFILE> targetId=<TAB> targetUrl=<PROFILE_URL>
```

- Result URL matches profile path → profile loaded, go to **Connect Step**
- Result URL is `/404/` → go to **Tier 2** (Google Search)

---

## Tier 2 — Google Search

Navigate directly to Google search (do NOT use address bar — stay in the LinkedIn tab via navigate):

```
browser action=navigate profile=<PROFILE> targetId=<TAB> targetUrl=https://www.google.com/search?q=<FirstName>+<LastName>+<Brand>+linkedin
```

Take a compact snapshot. Find the LinkedIn profile URL in results (usually the first organic result).

```
browser action=act request={"kind":"click","ref":"<linkedin-result-ref>"}
```

This lands on their LinkedIn profile — go to **Connect Step**.

**If no trustworthy LinkedIn result found** → go to **Tier 3**

---

## Tier 3 — LinkedIn People Search (last resort)

Navigate to LinkedIn people search:

```
browser action=navigate profile=<PROFILE> targetId=<TAB> targetUrl=https://www.linkedin.com/search/results/people/?keywords=<FirstName>+<LastName>+<Brand>
```

Take a compact snapshot and scan results for the person. Check name + company headline match.

**Option A — Connect inline from search results:**

Some search result cards show a `Connect` button directly. If visible and the person matches:
```
browser action=act request={"kind":"click","ref":"<connect-ref>"}
```
→ go to **Confirm Dialog**

**Option B — No inline Connect, open profile:**

Click the person's name link to navigate to their profile, then go to **Connect Step**.

**If no trustworthy match** → mark `Profile Not Found`, move to next person.

---

## Connect Step — Detecting Status

Take a compact interactive snapshot on the loaded profile:

```
browser action=snapshot compact=true depth=2 interactive=true targetId=<TAB>
```

| What you see | Status | Action |
|---|---|---|
| `Connect` button on profile | Not connected | → Pattern A |
| `Follow` + `Message` + `More actions` (no Connect) | Follow mode | → Pattern B |
| `Message` only, no Follow, no Connect | Already 1st degree | Mark `Already Connected` |
| `Pending` button | Request already sent | Mark `Pending` |
| `Following` button (post-action) | Just sent | Mark `Request Sent` |

---

## Pattern A — Direct Connect Button

```
browser action=act request={"kind":"click","ref":"<connect-button-ref>"}
```
→ go to **Confirm Dialog**

---

## Pattern B — Connect via More Actions

**1. Click More actions:**
```
browser action=act request={"kind":"click","ref":"<more-actions-ref>"}
```

**2. Get dropdown items using selector (most reliable):**
```
browser action=snapshot compact=false depth=3 selector=".artdeco-dropdown__content--is-open" targetId=<TAB>
```

This exposes the dropdown buttons directly. Look for `"Invite [Name] to connect"`.

**3. Click it:**
```
browser action=act request={"kind":"click","ref":"<invite-ref>"}
```
→ go to **Confirm Dialog**

**If dropdown has no Invite/Connect option** → mark `Follow Only`

---

## Confirm Dialog

After clicking Connect or Invite, LinkedIn shows a modal. Take snapshot:

```
browser action=snapshot compact=true depth=2 interactive=true
```

Buttons: `Dismiss` | `Add a note` | `Send without a note`

```
browser action=act request={"kind":"click","ref":"<send-without-note-ref>"}
```

**Confirm success:** Take one more snapshot. Button should now say `Following [Name]` and "Notify me about all of [Name]'s posts" should appear. Mark `Request Sent`.

---

## Common Issues

**Consecutive 404s on valid-looking URLs**
→ LinkedIn rate-limiting. Navigate to `/feed/`, wait 10 seconds, retry once. If still 404, go to Tier 2 (Google Search).

**More actions dropdown items not visible in compact snapshot**
→ Use `selector=".artdeco-dropdown__content--is-open"` with `compact=false depth=3`. Do not rely on compact snapshots for dropdown contents.

**Relay disconnects**
→ Never use `browser action=open` — this creates a new tab and breaks the relay. Always use `navigate` on the existing tab. If relay disconnects, ask user to re-click the OpenClaw Browser Relay icon on the LinkedIn tab.

**Old-format LinkedIn slugs (e.g. `-21b1804`, `-05bb7611`)**
→ Legacy URL format. Will always 404. Skip Tier 1, go directly to Tier 2 (Google Search).

**Name collision in Google results (common names)**
→ Hover/click the LinkedIn result carefully — check the URL slug matches the person's name/company before clicking through.

**Name collision in LinkedIn people search (common names)**
→ Check the company/headline in the result card before connecting. If ambiguous, open the profile and verify before sending.

**LinkedIn search shows no Connect button inline**
→ Normal for many profiles. Click through to the profile and use Pattern A or B.

```



---

## Skill Companion Files

> Additional files collected from the skill directory layout.

### _meta.json

```json
{
  "owner": "10madh",
  "slug": "linkedin-bulk-connect",
  "displayName": "LinkedIn Bulk Connect",
  "latest": {
    "version": "1.1.0",
    "publishedAt": 1770982652890,
    "commit": "https://github.com/openclaw/skills/commit/a331904f15725e553a067d2744340425206dff06"
  },
  "history": [
    {
      "version": "1.0.0",
      "publishedAt": 1770978059672,
      "commit": "https://github.com/openclaw/skills/commit/5277ebad91be9061232df5d139435ffff00a3875"
    }
  ]
}

```

linkedin-connect | SkillHub