Pricing Strategy
alirezarezvani/claude-skills
Design, optimize, and communicate SaaS pricing — tier structure, value metrics, pricing pages, and price increase strategy.
Tell it what your product is (URL or description) and it finds 5 competitors globally, fetches their actual pricing pages, extracts every tier and price point, and returns a complete pricing…
$ npx skills add Varnan-Tech/opendirectory --skill pricing-finder -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Varnan-Tech/opendirectory pricing-finder --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/pricing-finder .claude/skills/pricing-finder && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "pricing-finder" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/pricing-finder into .claude/skills/pricing-finder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pricing-finder", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Varnan-Tech/opendirectory/tree/main/skills/pricing-finderType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Varnan-Tech/opendirectory --skill pricing-finder -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Varnan-Tech/opendirectory pricing-finder --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/pricing-finder .agents/skills/pricing-finder && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pricing-finder" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/pricing-finder into .agents/skills/pricing-finder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pricing-finder", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Varnan-Tech/opendirectory --skill pricing-finder -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Varnan-Tech/opendirectory pricing-finder --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/pricing-finder .cursor/skills/pricing-finder && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "pricing-finder" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/pricing-finder into .cursor/skills/pricing-finder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pricing-finder", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Varnan-Tech/opendirectory.git --path skills/pricing-finder--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Varnan-Tech/opendirectory --skill pricing-finder -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Varnan-Tech/opendirectory pricing-finder --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/pricing-finder .gemini/skills/pricing-finder && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "pricing-finder" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/pricing-finder into .gemini/skills/pricing-finder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pricing-finder", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Varnan-Tech/opendirectory pricing-finderInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Varnan-Tech/opendirectory --skill pricing-finder -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/pricing-finder .github/skills/pricing-finder && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "pricing-finder" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/pricing-finder into .github/skills/pricing-finder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pricing-finder", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Varnan-Tech/opendirectory --skill pricing-finder -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Varnan-Tech/opendirectory pricing-finder --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Varnan-Tech/opendirectory.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/pricing-finder .opencode/skills/pricing-finder && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "pricing-finder" agent skill from https://github.com/Varnan-Tech/opendirectory/tree/main/skills/pricing-finder into .opencode/skills/pricing-finder/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pricing-finder", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
pricing-finderTell it what your product is (URL or description) and it finds 5 competitors globally, fetches their actual pricing pages, extracts every tier and price point, and returns a complete pricing…
Pricing Finder is an agent skill from Varnan-Tech/opendirectory. Tell it what your product is (URL or description) and it finds 5 competitors globally, fetches their actual pricing pages, extracts every tier and price point, and returns a complete pricing intelligence report: the dominant pricing model in your space, a benchmark price table, feature gate analysis, competitive positioning map, and a concrete recommended pricing strategy for your product. Use when asked to research competitor pricing, find pricing benchmarks, decide how to price a product, understand pricing…
Its SKILL.md is about 6.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including scripts and reference files (for example `README.md`, `evals/evals.json` and `references/extraction-guide.md`). Compatibility notes: ["claude-code","gemini-cli","github-copilot"]
It sits in Sales & Support, covering Pricing strategy and Landing pages. The repository describes itself as: AI Agent Skills built for Founders who hate Marketing. The licence is MIT.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 62e437a. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3curlpipFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.firecrawl.devFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
FIRECRAWL_API_KEYTAVILY_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
["claude-code","gemini-cli","github-copilot"]
From compatibility in the SKILL.md frontmatter.
Pricing Finder loads about 6.8k tokens when it runs, and up to ~11k if it reads all its reference files. Until then it costs about 144 tokens; SKILL.md has 1,081 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from Varnan-Tech/opendirectory at commit 62e437a, republished under its MIT licence (© Varnan-Tech). 1,081 words, ~6,844 tokens.
.claude/skills/pricing-finder/SKILL.md (or your agent's skills folder). This skill also uses 8 other files; get the full folder from GitHub.Tell it your product URL or description. It finds 5 competitors, fetches their actual pricing pages, and returns a complete pricing intelligence report: dominant model in your space, benchmark price table, feature gate analysis, positioning map, and a concrete pricing recommendation for your product.
Zero required API keys. Runs entirely on free pip dependencies. Optional API keys improve quality.
Zero-hallucination policy: Every price point, tier name, and feature gate in the output must trace to fetched pricing page content or a DuckDuckGo search snippet. This applies to:
| The agent will want to... | Why that's wrong |
|---|---|
| Fill in "Contact Sales" with an estimated price | Never estimate enterprise pricing. Record it as "Contact Sales" exactly. |
| Use training knowledge for competitor prices | Every price must trace to fetched page content or a search snippet. |
| Skip the competitor confirmation step | Always show discovered competitors and wait for confirmation. Wrong competitors = wrong benchmarks. |
| Recommend a price without referencing benchmark data | Every price recommendation must cite a specific number from the benchmark table. |
| Mark a page as high quality when content < 500 chars | < 500 chars means the page was not fetched -- mark data_quality as 'low' and use search snippet fallback. |
| Use em dashes in output | Replace all em dashes with hyphens. |
cat references/pricing-models.md
cat references/extraction-guide.md
cat references/positioning-guide.mdecho "TAVILY_API_KEY: ${TAVILY_API_KEY:+set (search quality enhanced)}${TAVILY_API_KEY:-not set, DuckDuckGo will be used (free)}"
echo "FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:+set (JS rendering enhanced)}${FIRECRAWL_API_KEY:-not set, requests+BS4 will be used (free)}"
echo ""
python3 -c "from ddgs import DDGS; import requests, bs4, html2text; print('Dependencies OK')" 2>/dev/null \
|| echo "ERROR: Missing dependencies. Run: pip install ddgs requests beautifulsoup4 html2text"If dependencies are missing: Stop immediately. Tell the user: "Missing Python dependencies. Run this to install them: pip install ddgs requests beautifulsoup4 html2text -- all free, no accounts needed. Then try again."
If only API keys are missing: Continue. DuckDuckGo and requests+BS4 are the free defaults.
Derive product slug:
PRODUCT_SLUG=$(python3 -c "
from urllib.parse import urlparse
import sys, re
url = 'URL_HERE'
if url.startswith('http'):
host = urlparse(url).netloc.replace('www.', '')
print(host.split('.')[0])
else:
print(re.sub(r'[^a-z0-9]', '-', url[:30].lower()).strip('-'))
")
echo "Product slug: $PRODUCT_SLUG"Collect from the conversation:
product_url: the URL to fetch (required, unless user pastes a description directly)geography: optional -- US / Europe / India / global. Default: USIf the user provides only a pasted description (no URL): Skip Steps 3 and 4. Go directly to Step 4 (product analysis) using the pasted text as product_content. Set page_source to user_description and note in data_quality_flags.
If neither URL nor description: Ask: "What is the URL of your product or startup? Or paste a short description: what it does, who it's for, and what makes it different."
Primary: Firecrawl (if FIRECRAWL_API_KEY is set)
curl -s -X POST https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer $FIRECRAWL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "URL_HERE", "formats": ["markdown"], "onlyMainContent": true}' \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('data', {}).get('markdown', '') or d.get('markdown', '')
print(f'Fetched via Firecrawl: {len(content)} characters')
open('/tmp/pf-product-raw.md', 'w').write(content)
"Fallback: requests + BS4 (free, always available)
python3 << 'PYEOF'
import requests, html2text, random
USER_AGENTS = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
]
headers = {"User-Agent": random.choice(USER_AGENTS), "Accept": "text/html,application/xhtml+xml;q=0.9,*/*;q=0.8"}
resp = requests.get("URL_HERE", headers=headers, timeout=20, allow_redirects=True)
converter = html2text.HTML2Text()
converter.ignore_images = True
converter.body_width = 0
content = converter.handle(resp.text)[:8000]
print(f'Fetched via requests+BS4: {len(content)} characters')
open('/tmp/pf-product-raw.md', 'w').write(content)
PYEOFCheckpoint:
python3 -c "
content = open('/tmp/pf-product-raw.md').read()
if len(content) < 200:
print('ERROR: fewer than 200 characters fetched -- page may be JS-rendered')
else:
print(f'Content OK: {len(content)} characters')
"If content < 200 characters: Tell the user: "The product page returned too little content -- the site may be JavaScript-rendered. Please paste a short description: what your product does, who it's for, and what makes it different from competitors."
Print page content:
python3 -c "
content = open('/tmp/pf-product-raw.md').read()[:5000]
print('=== PRODUCT PAGE (first 5000 chars) ===')
print(content)
"AI instructions: Analyze the product page above and extract:
product_name: the product or company nameone_line_description: what it does, for whom, core value prop. Under 20 words. No marketing language.industry_taxonomy: l1 (top-level: developer tools / fintech / healthtech / consumer / etc.), l2 (sector: devops / payments / hr / etc.), l3 (specific niche: CI/CD automation / embedded payments / async video / etc.)differentiators: exactly 2-3 specific things that distinguish this product. These feed the recommendation -- be specific. Generic answers like "easy to use" are not acceptable.icp: buyer_persona (job title), company_type, company_sizegeography_bias: US / Europe / India / globalpage_source: "live_page" or "user_description"Write to /tmp/pf-product-analysis.json:
python3 << 'PYEOF'
import json
analysis = {
# FILL from your analysis above
"product_name": "",
"one_line_description": "",
"industry_taxonomy": {"l1": "", "l2": "", "l3": ""},
"differentiators": [],
"icp": {"buyer_persona": "", "company_type": "", "company_size": ""},
"geography_bias": "US",
"page_source": "live_page"
}
json.dump(analysis, open('/tmp/pf-product-analysis.json', 'w'), indent=2)
print('Product analysis written.')
PYEOFVerify:
python3 -c "
import json
a = json.load(open('/tmp/pf-product-analysis.json'))
print('Product:', a['product_name'])
print('Industry:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Differentiators:')
for d in a['differentiators']:
print(f' - {d}')
"ls scripts/research.py 2>/dev/null && echo "script found" || echo "ERROR: scripts/research.py not found -- cannot continue"python3 scripts/research.py \
--phase discover \
--product-analysis /tmp/pf-product-analysis.json \
--output /tmp/pf-competitors-raw.jsonPrint results for AI review:
python3 -c "
import json
data = json.load(open('/tmp/pf-competitors-raw.json'))
print(f'Searches run: {len(data[\"competitor_searches\"])}')
for s in data['competitor_searches']:
print(f'\nQuery: {s[\"query\"]}')
for r in s.get('results', [])[:6]:
print(f' - {r[\"title\"]} | {r[\"url\"]}')
print(f' {r.get(\"snippet\",\"\")[:150]}')
"AI instructions: Read the search results above. Pick exactly 5 competitor companies that:
For each competitor write: name, url, pricing_url (their pricing page -- infer as [url]/pricing if not found in snippets), description (one sentence from snippet), source_url.
python3 << 'PYEOF'
import json
analysis = json.load(open('/tmp/pf-product-analysis.json'))
# FILL: 5 competitors from the search results above
candidates = [
# {"name": str, "url": str, "pricing_url": str, "description": str, "source_url": str}
]
print(f"\nFound 5 competitors for {analysis['product_name']} in {analysis['industry_taxonomy']['l3']}:\n")
for i, c in enumerate(candidates, 1):
print(f" {i}. {c['name']} -- {c['description']}")
print(f" Product: {c['url']}")
print(f" Pricing: {c['pricing_url']}")
data = json.load(open('/tmp/pf-competitors-raw.json'))
data['competitor_candidates'] = candidates
json.dump(data, open('/tmp/pf-competitors-raw.json', 'w'), indent=2)
PYEOFTell the user: "These are the 5 competitors I'll fetch pricing data from. Add, remove, or swap any -- or say 'looks good' to continue."
Wait for confirmation. If the user edits the list, update candidates accordingly. Then write the confirmed list:
python3 << 'PYEOF'
import json
# FILL: confirmed competitor list (after user review)
confirmed = [
# {"name": str, "url": str, "pricing_url": str}
]
json.dump({"confirmed_competitors": confirmed}, open('/tmp/pf-competitors-confirmed.json', 'w'), indent=2)
print(f"Confirmed {len(confirmed)} competitors for pricing research.")
for c in confirmed:
print(f" - {c['name']} | pricing: {c['pricing_url']}")
PYEOFpython3 scripts/research.py \
--phase fetch-pricing \
--competitors /tmp/pf-competitors-confirmed.json \
--output /tmp/pf-pricing-raw.jsonThis fetches each competitor's pricing page using a 3-tier fallback:
requests + beautifulsoup4 + html2textwebcache.googleusercontent.com/search?q=cache:[url]"[competitor]" pricing plans cost per month (snippet fallback)Print fetch summary:
python3 -c "
import json
data = json.load(open('/tmp/pf-pricing-raw.json'))
print(f'Competitors fetched: {data[\"competitors_fetched\"]}')
print()
for r in data['results']:
quality_label = {'high': 'GOOD', 'medium': 'OK', 'low': 'SNIPPET ONLY'}.get(r['data_quality'], r['data_quality'])
print(f' {r[\"name\"]:20} {r[\"source\"]:15} {r[\"content_length\"]:5} chars [{quality_label}]')
"If a competitor has data_quality: low: This means the pricing page was blocked or JS-rendered. The analysis will proceed using search snippets but confidence for that competitor will be noted as low.
Print all raw pricing content:
python3 -c "
import json
data = json.load(open('/tmp/pf-pricing-raw.json'))
for r in data['results']:
print(f'\n=== {r[\"name\"]} (source: {r[\"source\"]}, quality: {r[\"data_quality\"]}) ===')
print(f'Pricing URL: {r[\"pricing_url\"]}')
print(r['content'][:4000])
print('---')
"AI instructions: For each competitor, extract structured pricing data from the content above. Follow references/extraction-guide.md for how to identify tiers, prices, limits, and CTAs.
Zero-hallucination rules:
null.data_quality: low means data came from search snippets -- extract what's there but do not fill gaps from training knowledge."not found in page data".Write to /tmp/pf-pricing-extracted.json:
python3 << 'PYEOF'
import json
# FILL: one object per competitor, following the schema below
extracted = [
# {
# "competitor": str,
# "pricing_url": str,
# "data_quality": "high" | "medium" | "low",
# "pricing_model": "per-seat" | "flat-rate" | "usage-based" | "freemium" | "tiered-flat" | "hybrid",
# "billing_cadence": ["monthly"] | ["annual"] | ["monthly", "annual"],
# "annual_discount": str, # e.g. "20%" or "not found in page data"
# "free_tier": true | false,
# "free_trial": true | false,
# "free_trial_days": int | null,
# "tiers": [
# {
# "name": str,
# "price_monthly": float | null, # null if Contact Sales
# "price_annual_monthly": float | null, # per-month equivalent when billed annually
# "price_note": str, # "Contact Sales", "Free", or empty
# "seats": str, # "per seat", "unlimited", "up to 5", etc.
# "key_limits": [str], # storage, API calls, projects, etc.
# "key_features": [str] # top 3-5 features in this tier
# }
# ],
# "enterprise_tier": true | false,
# "enterprise_pricing": str, # "Contact Sales" or actual price
# "regional_pricing": str | null # e.g. "India: ₹999/mo" or null
# }
]
json.dump(extracted, open('/tmp/pf-pricing-extracted.json', 'w'), indent=2)
print(f'Extracted pricing for {len(extracted)} competitors.')
for c in extracted:
tier_count = len(c.get('tiers', []))
print(f" {c['competitor']:20} model={c['pricing_model']:15} tiers={tier_count} quality={c['data_quality']}")
PYEOFPrint all extracted pricing data:
python3 -c "
import json
data = json.load(open('/tmp/pf-pricing-extracted.json'))
for c in data:
print(f'\n{c[\"competitor\"]} ({c[\"pricing_model\"]}, quality={c[\"data_quality\"]})')
for t in c.get('tiers', []):
price = t.get('price_monthly')
label = t.get('price_note', '')
print(f' {t[\"name\"]:15} \${price}/mo' if price is not None else f' {t[\"name\"]:15} {label}')
"AI instructions: Analyze all extracted pricing data and synthesize patterns. Follow references/positioning-guide.md for positioning analysis.
Write to /tmp/pf-patterns.json:
python3 << 'PYEOF'
import json
patterns = {
# FILL from analysis
# Dominant model across 5 competitors
"dominant_model": "", # the most common model
"model_breakdown": {}, # {"per-seat": 3, "flat-rate": 1, "freemium": 1}
"model_explanation": "", # 2 sentences: why this model dominates this space
# Price benchmarks (USD/mo, monthly billing)
"entry_tier": {
"min": None, "max": None, "median": None,
"currency": "USD/mo",
"note": "" # e.g. "based on 4/5 competitors (1 was search snippet only)"
},
"mid_tier": {
"min": None, "max": None, "median": None,
"currency": "USD/mo",
"note": ""
},
"enterprise_floor": "", # e.g. "$99+/mo" or "Contact Sales (4/5 competitors)"
# Billing patterns
"annual_discount_typical": "", # e.g. "15-20%"
"billing_cadence_dominant": "", # "monthly + annual", "monthly only", "annual only"
# Free tier / trial prevalence
"free_tier_count": 0, # how many of 5 offer free tier
"free_trial_count": 0, # how many of 5 offer free trial
"free_tier_typical_limits": [], # what's typically in a free tier
# Feature gates
"always_free_features": [], # features present in all free/entry tiers
"always_paid_features": [], # features locked behind paid in all competitors
"variable_features": [], # features that vary most across competitors
# Regional pricing
"regional_pricing_flags": [], # competitors with region-specific pricing
# Data quality
"high_quality_count": 0, # competitors with fetched page data
"low_quality_count": 0, # competitors with snippet-only data
"data_quality_flags": []
}
json.dump(patterns, open('/tmp/pf-patterns.json', 'w'), indent=2)
print('Patterns written.')
print(f"Dominant model: {patterns['dominant_model']}")
print(f"Entry tier: ${patterns['entry_tier']['min']}-${patterns['entry_tier']['max']}/mo (median ${patterns['entry_tier']['median']})")
print(f"Free tier: {patterns['free_tier_count']}/5 | Free trial: {patterns['free_trial_count']}/5")
PYEOFPrint consolidated data:
python3 -c "
import json
analysis = json.load(open('/tmp/pf-product-analysis.json'))
extracted = json.load(open('/tmp/pf-pricing-extracted.json'))
patterns = json.load(open('/tmp/pf-patterns.json'))
print('=== PRODUCT ===')
print(f'Name: {analysis[\"product_name\"]}')
print(f'What it does: {analysis[\"one_line_description\"]}')
print('Differentiators:')
for d in analysis['differentiators']:
print(f' - {d}')
print()
print('=== PATTERNS ===')
print(f'Dominant model: {patterns[\"dominant_model\"]} breakdown: {patterns[\"model_breakdown\"]}')
print(f'Entry tier: \${patterns[\"entry_tier\"][\"min\"]}-\${patterns[\"entry_tier\"][\"max\"]}/mo (median \${patterns[\"entry_tier\"][\"median\"]})')
print(f'Mid tier: \${patterns[\"mid_tier\"][\"min\"]}-\${patterns[\"mid_tier\"][\"max\"]}/mo (median \${patterns[\"mid_tier\"][\"median\"]})')
print(f'Enterprise: {patterns[\"enterprise_floor\"]}')
print(f'Free tier: {patterns[\"free_tier_count\"]}/5 | Free trial: {patterns[\"free_trial_count\"]}/5')
print()
print('=== COMPETITOR PRICING SUMMARY ===')
for c in extracted:
print(f'{c[\"competitor\"]} ({c[\"pricing_model\"]}):')
for t in c.get('tiers', []):
p = t.get('price_monthly')
print(f' {t[\"name\"]}: \${p}/mo' if p is not None else f' {t[\"name\"]}: {t.get(\"price_note\",\"\")}')
"AI instructions -- zero-hallucination rules:
free_tier_count from patterns (e.g., "3/5 competitors offer a free tier, so not offering one is a risk").differentiators list in the analysis -- not invented features.Generate:
Write to /tmp/pf-final.json:
python3 << 'PYEOF'
import json
result = {
"product_summary": {
# FILL from analysis
"product_name": "",
"one_line_description": "",
"differentiators": []
},
"competitors_researched": [], # FILL: list of competitor names
# Filled from patterns
"pricing_model_analysis": {
"dominant_model": "",
"model_breakdown": {},
"model_explanation": "",
"free_tier_count": 0,
"free_trial_count": 0,
"annual_discount_typical": ""
},
# Benchmark table (filled from extracted data)
"benchmark_table": [
# Per competitor:
# {"name": str, "model": str, "entry_price": str, "mid_price": str,
# "top_price": str, "free_tier": bool, "free_trial": bool, "data_quality": str}
],
# Market ranges
"market_ranges": {
"entry": {"min": None, "max": None, "median": None},
"mid": {"min": None, "max": None, "median": None},
"enterprise": ""
},
# Feature gate analysis
"feature_gates": {
"always_free": [],
"always_paid": [],
"most_variable": []
},
# Positioning map
"positioning_map": {
"cheap_simple": {"competitor": "", "price": ""},
"middle_market": [],
"enterprise": {"competitor": "", "note": ""},
"underserved_gap": ""
},
# Recommendation
"recommendation": {
"model": "",
"model_justification": "", # references specific data from model_breakdown
"entry_price": "", # e.g. "$12/mo"
"entry_justification": "", # references entry_tier.median
"mid_price": "",
"mid_justification": "",
"top_price": "", # price or "Contact Sales"
"top_justification": "",
"free_tier": True, # bool
"free_tier_justification": "", # references free_tier_count
"annual_discount": "", # e.g. "17%"
"annual_justification": "",
"gate_behind_paid": "", # specific differentiator from product analysis
"gate_justification": ""
},
"data_quality_flags": []
}
json.dump(result, open('/tmp/pf-final.json', 'w'), indent=2)
print('Synthesis written.')
print(f'Benchmark table: {len(result.get("benchmark_table", []))} competitors')
print(f'Recommendation model: {result.get("recommendation", {}).get("model", "--")}')
PYEOFSelf-QA:
python3 << 'PYEOF'
import json
result = json.load(open('/tmp/pf-final.json'))
failures = []
# Check 1: em dashes
full_text = json.dumps(result)
if '—' in full_text:
result = json.loads(full_text.replace('—', '-'))
failures.append('Fixed: em dashes replaced with hyphens')
# Check 2: banned words
banned = ['powerful', 'seamless', 'innovative', 'game-changing', 'revolutionize',
'cutting-edge', 'best-in-class', 'world-class', 'leverage', 'disrupt', 'transform']
for word in banned:
if word.lower() in json.dumps(result).lower():
failures.append(f'Warning: banned word "{word}" found in output')
# Check 3: recommendation completeness
rec = result.get('recommendation', {})
required = ['model', 'entry_price', 'mid_price', 'top_price', 'free_tier',
'entry_justification', 'mid_justification', 'gate_behind_paid']
for field in required:
if not rec.get(field) and rec.get(field) is not False:
failures.append(f'Warning: recommendation missing field: {field}')
# Check 4: no Contact Sales replaced with numbers
for row in result.get('benchmark_table', []):
for field in ['entry_price', 'mid_price', 'top_price']:
val = str(row.get(field, ''))
if 'contact' in val.lower():
pass # correct
elif row.get('data_quality') == 'low' and '$' in val:
failures.append(f'Warning: {row["name"]} has dollar prices from low-quality source')
# Check 5: benchmark table populated
if len(result.get('benchmark_table', [])) < 3:
failures.append(f'Warning: benchmark table has only {len(result.get("benchmark_table", []))} competitors -- need at least 3 for reliable benchmarks')
# Check 6: "not found in page data" count
nf = json.dumps(result).count('not found in page data')
if nf > 0:
failures.append(f'INFO: {nf} field(s) marked "not found in page data"')
if 'data_quality_flags' not in result:
result['data_quality_flags'] = []
result['data_quality_flags'].extend(failures)
json.dump(result, open('/tmp/pf-final.json', 'w'), indent=2)
print(f'QA complete. {len(failures)} issues.')
for f in failures:
print(f' - {f}')
if not failures:
print('All QA checks passed.')
PYEOFPresent the output:
## Pricing Intel: [product_name]
Date: [today] | Competitors: [list] | Geography: [geography]
---
### Your Product
[one_line_description]
Differentiators: [list]
---
### 1. Pricing Model Analysis
Dominant model: [dominant_model] ([N]/5 competitors)
[model_explanation -- 2-3 sentences on why this model dominates the space]
Free tier: [N]/5 competitors | Free trial: [N]/5 | Annual discount: typical [X]%
---
### 2. Price Point Benchmark Table
| Competitor | Model | Entry | Mid | Top | Free tier | Free trial | Data quality |
|---|---|---|---|---|---|---|---|
[one row per competitor from benchmark_table]
Market ranges:
- Entry tier: $[min]-$[max]/mo (median $[median])
- Mid tier: $[min]-$[max]/mo (median $[median])
- Enterprise: [enterprise_floor]
---
### 3. Feature Gate Analysis
Always free: [always_free list]
Always behind paid: [always_paid list]
Most variable across competitors: [most_variable list]
---
### 4. Competitive Positioning Map
Cheap + simple: [competitor] at $[X]/mo
Middle market: [competitors] at $[X]-$[Y]/mo
Enterprise: [competitor] (Contact Sales)
Underserved gap: [underserved_gap -- specific observation]
---
### 5. Recommended Pricing for [product_name]
Model: [model] -- [model_justification]
Entry: [entry_price] -- [entry_justification]
Mid: [mid_price] -- [mid_justification]
Top: [top_price] -- [top_justification]
Free tier: [Yes/No] -- [free_tier_justification]
Annual discount: [annual_discount] -- [annual_justification]
Gate behind paid: [gate_behind_paid] -- [gate_justification]
---
Data notes: [data_quality_flags or "None"]
Saved to: docs/pricing-intel/[PRODUCT_SLUG]-[DATE].mdSave to file and clean up:
DATE=$(date +%Y-%m-%d)
OUTPUT_FILE="docs/pricing-intel/${PRODUCT_SLUG}-${DATE}.md"
mkdir -p docs/pricing-intel
echo "Saved to: $OUTPUT_FILE"rm -f /tmp/pf-product-raw.md /tmp/pf-product-analysis.json \
/tmp/pf-competitors-raw.json /tmp/pf-competitors-confirmed.json \
/tmp/pf-pricing-raw.json /tmp/pf-pricing-extracted.json \
/tmp/pf-patterns.json /tmp/pf-final.json
echo "Temp files cleaned up."© Varnan-Tech, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 8 other files (scripts, references) in skills/pricing-finder of Varnan-Tech/opendirectory.
Open the folder on GitHubat commit 62e437a
Pricing Finder next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Pricing Finder this skillVarnan-Tech/opendirectory | 674 | — | ~6.8k | Automated safety check: Pass | MIT | |
| Pricing Strategyalirezarezvani/claude-skills | 28k | 1 repos | ~3.5k | Automated safety check: Pass | MIT | |
| Paw Mkt Pricingpawbytes/skill-suites | 113 | — | ~2.1k | Automated safety check: Pass | MIT | |
| Pricemenkesu/awesome-pm-skills | 433 | — | ~5.3k | Automated safety check: Pass | Custom licence | |
| Pricing StrategyOpenClaudia/openclaudia-skills | 713 | — | ~1.8k | Automated safety check: Pass | MIT | |
| Suede PricingJasonColapietro/suede-creator-skills | 127 | — | ~2.4k | Automated safety check: Pass | MIT |
alirezarezvani/claude-skills
Design, optimize, and communicate SaaS pricing — tier structure, value metrics, pricing pages, and price increase strategy.
pawbytes/skill-suites
Pricing models, tier packaging, and willingness-to-pay research.
menkesu/awesome-pm-skills
Builds a pricing model, packaging/tier structure and willingness-to-pay research plan, then grades your existing pricing page or plan.
OpenClaudia/openclaudia-skills
Optimize pricing pages, pricing models, and pricing strategy.
JasonColapietro/suede-creator-skills
Suede-owned pricing and packaging discipline. An agent skill from JasonColapietro/suede-creator-skills.
OneWave-AI/claude-skills
Monitor competitor pricing pages and send alerts when prices change.
Varnan-Tech/opendirectory
Creates professionally designed B2B SaaS e-books in HTML + CSS, exported as print-ready PDF.
Varnan-Tech/opendirectory
Generates and updates README.md and API reference docs by reading your codebase's functions, routes, types, schemas, and architecture.
Varnan-Tech/opendirectory
Generates data visualization charts (bar, line, area, pie, doughnut, scatter, radar, treemap) as PNG using Apache ECharts v6.
Varnan-Tech/opendirectory
Creates animated looping GIFs from CSS animations (default) or AI image-to-video.
Varnan-Tech/opendirectory
Given a product description, category keywords, or competitor names (any combination), searches Reddit, Hacker News, GitHub Issues, G2, and Google Trends for the real pains your market experiences…
Varnan-Tech/opendirectory
Aggregates RSS feeds from the past week, synthesizes the top stories using Gemini, and publishes a newsletter digest to Ghost CMS.
Categories
Tell it what your product is (URL or description) and it finds 5 competitors globally, fetches their actual pricing pages, extracts every tier and price point, and returns a complete pricing…. Pricing Finder is an agent skill from Varnan-Tech/opendirectory. Tell it what your product is (URL or description) and it finds 5 competitors globally, fetches their actual pricing pages, extracts every tier and price point, and returns a complete pricing intelligence report: the dominant pricing model in your space, a benchmark price table, feature gate analysis, competitive positioning map, and a concrete recommended pricing strategy for your product.
Pricing Finder fits situations like: asked to research competitor pricing; find pricing benchmarks; decide how to price a product; understand pricing models in a space.
Run `npx skills add Varnan-Tech/opendirectory --skill pricing-finder -a claude-code`. Or copy the skill folder (skills/pricing-finder in Varnan-Tech/opendirectory) into .claude/skills/pricing-finder in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Varnan-Tech/opendirectory --skill pricing-finder -a codex`. Or copy the skill folder (skills/pricing-finder in Varnan-Tech/opendirectory) into .agents/skills/pricing-finder in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Varnan-Tech/opendirectory --skill pricing-finder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pricing-finder, .gemini/skills/pricing-finder, .github/skills/pricing-finder and .opencode/skills/pricing-finder in your project.
Going by SKILL.md and its folder, Pricing Finder needs Python for the scripts in its folder, the command-line tools its instructions call (python3, curl and pip) and credentials named FIRECRAWL_API_KEY and TAVILY_API_KEY. Our summary lists: Python 3; A credential in TAVILY_API_KEY; A credential in FIRECRAWL_API_KEY. Compatibility (from SKILL.md): ["claude-code","gemini-cli","github-copilot"].
SKILL.md names 1 domain. In commands or code: api.firecrawl.dev; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Pricing Finder is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.8k tokens (SKILL.md is roughly 27k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.9k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Pricing Finder: Pricing Strategy (alirezarezvani/claude-skills, 28k stars), Paw Mkt Pricing (pawbytes/skill-suites, 113 stars), Price (menkesu/awesome-pm-skills, 433 stars) and Pricing Strategy (OpenClaudia/openclaudia-skills, 713 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Varnan-Tech (a GitHub organization) maintains it in Varnan-Tech/opendirectory, which has 674 GitHub stars. The repository holds 61 skills in this directory. The repository was last updated on August 16, 2026.
Source: Varnan-Tech/opendirectory on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.