http://example.com/page
and https://example.com/page
, or www.example.com/page
and example.com/page
, you’ll see separate rows for what looks like the same pathname.
Below are the most common causes, how to confirm what’s happening, and fixes we recommend.
How to view the full URL in your dashboard
If you’re unsure which exact URL Fathom recorded, hover over the pathname in the Pages box. Your browser will show the full URL (typically in the bottom-left corner). This is the quickest way to spot differences likehttp
vs https
, www
vs non-www
, or a different domain/subdomain.
Common causes and how to fix them
1) Both www
and non-www
versions are accessible
Symptom: You can visit both https://example.com/page
and https://www.example.com/page
and they both load without redirecting. Fathom will treat these as separate pages.
Fix: Choose a primary host (with or without www
) and permanently redirect the other to it.
Example fixes:
- DNS + web server: Point both hosts at your server, but have the secondary host 301 redirect to the primary.
-
NGINX (force non-www):
-
Apache (.htaccess, force www to non-www):
-
Cloudflare: Use a single A/AAAA record for the primary host. Add a Redirect Rule to send
www.example.com/*
→https://example.com/$1
(301).
Tip: Be consistent with internal links and your
<link rel="canonical">
tag so everything points to your chosen host.2) Both http
and https
are accessible
Symptom: http://example.com/page
and https://example.com/page
both load. Each protocol shows up as a separate URL.
Fix: Redirect all HTTP traffic to HTTPS, and consider enabling HSTS.
Example fixes:
-
NGINX (force HTTPS):
-
Apache (.htaccess):
- Cloudflare: Turn on “Always Use HTTPS” and (optionally) HSTS after testing.
3) The domain differs (localhost, staging domains, or subdomains)
Symptom: You see the same pathname under different domains, for example:https://example.com/pricing
(production)https://staging.example.com/pricing
(staging)http://localhost:3000/pricing
(local dev)
- Block non-production domains using Allowed Domains so dev/staging traffic is never recorded.
- If you do want subdomain data, enable Multi-domains so each domain/subdomain is clearly grouped and reported.
Recommendation: For most teams, allow only the production domain(s) and exclude localhost/staging entirely. Enable multi-domains only when you intentionally want to analyse multiple domains or subdomains under the same site.
Canonical link doesn’t match the page URL
Fathom will default to using the page’s canonical URL if a<link rel="canonical" href="...">
tag is present. If your canonical points to a different host or path than the one the visitor is on, you’ll see data attributed to that canonical URL instead.
How to check:
- Open the page in your browser and view source (or inspect).
- Find the
<link rel="canonical">
tag and confirm thehref
exactly matches your intended, public URL (correct protocol,www
vs non-www
, correct domain/subdomain, correct path and trailing slash conventions). - Hover over the pathname in Fathom’s Pages box to compare the recorded URL with your canonical.
Verification checklist
- Open each variant (http vs https, www vs non-www, subdomain vs root) and make sure every non-primary URL 301-redirects to your primary URL.
- Check a few representative pages for a correct canonical tag that matches your chosen host and path.
- In Fathom, hover page rows to confirm the full URL matches your expectations.
- If you use test/staging/local environments, configure Allowed Domains (to block them) or Multi-domains (to measure them intentionally).
FAQ
Will this merge my historical duplicates?No. Redirects and canonical fixes prevent future duplication. Historical rows will remain as they were recorded. Do trailing slashes matter?
Yes,
https://example.com/page
and https://example.com/page/
are distinct URLs. Pick a convention, redirect the other, and make sure your canonical tags and internal links follow the same convention.
Do query strings matter?No. By default, Fathom strips query strings from page URLs. Only UTMs (
utm_source
, utm_medium
, utm_campaign
, utm_term
, utm_content
) and the ref
parameter are read for attribution — and they don’t create separate page rows. So https://example.com/page?a=1
and https://example.com/page
are reported as the same page. If you’re seeing duplicates, it’s almost certainly due to host/protocol differences or canonicals, not query strings.