Website and product analytics aimed at marketers: page views, funnels and cohorts without a data team, and event tracking that does not require someone to instrument the code first.
Build me product analytics that replace Usermaven: funnels and cohorts somebody can read without writing SQL, from events I capture automatically. STACK - Node 20+ with Fastify - SQLite through better-sqlite3, WAL mode — and read the note on scale at the end - A tracking script under 6KB gzipped, from my own domain - Server-rendered dashboard, charts as inline SVG drawn by hand - Caddy in front THE DATA MODEL - users: id, external_id, email_hash, first_seen_at, last_seen_at, traits_json, company_id - companies: id, external_id, name, traits_json — because business products are bought by an account, not a person, and every question is really about the account - events: id, name, user_id, anonymous_id, session_id, path, referrer_host, utm_json, props_json, country, device, browser, os, bot, created_at - sessions: id, user_id, anonymous_id, started_at, ended_at, entry_path, exit_path, event_count - identities: anonymous_id, user_id, at — the stitch, so a visitor's events before signup belong to them afterwards - funnels, cohorts, saved_reports: definitions only, computed at query time. Never stored results - Everything is an event with a name and properties. A new signal is a new name, never a migration AUTOMATIC CAPTURE, WHICH IS THE SELLING POINT - The script records page views, clicks on interactive elements, form submissions, and outbound links without anybody instrumenting anything - Each captured click carries a stable selector, the element's text and its position, so a button added on Tuesday is analysable on Wednesday without a deployment - The stable selector is the hard part: prefer an explicit attribute, then an id, then a structural path that ignores generated class names. A selector that changes on every build makes the history worthless - Autocapture is a starting point, not the whole story. Named events with properties are still better for anything that matters, so make defining one a single line and encourage it in the documentation - Never capture the contents of an input. Ever. Autocapture that reads form values is how a password ends up in an analytics database IDENTITY AND STITCHING - An anonymous identifier per browser until the person is identified, then a stitch row that binds the two - After stitching, the anonymous events belong to the user, and every report must honour that retroactively — which is why events keep both identifiers rather than being rewritten - Traits set at identification and updated over time, with the value at the time of the event available to reports. 'Which plan were they on when they did this' is a question people ask constantly - Company traits alongside user traits, and every report groupable by either FUNNELS WITHOUT SQL - Pick steps in order, choose a window, and see the count and the conversion at each - Strict or loose ordering, chosen explicitly: loose allows other events in between, strict does not, and the difference changes the number a great deal - Break the funnel down by any property — plan, country, device, source — with the segments compared side by side - Show where people go instead of the next step, which is usually the most useful thing on the screen - Time between steps, as a distribution rather than an average COHORTS AND RETENTION - A cohort is a saved definition: people who did this, with these traits, in this period. Computed at query time, never stored, so it is never stale - Retention as a triangle: of the people who first did X in a given week, how many did Y in each following week - Say plainly which retention definition is in use, because there are several and they give very different answers - Cohorts usable as a filter anywhere else ATTRIBUTION, CAREFULLY - Capture the first and last touch per user, with the campaign parameters and the referrer - Report both, and say which is which. Multi-touch attribution models are mostly a way of turning an unanswerable question into a confident number, so if you build one, label it as a model rather than a measurement BOTS AND HONESTY - Flag, never drop, and exclude through a SQL view - The script executing is the strongest humanity signal available; record it - Definitions written beside every number, because a metric without a definition is decoration and these numbers get shown to people who will act on them PRIVACY - No cookie beyond a first-party identifier you control, no third-party requests, and nothing sent anywhere else - Email stored as a salted hash unless there is a reason to hold it - Deletion by user identifier in one command SCALE, HONESTLY - Product analytics is high-volume, and SQLite will take you further than expected but not forever. Keep the event table narrow, index deliberately, and pre-aggregate nothing - Write down the threshold at which you would move to a columnar store, and the fact that the event schema is the thing that would carry across OPERATIONS - .env: DATABASE_PATH, BASE_URL, HASH_SALT, GEOIP_DB_PATH, SESSION_SECRET - Migrations on boot, each once - Nightly backup off the machine, restore script - Health endpoint WHAT MATTERS MOST Identity stitching and stable selectors. Get the anonymous-to-known join right before any report exists, because every funnel and every cohort is wrong without it, and make autocapture's selectors survive a rebuild or the history means nothing. Give me the repository, the tracking script, migrations, .env.example, a seed of shaped events, and a README with deploy steps behind Caddy and every definition written out.
What you lose
- Funnels and cohorts presented so somebody who does not write SQL can use them
- Attribution across channels already stitched together
- Automatic event capture, so a new button is measurable without a deploy
- A single script covering both site and product analytics
If you would rather not build
- Plausible plus a small events table
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $84/mo | — | 15 Aug 2026 |
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 and cohorts, self-hostable.
PostHog/posthogfree · open source
Metabase
$0Point it at your database and non-technical colleagues can build their own charts.
metabase/metabasefree · open source
Why this verdict
our own opinion · changed only by a person
74/100
Verdict yes at 74. The engineering is a familiar events table; the work is in presenting it so somebody who does not write queries can get an answer.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Usermaven
answered from the record above
Is Usermaven free?
No — the plan we track is $84 a month. Growth at $84/month for three users; Scale is $199. An agency plan starts at $49/month.
Can you replace Usermaven 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 Usermaven cost?
$84 a month on Starter — $1,008 a year. Recorded 14 Aug 2026.
What do you lose by replacing Usermaven?
Funnels and cohorts presented so somebody who does not write SQL can use them; Attribution across channels already stitched together; Automatic event capture, so a new button is measurable without a deploy; A single script covering both site and product analytics. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Usermaven?
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

