Hulo Global
Plugins

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:

curl -sSL https://huloglobal.com/vendure-plugins/visitor-analytics/install.sh | bash

Prefer to do it by hand?

yarn add @huloglobal/vendure-plugin-visitor-analytics

Register it

In your vendure-config.ts:

# vendure-config.ts import { VisitorAnalyticsPlugin } from '@huloglobal/vendure-plugin-visitor-analytics'; export const config: VendureConfig = { plugins: [ VisitorAnalyticsPlugin.init({ publicBaseUrl: 'https://shop.example.com', licenceKey: process.env.HULO_LICENCE_KEY_VISITOR_ANALYTICS, }), // ... your other plugins ], };

Run the migration

The plugin adds its own table(s). Generate + run the migration like any other:

yarn migration:generate AddVisitorAnalyticsPluginTables yarn migration:run

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.

POST/ees/trackPublic: ingest a batch of events
GET/ees/visitors/summaryAdmin: top-line counters + daily series
GET/ees/visitors/sourcesAdmin: top sources by visits / sessions
GET/ees/visitors/top-pagesAdmin: most-visited URLs
GET/ees/visitors/funnelAdmin: configurable funnel with drop-offs
GET/ees/visitors/exit-pagesAdmin: top exit pages
GET/ees/visitors/top-eventsAdmin: top custom event types
GET/ees/visitors/liveAdmin: SSE live-now stream
GET/ees/visitors/journey/:visitorIdAdmin: per-visitor timeline
GET/ees/visitors/recentAdmin: recent events
GET/ees/visitors/export.csvAdmin: CSV export
GET/ees/goalsAdmin: list conversion goals
POST/ees/goalsAdmin: create a goal
PUT/ees/goals/:idAdmin: update a goal
DELETE/ees/goals/:idAdmin: delete a goal
GET/ees/goals/statsAdmin: per-goal completion stats

FAQ

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.

Ready to ship?

Buy a key, drop the plugin in, ship today.