skills/marketing/competitor-positioning/SKILL.md
Tracks how competitors position themselves online — scrapes homepages, features, pricing, and blogs to extract messaging, value props, CTAs, and pricing models. Compares against previous snapshots to surface positioning shifts with before/after tracking. Produces messaging matrices, content gap analysis, white space maps, and battlecard inputs. Use when anyone asks about competitor messaging, positioning, website copy, content strategy, or how competitors present themselves. Triggers: "competitor positioning", "messaging comparison", "content gap", "what changed on their site", "competitor homepage", "landing page teardown", "marketing battlecard", "how do they describe their product", "share of voice", "counter-messaging". Do NOT use for business signals like funding/hiring (use competitor-intel), single-company deep dives (use company-deep-dive), or meeting prep (use meeting-prep).
npx skillsauth add nimbleway/agent-skills competitor-positioningInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Marketing-focused competitive positioning analysis powered by Nimble's web data APIs. Built for marketing teams who need to understand how competitors present themselves — messaging, value props, content themes, pricing — and how that evolves over time.
The output is a marketing briefing, not a signal feed. Every insight should answer: "what does this mean for our messaging and positioning?"
User request: $ARGUMENTS
Argument parsing — determine what to do before running anything:
Before running any commands, read references/nimble-playbook.md for Claude Code
constraints (no shell state, no &/wait, sub-agent permissions, communication style).
Follow the transport selection + standard preflight from references/nimble-playbook.md — pick CLI or MCP at session start, then run the standard preflight calls (date calc, today, profile, memory index) in parallel.
From the results:
references/profile-and-onboarding.md, stopnimble CLI calls: nimble --client-source skill-competitor-positioning <subcommand>. MCP path: not yet supported — see references/nimble-playbook.md for status.~/.nimble/memory/positioning/*.md — prior positioning snapshots (used for
delta detection in Steps 4 + 5)~/.nimble/memory/competitors/*.md — business signals from competitor-intel
runs (provides context for why positioning may have shifted, e.g., a funding
round or leadership change that preceded a messaging pivot)
Determine mode:last_runs.competitor-positioning is today, check for
existing report at ~/.nimble/memory/reports/competitor-positioning-[today].md.
If found, ask: "Already ran today. Run again for fresh data?" Don't silently re-run.This skill shares the competitor list from competitor-intel. If a profile already
exists with competitors, skip onboarding entirely.
If no profile exists, follow references/profile-and-onboarding.md for the full
onboarding flow. The profile and competitor list created here will be shared across
all business skills.
If $ARGUMENTS already specifies competitors, use those and skip this step.
Otherwise, check how many competitors are in the profile:
4 or fewer → proceed with all, no confirmation needed
More than 4 → ask which to focus on (use AskUserQuestion):
You have [N] competitors tracked. Which ones should I analyze?
- All [N] (~[3-5 × N] Nimble API credits, ~[N × 2] min)
- [Category A]: [names] (grouped by
categoryfrom profile)- [Category B]: [names]
- Let me pick — I'll list them
Accept natural language: "just the AI search ones" → resolve from profile categories.
This prevents wasted API credits and wall time on competitors the user doesn't care about right now. Each competitor costs ~3-5 Nimble API credits (1 map + 3-4 extracts
For each competitor domain and the user's domain, discover available WSAs:
nimble agent list --search "{domain}" --limit 20
Run one search per domain simultaneously. Filter for SERP/PDP WSAs, prefer
managed_by: "nimble", validate with nimble agent get --template-name {name}.
Cache discovered names + params. Pass them to competitor agents in Step 5 for
richer extraction. If no WSAs found, continue with nimble search/extract/map.
Before analyzing competitors, capture the user's own positioning as a baseline for the messaging matrix.
First, discover the site structure to find the right pages to extract:
nimble --transform "links.#.url" map --url "https://[company-domain]" --sitemap only --limit 200
From the returned URLs, identify the features/product page and pricing page (look
for paths containing /features, /product, /platform, /pricing, /plans).
Then extract the key pages simultaneously (homepage + whichever pages map found):
nimble extract --url "https://[company-domain]" --format markdown
→ Homepage messaging, tagline, hero copy, CTAsnimble extract --url "[features-page-url]" --format markdown
→ Features page structure and emphasis (skip if map found no match)nimble extract --url "[pricing-page-url]" --format markdown
→ Pricing structure and tier naming (skip if map found no match)If a page extraction returns garbage, note "page not accessible" and continue — partial baseline is better than none.
Read references/positioning-agent-prompt.md for the full agent prompt template.
Follow the sub-agent spawning rules from references/nimble-playbook.md
(bypassPermissions, batch max 4, explicit Bash instruction, fallback on failure).
Call estimation & Scaled Execution: Before launching agents, estimate total API
calls: ~1 map + 3 extractions + 3 searches per competitor = ~7 × N calls (plus baseline
from Step 3). For 2+ competitors (14+ calls), tell agents to use extract-batch for
page extractions instead of individual calls. See the Scaled Execution pattern in
references/nimble-playbook.md for tier selection.
For each competitor in scope, spawn a general-purpose sub-agent with
mode: "bypassPermissions" and inline the prompt from
references/positioning-agent-prompt.md. Customize the prompt with each competitor's
name, domain, start-date, previous positioning snapshot from memory (loaded in
Step 0), and any discovered WSA names from Step 3 for richer data access.
Do NOT use agents/nimble-researcher.md — that agent is scoped for raw data gathering
and explicitly forbids analysis, but this skill requires interpretive work (identifying
audience signals, comparing positioning snapshots, assessing structure implications).
Each agent handles the complete research cycle for one competitor:
nimble map to discover the site's actual page structureThe agent returns a structured positioning snapshot — see the prompt template for the full output format. No separate blog extraction step is needed; agents handle it.
If an agent's blog extraction was thin (< 2 posts extracted), optionally extract additional posts from the main context using URLs from the agent's search results.
Fallback: If an agent fails entirely, run extractions directly from the main context using the same prompt template steps.
Frame everything for a marketing team. Use terms they work with: messaging hierarchy, share of voice, battlecard inputs, content calendar implications.
When analyzing blog content from agent results, look for:
Full snapshot mode (first run or > 14 days since last):
TL;DR for Marketing — 3-5 key positioning insights the marketing team should act on, each with a specific implication (e.g., "Competitor X shifted tagline from developer-focused to enterprise — consider whether our messaging still differentiates")
Messaging Matrix — build a comparison table with rows for Tagline, Primary CTA, Value Props, Target Audience, and Pricing Model across all competitors including your company. Use verbatim quotes for taglines and CTAs.
Per Competitor — Positioning Profile:
Content Gap Analysis — what competitors are publishing that you're not:
Positioning White Space — messaging angles no competitor has claimed strongly:
Recommended Actions — specific, actionable next steps for the marketing team (e.g., "Draft counter-messaging for Competitor X's new enterprise positioning", "Prioritize case studies targeting [segment] — 3 competitors already own this space")
Delta mode (last run < 14 days) — changes only:
What Changed — per competitor, before/after for each shift:
Nothing Changed — list competitors with no positioning shifts
Marketing Implications — what the changes mean for your team's priorities
Core rules:
~/.nimble/memory/positioning/*.md — in delta mode, only
surface genuinely new changes.WSA enrichment: If WSAs were discovered in Step 3, agents should use them
alongside nimble map/nimble extract for richer page data.
Make all Write calls simultaneously:
Report → ~/.nimble/memory/reports/competitor-positioning-[date].md
(save the full briefing, not a summary — this is the local source of truth)
Per competitor → save positioning snapshot to
~/.nimble/memory/positioning/[name].md using the format in
references/positioning-snapshot-format.md. Append a dated entry to the History
section so future runs can detect what changed and when. Add [[competitors/name]]
cross-references to link positioning snapshots to competitor intel files.
Profile → update last_runs.competitor-positioning in
~/.nimble/business-profile.json
Follow the wiki update pattern from references/memory-and-distribution.md: update
index.md rows for all affected entity files, append a log.md entry for this run.
Always offer distribution — do not skip this step. Follow
references/memory-and-distribution.md for connector detection, sharing flow, and
source links enforcement. Marketing teams especially benefit from shared Notion pages
they can reference in positioning workshops and content planning sessions.
Triggered by "battlecard [competitor]" argument or as a follow-up request.
Inputs: Read the competitor's positioning snapshot from
~/.nimble/memory/positioning/[name].md and the user's own baseline from the most
recent report. If no snapshot exists (or it's stale > 14 days), run Steps 4-5 for
that competitor first, then return here.
Output format:
# Battlecard: [Your Company] vs [Competitor]
## As of [date]
### Competitor Overview
- Tagline: [verbatim]
- Primary CTA: [verbatim]
- Target audience: [who their messaging speaks to]
- Pricing model: [type and entry price if known]
### Their Key Claims
[List each value prop / differentiator they emphasize, verbatim with source URL]
### Our Counter-Positioning
[For each claim above: our response, proof points, and messaging angle]
### Feature Comparison
| Capability | Us | Them | Advantage |
|---|---|---|---|
### Where They Win (acknowledge honestly)
[Areas where their positioning is stronger or they have genuine advantages]
### Where We Win
[Our unique advantages, with evidence]
### Objection Handling
| Prospect Says | Respond With |
|---|---|
### Recommended Talking Points
[3-5 concise talking points for sales/marketing conversations]
competitors, create positioning snapshotpreferences.skip_competitorsSibling skill suggestions:
Next steps:
- Run
competitor-intelfor business signals (funding, hiring, product launches)- Run
company-deep-divefor a full 360 profile on any competitor- Run
meeting-prepif you're meeting with someone at a competitor
Check at startup: echo $CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS
Team mode (flag set):
Agent tool with name: parameter so teammates are addressableSendMessage to share cross-competitor patterns they discover
(e.g., "two competitors both shifted to usage-based pricing this month")Solo mode (flag not set):
SendMessage, no name:)See references/nimble-playbook.md for the standard error table (missing API key, 429,
401, empty results, extraction garbage). Skill-specific errors:
--focus flag. If still failing, retry with a
simplified query (shorter terms, no date filter). Log the failure but don't skip
the competitor.development
Finds qualified candidates for a role by searching LinkedIn, Indeed, GitHub, and other professional platforms using Nimble Web Search Agents. Accepts a job description, role title, or freeform request and returns a ranked candidate list with profiles, skills, and contact signals. Use this skill when the user wants to find, source, or recruit candidates for a role. Common triggers: "find candidates for", "source engineers in", "who can I hire for", "find me a [role]", "recruiting for", "talent search", "find a [role] in [city]", "build a candidate list", "sourcing for [role]", "who's available for", "find potential hires". Also triggers on a pasted job description followed by a sourcing request. Do NOT use for job market research or salary benchmarking — use market-finder instead. Do NOT use for researching a single known person — use company-deep-dive or meeting-prep instead.
development
Get web data now — fast, incremental, immediately responsive to what the user needs. The only way Claude can access live websites. USE FOR: - Fetching any URL or reading any webpage - Scraping prices, listings, reviews, jobs, stats, docs from any site - Discovering URLs on a site before bulk extraction - Calling public REST/XHR API endpoints - Web search and research (8 focus modes) - Bulk crawling website sections Must be pre-installed and authenticated. Run `nimble --version` to verify. For building reusable extraction workflows to run at scale over time, use nimble-agent-builder instead.
development
A building experience: create, test, validate, refine, and publish extraction workflows based on existing or new Nimble agents. For users who want to invest in a durable, reusable workflow for a specific domain — not get data immediately. Trigger phrases: "set up extraction for X site", "I need to extract from this site regularly", "build an agent for", "create a reusable scraper", "generate a Nimble agent", "refine my agent", "add a field to my agent", or when the user wants to run extraction at scale. For getting data immediately, use nimble-web-expert instead.
tools
SEO intelligence toolkit covering the full lifecycle via live web data: keyword research, rank tracking, site audits, content gap analysis, competitor keyword reverse-engineering, AI visibility across five platforms (ChatGPT, Perplexity, Google AI, Gemini, Grok), and GitHub repo SEO. Crawls real sites and SERPs via Nimble CLI — no fabricated metrics. Triggers: "SEO", "keywords", "rank tracker", "site audit", "content gap", "competitor keywords", "AI visibility", "GitHub SEO", "SERP analysis", "keyword research", "technical SEO", "keyword difficulty", "topic clusters", "ranking delta", "on-page SEO", "AI citation audit". Do NOT use for competitor business signals — use `competitor-intel` instead. Do NOT use for competitor messaging — use `competitor-positioning` instead. Do NOT use for general web scraping — use `nimble-web-expert` instead.