skills/marketing-growth/ecommerce-seo/SKILL.md
Maximize organic search traffic with optimized product page meta tags, JSON-LD structured data for Google Shopping, and automated XML sitemaps
npx skillsauth add finsilabs/awesome-ecommerce-skills ecommerce-seoInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
E-commerce SEO covers the technical and content foundations that help search engines understand and rank your product pages: meta tags, structured data (JSON-LD), canonical URLs, XML sitemaps, and Core Web Vitals. Shopify and WooCommerce handle most technical SEO automatically; your effort should focus on optimizing titles, descriptions, and structured data quality — not plumbing.
Before installing anything, understand what is already built in:
| Feature | Shopify | WooCommerce | BigCommerce |
|---------|---------|-------------|-------------|
| XML sitemap | Auto-generated at /sitemap.xml | Auto-generated at /sitemap_index.xml (with Yoast SEO) | Auto-generated at /xmlsitemap.xml |
| Canonical URLs | Yes (built-in) | Yes (with Yoast SEO) | Yes (built-in) |
| Meta title/description editing | Yes (via product editor) | Yes (via Yoast SEO fields) | Yes (via product editor) |
| JSON-LD product schema | Basic (varies by theme) | Requires WooCommerce + Yoast or Rank Math | Basic (varies by theme) |
| robots.txt | Editable in Online Store settings | Editable via file or Yoast | Editable via admin |
Shopify handles sitemaps, canonicals, and basic schema automatically. Focus on:
[Brand] [Product Name] - [Key Attribute] | [Store Name]yourstore.com/sitemap.xml/sitemap_index.xmlyourstore.com/xmlsitemap.xml to Google Search ConsoleFor headless storefronts, implement structured data manually. Serve JSON-LD on every product page:
function buildProductJsonLd(product: Product, reviews: ReviewSummary) {
return {
'@context': 'https://schema.org',
'@type': 'Product',
name: product.title,
image: product.images.map(img => img.src),
description: product.metaDescription || product.description.slice(0, 200),
sku: product.variants[0]?.sku,
brand: { '@type': 'Brand', name: product.vendor },
offers: product.variants.length === 1
? {
'@type': 'Offer',
url: `https://yourstore.com/products/${product.slug}`,
priceCurrency: 'USD',
price: (product.variants[0].priceInCents / 100).toFixed(2),
availability: product.variants[0].inventoryQuantity > 0
? 'https://schema.org/InStock'
: 'https://schema.org/OutOfStock',
}
: {
'@type': 'AggregateOffer',
lowPrice: (Math.min(...product.variants.map(v => v.priceInCents)) / 100).toFixed(2),
highPrice: (Math.max(...product.variants.map(v => v.priceInCents)) / 100).toFixed(2),
priceCurrency: 'USD',
offerCount: product.variants.length,
},
...(reviews.count > 0 ? {
aggregateRating: {
'@type': 'AggregateRating',
ratingValue: reviews.average.toFixed(1),
reviewCount: reviews.count,
bestRating: '5',
},
} : {}),
};
}
For canonical URL handling on variant pages — strip variant parameters:
// Always use the base product URL as canonical
// /products/blue-widget?variant=123 → canonical: /products/blue-widget
function getCanonicalUrl(path: string): string {
// Strip variant query parameters
return `https://yourstore.com${path.split('?')[0]}`;
}
For large catalogs (10k+ products), use a sitemap index:
// Serve /sitemap.xml as a sitemap index pointing to paginated product sitemaps
// Each child sitemap: max 50,000 URLs
// Regenerate every 6 hours or on product publish/unpublish events
This is the highest-ROI SEO work. Follow these title formats:
[Brand] [Product Name] [Key Attribute] - [Store Name]
Common issues to fix:
[Product Name] - [Color/View] format)Canonical URLs for filter pages:
/collections/shoes?color=red) should use self-referencing canonicals/collections/shoes?sort=price-asc) should canonical back to the unfiltered collection URLIn Shopify, this is handled automatically. In WooCommerce with Yoast, go to Yoast SEO → Search Appearance → Taxonomies and configure canonical behavior for filtered pages.
Robots.txt — block these paths:
/cart and /checkout — not indexable/account and /search? — not indexablenoindex, follow meta tagIn Shopify: Online Store → Themes → Edit Code → robots.txt.liquid In WooCommerce: Yoast SEO manages robots.txt automatically
| Problem | Solution |
|---------|----------|
| Products not appearing in Google Shopping rich results | Check Google Search Console → Enhancements → Products for structured data errors; use Rich Results Test to validate |
| Faceted navigation creating millions of indexable URLs | Shopify/WooCommerce handle this automatically with canonicals; for custom builds, use noindex, follow on heavily filtered pages |
| Out-of-stock products returning 404 | Keep the page live at 200 status; show "out of stock" and suggest alternatives; remove from sitemap only if permanently discontinued |
| Schema.org validation errors | Test with Google's Rich Results Test; ensure price and availability are always present and correctly formatted |
| Slow Core Web Vitals hurting ranking | Preload hero images, compress product images, use lazy loading below fold; Shopify's CDN helps significantly |
tools
Let shoppers save products to a wishlist, share it with friends, and get notified when saved items come back in stock or drop in price
development
Build a themeable storefront with design tokens and CSS custom properties that supports white-labeling, multi-brand variants, and dark mode
development
Speed up product discovery with instant search suggestions, fuzzy typo matching, and category-aware results powered by Algolia or Elasticsearch
development
Build a mobile-first storefront with thumb-friendly navigation, sticky add-to-cart buttons, and touch-optimized components for high mobile conversion