Score an ecommerce URL for SEO + GEO readiness and AI citation visibility. Triggers on "geo score", "SEO + GEO score", "check ecommerce GEO", "Amazon/Shopify GEO", "GEO readiness audit". Covers product pages, store pages, marketplace listings, category pages, and homepages, scored from crawlable evidence (not live AI polling).
npx skills add https://github.com/nexscope-ai/nexscope-ecommerce-skills --skill ecommerce.geo-score-check
Use this skill to evaluate how ready an ecommerce URL is for SEO, GEO, AI visibility, citations, and product recommendation discovery.
The default output is a Quick SEO + GEO Readiness Score based on evidence that can be detected from the page, HTML, metadata, images, schema, robots, sitemap, llms files, and marketplace/listing content. It is not a live AI mention-rate report unless the user explicitly asks for live AI polling and the relevant polling workflow is available.
node /Users/edy/.codex/skills/ecommerce-geo-score/scripts/quick_geo_score.mjs "https://example.com/product-url" --market US --json
The script is a deterministic helper, not the only allowed path. If better browser/page evidence is available, use it and keep the same scoring contract.
references/scoring-model.md.Read /root/.claude/skills/ecommerce.geo-score-check/references/report-template.html Step A: Write /tmp/gen_report.py (a Python script that opens the output file and writes all HTML sections)
Step B: Run `python3 /tmp/gen_report.py`
wc -l <file> and wc -c <file>grep -c "score-card-detail" <file> — must return 8 (one per dimension). If less than 8, the report is missing dimension cards.grep -c "recommendation-item" <file> — must return 5-8. If 0, recommendations are missing.grep -c "PASS\|FAIL\|WARN" <file> — must return 20+. If less, evidence table is missing.Never present quick readiness as live AI visibility.
Allowed:
Not allowed unless live polling was actually run:
Do not use or imply guaranteed profitable products, guaranteed sales growth, or guaranteed AI recommendations.
Read references/platform-handling.md before scoring Amazon, TikTok Shop, Walmart, or other marketplace URLs. Marketplace pages can be scored, but the dimensions must be interpreted as listing-readiness rather than site-infrastructure readiness.
Use references/report-contract.md for the preferred JSON shape and user-facing report layout. If the user asks for a handoff to engineering, include persistence requirements:
/geo-check/report/{checkId} URLs.The conversation output MUST be detailed and comprehensive. Do NOT output a short summary. Follow this EXACT structure with FULL detail for every section:
🎯 SEO + GEO Readiness Score Report
Target URL: https://example.com/product
Market: United States
Platform: DTC Brand Site
Category: Consumer Electronics
Assessment Type: Quick Readiness (not live AI polling)
State the overall score prominently, then show 4 summary dimensions:
Overall Score: 82/100 — Strong
| Summary Dimension | Score |
|---|---|
| SEO Score | **85**/100 |
| GEO / AI Visibility | **78**/100 |
| Technical Health | **80**/100 |
| Content Authority | **88**/100 |
Each dimension MUST be a Signal | Evidence table. The Evidence column MUST start with a status emoji:
Each dimension MUST have 4-8 rows covering both good and bad signals. Example:
#### 1. On-Page SEO — 86/100
| Signal | Evidence |
|---|---|
| Title tag | ✅ Present: "MacBook Air - Apple" (unique, descriptive) |
| Meta description | ✅ Contains product name + key feature |
| H1 heading | ✅ Clear, singular product heading detected |
| Image alt text | ✅ Present on hero product images |
| Price in meta | ❌ Not mentioned in metadata |
| Long-tail keywords | ⚠️ Missing secondary keyword variants |
All 8 dimensions MUST be output: On-Page SEO, Technical SEO, Schema/Structured Data, Content Depth, AI Crawlability, Citation Readiness, Competitive Positioning, User Intent Coverage.
Priority headers use colored circle emoji. Individual items are plain numbered (NO emoji before the number):
🔴 **HIGH PRIORITY**
**1. Create llms.txt + llms-full.txt**
**Problem:** /llms.txt returns 404. AI search engines use this file to instantly understand site structure.
**Impact:** Without llms.txt, AI relies on slow crawls that miss JS content. Competitors with llms.txt get cited first.
**Action Steps:**
- Create /llms.txt with site overview, product lines, canonical URLs
- Create /llms-full.txt with full specs, pricing, audience segments
- Follow llms-txt.cloud spec: Markdown, text/plain, SSR
- Include competitive claims AI should cite
- Update with each product cycle
---
**2. Add Product Schema (JSON-LD)**
**Problem:** No Product JSON-LD detected...
**Impact:** 15-30% CTR loss...
**Action Steps:**
- ...
🟡 **MEDIUM PRIORITY**
**4. Server-Side Render Critical Content**
...
🟢 **LOW PRIORITY**
**7. Create Structured Comparison Content**
...
EVERY recommendation MUST include Problem + Impact + Action Steps (3-7 bullet points each). Do NOT just list one-line summaries.
State: "This is a Quick SEO + GEO Readiness assessment based on crawlable signals. Not live AI polling."
Always end with a clickable link to the uploaded HTML report:
📎 **HTML online report:** [Click to view/download](url)
OUTPUT LENGTH: The full conversation output should be 800-1500 lines of Markdown. If your output is shorter than 400 lines, you are missing detail. Go back and add more evidence rows and more action steps to recommendations.
⚠️ STOP: Before writing ANY HTML, you MUST read the template file first. If you have not yet called Read on the path below, do it NOW. Do NOT proceed without reading it. Do NOT generate HTML from your own knowledge.
When generating an HTML report, you MUST:
/root/.claude/skills/ecommerce.geo-score-check/references/report-template.html — You MUST call the Read tool on this file. This is not optional. If you skip this step, the report will be wrong.| Section | Required Content | If Missing = FAIL |
|---|---|---|
| Cover + metric-grid | 5 score cards (Overall, SEO, GEO/AI, Technical, Content) with real numbers | ❌ |
| Evidence boundary | Two-col: left = assessment type explanation, right = target URL + market + platform + category | ❌ |
| Evidence table | Full <table> with 20-40 rows: Signal / Status (PASS/FAIL/WARN) / Evidence detail | ❌ |
| Score detail grid | ALL 8 dimension cards, each with: score-pill, progress bar, 2-4 "What Looks Good" + 2-4 "What Needs Work" findings | ❌ |
| Recommendations | 5-8 numbered items, each with h3 title + pri-badge + 4-8 bullet action steps | ❌ |
| Footer | Evidence boundary disclaimer + generation date | ❌ |
If your HTML report is missing ANY of the above sections, it is INCOMPLETE. Go back and add the missing sections before uploading.
A report with only the cover/header and no body content is NOT acceptable. The full report should be 400-800 lines of HTML.
:root {
--page:#f7f9fc;--card:#ffffff;--soft:#eef5ff;--brand:#2563eb;--violet:#7c3aed;
--ink:#0f172a;--muted:#64748b;--text:#334155;--border:#dbe4f0;
--ok:#059669;--warn:#d97706;--risk:#ea580c;
--serif:Charter,Georgia,"Times New Roman",serif;
--sans:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
}
.eyebrow tag + h1 title + .target-line tags + .metric-grid (5 .metric-card boxes showing Overall, SEO, GEO, Technical, Content scores).two-col layout: left .panel.boundary (assessment type note) + right .panel (target profile info)<table> with columns: Signal | Status | Evidence. Status uses colored text: color:var(--ok) for PASS, color:var(--risk) for FAIL, color:var(--warn) for WARN..score-detail-grid with 8 .score-card-detail cards. Each card has:.score-detail-head with h3 dimension name + .score-pill (class good/mid/low based on score).bar with <i> fill element (width = score%, class good/mid/low).finding-pair with two <div>: "What Looks Good" items + "What Needs Work" items<ol class="recommendation-list"> with <li class="recommendation-item"> items. Each has:<span> with number<div> with <h3> title + <span class="pri-badge pri-high/pri-med/pri-low"> priority + <ul> action stepsIf the template file cannot be read at the absolute path above, replicate EXACTLY the structure described here. The design is: white cards on light gray (#f7f9fc) background, serif headings (Charter/Georgia), Inter sans body text.
Take nexscope-ai/ecommerce.geo-score-check from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.