Shopify SEO 0→100: Full Playbook in One Day
Took a 115-product Shopify store from ~50 to 100/100 Lighthouse SEO score in a single working day using AI-powered batch API updates, rotating description templates, and schema markup injection. Includes exact gotchas with Shopify's metafields API and the hidden custom_collections 406 error.
Shopify SEO 0→100: The Full Playbook
The Problem
A building materials Shopify store with 115 products had:
The Approach
We used AI automation to batch-update everything via Shopify's API rather than clicking through admin one-by-one.
Phase 1: Blog Content (2 hours)
Wrote 6 SEO-targeted articles for link destinations. Targeted actual search queries like "SPC vs WPC flooring" and "flooring installation cost Ontario."
Phase 2: Batch API Updates (1 hour)
Pulled all products via Shopify JSON API, generated unique meta descriptions with AI based on category/specs, pushed back in batch. 68 products updated in seconds.
Phase 3: Fixing Copy-Paste Descriptions (2 hours)
Built rotating templates: 5 styles for SPC flooring, 3 for WPC, 10 for porcelain tile. Each template hits different angles (durability, installation ease, aesthetics). Plugged in actual product specs. Every product reads genuinely different.
Phase 4: Technical SEO (1.5 hours)
Key Technical Details
Shopify Metafields Gotcha
Shopify's product API ACCEPTS your meta description update, returns 200, and silently doesn't save it. You MUST use the metafields endpoint separately:
// WRONG - silently fails
PUT /admin/api/2024-01/products/{id}.json
{ product: { meta_description: "..." } }
// RIGHT - actually works
POST /admin/api/2024-01/products/{id}/metafields.json
{ metafield: { namespace: "global", key: "description_tag", value: "...", type: "single_line_text_field" } }
Collections 406 Error
collections.json returns 406 on PUT. You need the custom_collections endpoint instead. This is not documented in any tutorial.
// WRONG - returns 406
PUT /admin/api/2024-01/collections/{id}.json
// RIGHT
PUT /admin/api/2024-01/custom_collections/{id}.json
Rotating Templates Strategy
Instead of AI-generating each description from scratch (which sounds same-y), we created category-specific templates with variable slots:
Template A (durability focus): "Built to withstand {traffic_level} foot traffic, {product_name} features {core_material} construction..."
Template B (aesthetic focus): "Transform your {room_type} with the {finish_style} finish of {product_name}..."
Template C (practical focus): "Easy {install_method} installation makes {product_name} perfect for..."
Results
Unlock Full Playbook
Save 8-12 hours of trial and error.
Estimated savings: $200+ in manual labor
Unlock for $7.99One-time purchase · Instant access · API key included
Steps
- 1Audit everything first — know what's broken before touching anything
- 2Write blog content targeting real search queries for link destinations
- 3Batch-update product meta descriptions via Shopify metafields API (not product API)
- 4Use rotating templates for unique product descriptions at scale
- 5Use custom_collections endpoint (not collections.json) for collection updates
- 6Add internal links between all blog posts
- 7Inject LocalBusiness schema markup directly into theme code
- 8Set up Google Search Console with DNS verification
- 9Clean up Google Business Profile
- 10Add alt text to every product image
⚠️ Gotchas
Shopify product API silently ignores meta_description — must use metafields endpoint separately
collections.json returns 406 on PUT — use custom_collections endpoint instead
AI-generated descriptions sound same-y — use rotating templates with variable slots instead
Shopify Performance score caps around 69/100 due to platform overhead — not fixable
Don't pay for schema markup apps — inject LocalBusiness JSON-LD directly in theme code
Results
~50 Lighthouse SEO, 0 meta descriptions, 75 duplicate product descriptions, no schema markup, no GSC
100/100 Lighthouse SEO, 68+ meta descriptions, 115 unique descriptions, LocalBusiness schema, GSC active
Get via API
Fetch this pitfall programmatically:
curl -X GET "https://api.tokenspy.com/v1/pitfalls/shopify-seo-0-to-100" \
-H "Authorization: Bearer YOUR_API_KEY"