For developers & indie hackers
One line in, full control out.
Drop in a single script tag, fire custom events with one function, and read it all back over a clean API. Self-hostable, PostgreSQL-backed, and privacy-first by default. Your data stays yours.
Own the pipeline, not just the dashboard.
The script and your data live on a host you control. Beacons POST to your own /collect endpoint and aggregates come back from your own PostgreSQL database, so there is no third party in the middle and nothing leaves for an ad graph.
- Self-host it, or point the script at your own domain.
- PostgreSQL-backed, so the raw events stay queryable.
- Open source, MIT-licensed, and framework-agnostic.
Privacy-first without writing any privacy code.
There are no cookies, no local storage, and no cross-site identifiers to reason about. Visitors are counted with a hash that rotates every 24 hours, so you ship a compliant analytics stack without a consent library or a legal review.
- No cookies and no consent banner to bolt on later.
- GDPR, CCPA, and PECR friendly with nothing to configure.
- SPA pageviews tracked through the History API automatically.
Drop it in, then send anything.
One tag starts pageviews. After that, any event you care about is a single call, with any properties you want to break it down by later. No SDK, no init.
<!-- analyticshq --> <script defer src="https://analyticshq.org/script.js" data-site="YOUR_SITE_ID"></script>
// a custom event with whatever properties you want analyticshq('plan_upgraded', { from: 'free', to: 'pro', seats: 3 }) // read your numbers back over the API fetch('/api/stats?range=30d').then(r => r.json())
The analyticshq() function ships with the tracking script, so there is nothing extra to import. Properties become filters and breakdowns in your dashboard, the beacon POSTs to your own /collect endpoint, and everything is readable back over the /api routes you host.
What indie builders reach for.
Enough to answer real product questions, none of the dashboard bloat you never open.
Custom events
Fire analyticshq('event', {...}) from anywhere and it becomes a filterable breakdown, no schema to declare first.
A real API
Pull stats over HTTP to build your own status page, Slack digest, or public metrics badge.
Your own data
Every raw event lands in a database you own, so you can query, export, or delete on your terms.