marketing-icp-research
Owns "who exactly buys, what they call the problem, where they hang out, who else they listen to". Foundation for copy + channel + SEO.
Triggers
- Brief contains "ICP", "target audience", "buyer persona", "customer research", "audience".
- Or invoked by
marketing-orchestrator / marketing-campaign-planner early in a campaign.
- Or no ICP doc exists for the brand under
marketing-studio/.research/icp/{slug}-{date}.md, or the latest is >180 days old.
Inputs
brand slug
feature (optional) — if researching for a specific feature's adopter segment
seed (optional) — known customers / quotes / interview transcripts
competitorReviews (optional) — G2 / Capterra review URLs to mine for vocabulary
documents (optional) — list of local PDF / DOCX / TXT paths (customer
interview transcripts, market reports, regulatory docs). When supplied,
call app.server.pi_ceo_docparser.parse_document(path) to extract
text + metadata before LLM analysis. The parser is deterministic and
preserves page boundaries (doc.pages) so the LLM can cite
"p. 3 of interview-2026-05-06.pdf" when surfacing pain quotes.
See skills/pi-ceo-docparser/SKILL.md for the contract. Skip + log
when doc.error is populated; never let a missing PDF dep break the
research workflow.
Method
- Seed from BrandConfig.
audience.primary and audience.secondary are the starting hypothesis; this skill validates and deepens them.
- Firmographic / demographic block:
- B2B: industry, company size (employees, revenue), funding stage, tech stack, geography.
- B2C: age, income, life-stage, geography, behaviour cohort.
- Role block (B2B only):
- Decision maker (signs the cheque) vs. champion (drives the project) vs. user (touches the tool) vs. blocker (legal / security / procurement).
- Each role: title variants, seniority, KPIs they're measured on.
- Pain hierarchy — list 5-10 pains, then RANK by:
- Frequency (daily / weekly / monthly / annual)
- Severity (cost of not solving, in money or time)
- Awareness (does the customer already articulate this pain or only realise it after?)
- Trigger events — concrete moments that move someone from "aware of pain" to "actively shopping". E.g. for Synthex: "model accuracy regression in prod", "auditor flags PII in training set", "new compliance regime announced".
- Vocabulary mining — exact phrases the customer uses, not the seller's terms. Pull from review sites, Reddit, Slack communities, sales-call transcripts. Tag each with frequency.
- Watering holes — places this ICP gathers, in priority order. Newsletters, podcasts, conferences, Slack/Discord communities, sub-Reddits, LinkedIn creators they follow.
- Buying process — step-by-step from trigger to signed contract. Average length, gates, common objections, deal-breakers.
- Anti-ICP — who LOOKS like a fit but is wrong. Saves wasted ad spend.
Output
marketing-studio/.research/icp/{slug}-{YYYY-MM-DD}.md (template at marketing-studio/frameworks/icp-canvas.md):
# ICP — {brand}{ - feature?}
Date: 2026-04-28
## Firmographics / demographics
…
## Roles
- Decision maker: …
- Champion: …
- User: …
- Blocker: …
## Pain hierarchy
1. {pain} — frequency / severity / awareness
2. …
## Trigger events
- …
## Vocabulary (exact phrases)
| Phrase | Frequency | Source |
| --- | --- | --- |
| "model drift in prod" | high | r/MachineLearning, G2 reviews |
| … | … | … |
## Watering holes
1. {newsletter / podcast / community} — why
2. …
## Buying process
1. Trigger → …
2. Awareness → …
3. Evaluation → …
4. Decision → …
5. Procurement → …
## Anti-ICP
- {segment} — looks similar but {why wrong}
Plus structured JSON sibling.
Boundaries
- Never invent customer quotes. If sources are thin, label fields "needs primary research" and propose 5 customer interviews.
- Never use
BrandConfig.audience as the final answer — it's the seed, this skill is the validation.
- Never mix B2B and B2C frameworks in the same doc.
- Never publish an ICP without an Anti-ICP section.
Hands off to
marketing-copywriter (uses vocabulary + pains for hooks and headlines)
marketing-channel-strategist (uses watering holes for channel selection)
marketing-seo-researcher (uses vocabulary as keyword seed)
marketing-positioning (refines value prop with the validated pain hierarchy)
Per-project keys
PERPLEXITY_API_KEY — review-site scraping, community mining. Missing → produces seed-only doc with explicit "fill via interviews" placeholders.
OPENAI_API_KEY / ANTHROPIC_API_KEY — vocabulary clustering, pain ranking. Missing → returns raw extracts.
1---2name: marketing-icp-research3description: Builds an Ideal Customer Profile (ICP) — firmographics, role, pains, triggers, vocabulary, watering holes, decision process — for a brand or feature. Use when a brief asks for "ICP", "target audience", "buyer persona", "customer research", "user research", or before any campaign / copy / channel work. Reads BrandConfig.audience as the seed; outputs structured ICP consumed by copywriter, channel-strategist, seo-researcher.4---56# marketing-icp-research78Owns "who exactly buys, what they call the problem, where they hang out, who else they listen to". Foundation for copy + channel + SEO.910## Triggers1112- Brief contains "ICP", "target audience", "buyer persona", "customer research", "audience".13- Or invoked by `marketing-orchestrator` / `marketing-campaign-planner` early in a campaign.14- Or no ICP doc exists for the brand under `marketing-studio/.research/icp/{slug}-{date}.md`, or the latest is >180 days old.1516## Inputs1718- `brand` slug19- `feature` (optional) — if researching for a specific feature's adopter segment20- `seed` (optional) — known customers / quotes / interview transcripts21- `competitorReviews` (optional) — G2 / Capterra review URLs to mine for vocabulary22- `documents` (optional) — list of local PDF / DOCX / TXT paths (customer23 interview transcripts, market reports, regulatory docs). When supplied,24 call `app.server.pi_ceo_docparser.parse_document(path)` to extract25 text + metadata before LLM analysis. The parser is deterministic and26 preserves page boundaries (`doc.pages`) so the LLM can cite27 `"p. 3 of interview-2026-05-06.pdf"` when surfacing pain quotes.28 See `skills/pi-ceo-docparser/SKILL.md` for the contract. Skip + log29 when `doc.error` is populated; never let a missing PDF dep break the30 research workflow.3132## Method33341. **Seed from BrandConfig**. `audience.primary` and `audience.secondary` are the starting hypothesis; this skill validates and deepens them.352. **Firmographic / demographic block**:36 - B2B: industry, company size (employees, revenue), funding stage, tech stack, geography.37 - B2C: age, income, life-stage, geography, behaviour cohort.383. **Role block** (B2B only):39 - Decision maker (signs the cheque) vs. champion (drives the project) vs. user (touches the tool) vs. blocker (legal / security / procurement).40 - Each role: title variants, seniority, KPIs they're measured on.414. **Pain hierarchy** — list 5-10 pains, then RANK by:42 - Frequency (daily / weekly / monthly / annual)43 - Severity (cost of not solving, in money or time)44 - Awareness (does the customer already articulate this pain or only realise it after?)455. **Trigger events** — concrete moments that move someone from "aware of pain" to "actively shopping". E.g. for Synthex: "model accuracy regression in prod", "auditor flags PII in training set", "new compliance regime announced".466. **Vocabulary mining** — exact phrases the customer uses, not the seller's terms. Pull from review sites, Reddit, Slack communities, sales-call transcripts. Tag each with frequency.477. **Watering holes** — places this ICP gathers, in priority order. Newsletters, podcasts, conferences, Slack/Discord communities, sub-Reddits, LinkedIn creators they follow.488. **Buying process** — step-by-step from trigger to signed contract. Average length, gates, common objections, deal-breakers.499. **Anti-ICP** — who LOOKS like a fit but is wrong. Saves wasted ad spend.5051## Output5253`marketing-studio/.research/icp/{slug}-{YYYY-MM-DD}.md` (template at `marketing-studio/frameworks/icp-canvas.md`):5455```markdown56# ICP — {brand}{ - feature?}57Date: 2026-04-285859## Firmographics / demographics60…6162## Roles63- Decision maker: …64- Champion: …65- User: …66- Blocker: …6768## Pain hierarchy691. {pain} — frequency / severity / awareness702. …7172## Trigger events73- …7475## Vocabulary (exact phrases)76| Phrase | Frequency | Source |77| --- | --- | --- |78| "model drift in prod" | high | r/MachineLearning, G2 reviews |79| … | … | … |8081## Watering holes821. {newsletter / podcast / community} — why832. …8485## Buying process861. Trigger → …872. Awareness → …883. Evaluation → …894. Decision → …905. Procurement → …9192## Anti-ICP93- {segment} — looks similar but {why wrong}94```9596Plus structured JSON sibling.9798## Boundaries99100- Never invent customer quotes. If sources are thin, label fields "needs primary research" and propose 5 customer interviews.101- Never use `BrandConfig.audience` as the final answer — it's the seed, this skill is the validation.102- Never mix B2B and B2C frameworks in the same doc.103- Never publish an ICP without an Anti-ICP section.104105## Hands off to106107- `marketing-copywriter` (uses vocabulary + pains for hooks and headlines)108- `marketing-channel-strategist` (uses watering holes for channel selection)109- `marketing-seo-researcher` (uses vocabulary as keyword seed)110- `marketing-positioning` (refines value prop with the validated pain hierarchy)111112## Per-project keys113114- `PERPLEXITY_API_KEY` — review-site scraping, community mining. Missing → produces seed-only doc with explicit "fill via interviews" placeholders.115- `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` — vocabulary clustering, pain ranking. Missing → returns raw extracts.