Docs · 01 of 07

Install

One DNS record, one script tag, and a check that it worked. About ten minutes, most of which is waiting for DNS.

1. Point a subdomain at the tracker

The tracker host has a fixed IP address, which is in your welcome email. Add one A record on the domain you are measuring:

Type   Name       Value            TTL
A      metrics    203.0.113.42     300

That gives you metrics.example.com. Any subdomain name works. Pick something that reads like part of your site, because that is the point: the script is served from your own domain, so blockers that work by blocking known analytics hosts never see it.

A CNAME works too, but an A record is better here. A CNAME to a shared analytics hostname is exactly the pattern blocklists match on, and it puts a name in your DNS that changes when the infrastructure does.

Wait for the record to propagate, then confirm it resolves before moving on. A certificate is issued automatically on first request, which can take another minute.

dig +short metrics.example.com
curl -sI https://metrics.example.com/script.js | head -1

2. Add the script

One tag, in <head>. It is deferred, so it never blocks rendering, and it is small enough that this is not a performance conversation.

<script
  defer
  src="https://metrics.example.com/script.js"
  data-website-id="b6c9e2a1-4f3d-4a02-9f77-1c5b0d8e2a44"
></script>

Your website ID is in the dashboard under Settings → Websites. It identifies the site, not the visitor.

Through a tag manager

It works, but put it in a Custom HTML tag firing on All Pages, with no consent trigger in front of it. Analytics here needs no consent, and gating it behind a banner throws away the traffic that declines, which is the traffic you were trying to measure honestly in the first place.

Loading it through a tag manager also means it is only as reliable as the tag manager, which is itself blocked reasonably often. Directly in the page is better.

Single-page apps

Route changes are tracked automatically by listening to the History API. Nothing extra is needed for React Router, Next.js, Vue Router or the rest.

3. Check it is working

Open your site, then open Realtime in the dashboard. Your own visit should appear within a few seconds.

If it does not:

  • Check the browser network tab for a POST to /api/send on your subdomain. A blocked request shows here first.
  • Check that the website ID matches. A wrong ID returns 200 and records nothing, which is the most annoying possible failure mode.
  • Check that you are not looking at a cached page served before the tag was added.

4. Tag your ads

Installation gets you traffic. Spend does not join to it until campaigns carry UTMs, and untagged campaigns land as direct with their spend sitting unmatched.

UTM tagging for Google Ads and Meta is the next thing to read, and it is the one that most often gets skipped and then causes the first support ticket.

What the script does not do

  • It writes nothing to the device. No cookie, no localStorage, no sessionStorage.
  • It sets no identifier that survives the day.
  • It sends nothing to any third party. The only host it talks to is yours.
  • It does not read form fields, record sessions, or capture keystrokes.