Seo ecommerce
Skill mvstepanek/nextjs-ecommerce-seo-skills/skills/seo-ecommerce
E-commerce specific SEO rules for product pages, category pages, pricing, availability, faceted navigation, and B2B considerations. Use when building or modifying product listings, category pages, shopping cart, or checkout.From its SKILL.md
npx -y skills add mvstepanek/nextjs-ecommerce-seo-skills --skill seo-ecommerceAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.4 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it
E-Commerce SEO Guidelines
Follow these rules when working on product pages, category pages, and shopping features.
For detailed e-commerce SEO patterns, see reference.md.
Product Pages
Every product page should have:
1. Unique, Descriptive Title
{Model} {Product Name} | {Brand}
Include model number — B2B buyers search by model.
2. Complete Product Schema (JSON-LD)
A common gap in e-commerce sites is missing price and availability in Product schema, which prevents rich results (price, stock status, ratings) from appearing in Google.
Required for rich results (per Google): name, image[], offers.price, offers.priceCurrency, offers.availability. Strongly recommended: sku, brand, description. Provide gtin if available; if not, provide brand + mpn for product identification. Also consider shippingDetails and hasMerchantReturnPolicy for merchant listing eligibility. See the seo-structured-data skill for full details.
3. Technical Specifications
Display specs prominently and include them in structured data via additionalProperty. Example spec fields:
- Power / wattage
- Capacity / volume
- Dimensions
- Weight
- Key performance metrics relevant to the product category
4. Breadcrumb Navigation
Visible breadcrumb trail reflecting the site hierarchy (e.g. Home > Category > Subcategory > Product Name) with matching BreadcrumbList schema (see seo-structured-data skill).
5. Unique Description
- Never duplicate descriptions across products — even similar models need unique text
- Min 150 words for product descriptions
- Include model number, product category, and brand name naturally
Category Pages
Category Page SEO Checklist
- Unique title per category:
{Category Name} - Buy Online | {Brand} - Unique description — don't use the same description for all categories
- H1 heading matching the category name
- CollectionPage or ItemList schema — list the products on the page
const categorySchema = {
"@type": "CollectionPage",
name: category.name,
description: category.description,
url: `${siteConfig.url}/${locale}/categories/${category.slug}`, // adapt path to your project
mainEntity: {
"@type": "ItemList",
itemListElement: products.map((product, index) => ({
"@type": "ListItem",
position: index + 1,
url: `${siteConfig.url}/${locale}/products/${product.id}/${product.slug}`,
name: product.name,
})),
},
};
Category Page Content
- Introductory text above the product grid — 100-300 words explaining the category
- Don't rely on product cards alone — pages with only product cards and no unique text are "thin content"
- Internal links to related categories and subcategories
Faceted Navigation (Filters)
Faceted navigation (filters by price, specs, features) can create duplicate or thin content if not handled correctly. Google's guidance is selective, not blanket — useful filter combinations that match real search intent should remain indexable.
Rules
-
Keep useful filter pages indexable — if a filter combination represents a genuine product category that users search for (e.g.
/categories/headphones?type=wireless), let it be indexed. These pages have unique value. -
Noindex granular multi-filter combinations —
?power=500w&color=red&weight=5kgcreates thousands of thin pages with little search value. Usenoindex, followso crawlers can still discover products through these pages. -
Set the canonical to the base category for granular filters — all low-value filter combinations should have their canonical pointing to the base:
/en-GB/categories/widgets?power=500w&color=red&weight=5kg → canonical: /en-GB/categories/widgets -
Use
noindex, follow(notnoindex, nofollow) on filtered pages — allows crawlers to discover products through filtered pages without indexing the filter combination itself
// App Router example — in Pages Router, set robots via next/head
export async function generateMetadata({ searchParams }: Props): Promise<Metadata> {
// Determine if this is a useful, searchable filter (e.g. single broad category)
// vs a granular multi-filter combo with little search value
const filterKeys = Object.keys(searchParams).filter(k => k !== 'sort');
const isGranularFilter = filterKeys.length > 1;
return {
robots: isGranularFilter
? { index: false, follow: true } // noindex granular filter combos
: { index: true, follow: true }, // index useful single-filter views
};
}
B2B Pricing Considerations
For B2B e-commerce sites, pricing requires special handling:
- If prices are visible: Always include
offers.priceandoffers.priceCurrencyin Product schema - If prices require login: Omit
priceentirely from schema rather than showing 0 or a placeholder. Still includeavailability. - If showing "Request a Quote": Use
offers.priceSpecificationwith no price, or omit offers block - Business customer type: Consider adding
offers.eligibleCustomerType: "https://schema.org/Business"
const offers = product.priceVisible
? {
"@type": "Offer",
price: product.price,
priceCurrency: getCurrencyForLocale(locale),
availability: `https://schema.org/${product.inStock ? 'InStock' : 'OutOfStock'}`,
seller: { "@type": "Organization", name: siteConfig.brandName },
}
: {
"@type": "Offer",
availability: `https://schema.org/${product.inStock ? 'InStock' : 'OutOfStock'}`,
seller: { "@type": "Organization", name: siteConfig.brandName },
eligibleCustomerType: "https://schema.org/Business",
};
Product Variants
For products with variants (same product line in different sizes, power ratings, colors):
- Each variant should have its own URL and page if it has a unique SKU
- Use
isVariantOfto link variants to a parent product group - Use
isSimilarTofor related products in the same category
const variantSchema = {
"@type": "Product",
name: "Widget Pro 500W",
isVariantOf: {
"@type": "ProductGroup",
name: "Widget Pro Series",
url: `${siteConfig.url}/${locale}/categories/widgets`,
},
};
Product Bundles
If the site offers product bundles, these need special SEO treatment:
- Own product page with unique title and description
- Product schema with all included items listed
- Highlight savings in meta description
- Cross-link between individual products and the bundle page
Common Mistakes to Avoid
- Missing price in Product schema — the #1 gap preventing rich results
- Same description across similar products — every product needs unique text
- No introductory content on category pages — thin content signal
- Indexable filter combinations — creates thousands of duplicate pages
- Price as 0 when login-required — omit price rather than fake it
- Missing breadcrumbs on product pages — hurts both UX and SEO
- Product images without descriptive alt text — see seo-images skill
What ships with it: 1 file
2.5 KB alongside SKILL.md
- reference.md2.5 KB
Gives 0 of the 12 instructions most marketing audience skills give in ~1.6k tokens
Counted across 690 of the 894 authors here whose files we hold, read 2026-08-07
- Apply Poppins font to headingsin 41 of 690, across 6 files
- Apply Lora font to body textin 41 of 690, across 6 files
- Use Arial fallback for headingsin 39 of 690, across 4 files
- Use Georgia fallback for body textin 39 of 690, across 4 files
- Maintain text hierarchy and formattingin 39 of 690, across 4 files
- Use accent colors for non-text shapesin 38 of 690, across 3 files
- Use RGB values for precise color matchingin 38 of 690, across 3 files
- Use brand colors for primary text and backgroundsin 36 of 690, across 1 file
- Read product marketing context file before asking questions, starting, or auditingin 35 of 690, across 23 files
- Use active voice instead of passive voicein 26 of 690, across 10 files
- Implement or generate appropriate JSON-LD structured datain 24 of 690, across 17 files
- Prioritize clarity over clevernessin 22 of 690, across 8 files
Said here and by no other author read
- include model numbers in product titles
- include price and availability in product schema
- display visible breadcrumb navigation matching site hierarchy
- add introductory text above product grids
- keep useful single-filter pages indexable
- set canonical tags to base category for granular filters
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.