SEO SKILL

Product-page SEO scoring

Product-page SEO scoring, Product schema validation, and, with a DataForSEO key, Google Shopping and Amazon marketplace intelligence.

Needs an API key: DataForSEO, for the marketplace halfClaude Code

Install the plugin
bash install.sh   # from a clone of github.com/AgriciDaniel/claude-seo, pinned to v2.3.1

Run this in a terminal inside your project folder. Claude Code, Cursor and Codex then read the skill from where it lands.

  1. Step 01Open a terminal in your project folder
  2. Step 02Paste the command and press Enter
  3. Step 03Pick the agents to install to
  4. Step 04Ask the agent for the job; it reads the skill

seo-ecommerceAgriciDaniel/claude-seoMIT licencev2.3.1updated 2026-09-10

Four commands. `/seo ecommerce <url>` analyses a product page or store; `schema <url>` validates and enhances Product markup; `products <keyword>` and `gaps <domain>` need the DataForSEO Merchant API and pull live Shopping and Amazon data.

The keyless half is a checklist you could run yourself, done for you: title, meta, headings, image alt and size, breadcrumbs, related products, unique description, specs table, reviews, and a six-part weighted score.

The schema section is the useful part for most stores: the confirmed-required fields (name, image, offers), the recommended ones, eight validation rules, and a completeness ladder from 50 to 100.

When to use it

The phrases that trigger it

Say any of these and an agent that has the skill installed will usually load it; you can also call it by name. The phrases are the skill’s own, from its description.

  • ecommerce SEO
  • product SEO
  • Google Shopping
  • product schema
  • Amazon SEO
  • shopping ads
  • merchant SEO

What’s inside

The playbook, section by section

  • Product SEO checklist, weighted

    Schema completeness 25%, images 20%, content 20%, title and meta 15%, internal linking 10%, technical 10%.

  • Product schema rules

    Price as a bare number string, availability as a full schema.org URL, ISO 4217 currency, no empty brand, ISO 8601 sale windows, ratingValue with reviewCount, and no undisclosed incentivised reviews.

  • Marketplace intelligence (keyed)

    Price distribution with outliers, top sellers by listing count, free-shipping prevalence, title patterns in the top listings, and a Google-versus-Amazon comparison table.

  • Keyword gap types

    Organic-only, Shopping-only, both, neither, each with the action the skill recommends.

  • UCP audit

    Checks for a `/.well-known/ucp` profile (the Universal Commerce Protocol) and reports its absence as an opportunity, not a failure.

Reference files the agent loads on demand

2 files in the skill folder, read only when an instruction calls for one.

marketplace-endpoints.md
DataForSEO Merchant API endpoints for Google Shopping and Amazon data, with parameters.
ucp-universal-commerce-protocol.md
The Universal Commerce Protocol (Google, Shopify, Etsy and others, June 2026) and the audit criteria for it.

See it in action

One real run, in full

The request on the left went to the skill as installed. On the right is everything it returned, unedited; scroll inside the box to read it all.

You ask

Analyse the product page https://furmind.co/products/warm-dog-sofa-bed (a Shopify store we run). No DataForSEO credentials are configured. Give the product page score and the schema enhancement.

The skill delivers

E-commerce SEO Report: https://furmind.co/products/warm-dog-sofa-bed

Fetched 2026-09-11 via render_page.py --mode auto (HTTP 200, served as raw HTML, is_spa=False, 423 KB) and parsed with parse_html.py. No DataForSEO credentials are configured, so the Marketplace Intelligence sections (Google Shopping, Amazon, keyword gaps) were not run. Everything below is on-page + schema only.

Overall Score: 66/100

Weighted per the skill's scoring table: Schema 25% · Title & meta 15% · Images 20% · Content 20% · Internal linking 10% · Technical 10%.

Product Page SEO
  • Schema Completeness: 70/100
  • Title & Meta: 60/100
  • Image Optimization: 65/100
  • Content Quality: 55/100
  • Internal Linking: 80/100
  • Technical: 70/100 (canonical, viewport, indexability checked; Core Web Vitals and mobile rendering NOT measured in this run)
What was measured

Title tag — Warm Dog Sofa Bed | Furmind (27 chars)

  • Primary product keyword: yes · Brand: yes · Under 60 chars: yes
  • Format [Product] - [Key Feature] | [Brand]: no key feature. There is room for one (e.g. the washable cover or the three sizes) without passing 60 chars.

