| name | competitor-analysis |
| description | Extracts marketing elements from competitor websites. Structured observation only. Does not write copy or make recommendations. |
Competitor Analysis Skill
Purpose
Extracts observable marketing data from competitor websites. Observation only, no interpretation.
Position in Workflow
[competitor-analysis] → [keyword-research] → [lead-gen-copy]
↓
Raw observations → Patterns → Copy decisions
This skill produces RAW DATA. Copy decisions happen in other skills.
Input
competitor_urls: ["url1", "url2", "url3"]
analysis_focus: full | messaging | trust | pricing | cta
industry: removals | cleaning | trades | legal | healthcare
Output
competitors:
- url: "..."
messaging: { ... }
trust: { ... }
pricing: { ... }
ctas: { ... }
observed_differences: [ ... ]
Hard Rules
| Rule | Requirement |
|---|
| Competitor count | Minimum 3, maximum 5 |
| Data source | Visual observation only |
| No scraping | Manual review, no HTML parsing |
| No recommendations | Observations only, no "should" |
| Absence = explicit | Missing element → not_found: true |
Analysis Categories
1. Messaging
| Field | Extract |
|---|
headline | Exact H1 text |
headline_pattern | benefit / feature / question / statement |
value_prop | Main promise (1 sentence) |
tone | formal / professional / casual / friendly |
unique_claims | List of specific claims |
2. Trust Elements
| Field | Extract |
|---|
review_platform | Google / Trustpilot / none |
rating | Number or not_found |
review_count | Number or not_found |
credentials | List: type + name |
guarantees | List: type + specifics |
team_visible | true / false |
3. Pricing
| Field | Extract |
|---|
transparency | hidden / teaser / full |
lowest_shown | Price or not_found |
pricing_model | fixed / hourly / quote-only |
discounts | List or not_found |
4. CTAs
| Field | Extract |
|---|
primary_text | Exact button text |
primary_placement | hero / header / footer |
form_fields_count | Number |
phone_prominent | true / false |
mobile_sticky | true / false |
Handling Missing Data
Never leave fields empty. Never guess.
rating: 4.8
rating:
not_found: true
pricing_model:
unclear: true
observed: "Shows 'from £X' but also 'call for quote'"
Observed Differences Rules
Differences are observations, not opportunities or recommendations.
observed_differences:
- category: pricing
observation: "Competitors A, B show no prices. Competitor C shows 'from £299'."
observed_differences:
- category: pricing
opportunity: "Show transparent pricing to differentiate"
"Opportunity" word is FORBIDDEN in output.
Output Stability
Same input → same output structure. Always.
| Scenario | Rule |
|---|
| Field has data | Include with value |
| Field not found | Include with not_found: true |
| Field unclear | Include with unclear: true + observed |
| Never | Omit fields |
Forbidden
- ❌ HTML scraping or parsing
- ❌ Accessing competitor analytics
- ❌ Recommendations or "should" statements
- ❌ Ranking competitors (better/worse)
- ❌ Omitting fields when data missing
- ❌ Using word "opportunity"
- ❌ Making strategic suggestions
Non-goals
- Does NOT write copy
- Does NOT rank competitors
- Does NOT make recommendations
- Does NOT interpret data
- Does NOT suggest positioning
References
Definition of Done