Section 1The Index: 7 Categories, What Got Merged, and the One Ceiling
Every LinkedIn skill from across the library, deduplicated into seven categories. 68 skills plus the 10 playbook modules.
Skills appeared under different names in different guides. post-engager-scorer and linkedin-post-engager-scorer are the same thing. Where that happened I kept one name and noted the alias.
The seven categories
| # | Category | Skills | Runs |
|---|---|---|---|
| 1 | Foundation and ICP | 7 | Once, then quarterly |
| 2 | List Building | 11 | Per campaign |
| 3 | Enrichment and Grading | 9 | Per list, before any send |
| 4 | Content and Warmup | 13 | Weekly |
| 5 | Engagement and Connection | 10 | Daily |
| 6 | DM and Sell-By-Chat | 12 | On every reply |
| 7 | Reporting and Diagnostics | 6 | Weekly |
The order is the order. Categories 1 to 3 produce a list. Category 4 makes the list warm. Categories 5 and 6 work it. Category 7 tells you which of the previous six is broken.
Install the whole library
# 1. Foundation and ICP
mkdir -p .claude/skills/{icp-from-customers,icp-prompt-builder,tam-sanity-check,linkedin-profile-optimizer,positioning-line,disqualifier-writer,proof-library-builder}
# 2. List Building
mkdir -p .claude/skills/{linkedin-list-builder,raw-list-source,competitor-engagers,disco-like,job-posting-trigger-list,funding-signal-list,linkedin-icp-list-builder,sales-prospect-list,event-attendee-import,group-member-import,signal-finder}
# 3. Enrichment and Grading
mkdir -p .claude/skills/{icp-filter-pass,list-quality-scorecard,post-engager-scorer,linkedin-enrich,decision-maker-mapper,duplicate-detector,contact-hygiene-check,verify-and-segment,email-finder}
# 4. Content and Warmup
mkdir -p .claude/skills/{content-engine,linkedin-post-writer,lead-magnet-post-writer,hook-last-and-humanize,editorial-calendar,content-bucket-planner,point-of-view-extractor,borrowed-reach-formatter,linkedin-carousel-builder,voice-note-transcriber,total-addressable-content-finder,linkedin-personal-branding,linkedin-daily-post}
# 5. Engagement and Connection
mkdir -p .claude/skills/{linkedin-feed-engage,feed-engagement-session,comment-quality-checker,linkedin-connection-note-writer,connection-request-batcher,linkedin-high-intent,reciprocity-tracker,referral-intro,social-selling,linkedin-daily-engagement}
# 6. DM and Sell-By-Chat
mkdir -p .claude/skills/{linkedin-warm-dm-sequencer,sequence-builder,opener-writer,prosp-prompt-writer,voice-note-scripter,linkedin-reply-classifier,one-question-filter,mirror-style-analyzer,objection-handler,next-step-closer,dm-self-check,voice-calibration}
# 7. Reporting and Diagnostics
mkdir -p .claude/skills/{linkedin-campaign-reporter,campaign-diagnostic,acceptance-rate-diagnostic,reply-rate-diagnostic,dm-reply-time-monitor,warm-signal-tracker}
# Shared context, read by everything
mkdir -p context/{icp,brand,proof}
mkdir -p output
68 folders. Paste each file from the category pages.
What got merged
Seven skills appeared under two or three names across the library. Kept name first, aliases after.
post-engager-scorerβ linkedin-post-engager-scorerlinkedin-connection-note-writerβ connection-note-writerlinkedin-reply-classifierβ reply-classifier, reply-routerlinkedin-warm-dm-sequencerβ warm-dm-sequencerlinkedin-list-builderβ icp-list-builder, target-list-buildericp-filter-passβ fit-filterlist-quality-scorecardβ list-grader
If you have already installed any of the source guides, delete the alias folder rather than keeping both. Two skills with near-identical descriptions collide on triggering and you get whichever one loads first.
The shared context files
Every skill in the library opens by reading these three. Build them before installing anything.
context/icp/derived-icp.md # from closed-won, not a workshop
context/icp/disqualifiers.md # who this is not for
context/brand/voice.md # 3 adjectives, 2 banned phrases
context/brand/reference-posts.md # 3 that performed, in full
context/brand/banned.md # claims nobody approved
context/proof/case-studies.md # with a permission column
reference-posts.md does more than voice.md. Three adjectives describe a voice, three real posts demonstrate one.
case-studies.md needs the permission column. Every skill here pulls proof from that file and nowhere else, which is what stops any of them inventing a number or naming a client who never agreed to be a reference.
The send ceiling, once
Stated here rather than repeated in every skill. Recommended limits:
| Action | Free | Premium / Sales Nav |
|---|---|---|
| Connection requests | 20/day, 100/week | 30 to 50/day |
| Direct messages | ~100/week | ~150/week |
| Profile views | 80/day | 150/day |
| Comments | 60/day | 60/day |
| InMail | n/a | 50/month |
Account-wide, not per campaign. Three campaigns at 20 each means 60 attempts a day and a restricted account. Split it and set each campaign individually.
Request and message limits are separate buckets, so both run at full allocation at once. When capped, only connection requests pause, and it resets in 2 to 3 days.
This is the constraint that makes categories 2 and 3 matter. Comments are free, lists are cheap, sends are not, so the order you work a list in decides the quarter.
Section 2Categories 1 to 3: Foundation, List Building, Grading (27 Skills)
27 skills across three categories. These produce a graded list. Nothing in categories 4 to 6 works without them.
The order is the cost control: build raw, filter cheap, grade, then enrich only what survived.
Category 1: Foundation and ICP, 7 skills
---
name: icp-from-customers
description: Derive an ICP from closed-won deals rather than a
workshop. Use when targeting is unclear, before any list building.
---
Pull closed-won deals from the CRM, last 12 months. Per deal: company
size, industry, tech stack if visible, buyer job title, deal size,
days to close, and the trigger that started it.
Output to context/icp/derived-icp.md:
1. Three attributes correlating with fast closes
2. Three correlating with long or lost deals
3. Exact job titles that actually signed, not the ones targeted
4. Size band with the highest win rate
5. A searchable LinkedIn or Sales Navigator filter string
6. The gap between the stated ICP and the actual one
Fewer than 10 closed-won deals means say so. Do not derive a pattern
from three customers.
---
name: icp-prompt-builder
description: Turn a rough ICP description into a structured, reusable
definition other skills can read.
---
Ask for, in one message: what they sell, exact buyer job title,
company type and size, the job the buyer is trying to do, what they
have already tried that failed, and who this is not for.
Output a structured ICP with each field filled or explicitly marked
UNKNOWN. Never fill a field by inference.
End with the searchable filter string and the three attributes a
list-building skill would filter on.
---
name: tam-sanity-check
description: Check whether an ICP is large enough to run a campaign
against. Use before building a list, not after.
---
Estimate the addressable count for the ICP filter string.
Report: the count, the source of the count, and the arithmetic.
Then the send maths. At 20 connection requests a day, state how many
weeks the full list takes to work. If the list is smaller than four
weeks of sending, the ICP is too narrow for a campaign and needs
widening or a second segment.
If the count cannot be established from an observable source, say so
rather than estimating.
---
name: linkedin-profile-optimizer
description: Audit and rewrite a LinkedIn profile for inbound. Use
before any outreach campaign, since outreach drives profile visits.
---
Audit nine checks, each PASS, WEAK or FAIL with one line of evidence:
proof, empty adjectives, brand clarity, gaps, call to action, visual
consistency, mobile readability, searchability, contact hygiene.
Then rewrite:
- Headline, three options with character counts, flagging mobile
truncation. Never job-title-at-company.
- About, four movements: hook, the problem solved, proof, CTA. First
person. Keywords in the first two lines.
- Featured: what to pin, treated as mandatory.
- Experience: action plus method plus measurable outcome per role.
- Skills: cut generic filler, merge into 10 to 15 clusters.
Critique the positioning, never the person. Photo assessed only on
quality and consistency with claimed seniority, never appearance.
Never invent a metric. Ask for one or leave the gap.
---
name: positioning-line
description: Produce the one sentence everything else says. Use before
content or outreach copy.
---
Output one sentence a stranger would understand, then:
- Who this positioning deliberately repels
- Two beliefs held that the market mostly disagrees with
- The named competitors, with the honest difference for each and
where each is genuinely better
Write to context/brand/positioning.md.
A positioning line that repels nobody converts nobody. If the "who
this repels" field is empty, the line is too broad.
---
name: disqualifier-writer
description: Write the explicit list of who an offer is not for. Use
after the ICP exists, before list filtering.
---
Output to context/icp/disqualifiers.md. Each entry: the attribute,
and one line on why it fails.
Cover at minimum: too small to afford the price, wrong buyer
seniority, competitor, agency when we sell to in-house teams, sector
we cannot serve, geography we cannot serve.
This file is what icp-filter-pass reads to produce DROP verdicts, so
vagueness here becomes a bad list later.
---
name: proof-library-builder
description: Build the single file every other skill takes proof from.
Use once, then update after each engagement.
---
One row per past result in context/proof/case-studies.md:
client | can we name them (YES/NO/ANONYMISED) | sector | size |
the problem | what we did | the result with a real number |
timeframe | service line | their quote if we have one
RULES
- The result column needs a number you can defend. "Improved their
rankings" is a sentence, not a result. Leave the row out.
- The permission column is not optional. Skills read it to decide
whether to name or anonymise.
- Twelve solid rows beat forty thin ones, because skills pick the
closest match and a thin match produces weak output.
Category 2: List Building, 11 skills
The first four are the ones to run. The rest are source-specific variants.
---
name: linkedin-list-builder
description: Build a raw prospect list from any LinkedIn source. Use
after the ICP exists.
---
Read context/icp/derived-icp.md.
Source in priority order, highest intent first:
1. Commenters and likers on a relevant post, ours or a competitor's
2. Attendees of a relevant LinkedIn event
3. Members of a relevant LinkedIn group
4. Search matching the ICP filter string
5. Job boards, for companies hiring the role our offer replaces
Capture per lead: full name, headline, company, company size,
location, LinkedIn URL, and the source.
Write to output/prospects.csv with a linkedin_url column. That header
name is required by the import later, so do not rename it.
Enrich nothing. Look up no emails. Most of this list is discarded in
the next step.
---
name: competitor-engagers
description: Build a list from people engaging with a competitor's
content. Highest-intent cold source available.
---
Given a competitor's profile or company page, identify their recent
posts with above-average engagement.
For each: capture commenters and likers, with the post URL and the
topic of the post recorded per lead.
The topic column is the point. Someone who commented on a post about
pricing has a different opener from someone who commented on one
about onboarding.
Score each on whether the comment was substantive or a reaction only.
Never contact someone based on a single reaction to a single post.
That is fit, not intent.
---
name: job-posting-trigger-list
description: Build a list from companies hiring the role our offer
replaces or supports. Strongest budget signal available.
---
Search job boards for the target role within the ICP filter.
Per company capture: the role, the posting date, the seniority, and
the named hiring manager where visible.
Why this is tier one: a company posting for the role has budget
allocated and an unmet need at the same time.
The hiring manager is usually the buyer. Where they are not visible,
run decision-maker-mapper.
Postings older than 45 days are stale. Either it is filled or the
budget moved. Drop them.
---
name: signal-finder
description: Find a dated, verifiable reason to contact each lead on
an existing list.
---
One signal per lead, ranked by proximity to a budget decision.
TIER 1, act this week
- Posted about the exact problem we solve, last 30 days
- Hiring for the role our offer replaces
- Raised in the last 90 days
- New leader in post, last 60 days
TIER 2, act this month
- Commented on a competitor's post
- Company shipped something relevant
- Attended a relevant event
- Expanding into a new market
TIER 3, ICP fit only, no observable trigger
Every signal verifiable and dated. Record the date and the URL,
because it appears in the first message and they will check.
No signal means write NONE. Never stretch "works at a SaaS company"
into a trigger.
The remaining seven, each a source variant of linkedin-list-builder with the same output contract:
raw-list-sourceβ broad first pass with no filtering, deliberately unqualifieddisco-likeβ people who liked a specific post, discovery-orientedfunding-signal-listβ companies that raised in the last 90 dayslinkedin-icp-list-builderβ search-URL driven, straight from the filter stringsales-prospect-listβ Sales Navigator saved-search drivenevent-attendee-importβ attendee lists post-eventgroup-member-importβ members of a relevant group
All seven write to the same output/prospects.csv contract with a source column, so downstream skills do not care which one produced the row.
Category 3: Enrichment and Grading, 9 skills
---
name: icp-filter-pass
description: Filter a raw list against the ICP before any enrichment.
Run on the cheapest model at the lowest effort.
---
Read context/icp/derived-icp.md and context/icp/disqualifiers.md.
Per row return exactly one of KEEP, DROP, UNSURE, with a reason of 12
words maximum.
KEEP Matches the title band and the size band
DROP Fails either, or hits a disqualifier
UNSURE Headline is ambiguous. Do not guess.
KEEP and UNSURE to output/filtered-leads.csv.
DROP to output/dropped.csv so the filter can be audited when someone
asks why a company was excluded.
Report the drop rate. Below 40% usually means the search was too
narrow rather than the list being unusually good.
This is classification across volume, not reasoning. Running it at
high effort is where the cost advantage disappears, and it touches
every row so it is the highest-volume call in the library.
---
name: list-quality-scorecard
description: Grade a list A to F before it enters a campaign. The
gate. Nothing sends below B.
---
Grade output/filtered-leads.csv across eight dimensions, 1 to 10:
1 ICP fit: share matching both bands
2 Title accuracy: decision makers or influencers
3 Affordability against the stated price
4 Data completeness: rows missing fields
5 Deduplication: within the list, against past campaigns, and
against any other active campaign on this account
6 Recency: how recently each profile was active
7 Reachability: how many are already 1st degree
8 Signal strength: how many carry a tier 1 or 2 signal
Average into a grade.
A 9.0+ send today B 7.5+ send C 6.0+ fix the two lowest first
D 4.5+ rebuild the list F below rebuild the ICP, not the list
Below B, stop. Name the two lowest dimensions and the fix for each.
Dimension 7 changes the campaign shape rather than the quality.
Mostly 1st degree messages directly. Mostly cold needs connection
requests first, which is a different daily budget.
Dimension 8 predicts reply rate better than any other. A B-grade list
where most rows carry a tier 1 signal beats an A-grade list with none.
---
name: post-engager-scorer
description: Score people who engaged with a post by depth and fit so
the send budget goes to the right people first.
alias: linkedin-post-engager-scorer
---
Two axes, 1 to 3, multiplied. Maximum 9.
DEPTH
1 Reaction only
2 Short comment
3 Substantive comment, or engaged more than once
FIT, against context/icp/derived-icp.md
1 Adjacent to the ICP
2 Right role wrong company type, or the reverse
3 Exact match
6 to 9 Contact this week
3 to 5 Hold. Watch for a second signal.
1 to 2 No outreach. Keep in the list, spend no send on it.
Add a score column, sort descending.
The reason to score rather than blanket-send: 20 connection requests
a day is account-wide, so a list of 400 is five weeks of the entire
budget. The order decides the quarter.
---
name: decision-maker-mapper
description: Find who actually signs at a target account. Use when
the list has companies but not the right people.
---
Given a company, map the buying committee:
- The economic buyer, who owns the budget line
- The champion, who feels the problem daily
- The blocker, whose remit the change touches
- The technical evaluator, if the offer needs one
Per person: name, title, LinkedIn URL, and which role they play.
State confidence per assignment. A title is evidence of a role, not
proof of one.
Where a role cannot be identified, write UNKNOWN rather than
assigning the nearest title. Contacting the wrong person burns the
account and you do not get a second first message.
The remaining five:
linkedin-enrichβ fills headline, company size, location and recent activity from the profileduplicate-detectorβ within the list, against past campaigns, and across other active campaigns on the same accountcontact-hygiene-checkβ dead links, malformed URLs, profiles that no longer existverify-and-segmentβ splits a graded list into send-order segments by score and signal tieremail-finderβ run on the cheapest model, and only after filtering. Note that email extraction on LinkedIn works only for 1st-degree connections who list an address, so do not promise it for cold lists.
Why this order and not another
The expensive mistake is enriching a thousand rows to find six hundred were never going to buy. Enrichment is per-lookup pricing and the filter costs almost nothing at low effort.
So: linkedin-list-builder β icp-filter-pass β list-quality-scorecard β signal-finder β post-engager-scorer β enrich only the survivors.
Once graded, Prosp takes the CSV directly. It needs headers in row one and a linkedin_url column, which is why every list skill here writes that exact header. AI column mapping handles the rest, and custom variables from the CSV become usable in message prompts, so the signal column travels with the lead into the copy.
Section 3Categories 4 and 5: Content, Warmup, Engagement (23 Skills)
23 skills across two categories. Content makes a cold list warm. Engagement is what gets the content seen in the first place.
Run category 5 before category 4 in week one. Posting into a feed nobody has seen you in is publishing into a void.
Category 4: Content and Warmup, 13 skills
---
name: content-engine
description: Turn one long asset into a month of channel content. Use
monthly. The only original writing in the month.
---
Read context/brand/reference-posts.md, voice.md, banned.md and
context/proof/case-studies.md.
ONE LONG ASSET becomes everything else. Never write channel content
from a blank page.
EXTRACT 10 to 12 standalone ideas. One idea per line. No idea that
needs the others to make sense.
THEN per idea produce one post via linkedin-post-writer.
STATUS on every output: DRAFT. Never scheduled, never published.
If the long asset yields fewer than 8 standalone ideas, say so. It is
not substantial enough to repurpose, and forcing it produces filler.
---
name: linkedin-post-writer
description: Write a single LinkedIn post in the house voice. Use for
any post that is not a lead magnet post.
---
Read context/brand/reference-posts.md. Match the reference pieces,
not the adjective list.
RULES
- Hook is lines 1 to 2 and must earn the See More click alone. If
deleting the body leaves the hook feeling complete, rewrite it.
- One idea per line. Three lines maximum per paragraph.
- No em dashes. No hashtags in the body.
- One CTA.
- Specific beats generic. A named figure beats "a lot".
- Only proof from case-studies.md.
- Check banned.md before writing any claim.
Output the post, the character count, and which pillar it serves.
Never more than one post a day on the calendar. Same-day multiples
suppress each other.
---
name: lead-magnet-post-writer
description: Write a post offering a free resource in exchange for a
comment, so commenters become a lead list.
---
Never write before you have all five, asked in ONE message:
1. The resource, and what is literally inside it
2. The ICP, exact job title and company type
3. Comment keywords, one per variant, same semantic family
4. Proof, a real number they can stand behind
5. The offer, one line, used for the PS only
No proof is a valid answer. Write a curiosity or mechanism version
that makes no results claim rather than inventing one.
Produce 3 variants, each a different formula, differing in angle not
wording. Each gets its own keyword.
CTA depends on connection state:
Mostly connected: Comment "[WORD]" and I'll DM it over.
Mostly not: Comment "[WORD]" and connect with me so I can send it.
PS. If we're already connected, just drop the comment.
List contents as objects, not outcomes. "43 prompts, 6 sequences, 1
tracker" not "unlock your potential".
Pick one to post first and say why. Never hedge. Order the other two
a week apart.
---
name: hook-last-and-humanize
description: Write the body first, then the hook, then strip the AI
tells. Use as the final pass on any post.
---
HOOK LAST
Write the body before the hook. A hook written first constrains the
body to fit it, which is why so many posts have a great line one and
nothing underneath.
Then write three hooks for the finished body and pick the one that is
true rather than the one that is loudest.
HUMANIZE, then check:
- Numbers not all round. 85 to 11, not 85 to 9.
- No perfect parallelism in lists. At least one element differs in
length or form.
- One genuine break in the flow of thought, not an inserted "anyway".
- Case studies carry one vague detail alongside one hyper-specific
one. Real memory is uneven.
- Not every post resolves. At least one a week ends open.
- No em dashes anywhere.
Final test: could a competent human have written this in five
minutes? If it reads like it took a committee, that is what it reads
as.
---
name: point-of-view-extractor
description: Find the contrarian position inside a piece of research
or a call transcript. Use when content feels agreeable and flat.
---
Read the source. Output:
- Three claims in it that the market mostly agrees with
- Two the market mostly disagrees with
- One the author would defend under pushback
The last one is the post. The first three are the reason most content
is ignored.
State what someone would say against it, and whether the position
survives that.
A point of view nobody could disagree with is not a point of view.
The remaining eight:
editorial-calendarβ four weeks visible, status per row: IDEA, DRAFT, SCHEDULED, LIVE, LOGGEDcontent-bucket-plannerβ three pillars, each a repeatable topic not a theme. "Cold email" is a topic, "growth" is a theme and produces nothing.borrowed-reach-formatterβ reformats a post to be quotable by others, so the reach comes from reshares rather than the algorithmlinkedin-carousel-builderβ one idea per slide, 8 to 12 slides, first slide carries the whole promisevoice-note-transcriberβ turns a spoken idea into a draft, which is the fastest route to something that sounds like the persontotal-addressable-content-finderβ finds every topic the ICP already engages with, so the pillars are chosen from evidencelinkedin-personal-brandingβ the profile-level positioning that content reinforceslinkedin-daily-postβ the scheduled version, publishing today's planned post plus an auto-comment 20 minutes later
On linkedin-daily-post: the 20-minute gap is deliberate. The first comment on your own post lifts early engagement, and 20 minutes is late enough to read as a considered addition rather than a planted one.
Category 5: Engagement and Connection, 10 skills
---
name: feed-engagement-session
description: Run a timeboxed engagement session with quality rules
enforced. Use daily, 25 minutes.
---
Target: 8 to 10 likes, 5 comments.
SIX RULES, all enforced
1. At most 2 of 5 comments mention our product. 3 of 5 reads as
promotion.
2. No two comments share a structure. Repetition is the second
strongest tell after promotion.
3. At least 1 of 5 outside our niche. Only-on-niche scores worse,
because a real person's feed is not perfectly on-brand.
4. At most 1 promotional phrase across the whole session. "I use it
every day" is advertising.
5. If you simply agree, like it. Do not comment. Extending an
agreement thread adds nothing and is visible.
6. At least 1 comment on a post with 200+ reactions. Large-post
comments carry a 7 to 12x reach multiplier.
Score each comment 1 to 10 before posting. Below 7 gets rewritten,
not posted. Target an 8.0 session average.
Log each comment, its structure type, its score, the target post and
its reaction count. The structure type column is what makes rule 2
enforceable across days rather than only within a session.
---
name: comment-quality-checker
description: Score a comment before it posts. Use inside every
engagement session.
---
Score 1 to 10:
9-10 Adds something the author did not know. Likely to get a reply.
8 Adds a real perspective or number. Reads as a peer.
7 Relevant and specific but adds little. Acceptable.
6 Generic but on topic. Rewrite.
5 Could be pasted under any post in the niche. Rewrite.
1-4 Praise, agreement, or a restatement. Never post.
SIX STRUCTURES to rotate, none twice in a session:
1 The counterexample. "Worked differently for us, here's what happened"
2 The specific number. Adds one figure the post did not have.
3 The narrowing question. Asks about the case the post did not cover.
4 The mild disagreement. Agrees with the premise, disputes the
conclusion. This is the one that gets replies.
5 The extension. Takes the point one step further.
6 The short reaction. One line, genuine, no argument.
A week averaging below 7.0 means the rules need adjusting, not the
volume. More bad comments is worse than fewer good ones, because each
one is publicly attached to a name.
---
name: linkedin-connection-note-writer
description: Write the note attached to a connection request. Use
when acceptance rate is below 30%.
alias: connection-note-writer
---
Under 200 characters. Sales Navigator is required to send a note at
all; without it, leave it blank rather than writing one that will not
send.
STRUCTURE
Line 1 the specific reason, dated. Not "saw your profile".
Line 2 the connection to something they would care about.
No ask. A connection request is not the place for one.
BANNED
"I came across your profile"
"I'd love to connect and learn more about what you do"
"I help [vertical] with [service]"
"Let's connect!"
Acceptance below 15% means this file is the problem, not the
sequence. Above 30% means leave it alone and look at the first
message instead.
---
name: linkedin-high-intent
description: Identify and act on the highest-intent signals in the
feed same-day. Use daily, before the general session.
---
SCAN for, in priority order:
1. Someone in the ICP posting about the exact problem we solve
2. Someone in the ICP asking for a recommendation in our category
3. A competitor's customer publicly complaining
4. Someone in the ICP announcing a new role, last 7 days
Signals 1 and 2 are same-day or not at all. A comment on a
two-day-old post asking for recommendations is late.
PER SIGNAL output: the action (comment, DM, or connect), the copy,
and the reason this is same-day.
Signal 3 needs care. Answer the problem, never mention the
competitor. Naming them reads as opportunism and gets screenshotted.
The remaining six:
linkedin-feed-engageβ the broader feed pass, less structured than a sessionconnection-request-batcherβ batches requests against the daily cap, ordered by scorereciprocity-trackerβ tracks who has engaged with you and not been reciprocated, which is the cheapest warm list there isreferral-introβ the forwardable warm intro your connector only has to press send onsocial-sellingβ the personal brand and distribution layer that feeds pipelinelinkedin-daily-engagementβ the scheduled version of the session, 09:00
The order in week one
Category 5 before category 4. Engagement first, content second.
The reason: a post published into a feed where nobody recognises the name gets the reach of a name nobody recognises. Two weeks of substantive commenting on ICP posts changes that, and it costs nothing but time.
The practical week one: feed-engagement-session daily from day one, content-engine and the first posts from day eight, outreach from day fifteen.
Rule 6 in the session skill is the one agencies underuse. A good comment on a large post outperforms a good post on a small account, at a fraction of the effort, and the people who reply to it become an importable list via Prosp from that post URL.
Section 4Categories 6 and 7: DM, Sell-By-Chat, Diagnostics (18 Skills)
18 skills across two categories. Category 6 handles everything after someone replies. Category 7 tells you which of the seven categories is actually broken.
Most outreach systems generate replies and no meetings, because nothing owns the space between the two.
Category 6: DM and Sell-By-Chat, 12 skills
---
name: opener-writer
description: Write the first-touch message from a signal. Use after
signal-finder, before sequence-builder.
---
RULES
- Under 300 characters. Longer reads as a template.
- Line one references the signal specifically. Not "saw your post"
but the actual thing the post said.
- One ask, answerable in under ten words.
- No compliments. No "hope this finds you well".
- Never mention the product in message one.
- No em dashes.
STRUCTURE
Line 1 the signal, dated and specific
Line 2 the inference drawn from it
Line 3 the question
ONE PER TIER
Tier 1 lead with the signal. It is recent and they know it.
Tier 2 lead with the observable problem. There is no event.
Tier 3 lead with the vertical-level pattern. Claim no
personalisation you cannot back.
BANNED, burnt:
"I came across your profile"
"I help [vertical] with [service]"
"Are you open to a quick chat"
"Quick question for you"
---
name: linkedin-warm-dm-sequencer
description: Build the full sequence spec for a warm, post-engaged
list. Use after the list is graded B or above.
alias: warm-dm-sequencer, sequence-builder
---
Output a node list, not prose. Per node: action, delay before it,
exact copy, exit condition.
RULES
- Every touch a different angle. Never "just following up".
- Message 2 references something message 1 did not.
- Four touches maximum. After that the answer is no.
- Reply stops the sequence for that lead, always.
- A connection request auto-detects acceptance over two weeks, so no
wait node after one.
- Any voice note pairs with a written message, before or after.
BRANCH on connection state:
1st degree message straight away
Not connected connection request, then message on acceptance
STATE the daily send split against the account ceiling. If the
requested volume exceeds it, state the ceiling and the split rather
than writing the sequence.
---
name: linkedin-reply-classifier
description: Classify every inbound reply and route it. Use on every
reply before drafting a response.
alias: reply-classifier, reply-router
---
Exactly one category:
ENGAGED Asked about a specific point, or disputed one. The
strongest signal in the system.
INTERESTED Wants to know more about the offer
TIMING Interested, not now. Capture the date named.
OBJECTION Price, fit, incumbent, internal capacity
WRONG_PERSON Not their remit. Ask who owns it.
NOT_INTERESTED Clear no. Thank them, stop, never pitch again.
AUTO_REPLY Out of office. Reschedule to their return date.
ESCALATE Anything below 8 confidence
Per reply: category, confidence 1 to 10, the sentence that decided
it, the recommended next action.
Below 8 confidence, always ESCALATE. Do not guess at tone. Sarcasm,
brevity and politeness all read the same in text.
ENGAGED goes straight to a call offer. Someone arguing with your
point is more likely to buy than someone praising it, because they
engaged with the substance.
Never auto-send to NOT_INTERESTED. A human closes that loop.
---
name: one-question-filter
description: Reduce any drafted reply to a single question. Use on
every outbound message in a live conversation.
---
Read the draft. Count the questions in it.
If more than one, pick the one whose answer changes what you do next,
and cut the rest.
Two questions in a DM gets you an answer to the easier one. Three
gets you no reply, because now it is work.
Output the single question, and name which ones you cut and why.
The test for the surviving question: could they answer it in under
ten words while walking? If not, it is too big for a DM and belongs
on a call.
---
name: mirror-style-analyzer
description: Match a prospect's message register before replying. Use
on any reply that will be more than one line.
---
Read their message and identify:
- Message length. Reply within roughly 20% of it.
- Punctuation. Do they use full stops in short messages, or not.
- Capitalisation. Sentence case or lowercase.
- Formality. "Hi James," or "hey".
- Do they use emoji. If not, do not.
Then draft the reply to match.
A three-line reply to a six-word message reads as eager. A six-word
reply to a three-paragraph message reads as dismissive. Register
mismatch is the most common reason a warm thread cools.
Never mirror hostility or unprofessionalism. Match energy, not
behaviour.
---
name: next-step-closer
description: Decide whether to ask for the meeting, then draft the
ask. Use when reply-classifier returns INTERESTED or ENGAGED.
---
Decide IF before HOW.
ASK NOW WHEN
- They asked something needing more than 400 characters to answer
- They named a problem we solve
- They asked about price, timeline or implementation
- Two substantive messages have gone each way
DO NOT ASK YET WHEN
- They replied with one line
- They have not named a problem
- It is still the first exchange
Instead, ask one more question that gets them to name the problem.
HOW
- Name the length and the agenda. "15 minutes, three questions, no deck"
- Offer the link and two concrete times. Some book, some reply.
- Say what happens on the call, one line.
- Never "let me know what works". Decision fatigue kills bookings.
Under 350 characters including the link.
After sending, tag the lead so the sequence does not follow up on
someone who already has a meeting booked. That is the most avoidable
bad impression in the whole system.
---
name: dm-self-check
description: Check a drafted DM against the rules before it sends.
Use as the last step on every message.
---
Seven checks, five must pass:
[ ] Under 300 characters
[ ] One question only
[ ] References something specific and dated, not a category
[ ] No banned opener
[ ] No claim absent from case-studies.md
[ ] Register matches theirs
[ ] No em dashes
Report pass or fail per check with the evidence. Do not summarise as
"looks good".
If fewer than five pass, rewrite rather than send. A message that
fails three checks will not be saved by the follow-up.
The remaining five:
prosp-prompt-writerβ converts message copy into per-lead personalisation prompts.{{double curly}}for profile data,[square brackets]for AI instructions. Only the opening line varies; the ask stays identical so results are comparable.voice-note-scripterβ under 20 seconds, roughly 50 words, written for speech with contractions and one filler word. Never sent alone.objection-handlerβ agree with the true part, add the one thing they do not know, ask a question that moves it forward. Never two objections in one message.voice-calibrationβ tunes the written voice against past messages that got replieslinkedin-dm-prepβ the scheduled version. Drafts replies for human review at 10:00 and never sends.
Category 7: Reporting and Diagnostics, 6 skills
---
name: campaign-diagnostic
description: Diagnose which stage is broken. Run weekly. Stops at the
first failure rather than reporting everything.
---
Pull: requests sent, accepted, messages sent, replied, meetings
booked.
Work the chain IN ORDER. Stop at the first failure.
1 ACCEPTANCE BELOW 15%
The connection note, or the list is off-ICP. Not the sequence.
Do not touch the sequence.
2 ACCEPTANCE FINE, REPLIES BELOW 10%
The list is fine. The first message is the problem. Check: is the
signal specific, one ask, under 300 characters.
3 REPLIES FINE, MEETINGS LOW
The outreach works. The ask is mistimed, or the offer is wrong.
4 MEETINGS FINE, NOTHING CLOSING
Not a LinkedIn problem. Price or offer fit.
5 ALL FINE, VOLUME LOW
Not quality. Check the daily cap split across campaigns.
Output the failing stage, the evidence, and ONE change.
Never more than one change per week. Change three things and a lift
tells you nothing about which one worked.
If figures are incomplete, name which stage cannot be assessed. A
diagnosis on partial data points at the wrong stage.
---
name: acceptance-rate-diagnostic
description: Diagnose a low connection acceptance rate specifically.
Use when campaign-diagnostic stops at stage 1.
---
Below 15% is a problem. 30%+ is healthy.
Check in order, stop at the first hit:
1. Is a note attached at all? Sales Navigator is required to send
one. Without it, requests go bare.
2. Does the note reference something specific and dated, or a
category?
3. Does the note contain an ask? A request is not the place for one.
4. Is the list actually the ICP? Run a sample of 20 against
derived-icp.md by hand.
5. Is the profile optimised? Every request drives a profile visit,
and a weak headline loses the accept there rather than in the note.
Output the failing item and the fix. Check 5 is the one people miss,
because it is not in the message at all.
The remaining four:
linkedin-campaign-reporterβ the weekly report. Every metric pairs with an action, percentages sit beside absolutes, impressions never lead.reply-rate-diagnosticβ for stage 2. Checks signal specificity, ask count, length, and whether the opener is on the burnt list.dm-reply-time-monitorβ tracks how long replies sit before a response. The single cheapest improvement in most accounts.warm-signal-trackerβ flags leads who engaged again after going quiet, which is a re-entry signal most sequences miss because the lead is already marked Contacted.
Where the numbers come from
Stages 1 to 3 of the diagnostic need outreach data that LinkedIn itself does not export usefully.
Prosp supplies it: requests sent and accepted, messages sent, replies received, per campaign and per account. Native HubSpot integration with field mapping, 12 webhook events including Message Replied and Connection Accepted, and a REST API at prosp.ai/api/v1/leads.
The lead states also feed warm-signal-tracker directly: Not Contacted, In Campaign, Contacted, Not Accepted after 14 days with auto-withdraw, Replied which stops the campaign, Duplicate, Blacklist, Failed.
On voice notes, since voice-note-scripter depends on it: across 1000+ campaigns they average around a 47% reply rate against roughly 8% for written messages, largely because under 1% of LinkedIn outreach uses them. Cloning needs a 30 second minimum recording, ideally of the actual script.
Section 5The 10 Playbook Modules, and the Weekly Loop
The ten modules from the 10 Call / Day playbook, mapped to the skills that automate them.
The modules are the method. The skills are the execution. Read the module once, then let the skill run it.
The 10 modules, and what runs them
| # | Module | Skills that run it |
|---|---|---|
| 1 | How to Define Your ICP | icp-from-customers, icp-prompt-builder, tam-sanity-check, disqualifier-writer |
| 2 | Optimise Your Profile | linkedin-profile-optimizer, linkedin-personal-branding |
| 3 | Viral Post Templates | linkedin-post-writer, hook-last-and-humanize, content-bucket-planner |
| 4 | The BEST DM on LinkedIn | opener-writer, dm-self-check, one-question-filter |
| 5 | Sales Nav Tutorial | linkedin-icp-list-builder, sales-prospect-list |
| 6 | Scrape Competitor Company Followers | competitor-engagers, icp-filter-pass, prosp-prompt-writer |
| 7 | Steal Competitor Leads from Comments | competitor-engagers, post-engager-scorer |
| 8 | 500+ Comment Lead Magnet Strategy | lead-magnet-post-writer, post-engager-scorer |
| 9 | 10+ Copy-Paste DM Templates | opener-writer, linkedin-warm-dm-sequencer, mirror-style-analyzer |
| 10 | Sell-By-Chat Framework | linkedin-reply-classifier, one-question-filter, objection-handler, next-step-closer |
Modules 6, 7 and 8 are three routes to the same thing: a list of people who have already engaged with your topic. They differ only in whose content they engaged with.
Module 1: ICP, and why it comes first
The playbook is explicit that this is the important one, and every skill in the library reads its output.
The method: derive from who actually bought rather than who you meant to sell to. The gap between the two is usually the most valuable line in the document.
Run icp-from-customers against the CRM.
Then tam-sanity-check on the result, and give me the send maths: at
20 connection requests a day, how many weeks does the full
addressable list take to work?
If that is under four weeks, the ICP is too narrow for a campaign.
Name the widening options rather than proceeding.
Then disqualifier-writer, so the filter has something to filter on.
The send maths is the step people skip. An ICP that produces 60 prospects is not a campaign, it is a list of people to contact by hand.
Modules 6 and 7: the competitor plays
Two routes to the same list. Followers of a competitor's company page, and commenters on a competitor's posts.
The commenters are better. A follower expressed interest once, possibly years ago. A commenter engaged with a specific idea on a specific date, and you know which idea.
Run competitor-engagers on [COMPETITOR].
Capture the post topic per lead, not just the lead. Someone who
commented on a pricing post has a different opener from someone who
commented on an onboarding post.
Then post-engager-scorer, depth x fit. Contact 6+ this week.
Then icp-filter-pass, because a competitor's audience is not
automatically your ICP.
The filter step matters more here than anywhere else. A competitor with a broader offer has an audience that mostly does not fit you, and their follower count is not a measure of your addressable market.
Module 8: the 500+ comment strategy
The highest-volume play in the playbook, and the one that breaks without the delivery half.
Run lead-magnet-post-writer. Three variants, three keywords, one
recommendation.
CTA depends on connection state:
Mostly connected: Comment "[WORD]" and I'll DM it over.
Mostly not: Comment "[WORD]" and connect with me so I can send it.
A post pulling 500 comments is 500 people expecting a link, and that is where this play either compounds or collapses. Prosp imports the commenters and likers straight from the post URL, including future reactions as they keep arriving.
Five nodes: import from the post, a lead is 1st level condition, the message with the link on the YES branch, a connection request then the message on the NO branch, and a Reply Comment node so every public comment gets a public reply too.
Connection requests auto-detect acceptance, checking every 24 hours for two weeks with a random 1 to 24 hour delay, so no wait card is needed after that step. It is the most common unnecessary node people add.
Module 10: the Sell-By-Chat framework
The module that turns replies into calls, run by four skills in sequence.
On every reply:
1. linkedin-reply-classifier
One of eight categories, with confidence. Below 8, escalate.
2. mirror-style-analyzer
Match their length, punctuation, capitalisation and formality
before drafting anything.
3. one-question-filter
Reduce the draft to a single question. Two questions gets you an
answer to the easier one. Three gets you nothing.
4. next-step-closer
Decide IF before HOW. Then name the length and the agenda, offer
two concrete times, and tag the lead so the sequence stops.
If the classifier returns OBJECTION, insert objection-handler between
2 and 3.
Run dm-self-check as the final gate on whatever comes out.
The ordering is the framework. Classify before drafting, match register before writing, cut to one question before sending, and only then decide whether to ask for the call.
Most people do these in reverse: draft the pitch, then try to make it fit the reply.
The weekly loop, everything together
Once, then quarterly
Category 1. ICP, profile, positioning, proof library.
Week 1 to 2, before any outreach
feed-engagement-session daily. Nothing else.
From week 2
Mon campaign-diagnostic. One change, no more.
Mon content-engine or editorial-calendar for the week
Tue linkedin-list-builder, then icp-filter-pass, then
list-quality-scorecard. Below B, rebuild.
Tue signal-finder and post-engager-scorer on the survivors
Wed linkedin-post-writer, publish. One post a day maximum.
Wed feed-engagement-session
Thu linkedin-warm-dm-sequencer, launch or top up
Daily linkedin-reply-classifier over the inbox, then the
sell-by-chat chain on whatever it routes
Fri linkedin-campaign-reporter
Fri Check caps: sends used against allocation, per account
One change per week is the rule that makes the diagnostic worth running. Change three things and a lift tells you nothing about which one worked.
Three things to remember
- Build the context files before installing anything. Sixty-eight skills reading one ICP file behave like a system. Sixty-eight reading nothing behave like sixty-eight tools.
- Engagement before content, content before outreach. Two weeks of substantive commenting costs nothing and changes what every later step is worth.
- Comments are free, lists are cheap, sends are not. Twenty connection requests a day account-wide is the real constraint, which makes
post-engager-scorerandlist-quality-scorecardthe highest-leverage skills in the library.
The library writes it. Prosp sends it π
β³ Start a 14 Day Free Trial π β³ Watch Full Tutorial βΆοΈ