URL parameters create duplicate content chaos.
example.com/page
example.com/page?ref=twittβ¦
example.com/page?ref=twittβ¦
Google sees 3 different URLs.
All with same content.
Wastes crawl budget.
Here's when to use parameters and when to avoid them: π§΅π
1/ Parameters that DON'T change content
These should NEVER create new URLs:
β Tracking parameters
- utm_source, utm_medium, utm_campaign
- ref, source, campaign_id
β Session identifiers
- sessionid, sid, PHPSESSID
β Sorting (doesn't change products shown)
- sort=price, order=asc
Solution: Use hash fragments instead
`/page#sort=price` (not indexed by Google)
Or configure in GSC as "No URLs"
These should NEVER create new URLs:
β Tracking parameters
- utm_source, utm_medium, utm_campaign
- ref, source, campaign_id
β Session identifiers
- sessionid, sid, PHPSESSID
β Sorting (doesn't change products shown)
- sort=price, order=asc
Solution: Use hash fragments instead
`/page#sort=price` (not indexed by Google)
Or configure in GSC as "No URLs"
2/ Parameters that DO change content
These MAY need unique URLs:
β Pagination
- ?page=2
β Filters (if valuable)
- ?color=red
- ?brand=nike
β Search queries
- ?q=running+shoes
Decision: Does it have search volume?
- Yes β Let Google index
- No β Canonical to base or noindex
These MAY need unique URLs:
β Pagination
- ?page=2
β Filters (if valuable)
- ?color=red
- ?brand=nike
β Search queries
- ?q=running+shoes
Decision: Does it have search volume?
- Yes β Let Google index
- No β Canonical to base or noindex
3/ Google Search Console configuration
GSC β Settings β Crawling β URL Parameters
For each parameter, choose:
"No URLs":
Use for tracking parameters.
Google ignores them completely.
"Representative URL":
Google chooses which URL to index.
Good for filters.
"Every URL":
Google indexes all variations.
Use sparingly (pagination, search results).
Client had 15 parameters unconfigured.
Google indexed 200K useless variations.
GSC β Settings β Crawling β URL Parameters
For each parameter, choose:
"No URLs":
Use for tracking parameters.
Google ignores them completely.
"Representative URL":
Google chooses which URL to index.
Good for filters.
"Every URL":
Google indexes all variations.
Use sparingly (pagination, search results).
Client had 15 parameters unconfigured.
Google indexed 200K useless variations.
4/ The clean URL alternative
Instead of parameters, use clean paths:
Bad: `/products?category=shoes&color=red`
Good: `/products/shoes/red/`
Rewrite with .htaccess or nginx:
apache
`RewriteRule ^products/([^/]+)/([^/]+)/$ /products?category=$1&color=$2 [L]`
Benefits:
- Cleaner URLs
- Better for SEO
- Easier to optimize
- Can set unique titles/metas
Instead of parameters, use clean paths:
Bad: `/products?category=shoes&color=red`
Good: `/products/shoes/red/`
Rewrite with .htaccess or nginx:
apache
`RewriteRule ^products/([^/]+)/([^/]+)/$ /products?category=$1&color=$2 [L]`
Benefits:
- Cleaner URLs
- Better for SEO
- Easier to optimize
- Can set unique titles/metas
5/ The tracking parameter solution
Never use URL parameters for tracking.
Instead:
Google Analytics: Auto-tagging
- Enable in GA4 settings
- No URL parameters needed
Other platforms: Fragment identifiers
- `/page#ref=twitter`
- Not in URL Google sees
- Still tracked by analytics
Server-side: HTTP headers
- Store referrer in session
- No URL pollution
Client removed all tracking parameters.
Reduced indexed pages from 50K to 5K.
Never use URL parameters for tracking.
Instead:
Google Analytics: Auto-tagging
- Enable in GA4 settings
- No URL parameters needed
Other platforms: Fragment identifiers
- `/page#ref=twitter`
- Not in URL Google sees
- Still tracked by analytics
Server-side: HTTP headers
- Store referrer in session
- No URL pollution
Client removed all tracking parameters.
Reduced indexed pages from 50K to 5K.
6/ When parameters make sense
Valid use cases:
β Pagination (keeps position in list)
β Search results (shows query context)
β A/B testing (temporarily)
β Print versions (canonical to main)
β Ajax loading (if properly handled)
But always:
- Configure in GSC
- Set proper canonicals
- Monitor index size
Valid use cases:
β Pagination (keeps position in list)
β Search results (shows query context)
β A/B testing (temporarily)
β Print versions (canonical to main)
β Ajax loading (if properly handled)
But always:
- Configure in GSC
- Set proper canonicals
- Monitor index size
7/ Parameter handling checklist:
β Identify all URL parameters on site
β Classify: Changes content? Has search volume?
β Configure in Google Search Console
β Remove tracking parameters (use alternatives)
β Canonical filtered pages appropriately
β Consider clean URL rewrites
β Monitor indexed pages monthly
β Check for parameter-based duplicate content
Parameters = necessary evil.
Manage them properly or suffer.
β Identify all URL parameters on site
β Classify: Changes content? Has search volume?
β Configure in Google Search Console
β Remove tracking parameters (use alternatives)
β Canonical filtered pages appropriately
β Consider clean URL rewrites
β Monitor indexed pages monthly
β Check for parameter-based duplicate content
Parameters = necessary evil.
Manage them properly or suffer.
Generated by Thread Navigator
Press β + S to quick-export
