# Reading the dashboard (/dashboard)



A site opens on six tabs: **Analytics**, **AI**, **Visitors**, **Goals**, **Funnels** and
**Search**. The Search tab is absent on a server with neither Google Search Console nor Bing
configured, which leaves five. This page is about the first one, and about the vocabulary the rest
of them borrow.

The range control in the header travels with you across all of them. The count of active filters
beside it belongs to the Analytics tab alone, because no other tab has a filter model.

## The tiles [#the-tiles]

| Tile                | What it counts                                                                                      |
| ------------------- | --------------------------------------------------------------------------------------------------- |
| People              | How many people visited, counted once per day. Somebody who comes back on another day counts again. |
| Visits              | How many separate times people arrived. A visit ends after 30 minutes with no new page.             |
| Page views          | How many pages were opened in total, including the same page more than once.                        |
| Time on site        | How long an average visit lasts, from the first page to the last.                                   |
| Left after one page | The share of visits where somebody opened one page and went no further.                             |
| Online              | How many people have a page open right now.                                                         |

Every tile explains itself behind its question mark, in a little more detail than the table above,
so the page can always tell you what a number means without you coming here.

Three of them deserve a paragraph.

**People is a sum of daily uniques.** Peeko has no cookie and no account to count with, so a person is
a one way hash of their address and browser that is re-salted every day. Within one day that is enough
to tell two people apart. Across two days it deliberately is not, which is the privacy property the
whole product rests on. So a 30 day People number is not "how many different humans", it is the sum of
each day's distinct people, and somebody who visits every week counts four times a month. It is the
honest version of a number most analytics tools round off.

**Time on site is measured between page views.** The last page of a visit has no next timestamp, so a
visit that opened one page contributes zero to the average. That is why it reads lower than you might
expect on a site where people read one article and leave.

**Left after one page is not automatically bad.** An answer found on the first page looks exactly like
a visitor who lost interest.

Once a site has recorded revenue, the Revenue tile joins the row and Left after one page steps out, so
the row stays six wide.

### Comparisons [#comparisons]

Each tile compares its window against the equal window immediately before it, and the tile you have
selected says "vs previous period" under the number. Counts move in percent, Time on site moves in
minutes and seconds, and Left after one page moves in points.

Deltas disappear when there is nothing honest to compare against: the range is `All time`, or the
site recorded nothing before the previous window began, or that previous window held fewer than ten
people. The selected tile then says "Nothing to compare with yet" instead of showing a number that
means nothing. Revenue never carries a delta at all.

### The chart [#the-chart]

Select a tile and the chart draws it. A muted dashed line behind it is the same metric in the previous
period. When the last bucket is still filling, the line finishes dotted and the legend adds a **so
far** swatch, so a half finished day is never read as a collapse in traffic.

Hovering a bucket gives the numbers for that bucket, the new and returning split when you are looking
at People, and the same day in the previous period.

## Ranges [#ranges]

`Today`, `Last 24 hours`, `Last 7 days`, `Last 30 days`, `Last 90 days` and `All time`, plus **Custom
range**, which opens a two month calendar.

The presets are calendar days in the site's own time zone, except `Last 24 hours`, which is a rolling
day and means the same thing in any zone. `Last 7 days` means today and the six days before it, so its
last bucket is still filling.

A custom range is written into the address as `?range=2026-08-01..2026-08-31`, both days included. It
can cover at most 731 days, two years and a day, and it cannot end in the future. A completed window
is compared against the same number of calendar days immediately before it.

The range travels with you: every link on the page keeps it, so moving between tabs or opening a
visitor never silently changes the window you are reading.

### The time zone, and the one place it does not reach [#the-time-zone-and-the-one-place-it-does-not-reach]

A site's time zone is set in its settings, and it decides where a day starts: the bucket boundaries,
their labels, and what `Today` means. The legend under the chart names the zone it drew.

**Visitor counts still reset at UTC midnight**, because that is when the daily hash rotates. On a site
far from UTC, somebody who visits on both sides of your local midnight is counted twice on that day.
Search Console and Bing days are the engines' own Pacific days, which is a third calendar again. These
are stated on the surfaces that use them rather than hidden.

A site with no zone set uses UTC, and offers you your account's zone as a nudge above the dashboard.
The nudge stays until you answer it, either way: taking the zone and keeping UTC are both answers,
and there is no third state where it simply goes away.

## Filters [#filters]

Click a row in a breakdown and the whole page narrows to it: the tiles, the chart, every other card
and the visit list. Click it again to remove it. A country on the map filters the same way. Thirteen
dimensions can be filtered.

