{"id":"b915f1da-3736-4acf-bb99-88682db13060","shortId":"5LzRXw","kind":"skill","title":"pricing-finder","tagline":"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, f","description":"# Pricing Finder\n\nTell 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.\n\n**Zero required API keys.** Runs entirely on free pip dependencies. Optional API keys improve quality.\n\n---\n\n**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:\n- Competitor prices: extracted verbatim from fetched page content only\n- \"Contact Sales\": recorded as-is, never estimated or replaced with a number\n- Tier names: copied exactly from the page, not paraphrased\n- Feature lists: extracted from page content, not inferred from product knowledge\n- Positioning observations: derived from the benchmark table data only\n\n---\n\n## Common Mistakes\n\n| The agent will want to... | Why that's wrong |\n|---|---|\n| Fill in \"Contact Sales\" with an estimated price | Never estimate enterprise pricing. Record it as \"Contact Sales\" exactly. |\n| Use training knowledge for competitor prices | Every price must trace to fetched page content or a search snippet. |\n| Skip the competitor confirmation step | Always show discovered competitors and wait for confirmation. Wrong competitors = wrong benchmarks. |\n| Recommend a price without referencing benchmark data | Every price recommendation must cite a specific number from the benchmark table. |\n| 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. |\n| Use em dashes in output | Replace all em dashes with hyphens. |\n\n---\n\n## Read Reference Files Before Each Run\n\n```bash\ncat references/pricing-models.md\ncat references/extraction-guide.md\ncat references/positioning-guide.md\n```\n\n---\n\n## Step 1: Setup Check\n\n```bash\necho \"TAVILY_API_KEY:    ${TAVILY_API_KEY:+set (search quality enhanced)}${TAVILY_API_KEY:-not set, DuckDuckGo will be used (free)}\"\necho \"FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:+set (JS rendering enhanced)}${FIRECRAWL_API_KEY:-not set, requests+BS4 will be used (free)}\"\necho \"\"\npython3 -c \"from ddgs import DDGS; import requests, bs4, html2text; print('Dependencies OK')\" 2>/dev/null \\\n  || echo \"ERROR: Missing dependencies. Run: pip install ddgs requests beautifulsoup4 html2text\"\n```\n\n**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.\"\n\n**If only API keys are missing:** Continue. DuckDuckGo and requests+BS4 are the free defaults.\n\nDerive product slug:\n\n```bash\nPRODUCT_SLUG=$(python3 -c \"\nfrom urllib.parse import urlparse\nimport sys, re\nurl = 'URL_HERE'\nif url.startswith('http'):\n    host = urlparse(url).netloc.replace('www.', '')\n    print(host.split('.')[0])\nelse:\n    print(re.sub(r'[^a-z0-9]', '-', url[:30].lower()).strip('-'))\n\")\necho \"Product slug: $PRODUCT_SLUG\"\n```\n\n---\n\n## Step 2: Parse Input\n\nCollect from the conversation:\n- `product_url`: the URL to fetch (required, unless user pastes a description directly)\n- `geography`: optional -- US / Europe / India / global. Default: US\n\n**If 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`.\n\n**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.\"\n\n---\n\n## Step 3: Fetch Product Page\n\n**Primary: Firecrawl (if FIRECRAWL_API_KEY is set)**\n\n```bash\ncurl -s -X POST https://api.firecrawl.dev/v1/scrape \\\n  -H \"Authorization: Bearer $FIRECRAWL_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"url\": \"URL_HERE\", \"formats\": [\"markdown\"], \"onlyMainContent\": true}' \\\n  | python3 -c \"\nimport sys, json\nd = json.load(sys.stdin)\ncontent = d.get('data', {}).get('markdown', '') or d.get('markdown', '')\nprint(f'Fetched via Firecrawl: {len(content)} characters')\nopen('/tmp/pf-product-raw.md', 'w').write(content)\n\"\n```\n\n**Fallback: requests + BS4 (free, always available)**\n\n```bash\npython3 << 'PYEOF'\nimport requests, html2text, random\n\nUSER_AGENTS = [\n    \"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\",\n    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\",\n]\nheaders = {\"User-Agent\": random.choice(USER_AGENTS), \"Accept\": \"text/html,application/xhtml+xml;q=0.9,*/*;q=0.8\"}\nresp = requests.get(\"URL_HERE\", headers=headers, timeout=20, allow_redirects=True)\nconverter = html2text.HTML2Text()\nconverter.ignore_images = True\nconverter.body_width = 0\ncontent = converter.handle(resp.text)[:8000]\nprint(f'Fetched via requests+BS4: {len(content)} characters')\nopen('/tmp/pf-product-raw.md', 'w').write(content)\nPYEOF\n```\n\n**Checkpoint:**\n\n```bash\npython3 -c \"\ncontent = open('/tmp/pf-product-raw.md').read()\nif len(content) < 200:\n    print('ERROR: fewer than 200 characters fetched -- page may be JS-rendered')\nelse:\n    print(f'Content OK: {len(content)} characters')\n\"\n```\n\n**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.\"\n\n---\n\n## Step 4: Product Analysis (AI)\n\nPrint page content:\n\n```bash\npython3 -c \"\ncontent = open('/tmp/pf-product-raw.md').read()[:5000]\nprint('=== PRODUCT PAGE (first 5000 chars) ===')\nprint(content)\n\"\n```\n\n**AI instructions:** Analyze the product page above and extract:\n\n- `product_name`: the product or company name\n- `one_line_description`: what it does, for whom, core value prop. Under 20 words. No marketing language.\n- `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.)\n- `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.\n- `icp`: `buyer_persona` (job title), `company_type`, `company_size`\n- `geography_bias`: US / Europe / India / global\n- `page_source`: \"live_page\" or \"user_description\"\n\nWrite to `/tmp/pf-product-analysis.json`:\n\n```bash\npython3 << 'PYEOF'\nimport json\n\nanalysis = {\n    # FILL from your analysis above\n    \"product_name\": \"\",\n    \"one_line_description\": \"\",\n    \"industry_taxonomy\": {\"l1\": \"\", \"l2\": \"\", \"l3\": \"\"},\n    \"differentiators\": [],\n    \"icp\": {\"buyer_persona\": \"\", \"company_type\": \"\", \"company_size\": \"\"},\n    \"geography_bias\": \"US\",\n    \"page_source\": \"live_page\"\n}\n\njson.dump(analysis, open('/tmp/pf-product-analysis.json', 'w'), indent=2)\nprint('Product analysis written.')\nPYEOF\n```\n\nVerify:\n\n```bash\npython3 -c \"\nimport json\na = json.load(open('/tmp/pf-product-analysis.json'))\nprint('Product:', a['product_name'])\nprint('Industry:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])\nprint('Differentiators:')\nfor d in a['differentiators']:\n    print(f'  - {d}')\n\"\n```\n\n---\n\n## Step 4b: Phase 1 -- Competitor Discovery\n\n```bash\nls scripts/research.py 2>/dev/null && echo \"script found\" || echo \"ERROR: scripts/research.py not found -- cannot continue\"\n```\n\n```bash\npython3 scripts/research.py \\\n  --phase discover \\\n  --product-analysis /tmp/pf-product-analysis.json \\\n  --output /tmp/pf-competitors-raw.json\n```\n\nPrint results for AI review:\n\n```bash\npython3 -c \"\nimport json\ndata = json.load(open('/tmp/pf-competitors-raw.json'))\nprint(f'Searches run: {len(data[\\\"competitor_searches\\\"])}')\nfor s in data['competitor_searches']:\n    print(f'\\nQuery: {s[\\\"query\\\"]}')\n    for r in s.get('results', [])[:6]:\n        print(f'  - {r[\\\"title\\\"]} | {r[\\\"url\\\"]}')\n        print(f'    {r.get(\\\"snippet\\\",\\\"\\\")[:150]}')\n\"\n```\n\n**AI instructions:** Read the search results above. Pick exactly 5 competitor companies that:\n1. Are named in the search result titles or snippets\n2. Are in the same L3 niche as the product being analyzed\n3. Are actual software products (not agencies, list articles, or review sites)\n4. Are distinct from each other\n\nFor 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`.\n\n---\n\n## Step 5: Competitor Confirmation\n\n```bash\npython3 << 'PYEOF'\nimport json\n\nanalysis = json.load(open('/tmp/pf-product-analysis.json'))\n\n# FILL: 5 competitors from the search results above\ncandidates = [\n    # {\"name\": str, \"url\": str, \"pricing_url\": str, \"description\": str, \"source_url\": str}\n]\n\nprint(f\"\\nFound 5 competitors for {analysis['product_name']} in {analysis['industry_taxonomy']['l3']}:\\n\")\nfor i, c in enumerate(candidates, 1):\n    print(f\"  {i}. {c['name']} -- {c['description']}\")\n    print(f\"     Product: {c['url']}\")\n    print(f\"     Pricing: {c['pricing_url']}\")\n\ndata = json.load(open('/tmp/pf-competitors-raw.json'))\ndata['competitor_candidates'] = candidates\njson.dump(data, open('/tmp/pf-competitors-raw.json', 'w'), indent=2)\nPYEOF\n```\n\nTell the user: \"These are the 5 competitors I'll fetch pricing data from. Add, remove, or swap any -- or say 'looks good' to continue.\"\n\n**Wait for confirmation.** If the user edits the list, update candidates accordingly. Then write the confirmed list:\n\n```bash\npython3 << 'PYEOF'\nimport json\n\n# FILL: confirmed competitor list (after user review)\nconfirmed = [\n    # {\"name\": str, \"url\": str, \"pricing_url\": str}\n]\n\njson.dump({\"confirmed_competitors\": confirmed}, open('/tmp/pf-competitors-confirmed.json', 'w'), indent=2)\nprint(f\"Confirmed {len(confirmed)} competitors for pricing research.\")\nfor c in confirmed:\n    print(f\"  - {c['name']} | pricing: {c['pricing_url']}\")\nPYEOF\n```\n\n---\n\n## Step 6: Phase 2 -- Fetch Pricing Pages\n\n```bash\npython3 scripts/research.py \\\n  --phase fetch-pricing \\\n  --competitors /tmp/pf-competitors-confirmed.json \\\n  --output /tmp/pf-pricing-raw.json\n```\n\nThis fetches each competitor's pricing page using a 3-tier fallback:\n1. Direct fetch: `requests` + `beautifulsoup4` + `html2text`\n2. Google cache: `webcache.googleusercontent.com/search?q=cache:[url]`\n3. DuckDuckGo search: `\"[competitor]\" pricing plans cost per month` (snippet fallback)\n\nPrint fetch summary:\n\n```bash\npython3 -c \"\nimport json\ndata = json.load(open('/tmp/pf-pricing-raw.json'))\nprint(f'Competitors fetched: {data[\\\"competitors_fetched\\\"]}')\nprint()\nfor r in data['results']:\n    quality_label = {'high': 'GOOD', 'medium': 'OK', 'low': 'SNIPPET ONLY'}.get(r['data_quality'], r['data_quality'])\n    print(f'  {r[\\\"name\\\"]:20} {r[\\\"source\\\"]:15} {r[\\\"content_length\\\"]:5} chars  [{quality_label}]')\n\"\n```\n\n**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.\n\n---\n\n## Step 7: Pricing Extraction (AI)\n\nPrint all raw pricing content:\n\n```bash\npython3 -c \"\nimport json\ndata = json.load(open('/tmp/pf-pricing-raw.json'))\nfor r in data['results']:\n    print(f'\\n=== {r[\\\"name\\\"]} (source: {r[\\\"source\\\"]}, quality: {r[\\\"data_quality\\\"]}) ===')\n    print(f'Pricing URL: {r[\\\"pricing_url\\\"]}')\n    print(r['content'][:4000])\n    print('---')\n\"\n```\n\n**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.\n\nZero-hallucination rules:\n1. Extract prices verbatim from content only. If a price is not in the content, write `null`.\n2. Record \"Contact Sales\" exactly as-is. Never replace with an estimated number.\n3. `data_quality: low` means data came from search snippets -- extract what's there but do not fill gaps from training knowledge.\n4. For any field not present in the content: write `\"not found in page data\"`.\n5. Annual prices: always record the per-month equivalent alongside the annual total.\n\nWrite to `/tmp/pf-pricing-extracted.json`:\n\n```bash\npython3 << 'PYEOF'\nimport json\n\n# FILL: one object per competitor, following the schema below\nextracted = [\n    # {\n    #   \"competitor\": str,\n    #   \"pricing_url\": str,\n    #   \"data_quality\": \"high\" | \"medium\" | \"low\",\n    #   \"pricing_model\": \"per-seat\" | \"flat-rate\" | \"usage-based\" | \"freemium\" | \"tiered-flat\" | \"hybrid\",\n    #   \"billing_cadence\": [\"monthly\"] | [\"annual\"] | [\"monthly\", \"annual\"],\n    #   \"annual_discount\": str,           # e.g. \"20%\" or \"not found in page data\"\n    #   \"free_tier\": true | false,\n    #   \"free_trial\": true | false,\n    #   \"free_trial_days\": int | null,\n    #   \"tiers\": [\n    #     {\n    #       \"name\": str,\n    #       \"price_monthly\": float | null,       # null if Contact Sales\n    #       \"price_annual_monthly\": float | null, # per-month equivalent when billed annually\n    #       \"price_note\": str,                   # \"Contact Sales\", \"Free\", or empty\n    #       \"seats\": str,                        # \"per seat\", \"unlimited\", \"up to 5\", etc.\n    #       \"key_limits\": [str],                 # storage, API calls, projects, etc.\n    #       \"key_features\": [str]                # top 3-5 features in this tier\n    #     }\n    #   ],\n    #   \"enterprise_tier\": true | false,\n    #   \"enterprise_pricing\": str,               # \"Contact Sales\" or actual price\n    #   \"regional_pricing\": str | null           # e.g. \"India: ₹999/mo\" or null\n    # }\n]\n\njson.dump(extracted, open('/tmp/pf-pricing-extracted.json', 'w'), indent=2)\nprint(f'Extracted pricing for {len(extracted)} competitors.')\nfor c in extracted:\n    tier_count = len(c.get('tiers', []))\n    print(f\"  {c['competitor']:20} model={c['pricing_model']:15} tiers={tier_count} quality={c['data_quality']}\")\nPYEOF\n```\n\n---\n\n## Step 8: Pattern Analysis (AI)\n\nPrint all extracted pricing data:\n\n```bash\npython3 -c \"\nimport json\ndata = json.load(open('/tmp/pf-pricing-extracted.json'))\nfor c in data:\n    print(f'\\n{c[\\\"competitor\\\"]} ({c[\\\"pricing_model\\\"]}, quality={c[\\\"data_quality\\\"]})')\n    for t in c.get('tiers', []):\n        price = t.get('price_monthly')\n        label = t.get('price_note', '')\n        print(f'  {t[\\\"name\\\"]:15} \\${price}/mo' if price is not None else f'  {t[\\\"name\\\"]:15} {label}')\n\"\n```\n\n**AI instructions:** Analyze all extracted pricing data and synthesize patterns. Follow `references/positioning-guide.md` for positioning analysis.\n\nWrite to `/tmp/pf-patterns.json`:\n\n```bash\npython3 << 'PYEOF'\nimport json\n\npatterns = {\n    # FILL from analysis\n\n    # Dominant model across 5 competitors\n    \"dominant_model\": \"\",                         # the most common model\n    \"model_breakdown\": {},                        # {\"per-seat\": 3, \"flat-rate\": 1, \"freemium\": 1}\n    \"model_explanation\": \"\",                      # 2 sentences: why this model dominates this space\n\n    # Price benchmarks (USD/mo, monthly billing)\n    \"entry_tier\": {\n        \"min\": None, \"max\": None, \"median\": None,\n        \"currency\": \"USD/mo\",\n        \"note\": \"\"                                # e.g. \"based on 4/5 competitors (1 was search snippet only)\"\n    },\n    \"mid_tier\": {\n        \"min\": None, \"max\": None, \"median\": None,\n        \"currency\": \"USD/mo\",\n        \"note\": \"\"\n    },\n    \"enterprise_floor\": \"\",                       # e.g. \"$99+/mo\" or \"Contact Sales (4/5 competitors)\"\n\n    # Billing patterns\n    \"annual_discount_typical\": \"\",                # e.g. \"15-20%\"\n    \"billing_cadence_dominant\": \"\",               # \"monthly + annual\", \"monthly only\", \"annual only\"\n\n    # Free tier / trial prevalence\n    \"free_tier_count\": 0,                         # how many of 5 offer free tier\n    \"free_trial_count\": 0,                        # how many of 5 offer free trial\n    \"free_tier_typical_limits\": [],               # what's typically in a free tier\n\n    # Feature gates\n    \"always_free_features\": [],                   # features present in all free/entry tiers\n    \"always_paid_features\": [],                   # features locked behind paid in all competitors\n    \"variable_features\": [],                      # features that vary most across competitors\n\n    # Regional pricing\n    \"regional_pricing_flags\": [],                 # competitors with region-specific pricing\n\n    # Data quality\n    \"high_quality_count\": 0,                      # competitors with fetched page data\n    \"low_quality_count\": 0,                       # competitors with snippet-only data\n    \"data_quality_flags\": []\n}\n\njson.dump(patterns, open('/tmp/pf-patterns.json', 'w'), indent=2)\nprint('Patterns written.')\nprint(f\"Dominant model: {patterns['dominant_model']}\")\nprint(f\"Entry tier: ${patterns['entry_tier']['min']}-${patterns['entry_tier']['max']}/mo (median ${patterns['entry_tier']['median']})\")\nprint(f\"Free tier: {patterns['free_tier_count']}/5 | Free trial: {patterns['free_trial_count']}/5\")\nPYEOF\n```\n\n---\n\n## Step 9: Positioning Map + Recommendation (AI)\n\nPrint consolidated data:\n\n```bash\npython3 -c \"\nimport json\n\nanalysis  = json.load(open('/tmp/pf-product-analysis.json'))\nextracted = json.load(open('/tmp/pf-pricing-extracted.json'))\npatterns  = json.load(open('/tmp/pf-patterns.json'))\n\nprint('=== PRODUCT ===')\nprint(f'Name: {analysis[\\\"product_name\\\"]}')\nprint(f'What it does: {analysis[\\\"one_line_description\\\"]}')\nprint('Differentiators:')\nfor d in analysis['differentiators']:\n    print(f'  - {d}')\n\nprint()\nprint('=== PATTERNS ===')\nprint(f'Dominant model: {patterns[\\\"dominant_model\\\"]}  breakdown: {patterns[\\\"model_breakdown\\\"]}')\nprint(f'Entry tier: \\${patterns[\\\"entry_tier\\\"][\\\"min\\\"]}-\\${patterns[\\\"entry_tier\\\"][\\\"max\\\"]}/mo (median \\${patterns[\\\"entry_tier\\\"][\\\"median\\\"]})')\nprint(f'Mid tier:   \\${patterns[\\\"mid_tier\\\"][\\\"min\\\"]}-\\${patterns[\\\"mid_tier\\\"][\\\"max\\\"]}/mo (median \\${patterns[\\\"mid_tier\\\"][\\\"median\\\"]})')\nprint(f'Enterprise: {patterns[\\\"enterprise_floor\\\"]}')\nprint(f'Free tier: {patterns[\\\"free_tier_count\\\"]}/5 | Free trial: {patterns[\\\"free_trial_count\\\"]}/5')\n\nprint()\nprint('=== COMPETITOR PRICING SUMMARY ===')\nfor c in extracted:\n    print(f'{c[\\\"competitor\\\"]} ({c[\\\"pricing_model\\\"]}):')\n    for t in c.get('tiers', []):\n        p = t.get('price_monthly')\n        print(f'  {t[\\\"name\\\"]}: \\${p}/mo' if p is not None else f'  {t[\\\"name\\\"]}: {t.get(\\\"price_note\\\",\\\"\\\")}')\n\"\n```\n\n**AI instructions -- zero-hallucination rules:**\n\n1. **Positioning map:** Name specific competitors from the extracted data. No invented observations.\n2. **Underserved gap:** Must reference a specific price range or model type absent from the data.\n3. **Every price recommendation:** Must cite a specific number from the patterns JSON (entry_tier.median, mid_tier.median, etc.).\n4. **Free tier recommendation:** Must reference `free_tier_count` from patterns (e.g., \"3/5 competitors offer a free tier, so not offering one is a risk\").\n5. **Differentiator gate:** Choose from the product's `differentiators` list in the analysis -- not invented features.\n6. No em dashes. No banned words (powerful, seamless, game-changing, revolutionary, cutting-edge, leverage).\n\n**Generate:**\n\n1. Positioning map: who owns each quadrant (cheap+simple, middle, enterprise), and the underserved gap\n2. Recommended pricing strategy: model + all tier prices + free tier decision + annual discount + what to gate\n\nWrite to `/tmp/pf-final.json`:\n\n```bash\npython3 << 'PYEOF'\nimport json\n\nresult = {\n    \"product_summary\": {\n        # FILL from analysis\n        \"product_name\": \"\",\n        \"one_line_description\": \"\",\n        \"differentiators\": []\n    },\n    \"competitors_researched\": [],  # FILL: list of competitor names\n\n    # Filled from patterns\n    \"pricing_model_analysis\": {\n        \"dominant_model\": \"\",\n        \"model_breakdown\": {},\n        \"model_explanation\": \"\",\n        \"free_tier_count\": 0,\n        \"free_trial_count\": 0,\n        \"annual_discount_typical\": \"\"\n    },\n\n    # Benchmark table (filled from extracted data)\n    \"benchmark_table\": [\n        # Per competitor:\n        # {\"name\": str, \"model\": str, \"entry_price\": str, \"mid_price\": str,\n        #  \"top_price\": str, \"free_tier\": bool, \"free_trial\": bool, \"data_quality\": str}\n    ],\n\n    # Market ranges\n    \"market_ranges\": {\n        \"entry\": {\"min\": None, \"max\": None, \"median\": None},\n        \"mid\":   {\"min\": None, \"max\": None, \"median\": None},\n        \"enterprise\": \"\"\n    },\n\n    # Feature gate analysis\n    \"feature_gates\": {\n        \"always_free\": [],\n        \"always_paid\": [],\n        \"most_variable\": []\n    },\n\n    # Positioning map\n    \"positioning_map\": {\n        \"cheap_simple\": {\"competitor\": \"\", \"price\": \"\"},\n        \"middle_market\": [],\n        \"enterprise\": {\"competitor\": \"\", \"note\": \"\"},\n        \"underserved_gap\": \"\"\n    },\n\n    # Recommendation\n    \"recommendation\": {\n        \"model\": \"\",\n        \"model_justification\": \"\",       # references specific data from model_breakdown\n        \"entry_price\": \"\",               # e.g. \"$12/mo\"\n        \"entry_justification\": \"\",       # references entry_tier.median\n        \"mid_price\": \"\",\n        \"mid_justification\": \"\",\n        \"top_price\": \"\",                 # price or \"Contact Sales\"\n        \"top_justification\": \"\",\n        \"free_tier\": True,               # bool\n        \"free_tier_justification\": \"\",   # references free_tier_count\n        \"annual_discount\": \"\",           # e.g. \"17%\"\n        \"annual_justification\": \"\",\n        \"gate_behind_paid\": \"\",          # specific differentiator from product analysis\n        \"gate_justification\": \"\"\n    },\n\n    \"data_quality_flags\": []\n}\n\njson.dump(result, open('/tmp/pf-final.json', 'w'), indent=2)\nprint('Synthesis written.')\nprint(f'Benchmark table: {len(result.get(\"benchmark_table\", []))} competitors')\nprint(f'Recommendation model: {result.get(\"recommendation\", {}).get(\"model\", \"--\")}')\nPYEOF\n```\n\n---\n\n## Step 10: Self-QA, Present, and Save\n\n**Self-QA:**\n\n```bash\npython3 << 'PYEOF'\nimport json\n\nresult = json.load(open('/tmp/pf-final.json'))\nfailures = []\n\n# Check 1: em dashes\nfull_text = json.dumps(result)\nif '—' in full_text:\n    result = json.loads(full_text.replace('—', '-'))\n    failures.append('Fixed: em dashes replaced with hyphens')\n\n# Check 2: banned words\nbanned = ['powerful', 'seamless', 'innovative', 'game-changing', 'revolutionize',\n          'cutting-edge', 'best-in-class', 'world-class', 'leverage', 'disrupt', 'transform']\nfor word in banned:\n    if word.lower() in json.dumps(result).lower():\n        failures.append(f'Warning: banned word \"{word}\" found in output')\n\n# Check 3: recommendation completeness\nrec = result.get('recommendation', {})\nrequired = ['model', 'entry_price', 'mid_price', 'top_price', 'free_tier',\n            'entry_justification', 'mid_justification', 'gate_behind_paid']\nfor field in required:\n    if not rec.get(field) and rec.get(field) is not False:\n        failures.append(f'Warning: recommendation missing field: {field}')\n\n# Check 4: no Contact Sales replaced with numbers\nfor row in result.get('benchmark_table', []):\n    for field in ['entry_price', 'mid_price', 'top_price']:\n        val = str(row.get(field, ''))\n        if 'contact' in val.lower():\n            pass  # correct\n        elif row.get('data_quality') == 'low' and '$' in val:\n            failures.append(f'Warning: {row[\"name\"]} has dollar prices from low-quality source')\n\n# Check 5: benchmark table populated\nif len(result.get('benchmark_table', [])) < 3:\n    failures.append(f'Warning: benchmark table has only {len(result.get(\"benchmark_table\", []))} competitors -- need at least 3 for reliable benchmarks')\n\n# Check 6: \"not found in page data\" count\nnf = json.dumps(result).count('not found in page data')\nif nf > 0:\n    failures.append(f'INFO: {nf} field(s) marked \"not found in page data\"')\n\nif 'data_quality_flags' not in result:\n    result['data_quality_flags'] = []\nresult['data_quality_flags'].extend(failures)\n\njson.dump(result, open('/tmp/pf-final.json', 'w'), indent=2)\nprint(f'QA complete. {len(failures)} issues.')\nfor f in failures:\n    print(f'  - {f}')\nif not failures:\n    print('All QA checks passed.')\nPYEOF\n```\n\n**Present the output:**\n\n```\n## Pricing Intel: [product_name]\nDate: [today] | Competitors: [list] | Geography: [geography]\n\n---\n\n### Your Product\n[one_line_description]\nDifferentiators: [list]\n\n---\n\n### 1. Pricing Model Analysis\nDominant model: [dominant_model] ([N]/5 competitors)\n[model_explanation -- 2-3 sentences on why this model dominates the space]\n\nFree tier: [N]/5 competitors | Free trial: [N]/5 | Annual discount: typical [X]%\n\n---\n\n### 2. Price Point Benchmark Table\n| Competitor | Model | Entry | Mid | Top | Free tier | Free trial | Data quality |\n|---|---|---|---|---|---|---|---|\n[one row per competitor from benchmark_table]\n\nMarket ranges:\n- Entry tier: $[min]-$[max]/mo (median $[median])\n- Mid tier:   $[min]-$[max]/mo (median $[median])\n- Enterprise: [enterprise_floor]\n\n---\n\n### 3. Feature Gate Analysis\nAlways free: [always_free list]\nAlways behind paid: [always_paid list]\nMost variable across competitors: [most_variable list]\n\n---\n\n### 4. Competitive Positioning Map\nCheap + simple: [competitor] at $[X]/mo\nMiddle market:  [competitors] at $[X]-$[Y]/mo\nEnterprise:     [competitor] (Contact Sales)\nUnderserved gap: [underserved_gap -- specific observation]\n\n---\n\n### 5. Recommended Pricing for [product_name]\nModel: [model] -- [model_justification]\nEntry: [entry_price] -- [entry_justification]\nMid:   [mid_price] -- [mid_justification]\nTop:   [top_price] -- [top_justification]\nFree tier: [Yes/No] -- [free_tier_justification]\nAnnual discount: [annual_discount] -- [annual_justification]\nGate behind paid: [gate_behind_paid] -- [gate_justification]\n\n---\nData notes: [data_quality_flags or \"None\"]\nSaved to: docs/pricing-intel/[PRODUCT_SLUG]-[DATE].md\n```\n\n**Save to file and clean up:**\n\n```bash\nDATE=$(date +%Y-%m-%d)\nOUTPUT_FILE=\"docs/pricing-intel/${PRODUCT_SLUG}-${DATE}.md\"\nmkdir -p docs/pricing-intel\necho \"Saved to: $OUTPUT_FILE\"\n```\n\n```bash\nrm -f /tmp/pf-product-raw.md /tmp/pf-product-analysis.json \\\n      /tmp/pf-competitors-raw.json /tmp/pf-competitors-confirmed.json \\\n      /tmp/pf-pricing-raw.json /tmp/pf-pricing-extracted.json \\\n      /tmp/pf-patterns.json /tmp/pf-final.json\necho \"Temp files cleaned up.\"\n```","tags":["pricing","finder","opendirectory","varnan-tech","agent-skills","gtm","hermes-agent","openclaw-skills","skills","technical-seo"],"capabilities":["skill","source-varnan-tech","skill-pricing-finder","topic-agent-skills","topic-gtm","topic-hermes-agent","topic-openclaw-skills","topic-skills","topic-technical-seo"],"categories":["opendirectory"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Varnan-Tech/opendirectory/pricing-finder","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Varnan-Tech/opendirectory","source_repo":"https://github.com/Varnan-Tech/opendirectory","install_from":"skills.sh"}},"qualityScore":"0.504","qualityRationale":"deterministic score 0.50 from registry signals: · indexed on github topic:agent-skills · 108 github stars · SKILL.md body (26,709 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-25T18:55:05.192Z","embedding":null,"createdAt":"2026-04-24T06:56:05.440Z","updatedAt":"2026-04-25T18:55:05.192Z","lastSeenAt":"2026-04-25T18:55:05.192Z","tsv":"'-20':2077 '-3':921,3094 '-5':1829 '/5':2231,2238,2357,2364,3089,3106,3111 '/dev/null':389,1065 '/mo':1951,2064,2217,2319,2337,2395,3145,3152,3189,3196 '/pricing':1204 '/search?q=cache:[url]':1441 '/tmp/pf-competitors-confirmed.json':1374,1415,3299 '/tmp/pf-competitors-raw.json':1086,1100,1294,1302,3298 '/tmp/pf-final.json':2551,2740,2784,3033,3303 '/tmp/pf-patterns.json':1980,2191,2265,3302 '/tmp/pf-pricing-extracted.json':1704,1858,1915,2261,3301 '/tmp/pf-pricing-raw.json':1417,1464,1562,3300 '/tmp/pf-product-analysis.json':967,1007,1025,1084,1229,2257,3297 '/tmp/pf-product-raw.md':660,754,765,846,3296 '/v1/scrape':615 '0':475,739,2094,2105,2169,2178,2591,2595,3000 '0.8':720 '0.9':718 '1':327,1058,1150,1272,1430,1620,2010,2012,2044,2414,2518,2787,3080 '10':685,2766 '10.0':697 '12/mo':2690 '15':686,1501,1888,1949,1961,2076 '150':1136 '17':2721 '2':388,494,920,1010,1064,1160,1305,1377,1403,1436,1637,1861,2015,2194,2427,2533,2743,2809,3036,3093,3116 '20':728,885,1498,1756,1883 '200':770,775,794 '3':534,596,1172,1427,1442,1651,1828,2006,2443,2853,2961,2977,3158 '3/5':2471 '30':485 '4':536,541,834,1184,1673,2459,2898,3180 '4/5':2042,2068 '4000':1590 '4b':1056 '5':16,60,1146,1218,1231,1254,1313,1505,1688,1814,1993,2098,2109,2484,2952,3207 '500':282,284 '5000':848,853 '6':1125,1401,2500,2982 '7':687,1545 '8':1898 '8000':743 '9':483,2241 '99':2063 '999/mo':1852 'a-z0':480 'absent':2439 'accept':713,942 'accord':1343 'account':427 'across':1992,2151,3175 'actual':21,64,1174,1844 'add':1321 'agenc':1178 'agent':194,678,709,712 'ai':837,857,1090,1137,1548,1592,1901,1963,2245,2408 'allow':729 'alongsid':1698 'alway':243,668,1691,2126,2135,2655,2657,3162,3164,3167,3170 'analysi':84,543,836,973,977,1005,1013,1083,1226,1257,1261,1528,1900,1977,1989,2254,2271,2279,2288,2496,2562,2581,2652,2731,3083,3161 'analyz':859,1171,1965 'annual':1689,1700,1749,1751,1752,1788,1798,2072,2082,2085,2544,2596,2718,2722,3112,3238,3240,3242 'answer':935 'api':97,106,333,336,343,354,357,364,434,604,620,1820 'api.firecrawl.dev':614 'api.firecrawl.dev/v1/scrape':613 'applewebkit/537.36':688,700 'appli':138 'application/json':626 'application/xhtml':715 'articl':1180 'as-i':152,1642 'ask':568 'async':915 'author':617 'autom':912 'avail':669 'ban':2505,2810,2812,2836,2846 'base':1740,2040 'bash':319,330,450,608,670,760,841,968,1017,1061,1076,1092,1221,1349,1407,1456,1554,1705,1907,1981,2249,2552,2776,3272,3293 'bearer':618 'beautifulsoup4':399,422,1434 'behind':2140,2725,2874,3168,3245,3248 'benchmark':45,79,187,254,260,272,2024,2599,2605,2749,2753,2909,2953,2959,2965,2971,2980,3119,3137 'best':2824 'best-in-class':2823 'bias':953,998 'bill':1746,1797,2027,2070,2078 'block':1522 'bool':2624,2627,2710 'breakdown':2002,2303,2306,2585,2686 'bs4':369,383,442,666,749 'buyer':944,991 'c':376,454,636,762,843,1019,1094,1268,1276,1278,1283,1288,1388,1393,1396,1458,1556,1871,1881,1885,1893,1909,1917,1923,1925,1929,2251,2371,2376,2378 'c.get':1877,1935,2384 'cach':1438 'cadenc':1747,2079 'call':1821 'came':1657 'candid':1238,1271,1297,1298,1342 'cannot':1074 'cat':320,322,324 'chang':2511,2818 'char':283,285,854,1506 'charact':658,752,776,791,795 'cheap':2525,2665,3184 'check':329,2786,2808,2852,2897,2951,2981,3057 'checkpoint':759 'choos':2487 'chrome/120.0.0.0':692,704 'ci/cd':911 'cite':266,2448 'class':2826,2829 'clean':3270,3307 'collect':497 'common':191,1999 'compani':871,948,950,993,995,1148 'competit':3181 'competitor':17,61,140,224,240,246,252,832,1059,1107,1113,1147,1192,1219,1232,1255,1296,1314,1356,1371,1383,1414,1421,1445,1467,1470,1511,1538,1596,1714,1720,1869,1882,1924,1994,2043,2069,2144,2152,2158,2170,2179,2367,2377,2419,2472,2569,2574,2608,2667,2672,2755,2973,3069,3090,3107,3121,3135,3176,3186,3192,3198 'complet':33,70,2855,3040 'concret':89 'confid':1535 'confirm':241,250,1220,1334,1347,1355,1361,1370,1372,1380,1382,1390 'consolid':2247 'consum':900 'contact':149,204,217,1639,1785,1802,1841,2066,2703,2900,2925,3199 'content':131,147,176,233,281,550,624,643,657,663,740,751,757,763,769,787,790,793,805,840,844,856,1503,1553,1589,1603,1625,1634,1681 'content-typ':623 'continu':438,1075,1331 'convers':500 'convert':732 'converter.body':737 'converter.handle':741 'converter.ignore':734 'copi':164 'core':881 'correct':2929 'cost':1448 'count':1875,1891,2093,2104,2168,2177,2230,2237,2356,2363,2467,2590,2594,2717,2988,2992 'ctas':1615 'curl':609 'currenc':2036,2057 'cut':2514,2821 'cutting-edg':2513,2820 'd':627,640,1048,1054,2286,2292,3277 'd.get':644,649 'dash':304,310,2503,2789,2804 'data':189,261,293,560,645,1097,1106,1112,1291,1295,1300,1319,1461,1469,1476,1489,1492,1513,1559,1566,1578,1600,1652,1656,1687,1725,1762,1894,1906,1912,1919,1930,1969,2164,2174,2184,2185,2248,2423,2442,2604,2628,2683,2734,2932,2987,2997,3012,3014,3021,3025,3130,3252,3254 'date':3067,3264,3273,3274,3283 'day':1773 'ddgs':378,380,397,420 'decis':2543 'default':446,520 'depend':104,386,393,402,412 'deriv':184,447 'descript':12,57,512,529,556,567,582,817,875,964,983,1210,1246,1279,2282,2567,3077 'develop':896 'devop':904 'differ':594,830 'differenti':918,989,1046,1051,2284,2289,2485,2492,2568,2728,3078 'direct':513,538,1431 'discount':1753,2073,2545,2597,2719,3113,3239,3241 'discov':245,1080 'discoveri':1060 'disrupt':2831 'distinct':1186 'distinguish':925 'docs/pricing-intel':3261,3280,3287 'dollar':2944 'domin':38,74,1990,1995,2020,2080,2200,2203,2298,2301,2582,3084,3086,3100 'duckduckgo':134,347,439,1443 'e.g':1755,1850,2039,2062,2075,2470,2689,2720 'easi':937 'echo':331,352,374,390,488,1066,1069,3288,3304 'edg':2515,2822 'edit':1338 'elif':2930 'els':476,784,1957,2401 'em':303,309,2502,2788,2803 'embed':913 'empti':1806 'enhanc':341,362 'enterpris':212,1834,1838,2060,2345,2347,2528,2649,2671,3155,3156,3197 'entir':100 'entri':2028,2207,2210,2214,2220,2309,2312,2316,2322,2613,2635,2687,2691,2861,2869,2914,3123,3141,3217,3218,3220 'entry_tier.median':2456,2694 'enumer':1270 'equival':1697,1795 'error':391,772,1070 'estim':156,208,211,1649 'etc':901,907,917,1815,1823,2458 'europ':517,955 'everi':25,114,226,262,2444 'exact':165,219,919,1145,1641 'explan':2014,2587,3092 'extend':3028 'extract':24,142,173,865,1547,1597,1621,1661,1719,1856,1864,1868,1873,1904,1967,2258,2373,2422,2603 'f':48,652,745,786,1053,1102,1116,1127,1133,1252,1274,1281,1286,1379,1392,1466,1495,1569,1581,1863,1880,1921,1946,1958,2199,2206,2224,2269,2275,2291,2297,2308,2326,2344,2350,2375,2391,2402,2748,2757,2844,2891,2939,2963,3002,3038,3045,3049,3050,3295 'failur':2785,3029,3042,3047,3053 'failures.append':2801,2843,2890,2938,2962,3001 'fallback':301,664,1429,1452 'fals':1766,1770,1837,2889 'featur':82,120,171,1825,1830,2124,2128,2129,2137,2138,2146,2147,2499,2650,2653,3159 'feed':929 'fetch':19,62,128,145,231,291,506,597,653,746,777,1317,1404,1412,1419,1432,1454,1468,1471,2172 'fetch-pric':1411 'fewer':773 'field':1676,2877,2883,2886,2895,2896,2912,2923,3005 'file':315,3268,3279,3292,3306 'fill':202,974,1230,1354,1668,1710,1987,2560,2571,2576,2601 'find':15,59 'finder':3,50 'fintech':898 'firecrawl':353,356,363,601,603,619,655 'first':852 'fix':2802 'flag':562,2157,2187,2736,3016,3023,3027,3256 'flat':1736,1744,2008 'flat-rat':1735,2007 'float':1781,1790 'floor':2061,2348,3157 'follow':1605,1715,1973 'format':631 'found':1068,1073,1207,1684,1759,2849,2984,2994,3009 'free':102,351,373,425,445,667,1763,1767,1771,1804,2087,2091,2100,2102,2111,2113,2122,2127,2225,2228,2232,2235,2351,2354,2358,2361,2460,2465,2475,2541,2588,2592,2622,2625,2656,2707,2711,2715,2867,3103,3108,3126,3128,3163,3165,3232,3235 'free/entry':2133 'freemium':1741,2011 'full':2790,2796 'full_text.replace':2800 'game':2510,2817 'game-chang':2509,2816 'gap':1669,2429,2532,2675,3202,3204 'gate':83,121,2125,2486,2548,2651,2654,2724,2732,2873,3160,3244,3247,3250 'gecko':691,703 'generat':2517 'generic':934 'geographi':514,952,997,3071,3072 'get':646,1487,2762 'global':18,519,957 'go':537 'good':1329,1481 'googl':1437 'h':616,622 'hallucin':112,1618,2412 'header':706,725,726 'healthtech':899 'high':278,1480,1727,2166 'host':468 'host.split':474 'hr':906 'html2text':384,400,423,675,1435 'html2text.html2text':733 'http':467 'hybrid':1745 'hyphen':312,2807 'icp':943,990 'identifi':1610 'imag':735 'immedi':406 'import':379,381,457,459,637,673,971,1020,1095,1224,1352,1459,1557,1708,1910,1984,2252,2555,2779 'improv':108 'indent':1009,1304,1376,1860,2193,2742,3035 'india':518,956,1851 'industri':890,984,1032,1034,1038,1042,1262 'infer':178,1201 'info':3003 'innov':2815 'input':496 'instal':396,416,419 'instruct':858,1138,1593,1964,2409 'int':1774 'intel':681,3064 'intellig':35,72 'invent':2425,2498 'issu':3043 'javascript':811 'javascript-rend':810 'job':946 'js':360,782,1525 'js-render':781,1524 'json':639,972,1021,1096,1225,1353,1460,1558,1709,1911,1985,2253,2455,2556,2780 'json.dump':1004,1299,1369,1855,2188,2737,3030 'json.dumps':2792,2840,2990 'json.load':641,1023,1098,1227,1292,1462,1560,1913,2255,2259,2263,2782 'json.loads':2799 'justif':2680,2692,2698,2706,2713,2723,2733,2870,2872,3216,3221,3226,3231,3237,3243,3251 'key':98,107,334,337,344,355,358,365,435,605,621,1816,1824 'khtml':689,701 'knowledg':181,222,1672 'l1':892,986,1036 'l2':902,987,1040 'l3':908,988,1044,1165,1264 'label':1479,1508,1941,1962 'languag':889 'least':2976 'len':656,750,768,789,1105,1381,1867,1876,2751,2957,2969,3041 'length':1504 'level':895 'leverag':2516,2830 'like':690,702,936 'limit':1613,1817,2116 'line':874,982,2281,2566,3076 'list':172,1179,1340,1348,1357,2493,2572,3070,3079,3166,3172,3179 'littl':804 'live':960,1002 'll':1316 'lock':2139 'look':1328 'low':296,1484,1515,1543,1654,1729,2175,2934,2948 'low-qual':2947 'lower':486,2842 'ls':1062 'm':3276 'mac':682 'macintosh':680 'make':592,828 'mani':2096,2107 'map':86,2243,2416,2520,2662,2664,3183 'mark':274,292,3007 'markdown':632,647,650 'market':888,2631,2633,2670,3139,3191 'max':2032,2053,2216,2318,2336,2638,2645,3144,3151 'may':779,808 'md':3265,3284 'mean':286,1517,1655 'median':2034,2055,2218,2222,2320,2324,2338,2342,2640,2647,3146,3147,3153,3154 'medium':1482,1728 'mid':2049,2327,2330,2334,2340,2616,2642,2695,2697,2863,2871,2916,3124,3148,3222,3223,3225 'mid_tier.median':2457 'middl':2527,2669,3190 'min':2030,2051,2212,2314,2332,2636,2643,3143,3150 'miss':392,404,410,437,2894 'mistak':192 'mkdir':3285 'model':40,75,1731,1884,1887,1927,1991,1996,2000,2001,2013,2019,2201,2204,2299,2302,2305,2380,2437,2537,2580,2583,2584,2586,2611,2678,2679,2685,2759,2763,2860,3082,3085,3087,3091,3099,3122,3213,3214,3215 'month':1450,1696,1748,1750,1780,1789,1794,1940,2026,2081,2083,2389 'mozilla/5.0':679,694 'must':125,228,265,2430,2447,2463 'n':1265,1570,1922,3088,3105,3110 'name':118,163,867,872,980,1030,1152,1194,1239,1259,1277,1362,1394,1497,1572,1777,1948,1960,2270,2273,2393,2404,2417,2564,2575,2609,2942,3066,3212 'need':428,2974 'neither':564 'netloc.replace':471 'never':155,210,1645 'nf':2989,2999,3004 'nfound':1253 'nich':910,1166 'none':1956,2031,2033,2035,2052,2054,2056,2400,2637,2639,2641,2644,2646,2648,3258 'note':558,1541,1800,1944,2038,2059,2407,2673,3253 'nqueri':1117 'nt':696 'null':1636,1775,1782,1783,1791,1849,1854 'number':161,269,1650,2451,2904 'object':1712 'observ':183,2426,3206 'offer':2099,2110,2473,2479 'ok':387,788,1483 'one':873,981,1211,1711,2280,2480,2565,3075,3132 'onlymaincont':633 'open':659,753,764,845,1006,1024,1099,1228,1293,1301,1373,1463,1561,1857,1914,2190,2256,2260,2264,2739,2783,3032 'option':105,515 'os':683 'output':124,306,1085,1416,2851,3062,3278,3291 'own':2522 'p':2386,2394,2397,3286 'page':23,66,130,146,168,175,232,276,288,552,599,778,801,839,851,862,958,961,1000,1003,1200,1406,1424,1520,1686,1761,2173,2986,2996,3011 'paid':2136,2141,2658,2726,2875,3169,3171,3246,3249 'paraphras':170 'pars':495 'pass':2928,3058 'past':510,528,546,579,814 'pattern':1899,1972,1986,2071,2189,2196,2202,2209,2213,2219,2227,2234,2262,2295,2300,2304,2311,2315,2321,2329,2333,2339,2346,2353,2360,2454,2469,2578 'payment':905,914 'per':1449,1695,1713,1733,1793,1809,2004,2607,3134 'per-month':1694,1792 'per-seat':1732,2003 'persona':945,992 'phase':1057,1079,1402,1410 'pick':1144 'pip':103,395,418 'plan':1447 'pleas':813 'point':29,116,3118 'polici':113 'popul':2955 'posit':85,182,1976,2242,2415,2519,2661,2663,3182 'post':612 'power':2507,2813 'present':1678,2130,2770,3060 'preval':2090 'price':2,22,28,34,39,46,49,65,71,80,90,115,129,141,209,213,225,227,257,263,1196,1199,1243,1287,1289,1318,1366,1385,1395,1397,1405,1413,1423,1446,1519,1546,1552,1582,1585,1599,1612,1622,1629,1690,1722,1730,1779,1787,1799,1839,1845,1847,1865,1886,1905,1926,1937,1939,1943,1950,1953,1968,2023,2154,2156,2163,2368,2379,2388,2406,2434,2445,2535,2540,2579,2614,2617,2620,2668,2688,2696,2700,2701,2862,2864,2866,2915,2917,2919,2945,3063,3081,3117,3209,3219,3224,3229 'pricing-find':1 'primari':600 'print':385,473,477,651,744,771,785,838,849,855,1011,1026,1031,1045,1052,1087,1101,1115,1126,1132,1251,1273,1280,1285,1378,1391,1453,1465,1472,1494,1549,1568,1580,1587,1591,1862,1879,1902,1920,1945,2195,2198,2205,2223,2246,2266,2268,2274,2283,2290,2293,2294,2296,2307,2325,2343,2349,2365,2366,2374,2390,2744,2747,2756,3037,3048,3054 'proceed':1530 'product':8,54,94,180,448,451,489,491,501,542,549,575,598,800,820,835,850,861,866,869,927,979,1012,1027,1029,1082,1169,1176,1258,1282,2267,2272,2490,2558,2563,2730,3065,3074,3211,3262,3281 'product-analysi':1081 'project':1822 'prop':883 'provid':525 'pyeof':672,758,970,1015,1223,1306,1351,1399,1707,1896,1983,2239,2554,2764,2778,3059 'python':411 'python3':375,453,635,671,761,842,969,1018,1077,1093,1222,1350,1408,1457,1555,1706,1908,1982,2250,2553,2777 'q':717,719 'qa':2769,2775,3039,3056 'quadrant':2524 'qualiti':109,279,294,340,561,1478,1490,1493,1507,1514,1576,1579,1653,1726,1892,1895,1928,1931,2165,2167,2176,2186,2629,2735,2933,2949,3015,3022,3026,3131,3255 'queri':1119 'r':479,1121,1128,1130,1474,1488,1491,1496,1499,1502,1564,1571,1574,1577,1584,1588 'r.get':1134 'random':676 'random.choice':710 'rang':2435,2632,2634,3140 'rate':1737,2009 'raw':1551 're':461 're.sub':478 'read':313,766,847,1139 'rec':2856 'rec.get':2882,2885 'recommend':91,255,264,931,2244,2446,2462,2534,2676,2677,2758,2761,2854,2858,2893,3208 'record':151,214,1638,1692 'redirect':730 'refer':314,2431,2464,2681,2693,2714 'referenc':259 'references/extraction-guide.md':323,1606 'references/positioning-guide.md':325,1974 'references/pricing-models.md':321 'region':1846,2153,2155,2161 'region-specif':2160 'reliabl':2979 'remov':1322 'render':361,783,812,1526 'replac':158,307,1646,2805,2902 'report':36,73 'request':368,382,398,421,441,665,674,748,1433 'requests.get':722 'requir':96,507,2859,2879 'research':1386,2570 'resp':721 'resp.text':742 'result':1088,1124,1142,1156,1236,1477,1567,2557,2738,2781,2793,2798,2841,2991,3019,3020,3024,3031 'result.get':2752,2760,2857,2908,2958,2970 'return':31,68,802 'review':1091,1182,1360 'revolution':2819 'revolutionari':2512 'risk':2483 'rm':3294 'row':2906,2941,3133 'row.get':2922,2931 'rule':1619,2413 'run':99,318,394,413,1104 's.get':1123 'safari/537.36':693,705 'sale':150,205,218,1640,1786,1803,1842,2067,2704,2901,3200 'save':2772,3259,3266,3289 'say':1327 'schema':1717 'script':1067 'scripts/research.py':1063,1071,1078,1409 'seamless':2508,2814 'search':135,236,299,339,1103,1108,1114,1141,1155,1235,1444,1532,1659,2046 'seat':1734,1807,1810,2005 'sector':903 'self':2768,2774 'self-qa':2767,2773 'sentenc':1212,2016,3095 'set':338,346,359,367,551,607 'setup':328 'short':581,816 'show':244 'simpl':2526,2666,3185 'site':807,1183 'size':951,996 'skill' 'skill-pricing-finder' 'skip':238,532 'slug':449,452,490,492,3263,3282 'snippet':136,237,300,1135,1159,1209,1214,1451,1485,1533,1660,2047,2182 'snippet-on':2181 'softwar':1175 'sourc':553,959,1001,1215,1248,1500,1573,1575,2950 'source-varnan-tech' 'space':43,78,2022,3102 'specif':268,909,922,933,2162,2418,2433,2450,2682,2727,3205 'startup':577 'step':242,326,493,533,540,595,833,1055,1217,1400,1544,1897,2240,2765 'stop':405 'storag':1819 'str':1240,1242,1245,1247,1250,1363,1365,1368,1721,1724,1754,1778,1801,1808,1818,1826,1840,1848,2610,2612,2615,2618,2621,2630,2921 'strategi':2536 'strip':487 'structur':1598 'summari':1455,2369,2559 'swap':1324 'synthes':1971 'synthesi':2745 'sys':460,638 'sys.stdin':642 't.get':1938,1942,2387,2405 'tabl':47,81,188,273,2600,2606,2750,2754,2910,2954,2960,2966,2972,3120,3138 'tavili':332,335,342 'taxonomi':891,985,1035,1039,1043,1263 'tell':4,51,407,796,1307 'temp':3305 'text':547,2791,2797 'text/html':714 'thing':923 'tier':26,117,162,1428,1611,1743,1764,1776,1833,1835,1874,1878,1889,1890,1936,2029,2050,2088,2092,2101,2114,2123,2134,2208,2211,2215,2221,2226,2229,2310,2313,2317,2323,2328,2331,2335,2341,2352,2355,2385,2461,2466,2476,2539,2542,2589,2623,2708,2712,2716,2868,3104,3127,3142,3149,3233,3236 'tiered-flat':1742 'timeout':727 'titl':947,1129,1157 'today':3068 'tool':897 'top':894,1827,2619,2699,2705,2865,2918,3125,3227,3228,3230 'top-level':893 'topic-agent-skills' 'topic-gtm' 'topic-hermes-agent' 'topic-openclaw-skills' 'topic-skills' 'topic-technical-seo' 'total':1701 'trace':126,229 'train':221,1671 'transform':2832 'tri':430 'trial':1768,1772,2089,2103,2112,2233,2236,2359,2362,2593,2626,3109,3129 'true':634,731,736,1765,1769,1836,2709 'type':625,949,994,2438 'typic':2074,2115,2119,2598,3114 'underserv':2428,2531,2674,3201,3203 'unless':508 'unlimit':1811 'updat':1341 'url':10,55,462,463,470,484,502,504,531,565,572,628,629,723,1131,1195,1197,1203,1216,1241,1244,1249,1284,1290,1364,1367,1398,1583,1586,1723 'url.startswith':466 'urllib.parse':456 'urlpars':458,469 'us':516,521,954,999 'usag':1739 'usage-bas':1738 'usd/mo':2025,2037,2058 'use':220,298,302,350,372,544,939,1425,1531 'user':409,509,524,555,677,708,711,798,963,1309,1337,1359 'user-ag':707 'val':2920,2937 'val.lower':2927 'valu':882 'vari':2149 'variabl':2145,2660,3174,3178 'verbatim':143,1623 'verifi':1016 'via':654,747 'video':916 'w':661,755,1008,1303,1375,1859,2192,2741,3034 'wait':248,1332 'want':196 'warn':2845,2892,2940,2964 'webcache.googleusercontent.com':1440 'webcache.googleusercontent.com/search?q=cache:[url]':1439 'width':738 'win64':698 'window':695 'without':258 'word':886,2506,2811,2834,2847,2848 'word.lower':2838 'world':2828 'world-class':2827 'write':662,756,965,1193,1345,1635,1682,1702,1978,2549 'written':1014,2197,2746 'wrong':201,251,253 'www':472 'x':611,684,3115,3188,3194 'x64':699 'xml':716 'y':3195,3275 'yes/no':3234 'z0':482 'zero':95,111,1617,2411 'zero-hallucin':110,1616,2410","prices":[{"id":"23c1f85d-0f4c-41c4-b83c-dc4929c3e0a5","listingId":"b915f1da-3736-4acf-bb99-88682db13060","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Varnan-Tech","category":"opendirectory","install_from":"skills.sh"},"createdAt":"2026-04-24T06:56:05.440Z"}],"sources":[{"listingId":"b915f1da-3736-4acf-bb99-88682db13060","source":"github","sourceId":"Varnan-Tech/opendirectory/pricing-finder","sourceUrl":"https://github.com/Varnan-Tech/opendirectory/tree/main/skills/pricing-finder","isPrimary":false,"firstSeenAt":"2026-04-24T06:56:05.440Z","lastSeenAt":"2026-04-25T18:55:05.192Z"}],"details":{"listingId":"b915f1da-3736-4acf-bb99-88682db13060","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Varnan-Tech","slug":"pricing-finder","github":{"repo":"Varnan-Tech/opendirectory","stars":108,"topics":["agent-skills","gtm","hermes-agent","openclaw-skills","skills","technical-seo"],"license":null,"html_url":"https://github.com/Varnan-Tech/opendirectory","pushed_at":"2026-04-25T16:06:48Z","description":" AI Agent Skills built for GTM, Technical Marketing, and growth automation.","skill_md_sha":"7160dfa61e9318efd2d778db771995f25eac05d7","skill_md_path":"skills/pricing-finder/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Varnan-Tech/opendirectory/tree/main/skills/pricing-finder"},"layout":"multi","source":"github","category":"opendirectory","frontmatter":{"name":"pricing-finder","description":"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 models in a space, or build a pricing strategy.","compatibility":"[claude-code, gemini-cli, github-copilot]"},"skills_sh_url":"https://skills.sh/Varnan-Tech/opendirectory/pricing-finder"},"updatedAt":"2026-04-25T18:55:05.192Z"}}