Verify
Once the script is live on a real domain, one real pageview should show up within seconds.
Confirm it works
- Load a real page
Open your live site in a normal browser tab — not
localhost, and not with an ad blocker you have configured to strip analytics. Navigate to any tracked page. - Check the dashboard
Open Real-time in your Kymo dashboard. Your visit should appear on the map within a few seconds. If you would rather confirm from the browser, open DevTools first — see below.
- Confirm the network calls
In DevTools, on the Network tab:
beat.jsloads with status200.- A request to
/api/beatfires with status204. That204means the event was accepted.
In the Console,
window.kymoshould be a function.
Nothing showing up
Work down this table. Most missing-event problems are one of these.
| Symptom | Cause | Fix |
|---|---|---|
No beat.js in Network | Ad blocker or privacy extension | Test in a clean browser profile or incognito with extensions off. The script is named beat.js, not analytics.js, to avoid most blocklists, but aggressive blockers still catch it. |
beat.js loads, no /api/beat call | Content-Security-Policy | Add https://kymo.in to script-src and connect-src in your CSP header. sendBeacon needs connect-src. |
/api/beat returns 400 | Missing data-site or path | Ensure the tag has data-site="yoursite.com". |
Events accepted (204) but dashboard empty | data-site does not match your registered domain | Your data-site must equal the domain in your dashboard exactly — no scheme, no www.. yoursite.com, not https://www.yoursite.com. |
| Nothing on localhost | Intentional | beat.js no-ops on localhost, 127.*, and 192.168.*. Deploy to a real domain to test. |
| Your own visits missing | Owner opt-out is set | You may have visited with ?kymo=ignore before. Clear it with ?kymo=track, or check your IP is not in Settings → excluded IPs. |
| Events delayed a few minutes | Per-site IP exclusion cache | Changes to excluded IPs take up to 5 minutes to apply. |
Still stuck
Confirm the beacon body in DevTools: the /api/beat request payload should be JSON containing your site and path. If site is wrong there, fix the data-site attribute. If it is right and the dashboard is still empty, the domain is not registered to your account — add it in the dashboard.