Create high-converting competitor comparison and alternative pages — singular alternatives, plural alternatives, vs pages, and competitor vs competitor formats.
Create persuasive comparison pages that help potential customers choose your product over specific rivals or general alternatives. Each page features structured, honest content for "vs" comparisons and switch guides designed to capture SEO traffic and enable your sales team. Reach for this tool whenever you need to convert users actively researching competitor solutions or want to dominate competitive search terms.
name: “competitor-alternatives”
description: “When the user wants to create competitor comparison or alternative pages for SEO and sales enablement. Also use when the user mentions ‘alternative page,’ ‘vs page,’ ‘competitor comparison,’ ‘comparison page,’ ‘[Product] vs [Product],’ ‘[Product] alternative,’ ‘competitive landing pages,’ ‘switch from competitor,’ or ‘comparison content.’ Covers four formats: singular alternative, plural alternatives, you vs competitor, and competitor vs competitor. Emphasizes deep research, modular content architecture, and varied section types beyond feature tables.”
license: MIT
metadata:
version: 1.0.0
author: Alireza Rezvani
category: marketing
updated: 2026-03-06
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:
Your Product
Core value proposition
Key differentiators
Ideal customer profile
Pricing model
Strengths and honest weaknesses
Competitive Landscape
Direct competitors
Indirect/adjacent competitors
Market positioning of each
Search volume for competitor terms
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:
Why people look for alternatives (validate their pain)
Summary: You as the alternative (quick positioning)
Detailed comparison (features, service, pricing)
Who should switch (and who shouldn’t)
Migration path
Social proof from switchers
CTA
Format 2: [Competitor] Alternatives (Plural)
Search intent: User is researching options, earlier in journey
Product research: Sign up, use it, document features/UX/limitations
Pricing research: Current pricing, what’s included, hidden costs
Review mining: G2, Capterra, TrustRadius for common praise/complaint themes
Customer feedback: Talk to customers who switched (both directions)
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
What are common reasons people switch to you?
Do you have customer quotes about switching?
What’s your pricing vs. competitors?
Do you offer migration support?
Proactive Triggers
Proactively offer competitor page creation when:
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.
Sales team friction — User mentions prospects comparing them to a specific tool; immediately offer a vs-page for sales enablement.
SEO gap identified — Keyword research shows competitor-branded terms with no coverage; propose a full alternative page set with prioritized build order.
Switcher testimonial available — When a customer quote about switching surfaces, offer to build a migration-focused alternative page around it.
Pricing page review — When reviewing pricing, note that pricing comparison tables belong on dedicated competitor pages, not the pricing page itself.
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:
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:
Headline: "[Your Product] as an Alternative"
Brief intro on why people switch to you
List of all alternative pages with:
Competitor name/logo
One-line summary of key differentiator vs. that competitor
Link to full comparison
Common reasons people switch (aggregated)
CTA
Example:
## Explore [Your Product] as an AlternativeLooking 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:
Headline: "Compare [Your Product]"
Section: "[Your Product] vs Competitors" — list of direct comparisons
Section: "Head-to-Head Comparisons" — list of [A] vs [B] pages
Brief methodology note
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:
This 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
Sitewide distribution: Footer links appear on every marketing page, passing link equity from your entire site to comparison content
Crawl efficiency: Search engines discover all comparison pages quickly
User discovery: Visitors evaluating your product can easily find comparisons
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 likeresponse 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 supportWe 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 Builder100% 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.mdmatrix.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 argparseimport jsonimport sysfrom 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()
Install this Skill
Skills give your AI agent a consistent, structured approach to this task — better output than a one-off prompt.