FAQ
Cookie banners, ad blockers, accuracy, serverless, multiple sites, data location and what Analytik leaves out.
Do I need a cookie banner?
strict mode, the default, is designed so that you do not need a consent banner. It stores no identifier on the visitor’s device, and the tracker only reads its own localStorage keys for opting out and consent (analytik_ignore, analytik_consent) if they exist. That design holds when the site and the tracker stay in strict mode, you do not use identify(), and nothing is kept in cookies or session storage. It is a design goal, not a legal opinion. Whether you need a banner depends on your country, your regulator’s guidance and what else your site does, and the GDPR still applies to any personal data you process. The visitor id is pseudonymous, not anonymous. Mention analytics in your privacy policy, and ask a lawyer if the stakes are high.
In enriched mode, show a banner and call analytik.consent() when the visitor accepts. In persistent mode, which sets cookies, treat consent as required in the EU. See Privacy modes.
Why are my numbers lower than Google Analytics?
Reasons stack up: ad blockers that block the script or the request (see the first-party route), bots that Analytik filters out, and the wait for the first interaction before the first pageview (data-require-interaction). Strict mode also has its own limits: a visitor who changes network counts twice, while two people on one network and browser count once.
Are visitors with Do Not Track counted?
Yes. Visitors whose browsers send Do Not Track or Global Privacy Control are counted, but always in strict mode: no cookie, no tab id and no stored identity, even on a site set to enriched or persistent. You can turn this off with privacy.respectDoNotTrack: false on the server.
Can I track several sites with one deployment?
Yes. Each site has an id, a domain and its own settings, including privacy mode. One Worker or one server handles all of them, and the dashboard has a site switcher.
Does it work on serverless?
Yes. The server is a fetch handler without background state. Salts are rotated and old ones deleted by the first request of each month, and retention runs on the ingest path, so no scheduled job is needed. On Postgres, use a pooled connection string, as in the Vercel guide. SQLite needs a single long-lived process, so use Workers with D1 or Postgres on serverless platforms.
Where is my data?
In the database you configured, on the platform you chose. Analytik sends nothing to any third party, and the dashboard has no external requests.
Can I use it without React?
Yes. The server, the tracker script and the HTTP API do not need React. Only the dashboard and the React bindings do. You can read the data from the HTTP API and draw it yourself.
What happens if the server is down?
Tracking never blocks the page. The tracker sends events with sendBeacon where available and ignores failures, so events during an outage are lost.
How do I exclude my own visits?
In the site’s Settings, under Privacy, copy the “Ignore this browser” link and open it in each browser you use (it is remembered in that browser only), or add your IP address or a range such as 203.0.113.0/24 to the ignored IPs (“Add my current IP” fills in the address the server sees). If the dashboard and the tracker share an origin, “Ignore signed-in admins” drops the visits of any browser signed in to the dashboard. You can also call analytik.optOut().
How do I get revenue per source?
Send payments with the generic API or a webhook, and put the visitor and session ids in the checkout metadata. See Attribution and payments for how payments are matched when the metadata is missing.
Can I import data from another analytics tool?
Yes, from Umami, Simple Analytics, Matomo, GoatCounter, Google Analytics 4 and PostHog, in Settings → Data or with analytik import. See Importing data. Plausible only exports daily totals, so its history cannot be imported; run both side by side for a week and compare the numbers.
What is not included?
A hosted multi-tenant service, Google sign-in and plan billing are out of scope. Also not available yet: an MCP server, a link shortener, A/B testing and session replay.
How do I read my numbers from a script?
Make an API key in Settings → API keys and send it as Authorization: Bearer anl_... to /api/v1/sites/SITE_ID/overview. A key can be limited to some sites, rolled without downtime and switched off in one click. For showing numbers to other people, a share link is simpler.
Can I limit an API key to my server’s address?
Yes. Press Addresses next to the key in Settings → API keys and list the IPv4 or IPv6 addresses or ranges it may be used from. Any other address, or one the server cannot tell, is refused with 403. See Limit a key to addresses.
Is the code open source?
Yes, under the MIT license. See the repository for the source and issues.