| name | cold-icp |
| description | Build your Ideal Customer Profile (ICP) and write it to icp.md for the rest of the cold.md suite to consume. Use when the user says "build my ICP", "define my target audience", "who should I sell to", "analyze my website for ICP", or when starting a new cold outreach project. Can bootstrap from a URL (scrape homepage, about, pricing, case studies) or run an interactive Q&A. Writes a structured icp.md that cold-leads, cold-draft, and cold-send all read. |
cold-icp
Step 1 of the cold.md suite. Builds the icp.md file that every other skill reads.
When to use
- User says "build my ICP", "define my audience", "who should I sell to"
- User is starting a new cold outreach project and has no
icp.md yet
- User wants to re-derive ICP from their website, case studies, or past wins
- User asks "does [lead] fit my ICP?"
Two input modes
Mode 1 - From a URL
If the user gives a URL (their company site, a case study library, or a portfolio):
- Fetch the homepage,
/about, /pricing, /customers, /case-studies (whichever exist).
- Extract:
- Industry / vertical (from hero copy, testimonial logos, case studies)
- Typical customer size (SMB / mid-market / enterprise - infer from case study names + pricing tiers)
- Geography (from team + testimonial locations)
- Titles / roles mentioned in testimonials
- Pain signals (the problems the company talks about solving)
- Pricing tier (so we can rule out misaligned prospects later)
- Draft the
icp.md from the extracted data.
- Surface any gaps ("I couldn't find your geography - is it US-only, global, EU-focused?") and fill via Q&A.
Mode 2 - Interactive Q&A
If the user has no URL or wants to build from scratch, ask these 7 questions in order:
- Company size band (employees): 1-10 / 11-50 / 51-200 / 201-1000 / 1000+
- Industry / vertical(s): list 1-3
- Stage / funding: bootstrapped / seed / A-C / public / doesn't matter
- Titles you sell to: list top 3
- Observable pain signals: what does a prospect do or not do that signals they have this problem? (tool stack, job posts, public statements, GitHub commits, hiring patterns)
- Geography / language: US, UK, EU, APAC, global, English-only, multilingual
- Hard disqualifiers: who would you refuse to sell to even if they offered money? (list 2-5)
Each answer goes into the corresponding section of icp.md.
Output format - icp.md
Write to ./icp.md in the current directory (not cold.md). The cold.md suite uses two files: icp.md (who) and cold.md (voice/message). They are separate so you can iterate on either independently.
---
coldMdVersion: "0"
updated: YYYY-MM-DD
source: [url or interactive]
---
# ICP - [Product or Company Name]
## Company signals
- Size: [X-Y employees]
- Stage: [funding / revenue band]
- Industry: [vertical 1], [vertical 2]
- Geography: [countries / regions]
- Tech stack signals: [tools they must use / must not use]
## Title signals
- Primary: [job title 1], [job title 2]
- Secondary: [job title 3]
- Not: [decision-makers who are wrong for us]
## Pain signals (observable)
- [Signal 1 - something public you can verify]
- [Signal 2 - tool they use, job posting, GitHub activity, etc.]
- [Signal 3]
## Disqualifiers
- [Hard no 1]
- [Hard no 2]
## Qualification checklist
A lead passes if:
- [ ] Matches company size band
- [ ] Title is in primary or secondary list
- [ ] At least one pain signal is observable
- [ ] Does NOT match any disqualifier
- [ ] Geography/language aligned
## Notes
[Any context, reasoning, edge cases]
Step 3 — Web research validation (autoresearch v0.2+)
Read .cold/config.json. If research.policyLevelEnabled is true (default), run up to maxQueriesPerInvocation (default 5) WebSearch queries to validate the drafted ICP before writing it. The goal: catch a niche that's too narrow, titles that don't really exist at scale, or disqualifiers that aren't actually meaningful.
If .cold/config.json doesn't exist (user skipped /cold init), skip this step gracefully — the skill still works without it.
Queries to run
For each query, capture: query string, top 3 result titles + URLs, a 1-sentence "what this tells us".
-
Cluster size — competitor companies in the vertical
<vertical> companies <region> (e.g. "B2B SaaS warmup tools US")
Tells us: is the niche big enough? <3 results = niche too narrow.
-
Title prevalence
"<title>" jobs <vertical> (e.g. "Head of Demand Gen" jobs B2B SaaS)
Tells us: is this title common in this niche, or rare?
-
Pain language in the wild
"<vertical> <pain>" reddit OR forum site:reddit.com
Surfaces real complaints — borrow phrasing for the offer.
-
Case study patterns
case study <vertical> <pain> 2026
Finds proof points the user can cite.
-
Disqualifier validation
"<disqualifier-trait>" <vertical>
Confirms the disqualifier is meaningful (i.e. that segment really exists and is wrong-fit).
Save findings
Write to .cold/research/icp-validation-<YYYY-MM-DD>.md:
# ICP validation — <YYYY-MM-DD>
## Source
- ICP: ./icp.md
- Queries run: 5 of 5
## Findings
### Cluster size: <vertical> companies
- Query: "..."
- Top results: ...
- Insight: ...
### Title prevalence: <title>
...
## Risks
- [List anything the research flagged: niche too narrow, title rare, etc.]
## Suggested icp.md edits
- [Concrete proposed changes; user accepts or rejects]
Surface to user
Print a 5-line summary:
ICP validation complete (5 queries):
✓ Cluster size: ~12 competitor companies in the niche (healthy)
✓ Title "Head of Demand Gen" appears in 1,200+ recent job posts
✓ Pain language: "Smartlead bounces" mentioned in r/coldemail
⚠ Disqualifier "agencies" — niche has many agency consumers; consider softening
✓ Found 3 case-study patterns for proof points
Apply suggested edits to icp.md? (Y/n/show)
If user accepts: edit icp.md. If shows: print the diff. If no: leave as-is, save findings only.
Validation
After writing icp.md:
- Check each section is filled (not
[placeholder]).
- Verify Titles list has at least one entry.
- Verify Pain signals contains at least 2 observable signals (not vibes).
- Run the qualification checklist against 1 known good customer (ask the user) - it should pass. If it fails, the ICP is too tight.
- Run against 1 known bad-fit prospect - it should fail. If it passes, the ICP is too loose.
Gotchas
- Observable != vague. "They care about deliverability" is not observable. "They use Instantly or Smartlead" is.
- Disqualifiers are sharper than qualifiers. Sometimes you only know the ICP by knowing who it's not.
- Don't ship
icp.md without running the qualification checklist against real leads. Garbage in, garbage out for every downstream skill.
References