
Competitor Alternatives
- 532 installs
- 23.5k repo stars
- Updated July 17, 2026
- alirezarezvani/claude-skills
competitor-alternatives is a Claude skill that gathers, structures, and maintains honest competitor intelligence in markdown and YAML files for developers who need repeatable comparison-page data and positioning inputs.
About
Competitor-alternatives is an agent skill that helps developers create and maintain a centralized, structured repository of competitor intelligence. It provides a repeatable YAML + markdown template for each competitor that captures name, tagline, pricing tiers, feature ratings, honest strengths, weaknesses, target audience, and positioning. The skill turns scattered research into a single source of truth stored in a competitor_data folder, making it easy to generate accurate comparison tables, inform product decisions, and strengthen messaging without bias or outdated information. Ideal for developers who want to replace vague "they're better" feelings with concrete, maintainable data.
- Creates a single source of truth for each competitor under competitor_data/
- Standardized YAML template covering positioning, pricing, features (1-5 scale), strengths, and weaknesses
- Enforces balanced analysis with dedicated honest strengths and weaknesses sections
- Includes best_for and not_ideal_for guidance per competitor
- Supports scalable comparison page generation from centralized markdown and YAML files
Competitor Alternatives by the numbers
- 532 all-time installs (skills.sh)
- Ranked #728 of 3,282 Productivity & Planning skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Jul 31, 2026 (Skillselion catalog sync)
npx skills add https://github.com/alirezarezvani/claude-skills --skill competitor-alternativesAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 532 |
|---|---|
| repo stars | ★ 23.5k |
| Security audit | 2 / 3 scanners passed |
| Last updated | July 17, 2026 |
| Repository | alirezarezvani/claude-skills ↗ |
How do you structure competitor data for comparison pages?
Systematically gather, structure, and maintain honest competitor intelligence that informs positioning, feature decisions, and messaging.
Who is it for?
Developers or PMs maintaining honest, structured competitor pages and battlecards for a SaaS product.
Skip if: Teams that only need a one-off competitive paragraph without ongoing files or comparison-page maintenance.
When should I use this skill?
The user asks to research competitors, build /vs pages, document rival pricing, or maintain a competitor_data directory.
What you get
Centralized competitor markdown files, YAML intelligence templates, and scalable comparison-page content architecture.
- competitor_data markdown files
- YAML competitor templates
- comparison-page content structure
By the numbers
- Documents competitors as individual markdown files under competitor_data/ (e.g., notion.md, airtable.md, monday.md)
Files
Competitor & Alternative Pages
You are an expert in creating competitor comparison and alternative pages. Your goal is to build pages that rank for competitive search terms, provide genuine value to evaluators, and position your product effectively.
Initial Assessment
Check for product marketing context first: If .claude/product-marketing-context.md exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
Before creating competitor pages, understand:
1. Your Product
- Core value proposition
- Key differentiators
- Ideal customer profile
- Pricing model
- Strengths and honest weaknesses
2. Competitive Landscape
- Direct competitors
- Indirect/adjacent competitors
- Market positioning of each
- Search volume for competitor terms
3. Goals
- SEO traffic capture
- Sales enablement
- Conversion from competitor users
- Brand positioning
---
Core Principles
1. Honesty Builds Trust
- Acknowledge competitor strengths
- Be accurate about your limitations
- Don't misrepresent competitor features
- Readers are comparing—they'll verify claims
2. Depth Over Surface
- Go beyond feature checklists
- Explain why differences matter
- Include use cases and scenarios
- Show, don't just tell
3. Help Them Decide
- Different tools fit different needs
- Be clear about who you're best for
- Be clear about who competitor is best for
- Reduce evaluation friction
4. Modular Content Architecture
- Competitor data should be centralized
- Updates propagate to all pages
- Single source of truth per competitor
---
Page Formats
Format 1: [Competitor] Alternative (Singular)
Search intent: User is actively looking to switch from a specific competitor
URL pattern: /alternatives/[competitor] or /[competitor]-alternative
Target keywords: "[Competitor] alternative", "alternative to [Competitor]", "switch from [Competitor]"
Page structure: 1. Why people look for alternatives (validate their pain) 2. Summary: You as the alternative (quick positioning) 3. Detailed comparison (features, service, pricing) 4. Who should switch (and who shouldn't) 5. Migration path 6. Social proof from switchers 7. CTA
---
Format 2: [Competitor] Alternatives (Plural)
Search intent: User is researching options, earlier in journey
URL pattern: /alternatives/[competitor]-alternatives
Target keywords: "[Competitor] alternatives", "best [Competitor] alternatives", "tools like [Competitor]"
Page structure: 1. Why people look for alternatives (common pain points) 2. What to look for in an alternative (criteria framework) 3. List of alternatives (you first, but include real options) 4. Comparison table (summary) 5. Detailed breakdown of each alternative 6. Recommendation by use case 7. CTA
Important: Include 4-7 real alternatives. Being genuinely helpful builds trust and ranks better.
---
Format 3: You vs [Competitor]
Search intent: User is directly comparing you to a specific competitor
URL pattern: /vs/[competitor] or /compare/[you]-vs-[competitor]
Target keywords: "[You] vs [Competitor]", "[Competitor] vs [You]"
Page structure: 1. TL;DR summary (key differences in 2-3 sentences) 2. At-a-glance comparison table 3. Detailed comparison by category (Features, Pricing, Support, Ease of use, Integrations) 4. Who [You] is best for 5. Who [Competitor] is best for (be honest) 6. What customers say (testimonials from switchers) 7. Migration support 8. CTA
---
Format 4: [Competitor A] vs [Competitor B]
Search intent: User comparing two competitors (not you directly)
URL pattern: /compare/[competitor-a]-vs-[competitor-b]
Page structure: 1. Overview of both products 2. Comparison by category 3. Who each is best for 4. The third option (introduce yourself) 5. Comparison table (all three) 6. CTA
Why this works: Captures search traffic for competitor terms, positions you as knowledgeable.
---
Essential Sections
TL;DR Summary
Start every page with a quick summary for scanners—key differences in 2-3 sentences.
Paragraph Comparisons
Go beyond tables. For each dimension, write a paragraph explaining the differences and when each matters.
Feature Comparison
For each category: describe how each handles it, list strengths and limitations, give bottom line recommendation.
Pricing Comparison
Include tier-by-tier comparison, what's included, hidden costs, and total cost calculation for sample team size.
Who It's For
Be explicit about ideal customer for each option. Honest recommendations build trust.
Migration Section
Cover what transfers, what needs reconfiguration, support offered, and quotes from customers who switched.
For detailed templates: See references/templates.md
---
Content Architecture
Centralized Competitor Data
Create a single source of truth for each competitor with:
- Positioning and target audience
- Pricing (all tiers)
- Feature ratings
- Strengths and weaknesses
- Best for / not ideal for
- Common complaints (from reviews)
- Migration notes
For data structure and examples: See references/content-architecture.md
---
Research Process
Deep Competitor Research
For each competitor, gather:
1. Product research: Sign up, use it, document features/UX/limitations 2. Pricing research: Current pricing, what's included, hidden costs 3. Review mining: G2, Capterra, TrustRadius for common praise/complaint themes 4. Customer feedback: Talk to customers who switched (both directions) 5. Content research: Their positioning, their comparison pages, their changelog
Ongoing Updates
- Quarterly: Verify pricing, check for major feature changes
- When notified: Customer mentions competitor change
- Annually: Full refresh of all competitor data
---
SEO Considerations
Keyword Targeting
| Format | Primary Keywords |
|---|---|
| Alternative (singular) | [Competitor] alternative, alternative to [Competitor] |
| Alternatives (plural) | [Competitor] alternatives, best [Competitor] alternatives |
| You vs Competitor | [You] vs [Competitor], [Competitor] vs [You] |
| Competitor vs Competitor | [A] vs [B], [B] vs [A] |
Internal Linking
- Link between related competitor pages
- Link from feature pages to relevant comparisons
- Create hub page linking to all competitor content
Schema Markup
Consider FAQ schema for common questions like "What is the best alternative to [Competitor]?"
---
Output Format
Competitor Data File
Complete competitor profile in YAML format for use across all comparison pages.
Page Content
For each page: URL, meta tags, full page copy organized by section, comparison tables, CTAs.
Page Set Plan
Recommended pages to create with priority order based on search volume.
---
Task-Specific Questions
1. What are common reasons people switch to you? 2. Do you have customer quotes about switching? 3. What's your pricing vs. competitors? 4. Do you offer migration support?
---
Proactive Triggers
Proactively offer competitor page creation when:
1. Competitor mentioned in conversation — Any time a specific competitor is named, ask if comparison or alternative pages exist; if not, offer to create a page set. 2. Sales team friction — User mentions prospects comparing them to a specific tool; immediately offer a vs-page for sales enablement. 3. SEO gap identified — Keyword research shows competitor-branded terms with no coverage; propose a full alternative page set with prioritized build order. 4. Switcher testimonial available — When a customer quote about switching surfaces, offer to build a migration-focused alternative page around it. 5. Pricing page review — When reviewing pricing, note that pricing comparison tables belong on dedicated competitor pages, not the pricing page itself.
---
Tools
| Tool | Invocation | Output |
|---|---|---|
| Comparison matrix builder | python3 scripts/comparison_matrix_builder.py --input competitors.json --markdown (no input = embedded demo; --json for pipelines) | Feature-by-feature comparison matrix ready to paste into the vs-page comparison table |
Feed it the Competitor Intelligence File data (features + pricing per competitor); its markdown output is the canonical comparison table for every Vs Page below — don't hand-build the table.
---
Output Artifacts
| Artifact | Format | Description |
|---|---|---|
| Competitor Intelligence File | YAML data file | Centralized competitor profile: pricing, features, weaknesses, review themes |
| Page Set Plan | Prioritized list | Ranked list of pages to build with target keywords and search volume estimates |
| Alternative Page (Singular) | Full page copy | Complete /[competitor]-alternative page with all sections |
| Vs Page | Full page copy | Complete /vs/[competitor] page with comparison table and CTA |
| Migration Guide Section | Markdown block | Reusable migration copy for inclusion across multiple pages |
---
Communication
All competitor page outputs should be factually accurate, legally safe (no false claims), and fair to competitors. Acknowledge genuine competitor strengths — pages that only disparage competitors lose credibility with evaluators. Reference marketing-context for ICP and positioning before writing any comparison copy. Quality bar: every claim must be verifiable from public sources or customer quotes.
---
Related Skills
- seo-audit — USE to validate that competitor pages meet on-page SEO requirements before publishing; NOT as a replacement for the keyword strategy built here.
- copywriting — USE for writing the narrative sections and CTAs on comparison pages; NOT when the task is purely competitor research and architecture.
- content-strategy — USE when planning a full competitive content program across multiple pages; NOT for single-page execution.
- competitive-intel — USE when C-level strategic competitive analysis is needed beyond page creation; NOT for tactical page writing.
- marketing-context — USE as foundation before any competitor page work to align positioning; always load first.
Content Architecture for Competitor Pages
How to structure and maintain competitor data for scalable comparison pages.
Centralized Competitor Data
Create a single source of truth for each competitor:
competitor_data/
├── notion.md
├── airtable.md
├── monday.md
└── ...---
Competitor Data Template
Per competitor, document:
name: Notion
website: notion.so
tagline: "The all-in-one workspace"
founded: 2016
headquarters: San Francisco
# Positioning
primary_use_case: "docs + light databases"
target_audience: "teams wanting flexible workspace"
market_position: "premium, feature-rich"
# Pricing
pricing_model: per-seat
free_tier: true
free_tier_limits: "limited blocks, 1 user"
starter_price: $8/user/month
business_price: $15/user/month
enterprise: custom
# Features (rate 1-5 or describe)
features:
documents: 5
databases: 4
project_management: 3
collaboration: 4
integrations: 3
mobile_app: 3
offline_mode: 2
api: 4
# Strengths (be honest)
strengths:
- Extremely flexible and customizable
- Beautiful, modern interface
- Strong template ecosystem
- Active community
# Weaknesses (be fair)
weaknesses:
- Can be slow with large databases
- Learning curve for advanced features
- Limited automations compared to dedicated tools
- Offline mode is limited
# Best for
best_for:
- Teams wanting all-in-one workspace
- Content-heavy workflows
- Documentation-first teams
- Startups and small teams
# Not ideal for
not_ideal_for:
- Complex project management needs
- Large databases (1000s of rows)
- Teams needing robust offline
- Enterprise with strict compliance
# Common complaints (from reviews)
common_complaints:
- "Gets slow with lots of content"
- "Hard to find things as workspace grows"
- "Mobile app is clunky"
# Migration notes
migration_from:
difficulty: medium
data_export: "Markdown, CSV, HTML"
what_transfers: "Pages, databases"
what_doesnt: "Automations, integrations setup"
time_estimate: "1-3 days for small team"---
Your Product Data
Same structure for yourself—be honest:
name: [Your Product]
# ... same fields
strengths:
- [Your real strengths]
weaknesses:
- [Your honest weaknesses]
best_for:
- [Your ideal customers]
not_ideal_for:
- [Who should use something else]---
Page Generation
Each page pulls from centralized data:
- [Competitor] Alternative page: Pulls competitor data + your data
- [Competitor] Alternatives page: Pulls competitor data + your data + other alternatives
- You vs [Competitor] page: Pulls your data + competitor data
- [A] vs [B] page: Pulls both competitor data + your data
Benefits:
- Update competitor pricing once, updates everywhere
- Add new feature comparison once, appears on all pages
- Consistent accuracy across pages
- Easier to maintain at scale
---
Index Page Structure
Alternatives Index
URL: /alternatives or /alternatives/index
Purpose: Lists all "[Competitor] Alternative" pages
Page structure: 1. Headline: "[Your Product] as an Alternative" 2. Brief intro on why people switch to you 3. List of all alternative pages with:
- Competitor name/logo
- One-line summary of key differentiator vs. that competitor
- Link to full comparison
4. Common reasons people switch (aggregated) 5. CTA
Example:
## Explore [Your Product] as an Alternative
Looking to switch? See how [Your Product] compares to the tools you're evaluating:
- **[Notion Alternative](/alternatives/notion)** — Better for teams who need [X]
- **[Airtable Alternative](/alternatives/airtable)** — Better for teams who need [Y]
- **[Monday Alternative](/alternatives/monday)** — Better for teams who need [Z]---
Vs Comparisons Index
URL: /vs or /compare
Purpose: Lists all "You vs [Competitor]" and "[A] vs [B]" pages
Page structure: 1. Headline: "Compare [Your Product]" 2. Section: "[Your Product] vs Competitors" — list of direct comparisons 3. Section: "Head-to-Head Comparisons" — list of [A] vs [B] pages 4. Brief methodology note 5. CTA
---
Index Page Best Practices
Keep them updated: When you add a new comparison page, add it to the relevant index.
Internal linking:
- Link from index → individual pages
- Link from individual pages → back to index
- Cross-link between related comparisons
SEO value:
- Index pages can rank for broad terms like "project management tool comparisons"
- Pass link equity to individual comparison pages
- Help search engines discover all comparison content
Sorting options:
- By popularity (search volume)
- Alphabetically
- By category/use case
- By date added (show freshness)
Include on index pages:
- Last updated date for credibility
- Number of pages/comparisons available
- Quick filters if you have many comparisons
---
Footer Navigation
The site footer appears on all marketing pages, making it a powerful internal linking opportunity for competitor pages.
Option 1: Link to Index Pages (Minimum)
At minimum, add links to your comparison index pages in the footer:
Footer
├── Compare
│ ├── Alternatives → /alternatives
│ └── Comparisons → /vsThis ensures every marketing page passes link equity to your comparison content hub.
Option 2: Footer Columns by Format (Recommended for SEO)
For stronger internal linking, create dedicated footer columns for each format you've built, linking directly to your top competitors:
Footer
├── [Product] vs ├── Alternatives to ├── Compare
│ ├── vs Notion │ ├── Notion Alternative │ ├── Notion vs Airtable
│ ├── vs Airtable │ ├── Airtable Alternative │ ├── Monday vs Asana
│ ├── vs Monday │ ├── Monday Alternative │ ├── Notion vs Monday
│ ├── vs Asana │ ├── Asana Alternative │ ├── ...
│ ├── vs Clickup │ ├── Clickup Alternative │ └── View all →
│ ├── ... │ ├── ... │
│ └── View all → │ └── View all → │Guidelines:
- Include up to 8 links per column (top competitors by search volume)
- Add "View all" link to the full index page
- Only create columns for formats you've actually built pages for
- Prioritize competitors with highest search volume
Why Footer Links Matter
1. Sitewide distribution: Footer links appear on every marketing page, passing link equity from your entire site to comparison content 2. Crawl efficiency: Search engines discover all comparison pages quickly 3. User discovery: Visitors evaluating your product can easily find comparisons 4. Competitive positioning: Signals to search engines that you're a key player in the space
Implementation Notes
- Update footer when adding new high-priority comparison pages
- Keep footer clean—don't list every comparison, just the top ones
- Match column headers to your URL structure (e.g., "vs" column →
/vs/URLs) - Consider mobile: columns may stack, so order by priority
Section Templates for Competitor Pages
Ready-to-use templates for each section of competitor comparison pages.
TL;DR Summary
Start every page with a quick summary for scanners:
**TL;DR**: [Competitor] excels at [strength] but struggles with [weakness].
[Your product] is built for [your focus], offering [key differentiator].
Choose [Competitor] if [their ideal use case]. Choose [You] if [your ideal use case].---
Paragraph Comparison (Not Just Tables)
For each major dimension, write a paragraph:
## Features
[Competitor] offers [description of their feature approach].
Their strength is [specific strength], which works well for [use case].
However, [limitation] can be challenging for [user type].
[Your product] takes a different approach with [your approach].
This means [benefit], though [honest tradeoff].
Teams who [specific need] often find this more effective.---
Feature Comparison Section
Go beyond checkmarks:
## Feature Comparison
### [Feature Category]
**[Competitor]**: [2-3 sentence description of how they handle this]
- Strengths: [specific]
- Limitations: [specific]
**[Your product]**: [2-3 sentence description]
- Strengths: [specific]
- Limitations: [specific]
**Bottom line**: Choose [Competitor] if [scenario]. Choose [You] if [scenario].---
Pricing Comparison Section
## Pricing
| | [Competitor] | [Your Product] |
|---|---|---|
| Free tier | [Details] | [Details] |
| Starting price | $X/user/mo | $X/user/mo |
| Business tier | $X/user/mo | $X/user/mo |
| Enterprise | Custom | Custom |
**What's included**: [Competitor]'s $X plan includes [features], while
[Your product]'s $X plan includes [features].
**Total cost consideration**: Beyond per-seat pricing, consider [hidden costs,
add-ons, implementation]. [Competitor] charges extra for [X], while
[Your product] includes [Y] in base pricing.
**Value comparison**: For a 10-person team, [Competitor] costs approximately
$X/year while [Your product] costs $Y/year, with [key differences in what you get].---
Service & Support Comparison
## Service & Support
| | [Competitor] | [Your Product] |
|---|---|---|
| Documentation | [Quality assessment] | [Quality assessment] |
| Response time | [SLA if known] | [Your SLA] |
| Support channels | [List] | [List] |
| Onboarding | [What they offer] | [What you offer] |
| CSM included | [At what tier] | [At what tier] |
**Support quality**: Based on [G2/Capterra reviews, your research],
[Competitor] support is described as [assessment]. Common feedback includes
[quotes or themes].
[Your product] offers [your support approach]. [Specific differentiator like
response time, dedicated CSM, implementation help].---
Who It's For Section
## Who Should Choose [Competitor]
[Competitor] is the right choice if:
- [Specific use case or need]
- [Team type or size]
- [Workflow or requirement]
- [Budget or priority]
**Ideal [Competitor] customer**: [Persona description in 1-2 sentences]
## Who Should Choose [Your Product]
[Your product] is built for teams who:
- [Specific use case or need]
- [Team type or size]
- [Workflow or requirement]
- [Priority or value]
**Ideal [Your product] customer**: [Persona description in 1-2 sentences]---
Migration Section
## Switching from [Competitor]
### What transfers
- [Data type]: [How easily, any caveats]
- [Data type]: [How easily, any caveats]
### What needs reconfiguration
- [Thing]: [Why and effort level]
- [Thing]: [Why and effort level]
### Migration support
We offer [migration support details]:
- [Free data import tool / white-glove migration]
- [Documentation / migration guide]
- [Timeline expectation]
- [Support during transition]
### What customers say about switching
> "[Quote from customer who switched]"
> — [Name], [Role] at [Company]---
Social Proof Section
Focus on switchers:
## What Customers Say
### Switched from [Competitor]
> "[Specific quote about why they switched and outcome]"
> — [Name], [Role] at [Company]
> "[Another quote]"
> — [Name], [Role] at [Company]
### Results after switching
- [Company] saw [specific result]
- [Company] reduced [metric] by [amount]---
Comparison Table Best Practices
Beyond Checkmarks
Instead of:
| Feature | You | Competitor |
|---|---|---|
| Feature A | ✓ | ✓ |
| Feature B | ✓ | ✗ |
Do this:
| Feature | You | Competitor |
|---|---|---|
| Feature A | Full support with [detail] | Basic support, [limitation] |
| Feature B | [Specific capability] | Not available |
Organize by Category
Group features into meaningful categories:
- Core functionality
- Collaboration
- Integrations
- Security & compliance
- Support & service
Include Ratings Where Useful
| Category | You | Competitor | Notes |
|---|---|---|---|
| Ease of use | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | [Brief note] |
| Feature depth | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | [Brief note] |
#!/usr/bin/env python3
"""
comparison_matrix_builder.py — Competitive Feature Comparison Matrix Builder
100% stdlib, no pip installs required.
Usage:
python3 comparison_matrix_builder.py # demo mode
python3 comparison_matrix_builder.py --input matrix.json
python3 comparison_matrix_builder.py --input matrix.json --json
python3 comparison_matrix_builder.py --input matrix.json --markdown > comparison.md
matrix.json format:
{
"your_product": "YourProduct",
"features": [
{
"name": "SSO / SAML",
"category": "Security",
"your_status": "full", # full | partial | no | planned
"competitors": {
"CompetitorA": "no",
"CompetitorB": "partial",
"CompetitorC": "full"
},
"notes": "Enterprise tier only" # optional
}
]
}
"""
import argparse
import json
import sys
from collections import defaultdict
# ---------------------------------------------------------------------------
# Status helpers
# ---------------------------------------------------------------------------
STATUS_SCORE = {
"full": 2,
"partial": 1,
"no": 0,
"planned": 0, # planned ≠ shipped; conservative scoring
}
STATUS_LABEL = {
"full": "✅",
"partial": "🔶",
"no": "❌",
"planned": "🗓",
}
STATUS_TEXT = {
"full": "Full",
"partial": "Partial",
"no": "No",
"planned": "Planned",
}
FEATURE_IMPORTANCE = {
# Generic defaults — override per-feature with "weight" in JSON
"default": 1,
}
# ---------------------------------------------------------------------------
# Core builder
# ---------------------------------------------------------------------------
def normalise_status(s: str) -> str:
s = (s or "no").strip().lower()
return s if s in STATUS_SCORE else "no"
def build_matrix(data: dict) -> dict:
your_product = data.get("your_product", "Your Product")
features = data.get("features", [])
if not features:
raise ValueError("No features provided in input.")
# Collect competitor names (ordered, deduplicated)
competitors = []
seen = set()
for f in features:
for c in f.get("competitors", {}):
if c not in seen:
competitors.append(c)
seen.add(c)
categories = sorted(set(f.get("category", "General") for f in features))
# --- per-feature analysis ---
feature_rows = []
for f in features:
fname = f.get("name", "?")
category = f.get("category", "General")
weight = f.get("weight", 1)
your_raw = normalise_status(f.get("your_status", "no"))
your_s = STATUS_SCORE[your_raw]
comp_raw = {c: normalise_status(f.get("competitors", {}).get(c, "no"))
for c in competitors}
comp_s = {c: STATUS_SCORE[comp_raw[c]] for c in competitors}
you_win = all(your_s > comp_s[c] for c in competitors) if competitors else False
you_lose = any(your_s < comp_s[c] for c in competitors)
your_max = max(comp_s.values()) if comp_s else 0
advantage = your_s - your_max # positive = you're better overall
feature_rows.append({
"name": fname,
"category": category,
"weight": weight,
"your_status": your_raw,
"your_score": your_s,
"competitors": comp_raw,
"comp_scores": comp_s,
"you_win": you_win,
"you_lose": you_lose,
"advantage": advantage,
"notes": f.get("notes", ""),
})
# --- competitive scores per competitor ---
comp_scores = {}
for c in competitors:
wins = sum(1 for r in feature_rows if r["your_score"] > r["comp_scores"].get(c, 0))
ties = sum(1 for r in feature_rows if r["your_score"] == r["comp_scores"].get(c, 0))
losses = sum(1 for r in feature_rows if r["your_score"] < r["comp_scores"].get(c, 0))
total = len(feature_rows)
score = round((wins / total) * 100) if total else 0
comp_scores[c] = {
"wins": wins, "ties": ties, "losses": losses,
"win_pct": score,
"verdict": _verdict(score),
}
# Overall competitive score (average win% across all competitors)
overall_win_pct = (
round(sum(v["win_pct"] for v in comp_scores.values()) / len(comp_scores))
if comp_scores else 0
)
# Advantages and gaps
advantages = [r["name"] for r in feature_rows if r["advantage"] > 0]
gaps = [r["name"] for r in feature_rows if r["advantage"] < 0]
parity = [r["name"] for r in feature_rows if r["advantage"] == 0]
return {
"meta": {
"your_product": your_product,
"competitors": competitors,
"categories": categories,
"total_features": len(feature_rows),
"overall_win_pct": overall_win_pct,
"verdict": _verdict(overall_win_pct),
},
"competitor_scores": comp_scores,
"advantages": advantages,
"gaps": gaps,
"parity": parity,
"features": feature_rows,
}
def _verdict(win_pct: int) -> str:
if win_pct >= 70: return "Strong advantage"
if win_pct >= 50: return "Slight advantage"
if win_pct >= 35: return "Competitive parity"
return "Trailing"
# ---------------------------------------------------------------------------
# Markdown output
# ---------------------------------------------------------------------------
def build_markdown(result: dict) -> str:
m = result["meta"]
rows = result["features"]
comp = m["competitors"]
lines = []
lines.append(f"# Feature Comparison: {m['your_product']} vs Competitors\n")
lines.append(f"_Generated by comparison_matrix_builder.py — {m['total_features']} features, "
f"{len(comp)} competitor(s)_\n")
# Summary table
lines.append("## Competitive Score Summary\n")
lines.append("| Competitor | You Win | Tie | You Lose | Win % | Verdict |")
lines.append("|---|---|---|---|---|---|")
for c, s in result["competitor_scores"].items():
lines.append(f"| {c} | {s['wins']} | {s['ties']} | {s['losses']} | "
f"**{s['win_pct']}%** | {s['verdict']} |")
lines.append(f"\n**Overall win rate: {m['overall_win_pct']}% — {m['verdict']}**\n")
# Feature matrix by category
lines.append("## Feature Matrix\n")
header = f"| Feature | {m['your_product']} | " + " | ".join(comp) + " | Notes |"
sep = "|---|---|" + "|".join(["---"] * len(comp)) + "|---|"
lines.append(header)
lines.append(sep)
current_cat = None
for r in rows:
cat = r["category"]
if cat != current_cat:
lines.append(f"| **{cat}** | | " + " | ".join([""] * len(comp)) + " | |")
current_cat = cat
you_icon = STATUS_LABEL[r["your_status"]]
comp_icons = " | ".join(STATUS_LABEL[r["competitors"].get(c, "no")] for c in comp)
note = r["notes"] or ""
# Highlight row if it's a unique advantage
fname = f"**{r['name']}**" if r["advantage"] > 0 else r["name"]
lines.append(f"| {fname} | {you_icon} | {comp_icons} | {note} |")
lines.append("")
# Advantages
if result["advantages"]:
lines.append("## ✅ Your Advantages\n")
for a in result["advantages"]:
lines.append(f"- {a}")
lines.append("")
# Gaps
if result["gaps"]:
lines.append("## ⚠️ Feature Gaps (competitors ahead)\n")
for g in result["gaps"]:
lines.append(f"- {g}")
lines.append("")
# Legend
lines.append("## Legend\n")
for k, v in STATUS_LABEL.items():
lines.append(f"- {v} {STATUS_TEXT[k]}")
lines.append("")
return "\n".join(lines)
# ---------------------------------------------------------------------------
# Pretty terminal output
# ---------------------------------------------------------------------------
def pretty_print(result: dict) -> None:
m = result["meta"]
print("\n" + "=" * 70)
print(f" COMPETITIVE MATRIX: {m['your_product'].upper()} vs {', '.join(m['competitors'])}")
print("=" * 70)
print(f"\n Total features analysed : {m['total_features']}")
print(f" Overall win rate : {m['overall_win_pct']}% ({m['verdict']})")
print(f"\n{'─'*70}")
print(f" {'COMPETITOR':<22} {'WIN%':>5} {'WINS':>5} {'TIES':>5} {'LOSSES':>7} VERDICT")
print(f"{'─'*70}")
for c, s in result["competitor_scores"].items():
bar = "█" * (s["win_pct"] // 10) + "░" * (10 - s["win_pct"] // 10)
print(f" {c:<22} {s['win_pct']:>4}% {s['wins']:>5} {s['ties']:>5} "
f"{s['losses']:>7} {bar} {s['verdict']}")
print(f"\n{'─'*70}")
col_w = 20
header = f" {'FEATURE':<28} | {'YOU':^8}"
for c in m["competitors"]:
header += f" | {c[:8]:^8}"
print(header)
print("─" * (30 + 11 * (1 + len(m["competitors"]))))
current_cat = None
for r in result["features"]:
if r["category"] != current_cat:
print(f"\n [{r['category']}]")
current_cat = r["category"]
you_icon = STATUS_LABEL[r["your_status"]]
line = f" {' '+r['name']:<28} | {you_icon:^8}"
for c in m["competitors"]:
ci = STATUS_LABEL[r["competitors"].get(c, "no")]
line += f" | {ci:^8}"
if r["advantage"] > 0:
line += " ← advantage"
elif r["advantage"] < 0:
line += " ← gap"
print(line)
print(f"\n ✅ YOUR ADVANTAGES ({len(result['advantages'])} features)")
for a in result["advantages"]:
print(f" • {a}")
print(f"\n ⚠️ FEATURE GAPS ({len(result['gaps'])} features)")
for g in result["gaps"]:
print(f" • {g}")
print(f"\n Legend: {STATUS_LABEL['full']} Full {STATUS_LABEL['partial']} Partial "
f"{STATUS_LABEL['no']} No {STATUS_LABEL['planned']} Planned\n")
# ---------------------------------------------------------------------------
# Sample data
# ---------------------------------------------------------------------------
DEMO_DATA = {
"your_product": "SwiftBase",
"features": [
{"name": "SSO / SAML", "category": "Security", "weight": 3, "your_status": "full", "competitors": {"AcmeSaaS": "no", "ProStack": "partial"}, "notes": "All plans"},
{"name": "2FA / MFA", "category": "Security", "weight": 3, "your_status": "full", "competitors": {"AcmeSaaS": "full", "ProStack": "full"}, "notes": ""},
{"name": "SOC 2 Type II", "category": "Security", "weight": 3, "your_status": "planned", "competitors": {"AcmeSaaS": "full", "ProStack": "no"}, "notes": "Q3 target"},
{"name": "Role-based access", "category": "Security", "weight": 2, "your_status": "full", "competitors": {"AcmeSaaS": "partial", "ProStack": "full"}, "notes": ""},
{"name": "REST API", "category": "Integrations", "weight": 3, "your_status": "full", "competitors": {"AcmeSaaS": "full", "ProStack": "full"}, "notes": ""},
{"name": "GraphQL API", "category": "Integrations", "weight": 2, "your_status": "full", "competitors": {"AcmeSaaS": "no", "ProStack": "partial"}, "notes": ""},
{"name": "Zapier Integration", "category": "Integrations", "weight": 2, "your_status": "partial", "competitors": {"AcmeSaaS": "full", "ProStack": "full"}, "notes": "10 zaps only"},
{"name": "Webhooks", "category": "Integrations", "weight": 2, "your_status": "full", "competitors": {"AcmeSaaS": "full", "ProStack": "no"}, "notes": ""},
{"name": "Custom domain", "category": "Branding", "weight": 2, "your_status": "full", "competitors": {"AcmeSaaS": "partial", "ProStack": "full"}, "notes": ""},
{"name": "White-label / rebrand","category": "Branding", "weight": 2, "your_status": "full", "competitors": {"AcmeSaaS": "no", "ProStack": "partial"}, "notes": "Agency plan"},
{"name": "Priority support", "category": "Support", "weight": 2, "your_status": "full", "competitors": {"AcmeSaaS": "partial", "ProStack": "full"}, "notes": "24/7"},
{"name": "Dedicated CSM", "category": "Support", "weight": 2, "your_status": "no", "competitors": {"AcmeSaaS": "full", "ProStack": "full"}, "notes": "Enterprise only"},
{"name": "SLA guarantee", "category": "Support", "weight": 3, "your_status": "no", "competitors": {"AcmeSaaS": "full", "ProStack": "no"}, "notes": "Roadmap"},
],
}
# ---------------------------------------------------------------------------
# CLI
# ---------------------------------------------------------------------------
def parse_args():
parser = argparse.ArgumentParser(
description="Build a competitive feature comparison matrix (stdlib only).",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=__doc__,
)
parser.add_argument("--input", type=str, default=None,
help="Path to JSON input file")
parser.add_argument("--json", action="store_true",
help="Output analysis as JSON")
parser.add_argument("--markdown", action="store_true",
help="Output comparison table as Markdown")
return parser.parse_args()
def main():
args = parse_args()
if args.input:
with open(args.input) as f:
data = json.load(f)
else:
print("🔬 DEMO MODE — using sample SaaS product matrix\n", file=sys.stderr)
data = DEMO_DATA
result = build_matrix(data)
if args.json:
# Serialise (remove non-JSON-safe keys)
print(json.dumps(result, indent=2))
elif args.markdown:
print(build_markdown(result))
else:
pretty_print(result)
print("\n💡 TIP: Re-run with --markdown to get a copyable Markdown table.\n")
if __name__ == "__main__":
main()
Related skills
How it compares
Pick competitor-alternatives when you need durable, file-based competitor records for comparison pages rather than ad-hoc chat summaries.
FAQ
What files does competitor-alternatives create?
competitor-alternatives organizes rival intelligence under a competitor_data/ folder with one markdown file per competitor, such as notion.md or airtable.md, each following a shared YAML template for positioning and pricing.
Which competitor fields should be documented?
competitor-alternatives recommends YAML fields including name, website, tagline, founded year, headquarters, primary use case, target audience, market position, pricing model, and free-tier limits.
Is Competitor Alternatives safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.