Meta description — 153 chars, under the 155 limit

  • Keyword + benefit: yes ("...dipped low on one side so a dog can step in")
  • Price or "from $XX": no (the page sells from $49.35 USD; the og:price:amount tag already carries it)
  • Call to action: no
  • One claim to check: it ends with "Sizes in cm on the page", but the server-rendered HTML contains no S/M/L dimensions in cm or inches, only the sizing method ("add 6-8 in (15-20 cm)"). If the size chart is injected client-side, crawlers reading raw HTML do not see it.

Headings

  • Single H1 Warm Dog Sofa Bed: yes
  • H2s present for reviews ("From our customers"), sizing ("Size and fit"), materials ("What it is made of"), care, FAQ ("Questions before you buy"), related products ("Other beds worth a look"): yes
  • Noise: Country/region appears twice as an H2 (the localization form), and the product name is repeated as an H2 under the H1.

Images — 69 <img> tags, 8 gallery images

  • Gallery images are 1946 x 1946 source, well over the 800 px Shopping threshold: pass
  • Hero image is not lazy-loaded, the other 7 are loading="lazy": pass
  • WebP: <picture> is not used, but Shopify's CDN content-negotiates. Verified with a HEAD request: the same URL returns image/webp at 86 KB when Accept: image/webp is sent, and image/png at 1.48 MB without it. Pass.
  • Alt text: all 8 gallery images have alt text, but only 1 of 8 contains the product name "Warm Dog Sofa Bed". The other 7 describe a "snap-convertible tufted pet sofa mat" (see Content below). About 20 of the 69 images have empty alt: the 5 review-photo thumbnails at 160 px, 9 payment/feature icons, 2 blog-card images, the promo popup image.
  • File names are not descriptive: slot1_fb5cb6f8-...png, renk-gray_...png, E6_...png.

Content

  • Description body: 194 words, plus a 47-word "closer look" block and a 150-word FAQ. Total page text ~1,150 words. Meets the 200-word bar when the sections are counted together; the description alone is just under.
  • Unique copy: reads as in-house (first-person sizing advice, honest "no dog bed is chew proof" FAQ). Not checked against any manufacturer listing.
  • Specs table: none. Zero <table> elements on the page; sizing is prose and the variant picker has S/M/L with no dimensions.
  • Reviews on page: yes, Loox widget plus 5 review photos; the rating link shows "4.9 · 115 reviews".
  • Copy and imagery describe two different products. The description says "a round bean-bag bed with a crackled leather-look outside and a cream plush lining, dipped low on one side so a dog can step in." The 8 gallery images' alt text, the "closer look" captions ("Nine cells keep the filling even", "Press studs down the sides", "Measure it flat, not buttoned") and the related-product card for this same product ID (Snap-Convertible Tufted Pet Sofa Mat) all describe a tufted mat that snaps into a sofa shape. One of the two is wrong for this URL. Until it is resolved, the page sends conflicting signals to both search engines and buyers.

Internal linking

  • Breadcrumb: Home / Dog Beds / Warm Dog Sofa Bed, visible and in BreadcrumbList JSON-LD: pass. The skill's ideal is Home > Category > Subcategory > Product; the site has a Sofa & bolster collection (/collections/dog-sofa-beds) that this bed belongs in, and it is skipped.
  • Related products: 4 cards in "Other beds worth a look", but one of the four is this same product (self-recommendation). 3 real cross-sells.
  • Category link with keyword anchor: Dog Beds in the breadcrumb: pass.
  • Reviews link: on-page anchor #yorumlar: fine.
  • 88 internal links, 0 external.

Technical (observable only)

  • Canonical: self-referencing https://furmind.co/products/warm-dog-sofa-bed: pass
  • Robots: no noindex: pass · Viewport meta present: pass · Open Graph and Twitter card complete, og:type=product with price and currency: pass
  • No fetchpriority="high" on the hero image (the only fetchpriority on the page is low).
  • Core Web Vitals, page speed and mobile rendering were not measured. Run /seo technical on this URL for LCP/INP/CLS.
Schema Completeness: 70/100

The page carries four JSON-LD blocks: Organization, Product, BreadcrumbList, and a Shopify ProductGroup with 9 variant Product nodes.

