Playbook warm intros skill

Build prospect lists where the prospect is already one hop from the client, and write the line that says so.

by growthenginenowoslawski·MIT license·★ 736 Stars on the repo·GitHub ↗

Use now

Files of Playbook warm intros

growthenginenowoslawski/main1 file shown
SKILL.md
Show the full text171 lines

Playbook: Warm Intros

All rules here are best practice, not law. Override any of them when the campaign calls for it; note the best practice once and move on.

Use when: the campaign's whole premise is that the prospect is already one hop from the client, and you need both the list and the line. The strongest version, and the one to build first, is "you used to work at a company that is now our client's customer".

Do not use when: you want a second contact at an account you already email (playbook-name-to-other-prospects), people who engaged with a competitor's or customer's posts (playbook-linkedin-engagement), or companies similar to a seed set (playbook-lookalikes).

One-line output: warm_intro_line = "you came up through Coca-Cola, who we work with now", rendering as Noticed you came up through Coca-Cola, who we work with now.

⚠️ Status: sources probed, no line graded

This is the least proven playbook in the library, and it is written that way deliberately.

  • Member 2's source probe passed — 20/20 rows carried a dated matched past experience, a profile URL and a city, and 15/20 had moved on.
  • Member 5's source probe passed — the investor filter returns a real result count.
  • No member has produced a graded warm_intro_line.

Everything below §3 is a build spec, not a measured path. Treat the coverage and quality claims as unverified until you run one.

1. A family, not one playbook

A warm-intro signal is any evidence that the prospect is already one hop from the client, so email 1 can lean on a real connection instead of a cold pitch.

Seven members share the copy shape warm_intro_line. They do not share a data source. So this is one routing table plus one build recipe per member.

# Member What it means Status
1 same-company alumni Everyone who ever worked at the case-study company and has since moved on live, same build as 2
2 current-customer alumni The prospect used to work at one of the client's current customers live, top priority, build this first
3 engagement overlap The prospect engages with the same content the client's world does live, but routed to playbook-linkedin-engagement
4 same metro The prospect sits in the same city as the client, a named rep, or an upcoming trip live
5 shared investor or advisor A common investor, board member or advisor links the two companies live
— mutual connection A first-degree connection in common deleted. Do not re-add it, do not prototype it
7 event attendee Both attended, spoke at or sponsored the same event live as a custom scrape every time. There is no reusable recipe and there will not be one
8 website visitor The prospect's company already visited the client's site live as a per-client toggle, not a standing integration
Why member 1 was reframed, and why it matters

Member 1 originally meant "overlapped in time with someone on the client's team". That list is always too small, and it never once got run.

Reframed, it means everyone who ever worked at the case-study company and has since moved on — which is a large, buildable list from the same source as member 2.

The general lesson: a warm-intro definition that requires a time overlap between two specific people produces a list too small to campaign on. Widen to "worked there at all, and left" and the same data source suddenly supports a real segment.

2. Output contract

Field Type Example Null?
warm_intro_line string you came up through Coca-Cola, who we work with now yes, ""
warm_intro_member enum current_customer_alumni no
warm_intro_evidence string, QA only Coca-Cola, Brand Manager, 2018-2021 yes

Abstain value: "".

Keep the member field. Seven members share one copy shape, and without it you cannot tell later which angle actually produced replies — which is the only way this family gets narrowed to the two or three members worth keeping.

⛔ Never name a real third party in copy without permission

The line says "who we work with now", not "we work with Coca-Cola" — unless the client has explicitly approved naming that customer.

Naming a client's customer in cold email is the client's decision, not yours, and it is the fastest way to turn a clever campaign into an awkward phone call. Default to the unnamed form.

Note this is the same posture playbook-lookalikes takes with case-study companies, for the same reason.

3. Build member 2 first

The source is a people search with a past-company filter set to the client's customer or case-study companies.

What the probe confirmed on 20 rows:

  • a dated matched past experience,
  • a profile URL,
  • a city,
  • and 15 of 20 had moved on — which is the population you actually want.

