Short answer: URL parameters (the part after ?) create duplicate content when they change the address without meaningfully changing the page, as tracking, sorting and session parameters do. Handle them by classifying each parameter: point passive ones to the clean URL with canonicals, keep valuable filters as indexable pages with clean URLs, block endless combinations in robots.txt, and never use parameterised URLs in your own internal links.
Why parameters create duplicates
To a search engine, every distinct URL is potentially a distinct page. These are four different URLs:
/shoes/
/shoes/?sort=price
/shoes/?utm_source=newsletter
/shoes/?sort=price&utm_source=newsletter
Yet they show the same products. Multiply that by every category, every sort option, every filter value and every campaign link, and a site with a few hundred real pages can expose tens of thousands of URLs. Search engines then have to crawl them, notice they are duplicates, choose one to index and fold the signals together. They are good at this, but not perfect, and the process wastes crawling and sometimes picks the wrong version.
The four kinds of parameters
The key to handling parameters is knowing what each one does. Most fall into four groups:
| Type | Examples | Changes content? | Usual handling |
|---|---|---|---|
| Tracking | utm_source, gclid, fbclid, ref |
No | Canonical to clean URL; never link internally |
| Session and state | sessionid, sid, currency |
No or minimally | Move to cookies; canonical to clean URL |
| Reordering and display | sort, order, view, per_page |
Order only | Canonical to clean URL; often block crawling |
| Filtering and paging | color, brand, size, page |
Yes | Depends on search value; see below |
Tracking, session and display parameters produce true duplicates. Filtering and paging produce different subsets of content, which is why they need a more careful decision.
Tracking parameters: keep them out of your own links
Campaign tags like utm_source are meant for external links, such as newsletters, ads and social posts. Problems start when they leak inside the site: a banner on your home page linking to /sale/?utm_source=homepage, or a menu built from a copied campaign URL. Every internal link with tracking parameters creates a crawlable duplicate and also distorts analytics by overwriting the real traffic source.
- Remove tracking parameters from all internal links. Use analytics events for internal campaign tracking instead.
- Make sure every page has a self-referencing canonical to its clean URL, so external links with tracking tags are consolidated.
- Check that your server does not redirect parameter URLs in chains or strip parameters needed for ad attribution.
Session IDs: move them to cookies
Session parameters in URLs are a legacy of older platforms. Because every visitor, including every crawler visit, gets a new ID, they produce effectively infinite duplicates. Modern platforms store sessions in cookies. If yours still adds a session ID to URLs, fix the platform configuration; canonicals help, but the crawl waste remains until the parameter disappears from links.
Sort and view parameters: canonicalise and often block
Sorting a category by price or showing 48 items per page gives visitors a useful choice, but it is not a new page for search. The standard approach:
- Canonical on every sorted or display variant pointing to the default category URL.
- If the variants are linked from every category and the site is large, block the parameters in robots.txt, for example
Disallow: /*?sort=, to save crawl requests. Only do this once you are sure no valuable URLs use them. - Alternatively, implement sorting without changing the URL, or with links that crawlers do not follow as standard
hreflinks.
Filter parameters: decide by search demand
Filters are where most of the value and most of the risk sit. Some filtered pages match real searches: “black running shoes”, “Nike running shoes”, “waterproof hiking jackets”. Others match nothing anyone searches for: “running shoes, size 44.5, sorted by newest, under 80 euros, blue or green”.
- List filter types and values and check which ones correspond to real search demand, using keyword research and your own site search data.
- Give valuable filters clean, stable URLs, such as
/running-shoes/black/or a single well-defined parameter, with their own title, heading and a short description. Treat them as landing pages: self-canonical, indexable, in the sitemap, linked from the category. - Make the rest non-indexable and ideally non-crawlable. Canonical to the parent category or noindex for combinations that remain crawlable, and block multi-filter combinations by pattern if they create crawl traps.
- Limit combinations. Many sites allow one filter per type to be indexable and block anything with two or more filters combined.
Pagination parameters: let them be
Paginated pages like ?page=2 show different items, so they are not duplicates of page one. Do not canonicalise them to page one and do not block them, or products and posts listed deeper lose their crawl path. Each paginated page should canonicalise to itself. If pagination creates very deep lists, improve structure with subcategories and more items per page rather than hiding the pages.
Rules that keep parameter URLs under control
- Consistent parameter order.
?color=black&size=42and?size=42&color=blackare different URLs. Generate parameters in a fixed order. - No empty parameters. Avoid URLs like
?color=&size=being linked. - Lowercase values and consistent encoding, so
?Color=Blackand?color=blackdo not both exist. - Return 404 for invalid values rather than showing an empty or default page with 200.
- Keep the sitemap clean. Only list the clean URLs you want indexed.
Google once offered a URL Parameters tool in Search Console to tell it how to treat each parameter. It was retired in 2022, so handling now has to happen on the site itself, through links, canonicals and robots.txt.
Parameters on WordPress and WooCommerce
WordPress sites have their own familiar set of parameters, and it helps to know which ones are harmless:
?p=123and?page_id=45are the default “ugly” permalinks. With pretty permalinks enabled, WordPress redirects them to the clean URL, which is fine.?s=is internal search. Keep it out of links and the sitemap, and consider blocking it in robots.txt.?replytocom=used to create a duplicate URL for every comment reply link. Most SEO plugins and modern themes handle it, but it is worth checking on older sites.?orderby=in WooCommerce is the sort parameter on shop and category pages. Canonicalise it to the clean category URL and consider blocking it on large shops.?filter_color=and similar come from WooCommerce layered navigation widgets. These are the ones that multiply fastest, so decide which filter values deserve clean landing pages and keep the rest out of the index.?add-to-cart=links should never be crawled. Crawlers following them can even add load to the server. Block them in robots.txt.
After changing any of these settings, crawl the shop again and compare the number of discovered URLs with the previous crawl. A large drop in parameter URLs, with no drop in real pages, is the result you want.
How to find parameter problems on your site
- Crawl the site and group all discovered URLs by parameter name. Count how many URLs each parameter produces.
- Check which pages link to parameter URLs. Templates such as filters, sort menus and banners are usually responsible.
- Check canonicals on parameter URLs. Do they point to the clean URL, to themselves or nowhere?
- Review Search Console for parameter URLs in the indexed pages list or in duplicate and not-indexed statuses.
- Check server logs to see how much of the crawl goes to parameter URLs.
How Site SEO AI Audit helps
SEOAuditBot crawls your site like a search engine and reports duplicate content, duplicate titles and canonical problems, along with the URLs involved. When parameter URLs create groups of near-identical pages, they show up together, making it easy to see which template produces them. Issues are weighted by how many pages they affect, so a filter system that multiplies every category rises to the top of the fix list. WordPress and WooCommerce sites also get concrete fix steps. You can run a free audit to see how many URLs your site really exposes.
Related reading
- Canonical tags explained: how to set them and fix errors
- Crawl budget explained: when it matters and how to save it
- Discovered – currently not indexed: why and how to fix it
- Duplicate title tags and meta descriptions: how to fix them
The bottom line
Parameters are not bad in themselves, but every one that changes the URL without changing the content creates a duplicate. Classify your parameters, canonicalise passive ones, give valuable filters clean indexable URLs, block endless combinations, and keep parameterised URLs out of your own links.
SSS
Do UTM parameters cause duplicate content?
They can, if pages with UTM tags get crawled. A self-referencing canonical on each page consolidates them. The bigger issue is internal links with UTM tags, which create crawlable duplicates and distort analytics, so remove them.
Should I block URL parameters in robots.txt?
Block parameters that create large numbers of worthless URLs, such as sort orders and multi-filter combinations. Do not block parameters whose pages need to be crawled, like pagination, or pages that carry canonicals you want search engines to see.
Is the Google Search Console URL Parameters tool still available?
No. Google retired it in 2022. Parameter handling now relies on your site’s links, canonical tags and robots.txt rules.
Should filtered category pages be indexed?
Only those that match real searches and offer a useful selection, such as a brand or colour within a category. Give them clean URLs and unique titles. Other combinations should not be indexed.
Are paginated URLs duplicate content?
No. Each paginated page lists different items, so it should canonicalise to itself and remain crawlable. Canonicalising all pages to page one can cut off crawl paths to deeper items.


