How Fathom measures your analytics
In early 2026, we rebuilt our analytics engine from the ground up. Every metric on your dashboard (visitors, pageviews, time on site, bounce rate, referrer attribution) runs through an entirely new system that is faster and more accurate.
This page explains how each metric is measured and what the numbers mean. If you’ve noticed changes in your data since the rebuild, the sections below explain why.
How visitors are counted
Fathom uses a 24-hour visitor-day model. Each visitor is identified by a unique, privacy-preserving signature that rotates every 24 hours at midnight UTC. A “visitor” is counted when that signature records at least one pageview.
There are no cookies and no cross-day tracking. A visitor who comes to your site on Monday and returns on Tuesday is counted as two separate visitors, one per day. This is intentional: it protects privacy while still giving you an accurate picture of daily traffic. You can read more about how our hashing works.
Every visitor is counted exactly. We do not use probabilistic or approximate counting methods. If 1,247 people visited your site today, your dashboard shows 1,247, not an estimate.
Visitors vs uniques
If you use the Fathom API or data exports, you’ll see two metrics that can look the same: visitors and uniques.
At the site level, they return the same number. Both count the unique people who visited your site in the selected date range.
They diverge when you filter or group by page. At that point:
visitors= the number of unique people who visited your site (site-level count)uniques= the number of unique people who visited that specific page (page-level count)
On the dashboard, this is the difference between “Site visitors” in the totals box at the top and “Page visitors” when you drill into a specific page in the Pages box.
For example, if 1,000 people visited your site and 600 of them viewed your /pricing page, the site-level visitors is 1,000 and the page-level uniques for /pricing is 600.
Referrer and UTM attribution
Referrer attribution uses a session-level first-touch model. When a visitor arrives at your site, the referrer from their first pageview is carried across every subsequent pageview and event in that session.
If a visitor arrives from Google and views six pages, all six pageviews are attributed to Google. If they complete an event on the third page, that event is also attributed to Google. The same applies to UTM parameters: utm_source, utm_medium, utm_campaign, utm_content, and utm_term all persist through the session.
Why Direct/Unknown traffic is lower
Previously, only the landing pageview carried the referrer. If a visitor arrived from Google and viewed five more pages, those five pageviews were attributed to Direct/Unknown. This meant the majority of pageviews from referred visitors were misattributed.
That’s been fixed. You’ll see lower Direct/Unknown traffic and higher numbers for your real traffic sources (Google, social platforms, email campaigns, etc.). This isn’t a data loss. Your real traffic sources were always there, they were just being miscounted as Direct.
Time on page
When a visitor leaves a page (or navigates to another page on your site), their browser sends a departure ping that reports exactly how long they spent on the page.
Two important details:
- Tab visibility matters. We only count time when the browser tab is actually visible. If a visitor opens your page, switches to another tab for ten minutes, then comes back for two minutes, the time on page is two minutes, not twelve.
- Single-page sessions are measured. If someone visits one page and leaves, we still know how long they spent there, because the departure ping fires when they leave.
Previously, time on page was estimated from the gap between consecutive pageview timestamps. This meant the last page of every session had no time data (there was no next pageview to measure against), and single-page sessions were completely unmeasured. Departure pings solve both of these problems.
Time on site
Average time on site measures the total duration of each visitor’s session, from their first pageview to their last recorded activity, using departure ping data.
This metric also changed what it measures. Previously, the dashboard showed “Avg time on page,” which averaged the gaps between consecutive page clicks across a session. That approach had two problems: it missed the last page of every session entirely (no subsequent click to measure against), and it couldn’t distinguish between a visitor actively reading and a visitor who left the tab open in the background for twenty minutes before clicking another page.
Now it’s “Avg time on site,” which is session duration calculated from departure pings. This means bounced visits (where someone reads one page and leaves) are now included, backgrounded tab time is excluded, and the metric reflects the full session rather than individual page gaps.
Your numbers may go up or down depending on your site. Sites with lots of single-page visits will often see an increase because those visits now have time data. Sites where visitors frequently background tabs may see a decrease because that idle time is no longer counted.
Bounce rate
A bounce is a visitor who views exactly one page during their visit. Bounce rate is the percentage of visitors who bounced.
Fathom uses a 24-hour session window. If a visitor views one page in the morning, leaves, and returns to view another page in the afternoon, the morning visit is no longer a bounce because the return visit “undoes” it. Both visits fall within the same 24-hour visitor-day.
Previously, bounce detection used a 30-minute window. If a visitor returned after 30 minutes, it was counted as a brand new session, and both visits counted as separate bounces. With the 24-hour window, your bounce rates will generally be lower, and more reflective of actual engagement.
Consistent filtered views
When you apply a filter on your dashboard (for example, filtering by the /pricing page), every box on the dashboard shows data for the same population of visitors.
The totals box, the referrers box, the countries box, the browsers box: they all show data about visitors who match your filter. If 49,000 people visited /pricing, the totals box shows 49,000 visitors, and every dimension box breaks down that same group of 49,000 visitors.
Previously, different dashboard boxes could show different populations for the same filter, which made the numbers appear contradictory. That’s been fixed. Your filtered dashboard is internally consistent.
Entry and exit pages
Entry pages show which page a visitor landed on first. Exit pages show the last page they viewed before leaving your site. You’ll find both as tabs in the Pages box on your dashboard.
These are session-level metrics. Filtering by an entry page shows you the full session context for visitors who entered through that page: where they came from, what devices they used, which events they completed, and where they went next.
Conversions are attributed to entry pages even when the event fires deeper in the session. If a visitor lands on your blog, browses two more pages, and then completes a purchase, the blog post is credited as the entry page for that conversion. This helps you understand which landing pages are actually driving results.
For more detail, see the entry and exit pages section of the dashboard docs.
Bot detection
Non-human traffic is identified and blocked at the point of ingestion. Bot traffic never enters your pageview, visitor, or event counts. It is filtered out before any data is stored or aggregated.
For full details on how bot detection works, see the bot detection documentation.
Dashboard performance
The analytics engine is significantly faster. Viewing “All Time” loads just as fast as viewing “Today,” and dashboard sections below the fold load as you scroll to them.
If you have a high-traffic site with years of data, you’ll notice the biggest improvement. Sites with 65 million+ pageviews and six years of history went from multi-second dashboard loads to sub-second response times.
Secondary dimensions
When you open the detail view of any data box (Pages, Referrers, Browsers, Countries, etc.), you’ll see a Secondary dimension dropdown next to the search field.
Select a secondary dimension (like Browser, Country, Device Type, or any UTM parameter) and your data splits into every unique combination. Each combination appears as its own row, fully sortable by any column.
Want to know which pages are most popular on mobile? Break down Pages by Device Type. Want to see which countries your Twitter traffic comes from? Break down Referrers by Country.
For more on how the detail view works, see the details view section of the dashboard docs.
Data exports
You have full control over what data you export and how it’s organised. Choose your data type (pageviews or events), select your dimensions and metrics, set the date range and timezone, and pick a date grouping (hourly, daily, weekly, monthly, or yearly). You can preview the data before downloading.
For a full guide, see the export documentation.