SEO
XML sitemaps for ecommerce catalogues in production
XML sitemaps for ecommerce are the list I give Google of preferred Magento, Shopify and WooCommerce catalogue URLs, so crawl is spent on products and collections rather than cart paths and filter twins. This note is for production catalogues, not for a ten-page brochure.
I am Alan Vo, a Gold Coast web developer. Eighteen years of storefronts, including Magento operations where year-on-year sales rose $2.5 million over three years, taught me that a sitemap packed with junk wastes the same crawl budget layered navigation already burns. Google’s build and submit a sitemap guide is the rule I start from: list the URLs you want in results, use absolute https:// addresses, and treat submission as a hint.
Why XML sitemaps for ecommerce still matter in 2026
XML sitemaps for ecommerce still matter in 2026 because a catalogue manufactures thousands of URLs by design, and Google will not guess which of those documents you actually sell from. A PDP, a collection, a size guide and a returns page deserve a fetch. A session-tagged twin, a ?color= facet, an empty sale category and /checkout do not.
Google is explicit that a sitemap does not force a crawl or an index. The value is operational. New SKUs reach Googlebot faster when the file is current. Preferred URLs get a weak canonical hint when they also appear in the sitemap. Search Console then shows which child files Google fetched and which lines 404ed.
I treat sitemaps as the other half of canonical URLs for ecommerce catalogues. The tag names the winner. The sitemap must list that winner, not the category-path twin Magento also serves. On-page SEO for ecommerce stores still has to make the document unique. llms.txt is a different file: a few dozen useful documents, not 40,000 SKUs.
How XML sitemaps for ecommerce actually work
XML sitemaps for ecommerce work by handing Google a UTF-8 file of absolute canonical URLs, optionally wrapped in a sitemap index when one file would break the size rules. XML is the format I ship because it can carry lastmod, image locators and locale alternates. RSS and a plain text list are legal. They are not how I describe a catalogue.
Google’s notes are the ones merchandisers skip:
- One file is capped at 50,000 URLs or 50 MB uncompressed. Split before either limit and point a sitemap index at the children. Google’s sitemap index documentation allows 50,000 child loc entries.
- Host the file at the site root unless you submit it in Search Console. Discovered only from robots.txt, a sitemap covers descendants of its parent directory.
- Use fully qualified URLs.
/hoodieis a relative path.https://store.example/products/hoodieis a loc. - List the URL you want in results. If the same product is reachable two ways, put the preferred one in and keep the others out.
- Google ignores
changefreqandpriority. It useslastmodonly when that date is consistently true. A copyright year bump is not a significant update. A price, offer, title or image change is.
Image locators sit in the same file. Google’s image sitemap extension wants image:loc under each page URL. Caption, title, geo and licence tags are gone. I list the primary product image. Shopify already attaches that image. Magento can add base or all images from Catalog > XML Sitemap. All images on a 20-shot PDP is how a jewellery sitemap doubles in size for no extra crawl.
Submission is a hint. I still do it. Search Console’s Sitemaps report shows fetch time and parse errors. I also put Sitemap: https://store.example/sitemap.xml in robots.txt. Multiple Sitemap lines are for market-specific files, not a second copy of the same product list.
Google’s ecommerce URL structure guide is the catalogue layer. The URL in internal links, the canonical tag and the sitemap loc must be the same string. If page one of a collection is /hoodies without ?page=1, do not list /hoodies?page=1.
How Magento, Shopify and WooCommerce emit them
The platforms emit sitemaps from catalogue settings and generated files, and they disagree the moment you add a second domain or a cloud filesystem that cannot write to /.
Magento and Adobe Commerce: Adobe’s site maps documentation (updated August 2026) is the Admin path I use. Marketing > SEO & Search > Site Map creates the file. Stores > Configuration > Catalog > XML Sitemap sets frequency, image inclusion, generation and file limits. Enable generation. Daily on a live catalogue. Maximum URLs per file defaults to 50,000. Maximum file size defaults to 10,485,760 bytes, tighter than Google’s 50 MB.
Adobe Commerce 2.4.9 added Generation Method. Standard loads the catalogue into memory. Batch is the memory-optimised path. I turn Batch on before I invent a custom exporter.
Cloud is the trap. Adobe’s cloud sitemap and robots guide (updated August 2026) says the web root is not writable. Generate to /media/ (or pub/media/ in the Admin path). Then rewrite https://store/sitemap.xml to /media/sitemap.xml with a Fastly VCL snippet. Skip the rewrite and Search Console submits a 404 while the real file lives under /media/.
Shopify: you do not write the Online Store sitemap. Shopify’s finding and submitting your sitemap help article is the official behaviour. https://your-domain/sitemap.xml is generated, points at child files for products, collections, blogs and pages, and updates when you add those resources or an image. The primary product image is included. International domains on Basic and above each get their own sitemap. Submit each domain. Private mode blocks the crawler. Extra sitemap URLs go in robots.txt.liquid using Shopify’s robots.txt theme guide. Keep the default Liquid groups.
Hydrogen is a different job. @shopify/hydrogen getSitemapIndex builds the index. getSitemap writes each child. Pass locales and a getLink function that returns the same canonical path the storefront serves. The Storefront API sitemap query can return empty pages. Always read hasNextPage.
WooCommerce: WordPress core already ships XML sitemaps at /wp-sitemap.xml. The WP_Sitemaps class registers posts, taxonomies and users, and adds the index to robots.txt on public sites. WP_Sitemaps_Posts includes every public, viewable post type except attachments. Product is public, so published products appear as wp-sitemap-posts-product-1.xml. wp_sitemaps_post_types is the filter I use to drop types that should not be in Search. I remove the users provider. A second SEO plugin that writes /sitemap_index.xml on top of core is how I get two indexes. Pick one.
Production checklist
The production checklist is a fetch of the live sitemap, then a diff against canonicals, robots and Search Console so the next import cannot reintroduce junk.
- Open the public sitemap URL as a guest. Confirm 200,
application/xml, and UTF-8. Follow the index to every child. - Sample 20 product locs, 10 collection locs and 5 CMS locs. View-source each page. The
rel="canonical"must equal the loc. - Drop cart, checkout, account, search, wishlist, filter URLs, HTTP twins, www mismatches and any URL that 301s or 404s.
- Split before 50,000 URLs or the platform byte cap. Submit the index, not 40 sibling files by hand, unless you want separate Search Console rows.
- Magento: enable generation, pick Batch on large catalogues, write to a writable path, and rewrite
/sitemap.xmlon cloud. Set Add Images into Sitemap to Base Only unless image SEO is a named job. - Shopify Online Store: submit
sitemap.xmlper international domain. Turn off private mode. Diffrobots.txt.liquidafter every app install. - Hydrogen:
getLinkmust match live PDP paths, including locale prefixes. Paginate untilhasNextPageis false. - WooCommerce: confirm products appear under core or the chosen plugin index, not both. Remove users. Keep drafts and private products out.
- robots.txt must name the same files you submitted. Do not Disallow a path you listed.
- After a catalogue import, regenerate or wait for the platform job, then refetch lastmod on a changed SKU. If lastmod did not move, Google has no reason to recrawl.
What breaks XML sitemaps on a live catalogue
Stale lastmod breaks them. A nightly Magento job that stamps every loc with tonight’s date trains Google to ignore the field. A WooCommerce CSV that updates price without touching post_modified does the opposite: the PDP changed and the sitemap still looks quiet.
Listing noindex or redirecting URLs breaks them. Google fetched a URL you asked it not to index, or a Magento category-path product that 301s to the short URL. Facets break them when a plugin adds every filtered collection, the sitemap version of the crawl mess in Magento faceted navigation. Two indexes break them: core WordPress plus an SEO plugin, or Shopify plus a Hydrogen file on the same host. Cloud Magento breaks them when /sitemap.xml 404s and /media/sitemap.xml is fine. Shopify private mode breaks them after a staging launch.
I do not invent a conversion lift from submitting a file. Where I have published store numbers they are system-level: Their Nibs after a Shopify rebuild, and the Magento retail conversion work. Sitemaps were plumbing in those systems.
How to measure
You measure this work in Search Console’s Sitemaps report and page indexing, not in a rank-tracker screenshot of the homepage. I look for last successful fetch, discovered URL count versus the file I generated, and “Couldn’t fetch” on a child. URL Inspection on a new SKU should show the sitemap as a referring source after the job has run.
If discovered URLs sit far below the loc count, Google is dropping lines: noindex, robots block, canonical elsewhere, or soft 404. If the count sits far above the live catalogue, the file still lists deleted SKUs. Fetching the same PDP fifty times a day while new collections sit unfetched is the failure mode.
Related work on this site
Catalogue-scale URL control is the daily work I did as Ecommerce Manager and SEO Coordinator on the Magento retail conversion project, where year-on-year sales increased $2.5 million over three years across three stores. Sitemaps only helped once each SKU had one address. On Shopify I apply the same rule with generated files, which is why Their Nibs (published +31% conversions and +48% orders after the rebuild) and Tamannaah Fine Jewellery still get a guest fetch of /sitemap.xml before a theme ships.
XML sitemaps for ecommerce FAQ
These are the questions I get after Search Console shows a sitemap fetch error.
Do XML sitemaps for ecommerce guarantee that Google will index every product?
XML sitemaps for ecommerce do not guarantee indexing. Google’s docs call submission a hint. The file helps discovery. Indexing still depends on the URL being canonical, crawlable and unique.
Should XML sitemaps for ecommerce include every colour and size URL?
Most colour and size URLs should stay out of XML sitemaps for ecommerce. Google’s ecommerce URL guide says optional query-parameter variants should sit under the parameter-free product URL. Include a variant loc only when that colour or size is a distinct document you intend to rank, with its own canonical and unique HTML.
How do I submit XML sitemaps for ecommerce in Search Console?
You submit XML sitemaps for ecommerce in Search Console by verifying the property, opening Indexing > Sitemaps, and entering the index filename, usually sitemap.xml. Shopify needs that step on every international domain. Magento needs the public URL after any /media/ rewrite.
Can a plugin replace XML sitemaps for ecommerce on Magento or WooCommerce?
A plugin cannot replace XML sitemaps for ecommerce on Magento or WooCommerce by itself. It can print a file. It cannot stop layered navigation, unpublished products or a second index from arguing with that file.
Keep reading
Contact if you want this kind of work on a live store.