Visitor Analytics
Self-hosted, privacy-respecting visitor journey + conversion goals — no third party.
What it does
Built for production from day one.
Self-hosted visitor analytics. Page views, time-on-page, exit pages, a configurable funnel, conversion goals, UTM attribution, bot detection. Per-visitor profile drawer with parsed UA + MaxMind GeoLite2 geo. Survives login — guest and signed-in events share the same visitor id. Privacy-first defaults: DNT respected, IPs anonymised, optional consent gate.
Lightweight ingest endpoint
`POST /ees/track` accepts a batch of pageviews / unloads / custom events. Cookies (`ees_vid`, `ees_sid`) issued + refreshed automatically.
Configurable conversion goals
CRUD a goal with a URL glob (`/checkout/thank-you/*`) and a value (£/$). Live matcher tags every pageview that hits the pattern. Dashboard shows completions per goal.
Bot detection
UA-classified `isBot` flag on every event. Excluded from "real human" counts but visible on the dashboard so you can see crawler share.
Privacy-first defaults
DNT respected, IPs anonymised to /24 (IPv4) / /48 (IPv6), optional `requireConsent` gate. All three opt-outable.
UTM attribution
Source / medium / campaign / term / content captured server-side per pageview. Plus referrer domain so reports group by source without UTM.
Funnel + exit-page reports
Configurable funnel with per-step drop-off, exit-page report, top events, top pages.
Per-visitor journey drawer
Click any visitor for the full timeline: pages, custom events, time on page, country, browser, OS.
Live-now SSE widget
Real-time tile on the admin dashboard showing visitors active right now (by country).
Custom event helpers
`recordEvent("add_to_cart", { productVariantId, quantity })` on the storefront — fires fire-and-forget, batched, with the same enrichment.
CSV export
`/ees/visitors/export.csv?days=N` returns the last N days (max 90) of raw events with full enrichment.
Install
Three steps, five minutes.
Add the package
Or run the one-line installer that does steps 1–3 for you:
Prefer to do it by hand?
Register it
In your vendure-config.ts:
Run the migration
The plugin adds its own table(s). Generate + run the migration like any other:
That's it. The admin UI tab appears immediately. Without a licence key the plugin runs in a degraded evaluation mode — fine for trying things out. Buy a key →
HTTP endpoints
Every route exposed.
/ees/trackPublic: ingest a batch of events/ees/visitors/summaryAdmin: top-line counters + daily series/ees/visitors/sourcesAdmin: top sources by visits / sessions/ees/visitors/top-pagesAdmin: most-visited URLs/ees/visitors/funnelAdmin: configurable funnel with drop-offs/ees/visitors/exit-pagesAdmin: top exit pages/ees/visitors/top-eventsAdmin: top custom event types/ees/visitors/liveAdmin: SSE live-now stream/ees/visitors/journey/:visitorIdAdmin: per-visitor timeline/ees/visitors/recentAdmin: recent events/ees/visitors/export.csvAdmin: CSV export/ees/goalsAdmin: list conversion goals/ees/goalsAdmin: create a goal/ees/goals/:idAdmin: update a goal/ees/goals/:idAdmin: delete a goal/ees/goals/statsAdmin: per-goal completion statsFAQ
Common questions.
How do I get a licence key?
Buy here — Stripe Checkout, monthly or lifetime. You'll receive the JWT key by email; set it as HULO_LICENCE_KEY_VISITOR_ANALYTICS in your .env.
Does it work without a key?
Yes — the plugin boots in a degraded "evaluation" mode. You can install, configure, and inspect the admin UI before committing.
Where is data stored?
In your Vendure database. The plugin adds its own tables via a migration — your data never leaves your server.
Will it survive a Vendure upgrade?
It targets Vendure 3.x (compatibility set to ^3.0.0). Major version bumps will be tested against new Vendure releases.