That last number is the one to plan from. Roughly three quarters of "ever worked there" is "worked there and left", and the rest are current employees who must be excluded (they are the customer's staff, not prospects).

The exclusions this family needs

Inherit them from playbook-linkedin-engagement, because the shape is identical:

  • Drop anyone currently employed by a source company. They work for the client's customer; they are not a warm intro, they are the customer.
  • Never include the client's own domain in the source set. If it appears, the list is wrong — stop.
  • Push the source companies onto the client's do-not-contact list, so this run's exclusions persist into future lanes.

4. Verification

Untested for the line. Sources probed only. See the status box above.

The first person to run a member owes the file: a real fill rate, a graded sample of at least 10 lines, and the member name on every row.

5. Clay implementation

  • clay-table.md — the labelling half as columns.
  • clay-workflow.md — the CLI-buildable version.

6. The line

The line is short, and the copy risk is entirely in what it names, not in how it is written.

Shape: you came up through <former employer>, who we work with now.

Rules:

  • Lowercase first word, no trailing period, no em dashes, under 90 characters.
  • Name the prospect's former employer (a public fact from their own profile) — not the client's customer relationship in identifying detail, unless approved.
  • Never state a date. "In 2018 you were at X" is both creepy and frequently wrong when a profile is imprecise.
  • Never imply you know someone in common unless you do. The deleted mutual-connection member exists as a warning: that claim is unverifiable at scale and reads as a lie when it is wrong.

Verification for this family is source-side, not model-side. The facts come from the prospect's own profile, and the model only phrases them — so the risk is a stale or mismatched profile, which no verifier over your own output can catch. Prefer sources that return a dated experience you can check.

7. Edge cases and failure modes

Symptom Cause Fix
The list is tiny and not worth a campaign The member was defined as a time overlap between two specific people Widen to "ever worked there, and has since moved on"
The list is full of the customer's current staff No current-employment exclusion Drop anyone currently employed by a source company
The client's own employees appear The client's domain got into the source set Stop. The list is wrong
The same people reappear next quarter Row drops only fix this run Push the source companies to the client's DNC list
A client is unhappy that their customer was named The line named a real third party Default to the unnamed form. Naming is the client's decision
The line states a date that is wrong Profile date ranges are imprecise Never state a date
Replies cannot be attributed to an angle Seven members share one copy field Keep warm_intro_member on every row
Someone proposes rebuilding mutual connections It is a deleted member It is unverifiable at scale and reads as a lie when wrong. Do not re-add it
An event member becomes a maintenance burden It was turned into a standing recipe Event overlap is a custom scrape every time. That is the decision, not a gap
Hard rules
  • Build member 2 first. It is the only one with a passing source probe and a real population behind it.
  • Never name a client's customer in copy without explicit approval.
  • Never claim a mutual connection.
  • Inherit the source-company exclusions, both halves.
  • No member ships a line until at least 10 rendered lines have been read and graded.
1---
2name: playbook-warm-intros
3description: Build prospect lists where the prospect is already one hop from the client, and write the line that says so. Seven members, each with its own source. Current-customer alumni is the priority member - everyone who ever worked at one of the client's customers or case-study companies and has since moved on. Triggers on "warm intro", "who do we know at that account", "they used to work at our customer", "alumni of our case study company", "shared investor angle", "who is in the same city as our rep", "did they visit our site". Outputs warm_intro_line plus a per-member evidence column.
4---
5 
6# Playbook: Warm Intros
7 
8> All rules here are best practice, not law. Override any of them when the campaign calls for it; note the best practice once and move on.
9 
10**Use when:** the campaign's whole premise is that the prospect is **already one hop from the
11client**, and you need both the list and the line. The strongest version, and the one to build first,
12is *"you used to work at a company that is now our client's customer"*.
13 
14**Do not use when:** you want a second contact at an account you already email
15(`playbook-name-to-other-prospects`), people who engaged with a competitor's or customer's posts
16(`playbook-linkedin-engagement`), or companies similar to a seed set (`playbook-lookalikes`).
17 
18**One-line output:** `warm_intro_line = "you came up through Coca-Cola, who we work with now"`,
19rendering as `Noticed you came up through Coca-Cola, who we work with now.`
20 
21## ⚠️ Status: sources probed, no line graded
22 
23**This is the least proven playbook in the library, and it is written that way deliberately.**
24 
25- **Member 2's source probe passed** — 20/20 rows carried a dated matched past experience, a profile
26 URL and a city, and **15/20 had moved on.**
27- **Member 5's source probe passed** — the investor filter returns a real result count.
28- **No member has produced a graded `warm_intro_line`.**
29 
30**Everything below §3 is a build spec, not a measured path.** Treat the coverage and quality claims
31as unverified until you run one.
32 
33## 1. A family, not one playbook
34 
35A warm-intro signal is any evidence that the prospect is already one hop from the client, so email 1
36can lean on a real connection instead of a cold pitch.
37 
38**Seven members share the copy shape `warm_intro_line`. They do not share a data source.** So this is
39one routing table plus one build recipe per member.
40 
41| # | Member | What it means | Status |
42|---|---|---|---|
43| 1 | **same-company alumni** | Everyone who **ever** worked at the case-study company and has since moved on | live, same build as 2 |
44| 2 | **current-customer alumni** | The prospect used to work at one of the client's **current customers** | **live, top priority, build this first** |
45| 3 | engagement overlap | The prospect engages with the same content the client's world does | live, but **routed to `playbook-linkedin-engagement`** |
46| 4 | same metro | The prospect sits in the same city as the client, a named rep, or an upcoming trip | live |
47| 5 | shared investor or advisor | A common investor, board member or advisor links the two companies | live |
48| — | ~~mutual connection~~ | A first-degree connection in common | **deleted. Do not re-add it, do not prototype it** |
49| 7 | event attendee | Both attended, spoke at or sponsored the same event | live as a **custom scrape every time. There is no reusable recipe and there will not be one** |
50| 8 | website visitor | The prospect's company already visited the client's site | live as a **per-client toggle**, not a standing integration |
51 
52### Why member 1 was reframed, and why it matters
53 
54Member 1 originally meant *"overlapped in time with someone on the client's team"*. **That list is
55always too small, and it never once got run.**
56 
57Reframed, it means **everyone who ever worked at the case-study company and has since moved on** —
58which is a large, buildable list from the same source as member 2.
59 
60**The general lesson: a warm-intro definition that requires a time overlap between two specific
61people produces a list too small to campaign on.** Widen to "worked there at all, and left" and the
62same data source suddenly supports a real segment.
63 
64## 2. Output contract
65 
66| Field | Type | Example | Null? |
67|---|---|---|---|
68| `warm_intro_line` | string | `you came up through Coca-Cola, who we work with now` | yes, `""` |
69| `warm_intro_member` | enum | `current_customer_alumni` | no |
70| `warm_intro_evidence` | string, **QA only** | `Coca-Cola, Brand Manager, 2018-2021` | yes |
71 
72**Abstain value:** `""`.
73 
74**Keep the member field.** Seven members share one copy shape, and without it you cannot tell later
75which angle actually produced replies — which is the only way this family gets narrowed to the two or
76three members worth keeping.
77 
78### ⛔ Never name a real third party in copy without permission
79 
80The line says *"who we work with now"*, not *"we work with Coca-Cola"* — **unless the client has
81explicitly approved naming that customer.**
82 
83Naming a client's customer in cold email is the client's decision, not yours, and it is the fastest
84way to turn a clever campaign into an awkward phone call. **Default to the unnamed form.**
85 
86Note this is the same posture `playbook-lookalikes` takes with case-study companies, for the same
87reason.
88 
89## 3. Build member 2 first
90 
91The source is a **people search with a past-company filter** set to the client's customer or
92case-study companies.
93 
94What the probe confirmed on 20 rows:
95 
96- a **dated** matched past experience,
97- a profile URL,
98- a city,
99- and **15 of 20 had moved on** — which is the population you actually want.
100 
101That last number is the one to plan from. **Roughly three quarters of "ever worked there" is "worked
102there and left"**, and the rest are current employees who must be excluded (they are the customer's
103staff, not prospects).
104 
105### The exclusions this family needs
106 
107Inherit them from `playbook-linkedin-engagement`, because the shape is identical:
108 
109- **Drop anyone currently employed by a source company.** They work for the client's customer; they
110 are not a warm intro, they are the customer.
111- **Never include the client's own domain** in the source set. If it appears, the list is wrong —
112 stop.
113- **Push the source companies onto the client's do-not-contact list**, so this run's exclusions
114 persist into future lanes.
115 
116## 4. Verification
117 
118**Untested for the line.** Sources probed only. See the status box above.
119 
120**The first person to run a member owes the file:** a real fill rate, a graded sample of at least 10
121lines, and the member name on every row.
122 
123## 5. Clay implementation
124 
125- **`clay-table.md`** — the labelling half as columns.
126- **`clay-workflow.md`** — the CLI-buildable version.
127 
128## 6. The line
129 
130The line is short, and the copy risk is entirely in **what it names**, not in how it is written.
131 
132Shape: `you came up through <former employer>, who we work with now`.
133 
134Rules:
135 
136- Lowercase first word, no trailing period, no em dashes, under 90 characters.
137- **Name the prospect's former employer** (a public fact from their own profile) — **not the client's
138 customer relationship in identifying detail**, unless approved.
139- **Never state a date.** "In 2018 you were at X" is both creepy and frequently wrong when a profile
140 is imprecise.
141- **Never imply you know someone in common** unless you do. The deleted mutual-connection member
142 exists as a warning: that claim is unverifiable at scale and reads as a lie when it is wrong.
143 
144**Verification for this family is source-side, not model-side.** The facts come from the prospect's
145own profile, and the model only phrases them — so the risk is a stale or mismatched profile, which no
146verifier over your own output can catch. **Prefer sources that return a dated experience you can
147check.**
148 
149## 7. Edge cases and failure modes
150 
151| Symptom | Cause | Fix |
152|---|---|---|
153| The list is tiny and not worth a campaign | The member was defined as a **time overlap between two specific people** | Widen to "ever worked there, and has since moved on" |
154| The list is full of the customer's current staff | No current-employment exclusion | Drop anyone currently employed by a source company |
155| The client's own employees appear | The client's domain got into the source set | **Stop. The list is wrong** |
156| The same people reappear next quarter | Row drops only fix this run | Push the source companies to the client's DNC list |
157| A client is unhappy that their customer was named | The line named a real third party | **Default to the unnamed form.** Naming is the client's decision |
158| The line states a date that is wrong | Profile date ranges are imprecise | **Never state a date** |
159| Replies cannot be attributed to an angle | Seven members share one copy field | **Keep `warm_intro_member` on every row** |
160| Someone proposes rebuilding mutual connections | It is a deleted member | It is unverifiable at scale and reads as a lie when wrong. Do not re-add it |
161| An event member becomes a maintenance burden | It was turned into a standing recipe | **Event overlap is a custom scrape every time.** That is the decision, not a gap |
162 
163### Hard rules
164 
165- **Build member 2 first.** It is the only one with a passing source probe and a real population
166 behind it.
167- **Never name a client's customer in copy without explicit approval.**
168- **Never claim a mutual connection.**
169- **Inherit the source-company exclusions**, both halves.
170- **No member ships a line until at least 10 rendered lines have been read and graded.**
171 