`page` · `source` · `country` · `device` · `browser` · `browser_version` · `os` · `os_version` ·
`screen` · `viewport` · `utm_source` · `utm_medium` · `utm_campaign`

Filters combine with **and**, one value each, and they live in the address, so a filtered view is a
link you can send. Active filters appear as chips under the tiles, each with its own remove button,
and a **Clear all** appears once there are two.

Two numbers are deliberately outside the filter model, and the page says so where it matters. Revenue
is range scoped only, because a sale belongs to a whole journey rather than to the last page of it.
Online now is a live snapshot of the site, not of the filtered slice.

## The breakdown cards [#the-breakdown-cards]

Four cards, each with tabs.

* **Pages**: the pages people read, plus **Entry** and **Exit** pages, the **Clicks** Peeko recorded,
  a **Broken** tab of paths that returned 404, and a **Revenue** tab once money is attributed.
* **Sources**: **Referrers**, **Campaigns** from UTM tagged links, **AI** for people arriving from an
  assistant, **Social**, and **Revenue**. AI and Social are subsets of Referrers, never a
  reclassification, so everything in them is also in the main list. When a site is linked to
  [Search Console or Bing](/search-console), a search row sits above the list.
* **Where people are**: a world map, and the countries as a list. Country comes from an edge header,
  never from an address Peeko stored.
* **Devices**: **Browser**, **OS**, **Device**, **Screen** and **Appearance**, which is the share of
  page views in dark mode and in light.

Four lists are display only, because Peeko has no filter key behind them: Appearance, the screen
size buckets, the Clicks list and the Revenue tabs. Every other row filters.

**The percentages do not all share a denominator**, on purpose. Pages, Referrers, Countries and
Devices are a share of the window's page views. Entry and Exit are a share of visits, because that is
the question those tabs answer. Broken pages are counted, not shared.

**"Direct" means no external referrer was recorded**, which covers a typed address, a bookmark, most
apps and anything that stripped the referrer on the way. A referrer that was recorded is stored as its
hostname alone, with `www.` removed, and never a full URL.

**The Broken tab is an undercount and can be blind.** The response status comes from the visitor's own
browser, and only Chrome and Edge report one. An empty list is not a promise that nothing is broken,
and the card says which of the two situations it is in.

**See all** opens the full list, up to a thousand rows, with a search box over what it fetched, and
the footer tells you how many of how many you are looking at. It is an owner's control: a demo or a
shared page prints "top 10" and offers no dialog.

## People and visits [#people-and-visits]

The **Visitors** tab holds two rosters, and it opens on visits.

* **Visits** is every visit in the range, newest first: who, where from, how many pages, how long, and
  the ordered trail of pages when you expand it.
* **People** groups those visits by a person, with their first and last visit, their countries and
  devices, and their journey across the range.

The name beside each one, something like "Cobalt Heron", is generated from the hash and is not an
identity. The hash **fragments** when somebody changes network or browser, and it **merges** people
who share an address and an identical browser. Peeko says the fragmenting half itself, in the detail
pane beside a selected visit, along with the fact that the identity resets whenever the salt is
rotated. The merging half is worth adding here: this is the resolution cookieless measurement has,
and anything more precise on offer elsewhere is a cookie or a fingerprint.

The dashboard itself carries a **Recent visits** card. It shows ten at a time and pages through them
in place, up to fifty pages, with a link to the full roster beside it.

### Online now [#online-now]

The Online tile counts people with a page open right now, from a heartbeat their browser sends every
45 seconds while the tab is visible. Anybody whose last heartbeat is under two minutes old is online.

That is a different question from "who clicked recently", and the difference shows: somebody reading
one long article for ten minutes is online and has opened nothing. Owners can open the tile to see
what those people are reading; a share link can publish the count alone.

## Your own visits [#your-own-visits]

Open your site once with `?me=1` and that browser is tagged as yours, by a flag kept in the browser's
own storage. `?me=0` untags it. Tagged visits are badged **You** wherever visits are listed.

**Count my own visits** in the site's settings decides whether they count. Off, they are left out of
every number on the dashboard and still shown, badged, in the visit lists, so you can see your own
testing without it moving the numbers.

## What is not on this page [#what-is-not-on-this-page]

Two reads that exist in the product have no dashboard card: time on page, per path, and the raw
engagement list behind it. They are on [the command line](/cli) as `peeko engagement` and over
[MCP](/mcp) as `get_engagement`.
