Skip to main content
Fluid serves storefront pages from a CDN. The query string decides which of three things happens to a request:
  • The page is served from the plain URL’s cached copy.
  • The page gets a cached copy of its own, one per distinct value.
  • The page is rendered fresh for every request.
If your theme adds parameters to storefront links, this decides what those links cost your visitors.

The three groups

Ignored

Fluid does not recognize the parameter. It is removed, and the visitor gets the plain URL’s cached page.

Cached separately

The parameter changes the page in a known, limited way, so it earns a cached copy of its own.

Not cached

The parameter can change the page in ways that cannot be cached safely. Every request renders fresh.

Ignored parameters

Any parameter Fluid does not recognize is ignored. Marketing tags are the common case:
So is any parameter you invent for your own front-end code:
That URL is served from the same cached page as /home/shop.
An ignored parameter is removed before the page renders, so request.query_parameters and params do not contain it in Liquid. Your browser URL keeps it, so client-side JavaScript still reads it normally.If you need a parameter your Liquid reads, you cannot invent one. Use a parameter from the Not cached table below, and expect the page to render fresh every time.
Visitor tracking is unaffected. Attribution is reported from the browser with the URL the visitor actually has, so campaign tags still reach your analytics.

Check a parameter your theme reads

If your Liquid reads a parameter — through request.query_parameters or params — check whether it reaches your template. Request the URL and read one header:
If you land in the third row and your template needs the value, move the logic to your front-end code, which still sees the parameter in the browser URL.

Parameters cached separately

Each distinct value gets its own cached copy of the page. A filtered grid is cached per combination, so the first visitor to a facet waits for a render and everyone after them does not:
The shop filter parameters are cached only on /shop, and filterrific[sorted_by] only on /shop and /join. On any other page they do not change the product grid, so Fluid does not cache them there — those requests render fresh instead.count, page, and per_page are cached everywhere, because a paginated section can appear on any template.
A value outside the limits above is not cached. It still works; the page just renders fresh. Deep pagination past page 200 is the case you are most likely to meet.

Parameters that are not cached

These reach the origin on every request, and nothing is written to the cache. Any filterrific filter not in the cached table is also uncached.
Use these deliberately. A storefront link that carries one of them renders on every click, so a navigation menu or a product card that adds ?lang= to every URL takes your whole catalog off the CDN.Set the visitor’s language with the locale selector rather than a link parameter. See Navbar locale selector.

Check what a URL does

Every storefront response carries a header naming the outcome:
Request the same URL twice. A cacheable URL answers MISS and then HIT. A URL that answers SKIP both times is never cached.
  • Prefer a path over a parameter. /home/categories/serums is cached; a filter parameter that reproduces it is cached separately.
  • Keep marketing tags. They cost nothing — they are ignored and the visitor gets the cached page.
  • Put your own state in a parameter only when your front-end code reads it. Liquid will not see it.
  • Keep language and country out of storefront links.