Tier math (skill's Schema Scoring table): required name + image + offers present → 50. aggregateRating present → 65. sku + gtin present on every variant → 75. review with 5 entries → +10 = 85. shippingDetails absent, hasMerchantReturnPolicy absent (those two tiers are skipped). Then deducted 15 for the validation issues below, landing at 70.

Validation findings

#SeverityFinding
1CriticalaggregateRating in JSON-LD says ratingValue: 5.0, reviewCount: 5. The visible page says 4.9 · 115 reviews. Structured data must match visible content; a mismatch of this size is a manual-action risk for review rich results. Whichever number is the real Loox total should be in both places.
2Highoffers on the Product node is an AggregateOffer (lowPrice 49.35, highPrice 97.61, offerCount 9). The skill's Google Merchant guidance is Offer, not AggregateOffer, for merchant listings. Per-variant Offer nodes already exist in the ProductGroup block; the Product block duplicates and contradicts them.
3HighTwo blocks share the same @id (/products/warm-dog-sofa-bed#product): the hand-written Product and Shopify's ProductGroup. Same identifier, different @type, different description coverage. Consumers may merge or discard one unpredictably.
4Medium@id values are relative (/products/...), not absolute URLs.
5MediumProduct node has no brand, description, sku, gtin (they live only on ProductGroup / variants).
6MediumshippingDetails missing, although the page states "Free shipping on every order" and "Arrives in 6-12 days".
7MediumhasMerchantReturnPolicy missing, although the FAQ states "Returns are open for 30 days".
8Low1 of 5 review entries (Miles D., 2026-03-29) has no reviewBody.
9LowAvailability values mix https://schema.org/InStock (Product) and http://schema.org/InStock (variants). Both are accepted; consistency is cleaner.
10Infoimage array (6 URLs), priceCurrency ISO 4217, numeric price strings without symbols, full-URL availability enum: all correct.
Schema Enhancement

Recommended shape: keep Shopify's ProductGroup as the single product entity, give it an absolute @id, and move rating, reviews, shipping and returns onto it. Remove the separate Product block (or reduce it to a ProductGroup reference) so there is one #product identifier on the page. Values below are taken from the page; the three fields marked FILL are not stated anywhere on the page and must not be guessed.

{
  "@context": "https://schema.org",
  "@type": "ProductGroup",
  "@id": "https://furmind.co/products/warm-dog-sofa-bed#product",
  "productGroupID": "9592863031573",
  "name": "Warm Dog Sofa Bed",
  "url": "https://furmind.co/products/warm-dog-sofa-bed",
  "brand": { "@type": "Brand", "name": "FURMIND" },
  "category": "Pet Beds",
  "description": "A round bean-bag bed with a crackled leather-look outside and a cream plush lining, dipped low on one side so a dog can step in. Leather-look crackled exterior. Plush white fleece lining. Three sizes, S to L.",
  "image": [
    "https://furmind.co/cdn/shop/files/slot1_fb5cb6f8-2a05-45e6-8106-1647209e96fb.png?v=1787642484&width=1200",
    "https://furmind.co/cdn/shop/files/slot3_46c44212-78c8-4502-9aad-17279a4221f2.png?v=1787642484&width=1200",
    "https://furmind.co/cdn/shop/files/slot4-ton-duzeltilmis.png?v=1788102074&width=1200",
    "https://furmind.co/cdn/shop/files/slot6_5b9f59ec-55df-4490-ae4d-d4d80476a33a.png?v=1787642484&width=1200",
    "https://furmind.co/cdn/shop/files/slot8_7a07b78f-74a0-4e5a-9869-c6daa6fdd677.png?v=1787642484&width=1200",
    "https://furmind.co/cdn/shop/files/E6_34391429-233a-49b0-84fa-1b85bd5ab2b2.png?v=1787642484&width=1200"
  ],
  "variesBy": ["https://schema.org/size", "https://schema.org/color"],
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "FILL: the live Loox average shown on the page (currently displayed as 4.9)",
    "reviewCount": "FILL: the live Loox count shown on the page (currently displayed as 115)",
    "bestRating": 5,
    "worstRating": 1
  },
  "review": [
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "L S." },
      "datePublished": "2026-04-18",
      "reviewRating": { "@type": "Rating", "ratingValue": 5, "bestRating": 5, "worstRating": 1 },
      "reviewBody": "We came back again...and bought another mattress for our dog. Great store, the product is high quality and the service is excellent. Arrived packaged without issues Thank you very much again."
    },
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "Emily M." },
      "datePublished": "2026-04-24",
      "reviewRating": { "@type": "Rating", "ratingValue": 5, "bestRating": 5, "worstRating": 1 },
      "reviewBody": "Great purchase, product as described, like in pictures. High quality very nice soft fabric. Size is perfect for my dog, we all love it! Highly recommend, thank you."
    },
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "Aria R." },
      "datePublished": "2026-03-15",
      "reviewRating": { "@type": "Rating", "ratingValue": 5, "bestRating": 5, "worstRating": 1 },
      "reviewBody": "The pillow arrived very well packaged and feels high quality. The delivery was quite fast, within weeks. Thank you very much, and there is a possibility that we will also purchase size L."
    },
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "Y O." },
      "datePublished": "2026-08-19",
      "reviewRating": { "@type": "Rating", "ratingValue": 5, "bestRating": 5, "worstRating": 1 },
      "reviewBody": "Beautiful. My dog loves it. Too bad for the significant delay in delivery."
    }
  ],
  "hasVariant": [
    {
      "@type": "Product",
      "@id": "https://furmind.co/products/warm-dog-sofa-bed?variant=50095380922645#variant",
      "name": "Warm Dog Sofa Bed - S / Gray",
      "sku": "fed59759-cf1a-4404-adca-2a85ad779dc7",
      "gtin": "7445016284229",
      "size": "S",
      "color": "Gray",
      "image": "https://furmind.co/cdn/shop/files/renk-gray_faa4c4f0-910c-41d9-8617-45faff3b933a.png?v=1787642484&width=1920",
      "offers": {
        "@type": "Offer",
        "url": "https://furmind.co/products/warm-dog-sofa-bed?variant=50095380922645",
        "price": "49.35",
        "priceCurrency": "USD",
        "availability": "https://schema.org/InStock",
        "seller": { "@id": "https://furmind.co/#organization" },
        "shippingDetails": { "@id": "https://furmind.co/#shipping-us" },
        "hasMerchantReturnPolicy": { "@id": "https://furmind.co/#returns" }
      }
    },
    { "_note": "repeat the same pattern for the other 8 variants already emitted by Shopify: M/Gray 73.92, M/Blue 71.64, L/Blue 97.61, S/Brown 51.64 (OutOfStock), L/Gray 93.41, L/Brown 94.81, S/Blue 50.48, M/Brown 73.18. Add size and color to each; keep their existing sku, gtin, image and Offer." }
  ]
}

