一键导入
pain-alternatives-landscape
Alternatives landscape mapping — how customers currently solve the problem, competitor positioning, switching patterns
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Alternatives landscape mapping — how customers currently solve the problem, competitor positioning, switching patterns
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use this skill to setup your knowledge base, improve your setup, edit /support/summary, change tone of voice, setup daily reporting, setup human escalation.
Guide the user through creating a sales pipeline — name, stages with probabilities, deal creation rules, and deal movement automations.
Guide the user through setting up a stall deal recovery policy — timing thresholds, per-stage actions, and an automated schedule. Use when the user asks about inactive deals, follow-up automation, or stale leads.
Execute a stall deal check — query stalled deals, send follow-ups per stage policy, archive long-inactive deals as Lost.
Guide the user through setting up a welcome email template and automation for new contacts.
Read scenario scores and trajectories in scenario-dumps/, diagnose patterns across models, understand root causes, propose and apply changes to skill/prompt files.
| name | pain-alternatives-landscape |
| description | Alternatives landscape mapping — how customers currently solve the problem, competitor positioning, switching patterns |
You map the landscape of alternatives customers use or consider when solving the problem your product addresses. Output is a structured, tiered alternative map that feeds positioning and offer design in the strategist. Four alternative tiers must always be covered — the direct-competitor-only lens is the primary failure mode of this skill.
Core mode: alternatives ≠ direct competitors. The strongest "competitor" in most pre-PMF markets is non-consumption — buyers tolerating the pain without adopting any solution. Map all tiers, including doing nothing, spreadsheets, internal tools, adjacent SaaS products, and hiring a person manually. A landscape that only contains named SaaS competitors is incomplete.
1. Define the problem statement from the buyer's perspective Before sourcing alternatives, write one sentence: "The job I'm mapping alternatives for is [verb] [outcome] [context]." This must be a buyer-perspective job statement, not a product description. The job statement determines what counts as a relevant alternative and prevents tier-1 tunnel vision.
2. Four-tier framework
Tier 1 — Direct competitors: Same G2 category, head-to-head. Most visible; risk is over-indexing here. Document: job owned, switch-to triggers, switch-away triggers (from 1-2 star reviews of the competitor).
Tier 2 — Adjacent substitutes: Different category, same underlying job by a different mechanism. Example: project management tool used as a lightweight CRM. Surface through interviews and Reddit research — rarely appears in G2 category search. Document: which job they own, why buyers choose this path, what would cause them to switch to a dedicated solution.
Tier 3 — DIY alternatives: Spreadsheets, internal builds, manual processes, hired person to do it. No G2 profile. Research sources: interviews, plus search volume for "[problem description] excel template" or "[problem] notion template" as a DIY prevalence proxy. Require at least one Tier 3 entry in every artifact.
Tier 4 — Non-consumption: Buyer is aware of the problem but has not acted on it. They tolerate the pain, deprioritize it, or don't believe a solution exists. The most important tier for pre-PMF markets and the least visible in secondary research. Signal: search volume gap between problem-description queries and solution-category queries. Require at least one Tier 4 entry in every artifact.
3. Alternative identification sources (in signal-quality order)
Interviews (highest signal): Ask "what do you currently use to handle [job]?" and "what did you try before settling on this?" Direct alternatives confirmed by at least one interview = high confidence.
G2 alternatives page (programmatic):
g2(op="call", args={"method_id": "g2.products.alternatives.v1", "filter[product_id]": "product_id"})
Rate limit: 100 req/sec; blocked 60s if exceeded. Max page size: 100. If access fails, use G2 scraper as fallback. G2 alternatives are buyer-curated — more reliable than algorithmic similarity for tier-1 identification.
Reddit (highest signal for switching stories): Use these patterns in order:
"switched from [product] to" — explicit migration story (highest signal)"alternative to [product name]" — active evaluation signal"[product] vs [competitor]" — comparison intent"cheaper than [product]" — price-driven switch signalTarget subreddits: r/SaaS, r/startups, r/Entrepreneur, plus function-specific ones (r/analytics, r/sales, r/marketing). Sort by recency.
Similarweb similar sites:
similarweb(op="call", args={"method_id": "similarweb.similar_sites.get.v1", "domain": "competitor.com"})
Returns up to 40 similar domains with similarity scores. Desktop-only data. Use to surface tier-2 adjacents not in G2 category. Classify returned domains into four tiers before adding to artifact.
ProductHunt alternatives pages:
producthunt(op="call", args={"method_id": "producthunt.graphql.posts.alternatives.v1", "slug": "product-slug"})
Note: verify this method ID against live API before use — not confirmed in current ProductHunt API v2 documentation.
4. Pattern extraction from reviews When mining G2, Capterra, or Trustpilot reviews, extract:
"I switched from X because..." → named alternative + switch trigger. High-confidence signal."I also tried X but..." → alternative considered in same purchase cycle. Medium-confidence."I use X alongside because..." → complementary tool pointing to a capability gap."I wish it did X like [competitor]" → feature gap vs. specific alternative.Count named products across all occurrences. Frequency = reliability signal. Alternatives named by many reviewers independently = tier-1 or strong tier-2. Named once = noise unless confirmed by interview data.
5. Competitive positioning per alternative For each identified alternative: what do they claim to do better (pricing page, hero messaging, G2 profile)? What do their reviewers complain about? Who are their top customers (case studies)? How are they growing (Similarweb trends)?
What it looks like: Alternatives map contains only named SaaS products in the same G2 category. Tier 3 (DIY) and Tier 4 (non-consumption) are absent. Detection signal: Every row in the artifact has a product name, G2 profile, and pricing page. No row says "spreadsheet" or "tolerate the pain." Consequence: Positioning calibrated against products, not against the actual incumbent — the status quo. Urgency messaging misses the buyer not yet considering any SaaS alternative. Mitigation: Require at least one Tier 3 and one Tier 4 entry before marking output complete.
What it looks like: Landscape was researched at founding or product launch and has not been updated.
Detection signal: research_date in artifact is more than 6 months old in a fast-moving category.
Consequence: New entrants, incumbent repositioning, and pricing changes are invisible. Positioning decisions made against a stale map.
Mitigation: Set review_by no more than 6 months from research_date. Flag if artifact is being used as a decision input more than 3 months after research_date.
What it looks like: Each alternative is described by feature set and pricing tier. No entry includes why buyers initially chose it or what would cause them to leave.
Detection signal: Artifact answers "what does each alternative do" but not "when and why do buyers hire it."
Consequence: Positioning built on this artifact will be feature-comparison positioning — competing on the incumbent's terms rather than creating a distinct category.
Mitigation: Require job_owned and switch_away_triggers for every alternative entry. If unavailable from secondary research, mark as requires_interview_validation.
write_artifact(path="/pain/alternatives-landscape", data={...})
g2(op="call", args={"method_id": "g2.products.alternatives.v1", "filter[product_id]": "product_id"})
producthunt(op="call", args={"method_id": "producthunt.graphql.posts.alternatives.v1", "slug": "product-slug"})
reddit(op="call", args={"method_id": "reddit.search.posts.v1", "q": "switched from [product] OR alternative to [product] OR [product] vs", "sort": "relevance", "t": "year"})
similarweb(op="call", args={"method_id": "similarweb.similar_sites.get.v1", "domain": "competitor.com"})
trustpilot(op="call", args={"method_id": "trustpilot.reviews.list.v1", "businessUnitId": "unit_id", "stars": [1, 2], "language": "en"})
{
"alternatives_landscape": {
"type": "object",
"description": "Full map of alternatives customers use or consider for the problem addressed by this product.",
"required": ["research_date", "review_by", "problem_statement", "alternatives", "non_consumption"],
"additionalProperties": false,
"properties": {
"research_date": {"type": "string", "format": "date", "description": "Date this research was conducted (YYYY-MM-DD). Used to flag staleness."},
"review_by": {"type": "string", "format": "date", "description": "Date by which research must be re-validated. Max 6 months from research_date in fast-moving categories."},
"problem_statement": {"type": "string", "description": "The specific job this landscape maps alternatives for. Written from buyer's perspective: 'help me [verb] [outcome] [context]'."},
"alternatives": {
"type": "array",
"description": "Named alternatives evaluated or used by buyers. Excludes non-consumption (see separate field). Must include at least one Tier 3 (DIY) entry.",
"items": {
"type": "object",
"required": ["name", "tier", "job_owned", "switch_to_triggers", "switch_away_triggers", "evidence_sources", "confidence"],
"additionalProperties": false,
"properties": {
"name": {"type": "string", "description": "Product or approach name. For DIY: 'Excel + manual tracking', 'Internal build', etc."},
"tier": {"type": "string", "enum": ["direct", "adjacent", "diy"], "description": "direct = same category head-to-head; adjacent = different category same job; diy = spreadsheet/manual/internal build."},
"job_owned": {"type": "string", "description": "The outcome buyers hire this alternative to deliver. Job statement format: 'help me [verb] [outcome] [context]'."},
"switch_to_triggers": {"type": "array", "items": {"type": "string"}, "description": "Events or conditions that cause buyers to choose this alternative."},
"switch_away_triggers": {"type": "array", "items": {"type": "string"}, "description": "Events or conditions that cause buyers to leave. Source: 1-2 star reviews of this alternative and win/loss interviews."},
"evidence_sources": {
"type": "array",
"items": {"type": "string", "enum": ["win_loss_interview", "customer_interview", "g2_reviews", "capterra_reviews", "reddit", "producthunt", "similarweb", "other"]},
"description": "Sources that produced evidence for this alternative."
},
"confidence": {"type": "string", "enum": ["high", "medium", "low"], "description": "High: confirmed by direct interview. Medium: multiple secondary sources. Low: single secondary source or inference."}
}
}
},
"non_consumption": {
"type": "object",
"description": "Buyers who tolerate the problem without adopting any solution. Must be present in every artifact — even if evidence is sparse.",
"required": ["prevalence_signal", "tolerance_duration", "evidence_source"],
"additionalProperties": false,
"properties": {
"prevalence_signal": {"type": "string", "description": "How non-consumption was detected: interview data, search volume gap, estimated market size vs active buyers, or proxy indicators."},
"tolerance_duration": {"type": "string", "description": "Typical time buyers have tolerated the problem before evaluating solutions. Source from interviews."},
"switch_trigger": {"type": "string", "description": "Event or threshold that causes non-consumers to enter the market. Often a headcount threshold, compliance requirement, or pain accumulation event."},
"evidence_source": {"type": "string", "description": "Where evidence for non-consumption was found. Note if only proxy signals available."}
}
}
}
}
}