Documentation
Everything you need to install Quietlytics, record events and read your numbers.
Quick start
- Create an account and confirm your email.
- On your account page, add your domain (for example
example.com) and publish the DNS record it shows. Press Check now. Data is only accepted for domains you have verified. - Paste this into the
<head>of every page:
<script defer src="https://quietlytics.app/tracker.js"></script>
Load your site and open your dashboard. The first visit appears within seconds.
Install
Plain HTML or a template
Put the snippet in the <head> of your layout so it is on every page. Keep the defer attribute.
Single-page apps (React, Vue, Svelte and similar)
Add the same snippet to your root HTML file, for example index.html. Route changes made with the History API are counted as pageviews automatically, so you do not need any router integration.
Next.js
import Script from 'next/script' // in your root layout <Script src="https://quietlytics.app/tracker.js" strategy="afterInteractive" />
Client-side navigations are counted as pageviews. The tracker works out where to send events from the address it was loaded from, so there is nothing else to configure.
Content Security Policy
If your site sends a Content-Security-Policy header, add https://quietlytics.app to script-src (to load the tracker) and to connect-src (to send events). Nothing else is needed: the tracker adds no styles, images, frames or inline code.
Local development and staging
The tracker ignores localhost, 127.x and [::1], and localhost cannot be verified, so your own local testing never reaches your numbers. To test the install end to end, use a staging domain such as staging.example.com. Add and verify it like any other website, then remove it when you are done.
What is tracked automatically
With just the snippet installed, each pageview records:
- The page path. The query string and
#fragmentare removed. Segments that look like IDs (numbers, UUIDs, long hex strings) become:id, so/users/48213and/users/77group as/users/:id. - The referrer, as a hostname only, such as
news.ycombinator.com. Visits from your own site are not counted as referrals. - Browser, operating system and device type as coarse groups (for example Chrome, macOS, Desktop). Anything unrecognised is grouped as Other.
- Campaign tags from the address (see below).
- A daily visitor code, used only to count unique visitors within a day. See privacy behaviour.
A new pageview is recorded when the page loads and when your app changes the address with history.pushState or the browser's back and forward buttons. Changing only the #fragment is not counted, and neither is navigating to the exact address the visitor is already on. A full page reload is a new pageview.
Custom events
Use custom events to count things that are not pageviews: signups, button clicks, downloads, checkout steps. Call track with a name:
track('signup')Events appear in the Custom events panel on your dashboard, with the number of times each was recorded.
Examples
// a button
document.querySelector('#download').addEventListener('click', () => track('download'))
// a form
form.addEventListener('submit', () => track('newsletter_subscribe'))
// after something succeeds in your code
await createAccount()
track('signup')Naming rules
- 1 to 64 characters: letters, numbers, spaces, and the characters
_ . : -. - A name that breaks the rules is dropped, not recorded. Names are case sensitive, so
Signupandsignupare different events. - Pick a consistent scheme such as
checkout:startandcheckout:complete. You can filter and group by name in the dashboard and with the AI analyst.
Things to know
- Always pass a name.
track()with no name is recorded as a pageview. - Events carry the page they happened on, so you can see which page produced them, but they have no extra properties. Put the detail in the name, for example
plan:pro. - Wait for the script. Because of
defer,trackexists once the page has loaded. Code that runs earlier should check first:window.track && window.track('signup') - Do not put personal data, such as an email address or a user ID, in an event name. Event names are stored as written.
- Do Not Track and Global Privacy Control apply to events too.
Campaigns (UTM)
Add the standard tags to the links you share and Quietlytics records them:
https://example.com/launch?utm_source=newsletter&utm_medium=email&utm_campaign=october
utm_source shows in the UTM source panel. utm_medium and utm_campaign are stored too and can be used when you ask the AI analyst about a campaign. Each value is kept to its first 64 characters.
Privacy behaviour
- No cookies and no local storage. Nothing is saved on your visitors' devices, so you do not need a cookie banner for Quietlytics.
- Do Not Track and Global Privacy Control are honoured. If a visitor's browser sends either, nothing is recorded. The tracker checks in the browser and the server checks again.
- Bots and crawlers are ignored.
- IP addresses and browser strings are not stored. They are used only to compute the visitor code, which is a one-way hash combined with a random value that is deleted every day. A person is counted once per day, and cannot be recognised from one day to the next. For IPv6 visitors only the network part of the address (the first half) goes into the code, because devices change the rest regularly.
Because the code changes daily, unique visitors over a longer range add up each day's visitors, so a person who visits on three days counts three times. Quietlytics cannot tell you about returning visitors or sessions, by design. The full details are in the privacy policy.
Reading the dashboard
- Visitors and Pageviews are the two headline charts. Click either to switch the chart. Use 7d, 30d and 90d to change the range, and the menu to switch website. All times are UTC.
- Live visitors, under the title, counts the different visitors who sent an event for the selected website in the last 5 minutes. It updates every 30 seconds while the tab is open. It is the number of people who loaded or navigated a page recently, not people still on the site, because Quietlytics does not track time on page.
- Top pages, Referrers, UTM source, UTM medium, UTM campaign, Browsers, Operating systems, Devices and Custom events list the biggest values over the chosen range.
- Compare with the previous period. Under Visitors and Pageviews, a line such as "▲ +12% vs prev 30d" compares the range with the same number of days just before it. It only appears once your website has twice that much history, so a 30-day comparison needs 60 days of data. Small numbers show as a plain difference ("+3") instead of a percentage, because percentages of tiny counts are noise. In the lists, an arrow marks a row that changed by at least 3 visitors and 20%.
- Click to filter. Click any row (a page, a referrer, a browser, a campaign) and the whole dashboard narrows to those visitors: the totals, the chart and every list. You can combine several filters, remove one by clicking it in the bar above the lists, and share the address, which keeps your filters. Custom events are shown for the filtered pages and visitors, and cannot themselves be filtered on.
- Ask (Pro and Business plans) opens the AI analyst. Ask in plain language, for example "What changed this week?" or "Which referrers lead to /pricing?". It reads only the aggregated numbers for your own websites. See pricing for the plans.
Managing websites
Verifying a domain
To prove you own a domain, add a TXT record at _quietlytics. followed by your domain, with the value shown on your account page. For example.com that is the host _quietlytics.example.com. Some DNS providers want only _quietlytics in the name field and add the domain themselves. Press Check now once it has propagated, which can take a few minutes. After it is verified you can remove the record.
Subdomains and www
www.example.comandexample.comare the same website.- Other subdomains, such as
blog.example.com, are separate websites. Add and verify each one. - Sites on a shared hostname you do not control (for example
yourname.github.io) cannot publish DNS records, so they cannot be verified yet.
Export and delete
- Export CSV on a website's card downloads every stored event for it.
- Remove website deletes the website and all of its stored data. This cannot be undone.
- Delete account, at the bottom of your account page, removes your account, websites and data, and cancels any paid plan.
Data kept
Hobby accounts keep 6 months of data. Pro and Business keep 13 months. Older data is deleted automatically.
Troubleshooting
If no data appears, check these in order:
- Is the website verified? Events for domains that are not verified are discarded. The card on your account page shows Verified.
- Does the domain match? A page on
app.example.comonly counts ifapp.example.comis verified, not justexample.com. - Is the snippet on the page? View the page source and look for the
tracker.jsline. Open the browser's network tab and look for a request to/api/eventafter loading the page. It should return202. - Are you on localhost? Add
data-localor test on the real domain. - Does your site have a Content Security Policy? The script can load while the events are still blocked. Your policy must allow both the script and the place it sends events:
Without the
script-src https://quietlytics.app connect-src https://quietlytics.app
connect-srcentry the browser's console shows a blocked/api/eventrequest, and no data arrives even though the script is on the page. - Do Not Track or Global Privacy Control on? Many privacy browsers and extensions turn them on, including your own. Test from a normal browser profile.
- An ad blocker? Some blockers stop analytics scripts. Try with it switched off.
- Is it a bot or headless browser? Automated and preview tools are ignored on purpose.
A 202 response does not prove an event was stored: the service answers the same way for dropped events, so it never reveals why something was ignored. Still stuck? Email [email protected].