Competitor Analysis
Structured side-by-side comparison of competing products. Designed for search + scrape; no interact needed for typical marketing/pricing pages.
When to use
- User names 2+ companies or products: "compare Vercel, Netlify, Cloudflare Pages"
- User names a category only: "best CDNs for edge functions" — search to discover the top 3–5 players, then analyze
- User asks for alternatives: "what are the alternatives to X?"
- User wants a feature matrix or positioning summary
Do NOT use for single-vendor deep-dives — use deep-research or structured-extraction instead.
Strategy
Identify competitors.
- If the user listed them, use that list.
- Otherwise search once:
"top <category> providers 2026" or "<product> alternatives". Pick the 3–5 most-cited.
For each competitor, gather three pages:
- Homepage — one-line positioning, target audience
- Pricing page (usually
/pricing or /plans) — tiers, units, free tier, enterprise gate
- Features or product page — top 5–10 capabilities, any standout differentiators
Fan out when scale warrants.
- 2–3 competitors: stay in the orchestrator, scrape serially or with parallel tool calls.
- 4+ competitors: use
spawnAgents, one worker per competitor. Each worker gets the 3 URLs above and returns a normalized sub-object.
Normalize before formatting.
- Align pricing tiers by role (Free / Pro / Team / Enterprise) even when vendors name them differently.
- Call out where a competitor has a capability the others don't.
- Flag anything missing (e.g. "Enterprise pricing is contact-sales only").
Call formatOutput once at the end with the full matrix.
Quick start
await agent.run({
prompt: 'Compare Vercel, Netlify, and Cloudflare Pages on pricing, edge functions, and free tier generosity',
skills: ['competitor-analysis'],
format: 'json',
})
// User gave only a category — discover competitors first
await agent.run({
prompt: 'Compare the top 4 vector databases for production RAG workloads',
skills: ['competitor-analysis'],
format: 'json',
})
Output schema
Every run should produce an object with this shape (add fields as the user's prompt demands):
{
"category": "Edge hosting platforms",
"competitors": [
{
"name": "Vercel",
"url": "https://vercel.com",
"positioning": "Frontend cloud for Next.js and React",
"pricing": [
{ "tier": "Hobby", "price": 0, "unit": "month", "limits": {} },
{ "tier": "Pro", "price": 20, "unit": "seat/month", "limits": {} }
],
"strengths": [],
"weaknesses": [],
"freeTier": true,
"enterpriseContactOnly": false,
"sources": []
}
],
"summary": "One-paragraph takeaway comparing the field.",
"bestFit": {
"budgetConscious": "",
"enterprise": "",
"developer": ""
}
}
Tips
- Pricing pages lie by omission. Always look for overages, egress costs, and seat minimums that show up only in a footnote.
- Marketing copy is noise. Prefer the pricing page and docs over the homepage for factual claims.
- If a scrape returns 404 on
/pricing, search "<vendor> pricing" before guessing another URL — vendors often move these pages.
- Populate
strengths and weaknesses from evidence, not opinion. "Has a built-in KV store (competitor docs do not mention one)" is fair game; "better DX" is not.
- Always include
sources: [...] on every competitor object with the URLs you actually scraped.
See also
1---2name: competitor-analysis3description: Compare two or more companies, products, or platforms across pricing, features, positioning, and docs. Use this skill whenever the user says "compare X vs Y", "how does X stack up against Y", "alternatives to X", "competitive landscape of …", "X vs Y vs Z", or asks for a competitor matrix. Uses search to discover competitors when the user only names a category, then scrape for each competitor's homepage, pricing page, and features/docs. Returns a normalized comparison matrix as JSON.4---56# Competitor Analysis78Structured side-by-side comparison of competing products. Designed for search + scrape; no interact needed for typical marketing/pricing pages.910## When to use1112- User names 2+ companies or products: "compare Vercel, Netlify, Cloudflare Pages"13- User names a category only: "best CDNs for edge functions" — search to discover the top 3–5 players, then analyze14- User asks for alternatives: "what are the alternatives to X?"15- User wants a feature matrix or positioning summary1617Do NOT use for single-vendor deep-dives — use `deep-research` or `structured-extraction` instead.1819## Strategy20211. **Identify competitors.**22 - If the user listed them, use that list.23 - Otherwise search once: `"top <category> providers 2026"` or `"<product> alternatives"`. Pick the 3–5 most-cited.24252. **For each competitor, gather three pages:**26 - **Homepage** — one-line positioning, target audience27 - **Pricing page** (usually `/pricing` or `/plans`) — tiers, units, free tier, enterprise gate28 - **Features or product page** — top 5–10 capabilities, any standout differentiators29303. **Fan out when scale warrants.**31 - 2–3 competitors: stay in the orchestrator, scrape serially or with parallel tool calls.32 - 4+ competitors: use `spawnAgents`, one worker per competitor. Each worker gets the 3 URLs above and returns a normalized sub-object.33344. **Normalize before formatting.**35 - Align pricing tiers by role (Free / Pro / Team / Enterprise) even when vendors name them differently.36 - Call out where a competitor has a capability the others don't.37 - Flag anything missing (e.g. "Enterprise pricing is contact-sales only").38395. **Call `formatOutput` once at the end** with the full matrix.4041## Quick start4243```typescript44await agent.run({45 prompt: 'Compare Vercel, Netlify, and Cloudflare Pages on pricing, edge functions, and free tier generosity',46 skills: ['competitor-analysis'],47 format: 'json',48})49```5051```typescript52// User gave only a category — discover competitors first53await agent.run({54 prompt: 'Compare the top 4 vector databases for production RAG workloads',55 skills: ['competitor-analysis'],56 format: 'json',57})58```5960## Output schema6162Every run should produce an object with this shape (add fields as the user's prompt demands):6364```json65{66 "category": "Edge hosting platforms",67 "competitors": [68 {69 "name": "Vercel",70 "url": "https://vercel.com",71 "positioning": "Frontend cloud for Next.js and React",72 "pricing": [73 { "tier": "Hobby", "price": 0, "unit": "month", "limits": {} },74 { "tier": "Pro", "price": 20, "unit": "seat/month", "limits": {} }75 ],76 "strengths": [],77 "weaknesses": [],78 "freeTier": true,79 "enterpriseContactOnly": false,80 "sources": []81 }82 ],83 "summary": "One-paragraph takeaway comparing the field.",84 "bestFit": {85 "budgetConscious": "",86 "enterprise": "",87 "developer": ""88 }89}90```9192## Tips9394- **Pricing pages lie by omission.** Always look for overages, egress costs, and seat minimums that show up only in a footnote.95- **Marketing copy is noise.** Prefer the pricing page and docs over the homepage for factual claims.96- **If a scrape returns 404 on `/pricing`**, search `"<vendor> pricing"` before guessing another URL — vendors often move these pages.97- **Populate `strengths` and `weaknesses` from evidence, not opinion.** "Has a built-in KV store (competitor docs do not mention one)" is fair game; "better DX" is not.98- **Always include `sources: [...]`** on every competitor object with the URLs you actually scraped.99100## See also101102- [deep-research](../deep-research/SKILL.md) — multi-source validation for a single topic103- [pricing-tracker](../pricing-tracker/SKILL.md) — detail on pricing extraction when that's the only dimension104- [structured-extraction](../structured-extraction/SKILL.md) — lower-level helper for arbitrary JSON schemas