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.

index.htmlHTML
<!-- analyticshq -->
<script defer src="https://analyticshq.org/script.js" data-site="YOUR_SITE_ID"></script>
anywhere in your appJavaScript
// 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.

Ship analytics you actually own.