492K non-indexed URLs. The problem was structural.
I audited a multilingual Shopify store where Google was discovering far more URLs than the site actually needed for organic search.
The analysis connected indexation data with duplicate product paths, URL parameters, pagination, crawl behavior, internal linking and hreflang to identify the template-level causes behind the excess URL footprint.
Google was crawling the system the site generated — not the site the business intended.
The sitemap contained 37.4K intended URLs, while Google had discovered hundreds of thousands more. The gap came from repeatable Shopify URL patterns, not from one isolated indexation issue.
The goal was not to index more URLs. It was to reduce unnecessary URL generation and align crawling, internal links, canonicals and hreflang around the pages the store actually wanted Google to rank.
The URL count was a symptom. The architecture was the cause.
I compared the store’s intended search inventory with what Google had actually discovered, then traced the gap back to repeatable Shopify rules rather than treating hundreds of thousands of URLs as isolated errors.
Measure the gap
Compare sitemap inventory with discovered, indexed and excluded URLs.
Find repeating generators
Group collection paths, parameters, pagination and other recurring URL patterns.
Validate crawl & signals
Check crawl composition, internal links, canonicals and hreflang for conflicting signals.
Prioritize template fixes
Convert the diagnosis into changes that stop recurrence and concentrate signals around priority URLs.
Fixing URLs one by one would not solve a template-level problem. The leverage came from changing the rules that kept generating duplicate paths, crawl waste and conflicting search signals.
One product could exist under multiple crawlable URLs.
Shopify collection paths exposed alternate URLs for the same products. Across multiple languages, the same structural pattern multiplied the crawlable footprint and split internal signals across unnecessary paths.
/products/{product-handle} Canonical /collections/.../products/... Duplicate The alternate collection URL added no unique search value but still expanded crawling and internal-link complexity.
- 01 Keep
/products/{product-handle}as the canonical product path - 02 Consolidate collection-based product duplicates into the canonical URL
- 03 Point product cards, listings and widgets directly to canonical 200 URLs
- 04 Align sitemap and hreflang with the same canonical product architecture
One product should have one primary search URL. Category context can stay in navigation and breadcrumbs without creating additional crawlable product paths.
Parameters, pagination and JSON were expanding the crawl workload.
The excess footprint came from repeatable template rules rather than isolated URLs: query parameters, duplicate first-page pagination and non-HTML resources were all consuming crawl attention without adding equivalent search value.
Query-string expansion
Tracking and product parameters created alternate crawlable URLs without creating new organic landing-page value.
First-page duplication
The clean category URL already represented page one, so a second crawlable ?page=1 version added unnecessary duplication.
Non-HTML crawl consumption
A material share of sampled crawl activity was going to JSON resources instead of priority HTML pages.
The objective was not to block Google blindly. First stop generating unnecessary URL variants where possible, then restrict crawling where those resources add no public search value.
Questions Behind the Technical Decisions
A few practical details behind the highest-impact recommendations.
Did 492K non-indexed URLs mean those pages should all be indexed?
No. The problem was not that Google refused to index 492K valuable pages. Much of the discovered inventory came from repeatable technical patterns: alternate product paths, parameters, redirects, 404s and duplicates. The priority was to reduce unnecessary URL generation and concentrate crawl and ranking signals around useful canonical pages.
Why were collection-based product URLs a problem if canonical tags existed?
Canonicals help consolidate signals, but they do not stop the site from generating, crawling and internally linking to alternate product paths. The recommended model was one canonical product URL, with internal links, sitemap entries and hreflang aligned to that same destination.
Why did 31% JSON crawl share matter?
JSON represented a material share of sampled crawl activity while those resources were not priority organic landing pages. The recommendation was not to block Google blindly, but to reduce unnecessary JSON crawling where it added no public search value and keep more crawl attention on useful HTML.
How were the fixes prioritized for implementation?
Priority went to repeatable rules with the largest structural impact: consolidate duplicate product URLs, control parameters and pagination, reduce unnecessary JSON crawling, and point internal links directly to final 200 URLs. Hreflang and other supporting signals were then aligned with the corrected architecture.
