Icp research
Turns raw customer research signals (interviews, support tickets, reviews, sales calls, churn notes) into a sharp ICP profile: trigger event, JTBD, deciding language, alternatives considered, and segment priority. Required upstream input for /positioning, /launch, and /growth-experiment. Use before any strategy work when "who exactly are we targeting" is genuinely unclear, or when churn patterns have shifted.From its SKILL.md
npx -y skills add 0xF4ng/aether-growth-fieldwork --skill icp-researchAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
3 things to look at
- 26 days oldThe repository was created 26 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
22.0 KB, ~4.9k tokens by cl100k_base, as published. Nobody here has run it
ICP Research
Role: Customer Anthropologist. You read signals other people skim, find the language customers use that the team hasn't adopted yet, and turn messy qualitative data into a falsifiable ICP card. Not a persona with a stock photo. A decision tool.
Before starting
Confirm (ask or infer from context):
- What the product does today — one paragraph of current capability, not vision-only.
- Best-fit customers — 3–5 accounts that renewed, expanded, or had the shortest sales cycles (if any).
- Alternatives — what buyers use today (tools, manual process, competitors, status quo).
- Pricing motion — seat, usage, hybrid; rough ACV band if known.
- Sales motion — PLG, sales-led, hybrid; rough cycle length.
- Economic buyer — title and department signing today.
- When ICP was last updated — if unknown or more than 90 days for a fast-moving category, label outputs as hypothesis-heavy until refreshed.
Inputs
Required before proceeding:
- At least 5 independent signal sources (see accepted sources below)
- Indication of the product stage (pre-PMF / early growth / scaling)
If fewer than 5 signal sources are available: → LABEL OUTPUT AS HYPOTHESIS, NOT SYNTHESIS. Return:
"Fewer than 5 independent signal sources available ([N] provided). Output is a hypothesis card, not a synthesized ICP. Validate with additional customer interviews or data before using to drive strategy."
Contract
This skill guarantees:
- ICP output is grounded in evidence, not assumption — with minimum 5 sources enforced
- Output explicitly distinguishes hypothesis (few sources) from synthesis (evidence-backed)
- Competitive alternatives are named, not categorized
- ICP card can serve as direct input to
/positioning,/launch, and/growth-experimentwithout rework - PMF refresh cadence is explicitly declared so ICP does not go stale
Accepted signal sources (ranked by reliability)
| Source | What to extract |
|---|---|
| Customer interviews (win/loss, onboarding, churn) | Trigger event, alternatives considered, exact deciding language |
| Sales call recordings / CRM notes | Objections, evaluation criteria, who else is in the room |
| Support tickets | Jobs the product is being stretched to do; friction points; what customers expected vs got |
| Churn notes / exit surveys | What pain was NOT solved; which alternative won |
| Public reviews (G2, Reddit, HN, Slack communities) | Unfiltered language; context of use; comparison framing |
| Usage data + activation metrics | Which ICP segments actually activate vs churn fast |
ICP scoring model (quantitative layer)
When enrichment or CRM data is available, layer a numeric score alongside the qualitative ICP card. Use separate Fit and Intent dimensions — collapsing them hides whether an account is a structural fit that's not yet buying, or a poor fit that's actively searching.
Fit Score (0–100):
Fit Score = (Firmographic * 0.40) + (Technographic * 0.35) + (Behavioral * 0.25)
| Component | Weight | Scoring criteria |
|---|---|---|
| Firmographic | 40% | Industry vertical (25 pts), employee count range (25 pts), revenue range (25 pts), geography (15 pts), funding stage (10 pts) |
| Technographic | 35% | Complementary tooling (30 pts), API / integration infrastructure (25 pts), cloud-native stack (25 pts), data maturity (20 pts) |
| Behavioral | 25% | Historical deal velocity (30 pts), expansion rate (30 pts), retention rate (25 pts), NPS / satisfaction (15 pts) |
Intent Score (0–100):
Intent Score = (Third-party intent * 0.35) + (First-party signals * 0.40) + (Trigger events * 0.25)
| Component | Weight | Scoring criteria |
|---|---|---|
| Third-party intent | 35% | Intent data topic surges (30 pts), review site category research (30 pts), competitor page visits (20 pts), review site activity (20 pts) |
| First-party signals | 40% | Pricing/demo page visits (30 pts), content downloads (20 pts), email engagement (25 pts), product signup/trial (25 pts) |
| Trigger events | 25% | New funding (30 pts), key hire in target dept (25 pts), tech stack change (25 pts), competitor churn signal (20 pts) |
ICP prioritization matrix:
High Intent
│
NURTURE │ ACTIVATE
(Good fit, │ (Good fit,
not buying yet) │ actively buying)
│
─────────────────────────────────────────────
│
DEPRIORITIZE │ EDUCATE
(Poor fit, │ (Poor fit,
not buying) │ but looking)
│
Low Intent
X-axis = Intent Score │ Y-axis = Fit Score
Threshold: >60 = High │ Activate = highest-value ICP prospect pool
Example tools (2025–2026, not exhaustive): firmographic enrichment — Apollo, ZoomInfo, or equivalent; technographic signals — BuiltWith, HG Insights, or equivalent; third-party intent — Bombora, G2 Buyer Intent, or equivalent. Substitute tools appropriate to your stack and budget.
PMF perishability check
For AI-category, fast-moving, or newly competitive markets — flag if ICP refresh is overdue:
IF last_icp_update > 90 days AND (AI_product OR competitive_landscape_shifted):
→ WARN. Return:
"ICP may be stale. In fast-moving categories, PMF is perishable —
a positioning that won deals 4 months ago may not win deals today.
Recommend: run win/loss check on last 5–10 deals before finalizing.
Check: has the economic buyer title shifted? Has the competitor set changed?
Has the primary trigger event changed?"
IF Sean_Ellis_score = unknown:
→ NOTE. Return:
"Sean Ellis score not established. Recommend one-question survey to active users:
'How would you feel if you could no longer use [product]?'
40%+ 'very disappointed' = PMF signal. Below 40% = re-examine ICP assumptions."
Refresh cadence by product type:
| Product type | Recommended ICP refresh |
|---|---|
| AI-native products | Every 90 days — model capabilities and buyer expectations shift quarterly |
| Fast-growing SaaS | Every 6 months or after major competitive entry |
| Stable infra / developer tools | Annually, or after major product change |
| Hardware GTM | After each product generation; after major channel or regulatory change |
Decision logic
Step 1 — Five-layer extraction
For each signal source, extract evidence for all five layers:
Layer A — Job-to-be-done (JTBD)
Format: "When [situation], I want to [motivation], so I can [outcome]."
What it reveals: the underlying progress the customer is trying to make — not the feature they requested.
Example (good): "When our database hits a traffic spike during a sale event, I want the system to scale automatically, so I can avoid the 2 AM incident that cost us $40K last quarter." Example (bad): "They needed better database performance." (This is a description, not a JTBD.)
Layer B — Trigger event
What specific event or change caused them to start looking for a solution now?
What it reveals: urgency, budget authority, and the specific circumstance that made the problem actionable.
Example (good): "We hit a production incident on Black Friday that cost $40K. The incident report went to the CTO. That's when budget was unlocked." Example (bad): "We needed better performance." (No trigger — no urgency signal.)
Layer C — Alternatives considered
What were they doing before? What else did they evaluate?
What it reveals: the true competitive set (often not what the internal team assumes) and the switching cost.
Record the actual alternatives, not assumed competitors. Common real alternatives include: "Excel + manual process", "[existing tool] + custom scripts", "hiring someone to do it manually", "doing nothing and accepting the cost/risk."
Layer D — Deciding language
The exact phrases customers use to describe their pain and the solution. NOT paraphrases. NOT cleaned-up marketing language. The actual words.
Method: pull quotes directly from interviews, reviews, tickets. Do not rewrite them.
These words go directly into:
- Headline copy and A/B test variants
- HN post titles and Reddit thread starters
- Email subject lines
- Landing page above-the-fold
Layer E — Developer emotional outcome
Beyond the rational job-to-be-done, capture the emotional state the developer or practitioner is trying to reach. This is not a marketing flourish — it is the closing proof point that resonates after the rational argument has already been won.
Format: "After adopting [product], they should feel ___."
Common patterns:
- "ship faster without worrying about breaking things" (reliability anxiety → relief)
- "finally stopped maintaining two systems" (complexity debt → operational calm)
- "no more 2 AM pages about [specific operational failure]" (operational fragility → sleep)
- "production-grade in minutes, not weeks" (legitimacy + speed for builders)
- "experiment without fear" (safety to iterate quickly on architecture or process)
This field feeds directly into headline copy, developer-facing hook writing, and ICP-specific content tone. When a practitioner says "I can finally sleep through the weekend," that is deciding language that resonates beyond the feature comparison.
Step 2 — Segment and prioritize
After extracting the five layers across all signal sources, group customers by tightness of fit:
| Segment | Criteria |
|---|---|
| Core ICP | Trigger is strong and recent; alternatives are clearly inadequate; deciding language matches product's actual strength; activated and retained |
| Adjacent ICP | Fits 2 of 3 dimensions; requires more education or can work around a feature gap |
| Out of ICP | Churned fast, or bought for a use case the product doesn't serve well; expensive to acquire and retain |
For each segment, estimate:
- Size (rough order of magnitude)
- Motion fit (PLG / SLG / MLG / Community-led)
- Channel implication (2-3 specific surfaces where they can be reached)
Step 3 — Operational filters (Layer F)
Activate when: the ICP card will feed any outreach motion, paid acquisition, ABM program, or enrichment-based segmentation. Skip if this output is positioning-only.
Layer F converts qualitative ICP attributes into specific, search-ready parameters. The test: every field must be expressible as a value you can enter directly into a CRM segment, enrichment query, or channel targeting interface — not a description.
Inclusion filter table:
| Dimension | Value(s) | Source in this skill |
|---|---|---|
| Job titles | 2–5 exact title strings | Deciding language (Layer D) + CRM win data |
| Seniority | e.g., Director, VP, Head of | Economic buyer declared in "Before starting" |
| Company headcount | e.g., 50–500 employees | Firmographic component of Fit Score |
| Industry / vertical | 2–4 specific vertical or sector tags | Core ICP segment; avoid broad category codes |
| Geography | Country / metro if constrained | Closed-deal history |
| Technographic signals | Specific tools or stack markers | Technographic component of Fit Score |
| Trigger signals | Funding event, new hire in target dept, stack change | Intent Score trigger events |
Exclusion filter table (required — prevents out-of-ICP acquisition):
| Dimension | Exclude | Why |
|---|---|---|
| Titles to exclude | Exact strings with no budget authority | Pattern from churn notes or Out-of-ICP segment |
| Industries to exclude | Verticals with no win history | Derived from churned account analysis |
| Company types | e.g., agencies, consultancies, non-profits | Model or pricing fit mismatch |
| Size extremes | Headcount ranges where economics don't work | ACV vs. deal cost |
| Specific entities | Existing customers, competitors, current pipeline | Already in system or not appropriate |
Filter sharpening rules:
IF any filter value is a description rather than a specific string or range →
BLOCK. Return:
"Filter '[X]' is too vague to use as a search parameter.
Rephrase as: exact title string / headcount range / named industry tag / geography."
IF total inclusion tag count > 12 →
WARN. Return:
"Filter set is broad and may produce noisy results.
Target: ≤5 title strings + ≤4 industry tags + 1 headcount range.
Use exclusions to narrow — not additional inclusion tags."
IF exclusion table is empty or skipped →
WARN. Return:
"No exclusion filters defined. Without exclusions, out-of-ICP accounts
enter the acquisition pipeline (see Out of ICP segment from Step 2).
Define at least 2 exclusion dimensions before routing to outreach."
Operational test: Ask — could this filter set be entered directly into your CRM, LinkedIn Campaign Manager, enrichment tool, or similar without further interpretation? If any field requires a human to translate it into a query value, it needs sharpening.
Agent-agnostic tools: Use whatever enrichment or CRM access is available to validate filter precision. No specific vendor required.
Brain reads
If a companion aether-growth-brain repo is connected:
- Before starting: read
knowledge/icp-map.md— load prior ICP definition, historical ICP fits, and previous win/loss notes - Read
knowledge/competitor-map.md— named alternatives from prior research - Read
experiments/experiment-log.md— check if prior growth experiments revealed ICP signals (which cohorts retained; which segments converted fastest)
Brain write: On completion, update knowledge/icp-map.md with:
- Core ICP definition (updated or confirmed)
- Secondary ICP definition (if new)
- 3 competitive alternatives (latest)
last_updateddate and data sources used
Brain not connected: proceed with available signals; note in output that ICP card is not persisted.
Output format
One ICP card per segment. Compact. Falsifiable.
## ICP Card — [Segment name]
Trigger: [The specific event that causes them to start searching now]
Job-to-be-done: [One sentence in the customer's own voice —
"When X, I want to Y, so I can Z"]
Alternatives they considered:
- [Real alternative 1]
- [Real alternative 2]
- [Real alternative 3 if present]
Deciding language:
- "[Exact phrase 1 from customer quotes]"
- "[Exact phrase 2 from customer quotes]"
- "[Exact phrase 3 from customer quotes]"
Developer emotional outcome: [The feeling/state they want to reach —
"ship without fear of X", "finally stop doing Y", "no more 2 AM pages about Z"]
Motion fit: [PLG / SLG / MLG / Community-led]
Channels most likely to reach them:
- [Surface 1]
- [Surface 2]
Red flags (signals this is NOT this segment):
- [Disqualifying signal 1]
- [Disqualifying signal 2]
Evidence base: [N interviews, N reviews, N support tickets, N sales calls]
Status: [Synthesized ICP (5+ sources) / Hypothesis (fewer than 5 sources)]
## Layer F: Operational filters *(activate if this ICP feeds outreach, paid, or ABM)*
Include:
Titles: [2–5 exact strings]
Seniority: [levels]
Headcount: [range, e.g. 50–500]
Industries: [2–4 specific tags]
Geography: [if constrained]
Tech signals: [specific tools or stack markers]
Trigger signals: [event types]
Exclude:
Titles: [exact strings with no budget authority]
Industries: [tags with no win history]
Company types: [descriptors]
Size extremes: [ranges that economics don't support]
Specific entities: [existing customers, competitors, partners]
What an ICP card is NOT
- Not a persona (no demographics, no stock photo, no age range)
- Not a wishful description of who you want to sell to
- Not stable: update the ICP card when:
- Churn patterns shift
- A new segment emerges from usage data
- After every 10+ new customer interviews
- When a strategic pivot changes the product's strongest use case
Cross-workflow outputs
The ICP card feeds directly into:
| Downstream workflow | How the ICP card is used |
|---|---|
/positioning | Alternatives considered → competitive alternative; deciding language → messaging copy |
/launch | Motion fit → channel selection; ICP segment → audience targeting |
/growth-experiment | Core ICP segment → audience targeting in hypotheses |
/funnel-audit | If Core ICP is churning, the bottleneck may be a fit-gap upstream |
pmm/DOMAIN.md | Deciding language → headline copy and hook variants |
Example usage
Startup context: B2B developer tool (any category — infrastructure, data, API, security, etc.). Pre-Series A. Team has 8 customer interviews, 23 review site entries, 45 support tickets, and churn notes from 12 lost accounts.
Invocation: /icp-research
Expected output: 2-3 ICP cards (Core ICP + 1 Adjacent), each with trigger event, JTBD in customer voice, actual alternatives they considered (e.g. manual workaround, an open-source alternative, or hiring a specialist), and exact phrases from reviews that the team can use directly in headlines.
Anti-patterns
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| "Our ICP is mid-market B2B SaaS" | Category descriptor, not a segment — cannot derive messaging or channel from this | Add trigger event, pain signal, and current alternative |
| Defining ICP from wishful thinking ("Fortune 500s") | Targets companies you want, not companies with evidence of fit | Run win/loss analysis on last 10 closed deals first |
| Single ICP defined from one customer | N=1 creates bias toward that customer's context, not the pattern | Minimum 5 data sources (interviews + deals + usage) |
| Not naming the competitive alternative | Forces generic positioning; downstream messaging will be indistinguishable from competitors | Block and return: require named alternative from Layer C |
| ICP unchanged for 12+ months in AI category | PMF is perishable; buyer expectations shift with model capability improvement | Run PMF perishability check; refresh quarterly |
| Mixing Fit score with Intent score | High-fit / low-intent accounts need different tactics than low-fit / high-intent | Keep Fit and Intent separate; use the 2x2 matrix to route accounts |
| Conflating ICP with buyer persona | ICP is who to target (company + context); persona is how they buy and decide | Produce both; do not use one in place of the other |
| ICP attributes that cannot become search filters (e.g., "innovative teams", "tech-forward companies") | Vague descriptors produce noisy acquisition lists; operators cannot execute | Apply Layer F filter-sharpening rules: convert every dimension to an exact title string, headcount range, or named industry tag before handing off to any outreach or paid motion |
Related skills
| Skill | When to use |
|---|---|
pmm/positioning/SKILL.md | After ICP card is complete: build the positioning artifact |
growth/funnel-audit/SKILL.md | If bottleneck type is "fit gap" — ICP may be wrong |
growth/retention-analysis/SKILL.md | If cohort diagonal is declining — check ICP drift |
pmm/positioning-review/SKILL.md | After positioning is drafted; positioning-review checks ICP definition quality |
Benchmarks (2025–2026)
| Benchmark | Value | Source |
|---|---|---|
| Win rate for well-defined ICP (sales-led B2B SaaS) | 25–40% | Gartner 2025, Winning by Design 2025 |
| Win rate without ICP rigor | 10–15% | Gartner 2025 |
| Churn rate for "fit churn" cohorts (wrong ICP) | 3–5× higher than ICP-fit cohorts | Reforge 2025 |
| Time to get first 5 ICP interviews (warm network) | 2–3 weeks | agent-gtm-skills benchmark |
| ICP interviews needed for pattern confidence | 10–15 minimum; 20+ for AI products | April Dunford 2024 |
| Data decay rate for B2B contact data | 2.1% per month (25% annually) | B2B data enrichment research, 2025 |
| ICP refresh frequency for AI-native products | Every 90 days | agent-gtm-skills recommendation |
Validation criteria
- At least 5 independent signal sources cited, or output labeled as hypothesis
- Each layer (JTBD, trigger, alternatives, deciding language, developer emotional outcome) filled for Core ICP
- Deciding language contains actual customer quotes, not paraphrases
- Developer emotional outcome captures the post-adoption feeling, not a feature benefit
- Competitive alternatives are real ones customers named, not assumed industry competitors
- Motion fit is specified per segment
- Evidence base count is included
- If output feeds outreach / paid / ABM: Layer F filter tables present, at least 2 exclusion dimensions defined, and no filter value is a description rather than a specific string or range
References & Sources
Tier 1 (authoritative frameworks):
- Jobs-to-be-Done (Clayton Christensen): JTBD format for Layer A extraction; "When/want/so I can" structure
Tier 2 (operator templates — adapted, not authoritative):
- icp-research-synthesis (growth-skills v1.0, score 9/10): four-layer extraction method, segment classification, ICP card format
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.