Discussion

Alternatives

AI Sales Team — Main OrchestratorYou are a comprehensive AI sales intelligence and outreach system for Claude Code. You help founders, sales teams, agency owners, and…Sales & ecommerce · MITAuto research publicAutonomous cold email campaign launcher. Takes one target company domain, scrapes their website, generates an ICP with Claude, pulls matching leads via Prospeo, enriches emails + company descriptions, personalizes each lead with parallel Claude Code Task sub-agents (A/B/C variants), and uploads as a live Smartlead campaign. Uses local JSON files for state (no database required). Use for automated daily campaign launches after you have an initial `client-profile.yaml` from /icp-onboarding. Triggers on "auto-research", "launch an automated campaign", "daily campaign", "run the research loop".Sales & ecommerce · MITCold email outreachRun end-to-end B2B cold-email outreach through the Hyper MCP — enrich prospects with Apollo, scrape per-prospect signals from company sites and LinkedIn, draft personalized emails using proven hook frameworks, send via Gmail with safe defaults, and route replies into labeled folders. Use when the user wants to write cold emails, run an outbound sequence, prospect a list, build a follow-up cadence, "reach out to leads," or asks why nobody is replying to their cold emails.Sales & ecommerce · MITBuild a system for handling sales leadsTell us how leads reach your team today and you get back a written playbook for scoring, routing, and following up on every lead fast.Business & ops · MIT