Product analytics with the reports already built: activation, retention and feature usage presented as answers rather than as a query builder.
Build me a product analytics service that replaces June: the handful of numbers that say whether the product is being used, computed from my own event data. STACK - Node 20+ with Fastify for ingestion and the interface - SQLite through better-sqlite3, WAL mode. It handles tens of millions of events on one disk; when it genuinely stops, the same schema moves to Postgres - A small browser SDK and a server SDK, both mine - Caddy in front THE DATA MODEL - events: id, name, user_key, company_key, properties_json, occurred_at, received_at, session_id, source - users: key, first_seen, last_seen, traits_json - companies: key, first_seen, last_seen, traits_json, plan, seats - daily_user_activity: derived at query time, never stored — computing it beats keeping it correct - funnels: id, name, steps_json, window_hours - reports: id, name, kind, definition_json, created_by - Index events on (name, occurred_at) and (user_key, occurred_at). Nothing else until a query is slow - occurred_at is when it happened, received_at is when it arrived. They differ on mobile and the difference matters INGESTION - POST /track with name, user key, optional company key, properties and a timestamp - Batch endpoint that takes an array, because a mobile client sends thirty at once when it comes back online - Idempotency: a client-supplied event id is unique, so a retry does not double count - Reject an event with no name or no user key; store nothing half-formed - Accept events up to 30 days old and never in the future by more than a minute; clock skew is real - Rate limit per token, and answer 202 quickly — ingestion must never wait on anything THE NUMBERS THAT MATTER - Active users: daily, weekly, monthly, each defined on the page. WAU is distinct user keys with at least one event in the last 7 days, and the definition is written where the number is - Stickiness: DAU over MAU, as a percentage - Retention: a cohort table by week, where week 0 is the week a user was first seen and each cell is the share still active. Say whether it is calendar weeks or rolling, and mean it - Feature adoption per event name: users who did it, how often, and the share of all users - Funnels between named steps with a completion window, showing drop-off per step and the median time between them - Company-level everything: the same numbers grouped by company key, because a B2B product is used by accounts, not by people WHAT NOT TO BUILD - No session replay, no heatmaps, no autocapture. Autocapture produces a lake nobody can query and a privacy problem nobody signed off - Named events only, defined deliberately. Fewer than fifty for a real product - No dashboards builder in version one: five fixed reports that answer real questions beat a query builder nobody opens DATA HYGIENE - An event schema registry: the first time a name arrives it is recorded with its property types, and a later event with a different type for the same property is flagged rather than silently coerced - A page listing event names by volume with their last-seen date, so dead events can be removed from the code - Renaming an event creates an alias so history is not lost PRIVACY - No IP stored, no cookie required: the user key comes from the host application - Properties are whatever the app sends, and the README says plainly not to send names, emails or anything else that identifies a person - Deletion by user key, and it deletes rather than anonymises THE INTERFACE - One page per report, each one number and one chart and the definition beneath it - A date range and one grouping control, nothing more - Charts hand-drawn as inline SVG. No charting library - Dark and light, one accent OPERATIONS - .env: DATABASE_PATH, INGEST_TOKENS, BASE_URL, ADMIN_PASSWORD_HASH - Migrations on boot, each once - Ingestion and reading are separate routes with separate rate limits; a slow report must not slow a write - Nightly backup off the machine, restore script, and a documented retention policy - Health endpoint that writes and reads one row WHAT MATTERS MOST Ingestion correctness first: idempotent, fast, and honest about time. Then active users and retention, with their definitions printed beside them. Every analytics product that gets abandoned was abandoned because somebody could not reproduce a number — make every number reproducible from the events table with a query the page will show you. Give me the repository, both SDKs, migrations, .env.example, a seed with a month of synthetic events, and a README with deploy steps behind Caddy.
What you lose
- Report templates that answer the standard product questions without anyone designing a dashboard
- Integrations that pull events from the tools you already send them to
- Company-level rollups for business-to-business products
If you would rather not build
- A weekly SQL query, which is honestly enough at the start
What it costs
as published on their pricing page
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $149/mo | — | — |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
PostHog
$0Product analytics with funnels, retention and cohorts, self-hostable.
PostHog/posthogfree · open source
Metabase
$0Saved questions and dashboards over a database you already run.
metabase/metabasefree · open source
Why this verdict
our own opinion · changed only by a person
74/100
Verdict yes at 74. Four SQL queries replace most of a product analytics tool at small scale, and they are the four everyone ends up reading.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about June
answered from the record above
Is June free?
No — the plan we track is $149 a month. From around $149/month billed monthly, priced on tracked users.
Can you replace June by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 74 out of 100, build time one session. Read what you lose before you decide.
How much does June cost?
$149 a month on Pro — $1,788 a year. Recorded 10 Aug 2026.
What do you lose by replacing June?
Report templates that answer the standard product questions without anyone designing a dashboard; Integrations that pull events from the tools you already send them to; Company-level rollups for business-to-business products. If any of those carry weight for you, keep paying.
Is there an open-source alternative to June?
Yes: PostHog, Metabase. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

