Use when running LinkedIn social selling as a repeatable motion — Sales Navigator saved searches and trigger alerts, weekly request budgets, fixing a low acceptance rate, turning profile views and post engagers into warm threads, logging every touch. NOT the note or DM copy (that is `cold-outreach`), NOT the deal after a reply (that is `sales-pipeline`).
npx skills add https://github.com/ericrisco/rsc-harness --skill linkedin-outreach
*You run the LinkedIn social-selling motion and keep its score: who to touch, when, through what warm-up, and how the loop is run and logged. The thesis is warm-first — engagement before connection, signal before send, ledger before "I'll remember it." The output is a running system plus a touch ledger under 02-DOCS/, never a finished line of copy: when prose is needed you write the brief and hand it off, then stay in the loop.*
The sharpest line is against ../cold-outreach/SKILL.md, and it splits on message-vs-system:
Also not yours: sourcing / scoring the raw prospect list and ICP definition → ../lead-gen/SKILL.md; the deal after a reply, i.e. stages, forecast, CRM tasks → ../sales-pipeline/SKILL.md; writing or scheduling LinkedIn *posts* → ../linkedin-content/SKILL.md; brand growth and positioning → ../linkedin-strategy/SKILL.md.
Five phases, in order. Each has a *why* and yields one artifact; the artifact gates the next phase. Skipping a phase is how acceptance collapses.
02-DOCS/ ledger with the outcome.Each phase gets a section below; the last one compresses all five into a day.
Build the saved search from the ICP, not from a name list:
Posted on LinkedIn in past 30 days (active profiles accept and reply far more). Save it; Sales Nav re-runs it and surfaces new matches.Free vs Core vs Advanced — buy on the job, not the brand:
| You need | Tier | 2025 price | Why |
| --- | --- | --- | --- |
| Run the loop on a tight ICP, manual budget | Free | $0 | Works if you stay disciplined; no saved-search alerts. |
| Saved searches, 40+ filters, lead/account alerts, 50 InMail/mo | Core | $119.99/mo ($1,079.88/yr) | The default for a working social seller. |
| + TeamLink, Smart Links, buyer-intent, Account/Lead IQ, CRM sync | Advanced | $159.99/mo ($1,799.88/yr) | Only when a team or CRM sync is real. |
Filter recipes per ICP, trigger-alert setup, and the full Core-vs-Advanced buy math → references/sales-navigator-playbook.md.
Engagement-before-connect ritual. 1–2 days before the request: view the profile, follow the company page, and drop one genuine comment or like on a recent post. This is what moves acceptance from ~20–30% (cold) to ~60%+. Log the pre-touch — it is phase 2, not optional flavor.
Note or no note — read the paradox correctly. A personalized note barely moves *acceptance* (26.42% with vs 26.37% without; some 2025/26 datasets show no-note accepting *higher*). But a note with real context nearly doubles the post-accept reply rate (9.36% vs 5.44%). So decide by goal:
| Your goal | Note? | Why |
| --- | --- | --- |
| Maximize the accept (build network, retarget later) | No note (or near-empty) | Notes don't lift acceptance; an empty request often accepts as well or better. |
| Maximize the reply after accept | Short context note | Real context roughly doubles reply; worth the friction only when you have a true hook. |
| No genuine hook exists | No note | A generic note is worse than none — it reads as a pitch. |
When you do send a note, you do not write it here — hand the brief (the hook, the person, the goal) to ../cold-outreach/SKILL.md.
Weekly request budget — the cap is a rolling weekly limit, not a daily reset.
| Account | Realistic weekly cap | Daily target | Health rule |
| --- | --- | --- | --- |
| Free | ~100/wk | ~20/weekday, stay under ~80/wk | Pause and warm more if acceptance drops below ~30%. |
| Premium / Sales Nav | up to ~200/wk | up to ~40/day | Only with strong SSI and acceptance >40%; otherwise treat as free. |
Over the cap, requests get throttled or the account flagged. Below ~30% acceptance you are spraying — go back to phase 2 instead of pushing volume, and withdraw stale pending requests before they pile up.
A signal is an opening. Match the signal to a play; the play is choreography (timing, sequence, what to reference), never finished prose.
| Signal | Play | Copy? |
| --- | --- | --- |
| Connection just accepted | Wait, don't pitch. Reference *why* you reached out (their post/role/trigger), ask one genuine question. | Brief → cold-outreach |
| Profile viewer (they viewed you) | Soft, warm reply: "Saw you stopped by — noticed [their thing], curious how you handle X?" | Brief → cold-outreach |
| Post engager (liked/commented your post) | Thank or build on their comment, then DM a related question tied to their work. | Brief → cold-outreach |
| Comment thread (they engaged a third party's post) | Add value in-thread first, connect with that context the next day. | Brief → cold-outreach |
Worked example — the move, not the words:
Bad (pitch-on-accept):
Accepted → "Thanks for connecting! We help teams like yours cut reporting
time 40% with our analytics platform — open to a 15-min demo Thursday?"
Reads as a trap; reply rate craters.
Good (reference-then-ask):
Accepted → "Appreciate the connect — your post on attribution gaps in
ecommerce hit home. How are you splitting paid vs organic credit right now?"
Opens a real thread; the product never comes up until they ask.
You run the loop up to a warm intro or a booked call — then you stop and hand off.
Buying-signal tells in a thread: they ask about price/timeline, mention an active project or pain, reference budget or a decision date, or say "send me more." When you see one:
call_booked) in the ledger.../sales-pipeline/SKILL.md — the moment a deal exists it is theirs, and you set no stages or forecasts.One file. Path: 02-DOCS/linkedin-outreach/touches.csv. The header row is fixed (verify.sh checks it verbatim):
date,name,profile_url,channel,trigger,action,stage,outcome,next_touch
channel: connect | inmail | dm | comment | view.outcome (enum, no blanks): requested | accepted | replied | conversation | call_booked | dead.{first_name}, [company], XXXX, TODO) in a cell — verify.sh fails on it.Full column spec, the outcome enum, a filled 5-row example, and the weekly-review formulas → references/ledger-schema.md.
Weekly review ritual (15 min, same day each week). Compute from the ledger:
If acceptance < ~30%, warm harder (phase 2). If reply < ~10%, your hooks are weak (better brief to cold-outreach). If touches/week is near zero, the loop stopped — that's the real failure.
| Bad | Why it bites | Do instead |
| --- | --- | --- |
| Spray connection requests over the cap | Rolling weekly limit; throttled or account-flagged | Stay under ~80/wk free, ~200 Premium with >40% accept |
| Pitch the instant a connection accepts | Reads as a trap; reply rate craters | Reference their context, ask one real question first |
| Automation that ignores the rolling limit | Bursts trip LinkedIn's detection; account at risk | Pace within the budget; warm-up beats volume |
| Read "notes don't help" as "context never helps" | Notes don't lift *accept*, but context doubles *reply* | Decide note by goal: accept→none, reply→context |
| Chase SSI as the goal | SSI is a lagging proxy; high SSI ≠ pipeline | Track acceptance/reply/calls; let SSI follow |
| Run outreach with no ledger | No measurement → no repeatable motion | Log every touch + outcome to 02-DOCS/ |
Run this as a checklist; it is the loop compressed into a day.
02-DOCS/linkedin-outreach/touches.csv.Weekly, run the review ritual and adjust the next week's targeting. That closes the loop back to phase 1.
Take ericrisco/linkedin-outreach from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.