Shared shipping and return nodes (referenced by @id from every variant Offer):

[
  {
    "@context": "https://schema.org",
    "@type": "OfferShippingDetails",
    "@id": "https://furmind.co/#shipping-us",
    "shippingRate": { "@type": "MonetaryAmount", "value": "0", "currency": "USD" },
    "shippingDestination": { "@type": "DefinedRegion", "addressCountry": "US" },
    "deliveryTime": {
      "@type": "ShippingDeliveryTime",
      "transitTime": { "@type": "QuantitativeValue", "minValue": 6, "maxValue": 12, "unitCode": "DAY" }
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "MerchantReturnPolicy",
    "@id": "https://furmind.co/#returns",
    "applicableCountry": "US",
    "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
    "merchantReturnDays": 30,
    "returnMethod": "FILL: https://schema.org/ReturnByMail or ReturnInStore (not stated on the page)",
    "returnFees": "FILL: https://schema.org/FreeReturn or ReturnShippingFees (not stated on the page)"
  }
]

Sources for the values: free shipping and 6-12 day transit from the page's trust strip and the Organization description; US from the Organization.areaServed; 30-day window from the FAQ answer "Returns are open for 30 days". The 6-12 days are shown as transit time because the page does not separate handling from transit. Note that the fifth review (Miles D.) was dropped from the example because it has no body; add it back with its text if the review exists in Loox.

What this fixes against the checklist: single #product identity, Offer per variant instead of AggregateOffer, brand/description/sku/gtin on one entity, shippingDetails and hasMerchantReturnPolicy present, rating matching the visible widget. On the skill's tier table that reaches the 90-100 band once the two FILL return fields and the live rating are supplied.

UCP profile (bonus check, ucp_check.py)

https://furmind.co/.well-known/ucp exists (HTTP 200, valid JSON). Reading the file directly: Shopify publishes it with version: 2026-08-25, supported versions 2026-04-08 and 2026-01-23, service dev.ucp.shopping over MCP, and 8 declared capabilities (checkout, fulfillment, discount, cart, order, catalog.search, catalog.lookup, plus dev.shopify.catalog). The plugin script reported "0 capabilities, 3 structural issues" because it does not read the nested ucp envelope that Shopify uses; treat the script output as a false negative. No action needed on UCP.

Marketplace Intelligence
  • Not run: DataForSEO credentials are not configured. Google Shopping listings, price range, seller landscape, Amazon comparison and the organic-vs-Shopping keyword gap are unavailable in this run.
Top Recommendations
  1. [Critical] Reconcile the rating in JSON-LD with the visible widget. JSON-LD says 5.0 from 5 reviews; the page shows 4.9 from 115. Emit the Loox totals into aggregateRating, or hide the widget count. This is the one item with rich-result penalty exposure.
  2. [Critical] Decide which product this page describes. Description copy says round crackled-leather bean-bag; images, alt text, "closer look" captions and the related-card title say snap-convertible tufted mat. Fix the copy or the media, then rewrite the 7 alt texts to include "Warm Dog Sofa Bed" plus the distinguishing feature.
  3. [High] Collapse the two #product blocks into one ProductGroup with absolute @id, per-variant Offer (drop AggregateOffer), and add shippingDetails + hasMerchantReturnPolicy from the shipping/returns facts already on the page (schema above).
  4. [High] Put the S/M/L dimensions in the server HTML as a table. The meta description promises "sizes in cm on the page"; the raw HTML has none. A specs table also satisfies the checklist's "specs table present (not just prose)".
  5. [Medium] Title and meta. Add a key feature to the title (Warm Dog Sofa Bed - Washable Cover, 3 Sizes | Furmind is 53 chars, using facts from the page) and put "from $49.35" plus a low-pressure CTA in the meta description.
  6. [Medium] Related products: remove the self-card from "Other beds worth a look" and show a fourth real cross-sell. Consider routing the breadcrumb through the Sofa & bolster collection the product belongs to.
  7. [Low] Image hygiene. Descriptive file names on the next upload cycle (warm-dog-sofa-bed-gray-front.png), fetchpriority="high" on the hero image, alt text or alt="" with role="presentation" on the 9 icon images.
  8. [Low] Heading noise. Drop the two Country/region H2s (use a <span> or <legend> in the localization form) and the duplicate product-name H2.

Generate a PDF report? Use /seo google report

What this run could not do

No DataForSEO Merchant or Labs data (no credentials, so no Google Shopping, Amazon or keyword-gap sections); Core Web Vitals and mobile rendering are outside its product-page workflow, so the technical score covers canonical, viewport and indexability only; three schema values not stated on the page (live rating and count, return method, return fees) are left as placeholders to fill.

Method behind it

Where we would differ, and why

Our ecommerce SEO guide covers the same product-page surface with measured examples from real stores and explains why the schema half matters more than the title-tag half for a catalogue. The skill scores; the guide shows what the score looks like on a Shopify page.

The checklist asks for a call-to-action in the meta description and a price in it. Google rewrites most ecommerce descriptions anyway; we would not spend effort there.

The 200-word minimum for a product description is the author’s floor, not Google’s. A short, specific description with a specs table gives a search engine more to match than a padded one.

ucp_check.py misreads Shopify’s real UCP profile, which nests everything under a top-level `ucp` key, and reports a declared version and eight capabilities as missing. The skill also calls 2026-04-08 the latest UCP release while Shopify stores advertise 2026-08-25. Read the profile yourself before trusting that row.

Ecommerce SEO: What to Fix and in What Order

Drawing: When Googlebot thinks two URLs return the same content, only one is retrieved and the other is discarded as a duplicate, so content can be missed.
Our drawing of Google Search Central, designing a URL structure for ecommerce sites, read 7 September 2026.From Ecommerce SEO: What to Fix and in What Order

SKILL.md

The file the agent reads

Written by Daniel Agrici and published under the MIT licence. Read the full file (2,001 words) on GitHub, at the commit we reviewed: AgriciDaniel/claude-seo/skills/seo-ecommerce/SKILL.md. The reference files are in the same folder.

Questions

Questions people ask before installing

Does it work on Shopify and WooCommerce?

Yes. It reads rendered HTML, so the platform does not matter, and it needs no store access: the URL is enough for the page analysis and the schema enhancement.

What does the DataForSEO half cost?

The skill runs `dataforseo_costs.py check` before each Merchant call and stops if your daily budget is exceeded; Amazon endpoints always ask first. The price itself is DataForSEO’s and is not published here.

Will it edit my product pages?

No. It outputs a report and recommended JSON-LD. Applying it is your job.