Shopify already solved filter duplication. Your meta description, not so much.
Most advice on Shopify category page SEO is about filters, sort URLs and duplicate content. The platform solved that years ago. On 12 August 2026 we measured seventeen Dutch Shopify stores: on all seventeen, a filtered collection URL points cleanly back to the plain category page. Not one exception.
What does break sits one layer down and takes no development work. On 7 of the 17 stores, the category page meta description is unusable. Six serve no tag at all. One serves a tag containing seven characters. In all seven cases the cause is identical: one empty text field in the Shopify admin.
So you pay for hours spent on a problem the platform handles itself, while the field that makes your category page visible stays empty. And since May 2026 that same field carries a third function almost nobody fills in: the context AI agents get to see about your store.
How we measured this, and where the measurement stops
We selected eighteen Dutch webshops whose Shopify origin was confirmed through the powered-by response header. For each store we took the first real collection listed in sitemap_collections_1.xml. That is deliberately not an editorial choice: it stops us from cherry-picking each store's best category page.
The downside is that some of the measured pages are edge collections, with slugs like test-collection or no-category. For the canonical measurement that changes nothing, because the behaviour comes from the platform rather than the merchant. For the meta description it is a real limitation: a store may well have filled in its main categories and skipped the leftovers. Read the numbers below as a floor for what is done right, not as a judgement on any single brand.
One domain dropped out. That address answers every path with homepage HTML, including /agents.md, so there is no collection page and no agent file to measure. The sample is therefore seventeen rather than eighteen.
This is a sample of seventeen measured stores, not a statement about Dutch e-commerce as a whole. That is why we report counts rather than market percentages. Every figure below comes from that measurement or from a primary source we link.
What Shopify already handles on your category pages
Two protective layers are on by default, and they work. The first is the canonical tag. For each store we requested several URL variants and looked at which canonical came back.
| URL variant | Canonical Shopify serves | Result |
|---|---|---|
/collections/x?filter.v.availability=1 |
the plain /collections/x |
17 out of 17 |
/collections/x?sort_by=price-descending |
the plain /collections/x |
17 out of 17 |
/collections/x?page=2 |
itself, including ?page=2 |
16 out of 17 |
The second layer sits in robots.txt. On all seventeen stores, the Shopify rules that exclude sort URLs and multi-filter combinations are still in place. Not one store removed them. On five multilingual stores those same rules appear several times in the file, including a variant with a language prefix, which makes the file longer without changing what it does.
That second pattern is more precise than it looks: it only kicks in at two or more filters at once. A single filter stays crawlable, but canonicalises to the base page. That is coherent design, not a gap.
If "handling filter indexation" or "setting up canonicals on collections" is a line item on your quote for a Shopify store, you are paying for work the platform already does. Ask which URL demonstrates the problem. The one failure mode you should genuinely check is a theme that overrides the canonical tag itself. That happens, and one request per template type settles it.
Why canonicalising to page 1 is the actual mistake
Of the seventeen stores measured, page 2 of a collection keeps its own canonical on sixteen. We checked the outlier: that collection has no second page, so there is nothing to canonicalise.
Sixteen out of seventeen is not a platform weakness, it is exactly what you want. Page 2 shows different products than page 1. Canonicalising page 2 to page 1 tells Google those products do not need a findable page of their own. On a collection of three hundred items, that removes most of your assortment from your own category structure.
Yet the advice to "canonicalise pagination to the first page" still circulates. It is a leftover from the rel=prev/next era, and it is precisely the kind of advice that causes damage the moment someone applies it to a store where things were already fine.
There is an immediate test for your own store here. Open a collection with more than one page, go to page 2 and view the source. A canonical without ?page=2 means someone modified the theme and you have a real problem. A canonical that includes ?page=2 means this item is done and you can cross it off.
The real gap in category page SEO: 7 of 17 have no meta description
Same measurement, different field. On every measured collection page we read out the meta name="description". The results fall into three groups.
| Situation | Count | What you see in the source |
|---|---|---|
| Filled and usable | 10 of 17 | A sentence of roughly 120 to 330 characters about the category |
| Tag entirely absent | 6 of 17 | No meta name="description" in the head |
| Present but empty | 1 of 17 | content="- Patta", seven characters |
That last case is the sharpest piece of evidence, because it exposes what happens underneath the other six. On the Patta tops collection, the source contains a dash and the brand name, and nothing else. The theme uses a pattern along the lines of "collection description, dash, store name". With an empty collection description, only the tail survives. The six stores without a tag run a theme that outputs nothing at all in that same situation. So this is not merchant negligence, it is a theme pattern that breaks on an empty field.
The cause is identical across all seven, and it is not a technical fault: the collection.description field is empty. That is a text box in the Shopify admin, not a development ticket. Anyone billing this as "technical SEO" is selling the wrong work.
What it costs to leave it there does not follow from our measurement, because we captured no search results. What is certain: without your own description, Google composes one from the page text, and on a category page without an introduction that page text consists of product names and prices. You are leaving the most important line of your search result to the incidental order of your collection.
One empty field, three payoffs
The reason we push on this is the stacking. collection.description is not one field with one function, but one field with three consumers: the visitor who reads at the top of the category page why your assortment is put together the way it is, Google which pulls the meta description from it in virtually every Shopify theme, and the agent files covered further down this article.
A category page without an introduction is a filter result, not a page with a point of view. That difference is exactly where brand building and findability meet: the text that convinces a visitor is the same text that makes your search result readable.
One writing round across your twenty most important collections therefore hits three channels at once. We now include that round as standard in every Shopify build, and on existing stores it is usually the first thing we tackle, before anyone touches the theme. How that fits into a broader build is covered under our webshop development and in projects such as Drivv.
What is /agents.md, and why is the factory version still in place on 17 of 17 stores?
Every Shopify store serves a file at /agents.md. Since 28 May 2026 you can override it: Shopify announced that you can customise /llms.txt, /llms-full.txt and /agents.md through your own template under Online Store, Themes, Edit code. Without a template, the path falls back to the Shopify-generated text.
We fetched /agents.md on the seventeen measurable stores. All seventeen respond with content type text/markdown and with the same heading structure: a title line carrying the store name, followed by blocks on the purchase protocol, read-only browsing, store policies and the platform. Not one store has its own version.
That it is auto-generated can be established without assumptions. One store in the set is the only one missing the store policies block, and that store happens to have published no policies. The content follows the store data, not an editor.
The file is not dead either. On one of the measured stores, the sitemap index file lists an agent discovery sitemap first, containing exactly one URL: that store's own /agents.md, with a weekly change frequency. Shopify actively offers this file to crawlers.
What sits in that factory version is disappointing for a brand. The text routes agents to Shopify's own infrastructure: a purchase skill, a protocol endpoint, a product interface. About your positioning, your category structure or the reason someone should buy from you rather than the next store, it says nothing. We wrote earlier about what that means in Shopify webshop AI: ready for agents and about how those purchases work technically in agentic commerce through Shopify.
Selling llms.txt as SEO is nonsense, filling in agents.md is not
Google is unambiguous here. Its own AI documentation states that it is fine to create llms.txt files for other services, but that doing so neither helps nor harms your visibility in Google Search, because Google Search ignores them. The same page clears up two more assumptions: chunking content "for AI", and structured data as a precondition for generative search results.
Several Dutch agencies nonetheless offer llms.txt as a standalone SEO service right now. That is not a matter of interpretation. The source says otherwise.
At the same time, agents.md is not a Google channel. It is the rail for agent-driven purchases, and Shopify itself offers it to crawlers. Almost nobody in the Dutch market draws that distinction, and it is the only distinction that matters here.
| File | Who reads it | Effect on your Google ranking | Worth filling in |
|---|---|---|---|
llms.txt |
External services that support the file | None, Google ignores it | Only as a follow-up to agents.md |
agents.md |
Agents buying through Shopify | None | Yes, this is where brand context belongs |
collection.description |
Visitor, Google and agents.md | Direct, through the meta description | Yes, this is the first action |
So we do not offer llms.txt as an SEO service. What we do is put brand, category and returns context into agents.md in plain language, so an agent can pass on something meaningful about the store. How that connects to how you build category pages is covered in our piece on GEO-ready category pages.
Shopify throttles bots that do not sign their requests
Another change that shipped quietly and affects your audit. On 7 May 2026 Shopify announced that it applies stricter rate limits to bots and agents accessing the Storefront API and Shopify-hosted online store pages. Bots that do not sign their requests fall into the strictest category. The same announcement notes that merchants wanting to crawl their own stores can find ready-to-use Web Bot Auth signatures in the Shopify admin.
That explains a class of failures that looks like a crawl error. If you run a crawler across a Shopify store and hit a wall of 429 responses halfway through, the store is not broken and neither is your crawler. You are in the strictest bucket because you are not signing.
The order we now follow: pull the signature from the client's admin first, then run the audit. Our own measurement this week ran sequentially with a one to two second pause per request and hit no 429 at all. That is not proof that signing is the fix, but it fits the picture.
One related point from the same changelog, because it causes silent damage otherwise. On 17 June 2026 Shopify shipped a new collection model. The announcement notes that collections using the new features are filtered out in earlier API versions, because the legacy shape cannot represent them. An SEO, feed or export tool on an older API version therefore does not see those collections, with no error message. They are simply absent. Check which version your apps run on before drawing conclusions from an export.
The order we work in
In six years of Oase Creative we have seen plenty of audits that were technically correct and commercially worthless. This measurement explains why that happens: the part of SEO that is easiest to automate is also the part the platform already solved. That is where the hours go, because that is what produces a report.
On a Shopify store we therefore reverse the order. First the collection descriptions for the most important categories, because that is one action with three payoffs. Then agents.md with real brand context instead of the factory version. Only then the theme, and specifically the two things that genuinely break: a theme that overrides the canonical, and apps on an old API version that miss collections.
What we no longer do is budget hours for filter and sort duplication. On seventeen out of seventeen measured stores, there was nothing wrong there. If an audit still lists it as a finding without a URL showing the failure, it is a template finding.
A category page that explains how you assembled your assortment does work no technical fix ever will. If you want to see where your store stands, an SEO engagement with us starts by looking at these three fields before anything else.
