Analytics
Dashboard → Analytics → Overview. Traffic, engagement and — if you sell things — revenue, for whatever date range you pick. This is the "how is the shop doing" screen; the site Home page is the "what happened today" one, and the two show different numbers on purpose.
The date range
Top right, on every panel at once. Presets are 7, 14, 30 and 90 days, and the default is the last 30 days including today. You can also set explicit start and end dates.
The range lives in the URL, so a link you send a colleague opens on the same window you were looking at.
Days are your shop's days
Inside a site, every date, time and daily figure is on the shop's own clock — the time zone your WordPress site reports, or the one set in Settings → Monitoring — not on UTC and not on the clock of whoever is reading. "Today" begins at the shop's midnight, so a single day compares with your WooCommerce or Shopify admin, which uses the same zone. The clock in the top bar names the zone and shows your own time beside it.
If the shop has never reported a zone and none has been set, days are UTC and the top bar says so; set the zone in Settings → Monitoring to match your order list.
The four tiles
| Tile | What it counts |
|---|---|
| Pageviews | Every page view in the range |
| Unique visitors | Distinct browsers, counted in the database rather than estimated |
| Avg. time on page | The average of every page view that reported a duration |
| Bounce rate | Sessions with exactly one page view, as a percentage of all sessions |
A session is one browser's visit: it spans every tab of that browser and ends after 30 minutes without activity, on sign-out, or after an order. Before 9 September 2026 a session was one tab, so a product opened in a new tab counted as a second session with a direct entry — session counts, bounce rate and the channel breakdown from before that date are not directly comparable with later figures (sessions read lower, pages per session higher, bounce lower).
A bounce here is a single-page-view session, not a "short visit". Someone who lands on a product page, reads it for four minutes and leaves is a bounce; that is the standard definition and it is worth knowing before you read the number as a verdict on quality.
Any tile shows — rather than 0 when there is nothing to average — no sessions means no bounce
rate, not a bounce rate of zero.
Where visits came from
Each visit is given one channel from the page it landed on and the site that sent it:
Direct, Organic search, Paid (an ad's click id such as gclid, or a utm_medium like
cpc), Email, AI assistants, Social, Referral (another site) and Unreadable
referrer. A visit counts as Email when its link carries an email service's click id —
Klaviyo's _kx, Mailchimp's mc_cid/mc_eid — or a utm_medium of email/newsletter, or
when it was opened from webmail such as Gmail or Outlook on the web. Those click ids name the
person who clicked, so StorePilot keeps only the fact that one was there, never its value. A
link with utm_medium=sms or push is not email, even from an email service.
Compared with the previous period
Under each tile, an arrow and a figure show how it moved against the previous period: the same number of days, ending the day before your range starts. For the last 31 days, that is the 31 days before them. The colour says whether the move is good: more visitors is green, a higher bounce rate is red. The bounce rate moves in percentage points, so 40% becoming 44% reads as +4 pp, not +10%. A rise from zero shows the difference with no percentage.
No comparison is shown when your site did not yet exist for the whole previous period. There was nothing to compare with, which is not the same as a fall to zero. The traffic chart draws the previous period's page views as a dashed line, day 1 over day 1.
New and returning visitors
Under Unique visitors, the count is split into new and returning. A visitor is new when StorePilot first saw their browser inside the range; everyone else is returning. A new browser is not always a new person: the same shopper on a second device, or after clearing cookies, counts as new. Only visits by people are counted.
Days counted before this split existed have no figure for it. A range that includes such a day says the split is not counted yet, rather than showing zero new visitors.
Panels
- Pageviews & errors — both series on one daily chart, because the question is almost always whether a change in one explains a change in the other. Days with no data are drawn as zero rather than skipped, so a gap looks like a gap.
- Top pages — the ten most-viewed pages with their view count and average time. Each row is
one page address: the path without its query string, so a page reached through an ad or a
newsletter link is still one row. A product page shows its product's name with the path
beneath it; every site search is one row, Search results; order and other numbered pages
are one row each kind (
/checkout/order-received/:id). Only visits by people are counted. - Countries, Devices, Browsers, Operating systems — who visited. Browsers are capped at the top 8 and countries at the top 10; unknown values are labelled rather than dropped, so the parts always add up to the whole.
- Leads by type — contact forms, checkouts and whatever else your site submits.
Campaigns
One row per advertising campaign, read from the utm_* parameters on the address a visit landed
on (utm_campaign, or the ad platform's own utm_id when no name is given). A campaign that
reached your shop through several sources, such as Facebook, Instagram and Audience Network, is
one row. Open it to see each source and medium separately.
| Column | Meaning |
|---|---|
| Sessions | Human visits that landed through the campaign |
| Bounce | Share of those visits that saw only one page |
| Checkouts, Orders, Revenue | Checkouts, and paid orders net of refunds, whose buyer last arrived through this campaign in the 7 days before checking out |
| Conv. | Orders ÷ sessions |
| First touch | Paid orders whose buyer first arrived through this campaign in the same 7 days, and their revenue |
| Assisted | Paid orders this campaign took part in when another campaign closed them. A count, not revenue |
Each sale is closed by one campaign and found by one campaign, which can be the same one: over a day, the first-touch orders of all campaigns add up to their last-touch orders. Assists do not add up to anything, because one sale can have several. Two placements of one campaign, such as an Instagram click and then a Facebook click of the same ad, are one campaign: the first is its first touch, and it does not assist itself.
Visits are counted on the day they happened and sales on the day of the checkout, so over a short range a campaign can show a sale with no visits. A buyer's visits include those on their other devices when StorePilot can tie them to the buyer, see One buyer, several devices. A later visit that names no campaign, such as a bookmark or typing the address, does not take the sale away from the advertisement.
Why an ad platform reports more sales than this panel. Meta and Google Ads also count people
who only saw an ad and bought later, and purchases on another device. This panel counts only
visits that reached your site with the campaign's tags. To show campaign names instead of numeric
ids, set the campaign parameter in your ad platform to its name, for example
utm_campaign={{campaign.name}} in Meta's URL parameters.
How buyers arrived
Each checkout's first and last visit in the 30 days before it, as a pair, busiest by paid
orders first. Every visit counts, an advertisement or not. Paid visits are split by the platform
that marked the link: Meta ads (a Meta source in utm_source, as Meta's URL builder writes
it), Google Ads (a Google click id, or a Google source on a paid visit) and Other ads. A
buyer who first came through a Meta ad and came back through Google Ads is the row Meta ads →
Google Ads.
Never seen is a checkout whose buyer's arrival the platform did not see — every earlier visit was automated, or happened before the arrival was recorded — and also a paid order with no checkout at all, counted on the day it was paid. It is listed last whatever its size, and a second line says why: how many of its orders were buyers whose browser asked not to be tracked (Global Privacy Control, which StorePilot honours — see the order's own page), and how many came from a browser the collector never ran in. The row's revenue is in the panel's total, so the panel adds up to the Ecommerce screen's revenue for the same days.
Thirty days rather than the campaigns' seven: this panel credits no sale, it describes the buyers. An ad that was seen but not clicked is never a visit.
One buyer, several devices
Both this panel and Campaigns gather a buyer's visits from every browser StorePilot already ties to them: the browsers of your shop's other checkouts filled in with the same email address, and the browsers logged in to the same customer account on your shop. A buyer who clicked your ad on their phone, started a checkout there, and paid on a computer days later is one buyer, and the ad is credited. A device they used without doing either stays separate. StorePilot does not match devices by IP address or by fingerprint. Your own team's checkouts link nothing, and one buyer is followed across at most 10 browsers.
Where visits begin, and where they go next
Landing page → first step lists the pages visits began on, busiest first: how many began there, how many left without opening a second page, and the first move from each — up to three next pages with their share of the visits that began there.
A page here is a template, the same unit the heatmaps use: every product page counts as one row. Human visits only. A reload is not a move, so a visit that refreshed the page it landed on still counts as leaving from it.
Revenue, orders and abandonment
The commerce block sits under the main chart and loads separately from the rest of the page, so a site with no orders does not slow down or break the traffic panels.
| Card | Meaning |
|---|---|
| Revenue | Total value of orders placed in the range |
| Orders | How many |
| Avg order value | Revenue divided by orders, computed exactly rather than in floating point |
| Cart abandonment | The share of checkouts started in the range that never became an order |
Below them, Revenue over time charts daily revenue; when no day in the range has any, the chart is replaced by "No orders in this window yet." rather than an empty grid. When there are abandoned carts, a line under the chart says how many and what they were worth.
Two things about money are deliberate and worth knowing:
- Amounts are always shown to two decimal places, including zero —
0.00, never0. A screen that mixes the two reads as two different prices. - When a range contains more than one currency, the totals are printed without a currency label. Adding pounds to euros produces a number that is wrong in a way nobody can see, so the label is dropped instead of guessed. If you sell in several currencies, narrow the range or read the per-order figures.
Revenue and orders are counted by when the order was placed. Abandonment is counted by when the checkout started, which is the only way the ratio means anything.
Why a past range can empty the visitor breakdowns
Set an explicit range that ends in the past and you may see this warning:
Device, browser, OS and country breakdowns reflect visitors last active in this window. For a range ending in the past they may read as empty.
Those four breakdowns are counted from the visitor record, which carries the time that visitor was last seen anywhere — not the time of each individual view. A visitor who came back yesterday counts as "last active yesterday" even for the pages they read last month, so a window that ended before yesterday does not contain them.
Pageviews, errors, top pages and the commerce figures are unaffected: they are counted from the events themselves. The warning only appears for custom ranges, because a preset always ends today.
Speed (Core Web Vitals)
Analytics → Speed shows how fast your pages loaded for the people who actually visited: the 75th percentile of real measurements, per device and per page template, in Google's three bands.
- Every figure carries a verdict — Good, Needs improvement or Poor — by Google's own thresholds (LCP 2.5 s / 4 s, CLS 0.10 / 0.25, INP 200 ms / 500 ms, TTFB 800 ms / 1.8 s), so the word here is the word PageSpeed Insights uses for the same page. A bar under each figure shows what share of visits fell in each band, and the legend at the top of the page lists the thresholds.
- A figure is a bound, not a measurement. Measurements are counted in buckets whose edges are Google's thresholds, so the p75 reads «≤ 2.5 s» — the edge of the bucket it fell in. The slowest bucket has no upper edge and reads «≥ 10.0 s».
- Too few visits is a sentence. Below 20 measurements a figure reads «Not enough data (7 of 20)» rather than a dash — a dash in a speed column reads as instant, which is the most flattering possible lie.
- The page list is ranked by slow page views, not by the worst figure: a template with a dreadful LCP and seven visits is not the first thing to fix. The busiest 20 templates are listed.
Where the numbers come from
For days that are closed, the figures are read from pre-computed daily rollups; today is computed live from the raw rows by the same code, so the two cannot drift. If any day in your range has never been rolled up, the whole range falls back to live queries rather than mixing the two — so an un-backfilled stretch of history can never show up as zeros.