Programmatic SEO
Create SEO-driven pages at scale using templates and data.
Maximize organic search traffic with optimized product page meta tags, JSON-LD structured data for Google Shopping, and automated XML sitemaps
Listed ·Updated
Install data from skills.sh
$ npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill ecommerce-seoEcommerce SEO is a Programmatic SEO skill for AI agents, published in the seoskills.sh catalog. Reach for it when your work involves large-scale page generation and ecommerce SEO built for consistent quality. Install it with one command and it runs inside your own agent, so the work happens in your workflow, not a separate SEO tool.
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 |
Not using the CLI? Copy the SKILL.md and paste it straight into ChatGPT, Claude, or any agent.
$ npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill ecommerce-seo -a claude-codeCreate SEO-driven pages at scale using templates and data.
Programmatic SEO planning and analysis for pages generated at scale from data sources.
Analyze ecommerce SEO across product pages, product schema, Shopping visibility, marketplace signals, and keyword gaps.
Comprehensive ecommerce SEO audit for product pages, collection pages, technical SEO, log file analysis, and competitor research.
Decides, facet by facet, whether filter URLs should be indexed, canonicalized, noindexed or blocked, from search demand, crawl logs and index status.
Audits a Google Merchant product feed for titles, attributes and valid GTINs, checks disapprovals, and returns per-product fixes and Product schema.