Hulo Global
Plugins Roadmap

Visitor Analytics

Self-hosted visitor journey, cart abandonment, product recommendations, search analytics — one plugin, one database, no third party.

2,146 npm downloads last monthListed in the Vendure plugin directoryVendure 3.5 – 3.7MySQL · MariaDB · PostgreSQLAGPL source + commercial licence

What it does

Built for production from day one.

Self-hosted analytics that reaches all the way from a visitor's first pageview to a recovered abandoned cart. Journey drawer with parsed UA + MaxMind geo + heuristic intent labels; cart abandonment detection with signed recovery links and Slack notifications; co-view product recommendations (also-viewed, personal, trending); site-search analytics (top queries, zero-result gaps, search-to-cart conversion); rage-click and dead-click hot-spot lists. Privacy-first defaults: DNT respected, IPs anonymised, optional consent gate. Ships a drop-in storefront JS helper at `/ees/hulo.js` — one script tag and every event type is wired.

Cart abandonment

Detects sessions with `cart_snapshot` events but no `checkout_completed` in the abandonment window (default 30 min). Auto-promotes to `converted` when a matching checkout later lands. Signed recovery-link tokens (time-bounded, non-reusable) — `/ees/abandoned-carts/:id/recovery-link` returns a URL you drop into a recovery email. Slack notification for high-value drops.

Product recommendations

Denormalised `ProductCoView` table rebuilt every 6 hours from `product_view` events, bounded per session to 20 events so bot sessions can't skew the table. Three endpoints: `also-viewed` for a product-page rail, `personal` for a homepage/cart rail based on a returning visitor's last 10 product views, `trending` for a most-viewed-in-window rail.

Site search analytics

Zero-schema-cost queries over `search` events. Top queries by volume with average results count, zero-result queries (direct catalogue-gap intel), search-to-cart conversion rate.

Journey drawer buffs

Rage-click + dead-click hot-spot lists per URL. Per-session heuristic `intent` label (`purchase` / `abandon` / `frustrate` / `consider` / `browse` / `bounce`) — one glance per session in the visitor drawer.

Drop-in storefront helper

Ships `/ees/hulo.js` — one script tag and every event helper (`cartSnapshot`, `productView`, `search`, `checkoutCompleted`) is on `window.hulo`. Handles batching, `sendBeacon`, auto rage-click + dead-click detection.

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.

Full visitor journey

Page views, time-on-page, exit pages, configurable funnel, 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 to /24 (IPv4) / /48 (IPv6), optional `requireConsent` gate. All three opt-outable per install.

Live-now SSE widget

Real-time tile on the admin dashboard showing visitors active right now (by country).

CSV export

`/ees/visitors/export.csv?days=N` and `/ees/abandoned-carts/export.csv` for raw event / abandoned-cart data.

Admin dashboards

Angular admin pages for Abandoned Carts (KPIs, filters, recovery-link mint, CSV export) and Analytics Insights (trending, also-viewed lookup, search analytics, rage/dead-click hot spots).

MySQL, MariaDB & PostgreSQL

The plugin follows whatever database your Vendure `dbConnectionOptions` use — no configuration. Verified against PostgreSQL 17; MySQL/MariaDB installs are unchanged.

Buy & activate from the admin

Start the 14-day free trial, subscribe or buy lifetime from the plugin's admin page — checkout opens in a new tab and the key installs itself within a minute, renewals included. The same card shows your plan, first-charge date and a <strong>Manage billing</strong> link to the Stripe portal (update card, cancel, switch plan). Already have a key? Paste it into the same banner. No `.env` edit, no redeploy; environment keys still take precedence for infrastructure-as-code setups.

One-click in-app updates

When a new version ships, an update banner shows current → latest with a What's-new link to the changelog. "Update now" installs the registry-verified release via your project's own package manager (yarn/npm/pnpm auto-detected) and gracefully restarts under pm2/systemd. Disable with `HULO_SELF_UPDATE=off`.

Install

Four 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 # or npm install @huloglobal/vendure-plugin-visitor-analytics # or pnpm 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 ], };

Compile the admin UI

Add the extension to your compileUiExtensions call so the plugin's page appears in the admin:

// compile-admin-ui.ts import { compileUiExtensions } from '@vendure/ui-devkit/compiler'; import { VisitorAnalyticsPlugin } from '@huloglobal/vendure-plugin-visitor-analytics'; compileUiExtensions({ outputPath: path.join(__dirname, 'admin-ui'), extensions: [VisitorAnalyticsPlugin.uiExtensions], });

Run the migration

The plugin registers its own entities. Generate and run the migration like any other:

yarn migration:generate AddVisitorAnalyticsPluginTables yarn migration:run

That's it. Restart Vendure and the plugin's page is in the admin. Without a key it runs in the free tier; open the page and click Start 14-day free trial to switch everything on — the key installs itself, no .env edit, no redeploy.

Free tier vs licensed

Try the whole thing, keep the core for free.

Install without a key and everything on the left works indefinitely. The 14-day trial switches the right-hand column on with your real traffic; a licence keeps it on.

Free, no key

  • Tracking and data collection with the storefront helpers
  • Privacy controls (DNT, IP anonymisation, consent gate)

Trial + licensed

  • Dashboards, funnels, exit pages and search analytics (403 on the free tier)
  • Product recommendations and abandoned-cart recovery links
Start 14-day free trial →

HTTP endpoints

Every route exposed.

POST/ees/trackPublic: ingest a batch of events
GET/ees/hulo.jsPublic: drop-in storefront helper JS (0.8.1)
GET/ees/recover-cart?t=…Public: resolve a recovery-link token → cart items
GET/ees/recommendations/also-viewed?productId=…Public: co-view recommendations for one product
GET/ees/recommendations/personal?visitorId=…Public: personalised recs from visitor history
GET/ees/recommendations/trending?hours=…Public: most-viewed products in the window
GET/ees/abandoned-cartsAdmin: paginated list with filters
GET/ees/abandoned-carts/summaryAdmin: totals + recovery rate + lost value
GET/ees/abandoned-carts/:idAdmin: detail incl. parsed items
POST/ees/abandoned-carts/:id/recovery-linkAdmin: mint signed recovery URL
POST/ees/abandoned-carts/:id/statusAdmin: mark recovered / dismissed
GET/ees/abandoned-carts/export.csvAdmin: CSV export
GET/ees/search-analytics/topAdmin: top search queries
GET/ees/search-analytics/no-resultsAdmin: zero-result queries
GET/ees/search-analytics/conversionAdmin: search→cart conversion
GET/ees/journey/rage-clicksAdmin: rage-click hot spots
GET/ees/journey/dead-clicksAdmin: dead-click hot spots
GET/ees/journey/session-summary?visitorId=…Admin: per-session intent labels
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/liveAdmin: SSE live-now stream
GET/ees/visitors/journey/:visitorIdAdmin: per-visitor timeline
GET/ees/visitors/export.csvAdmin: CSV export
POST/ees/goalsAdmin: create a conversion goal
GET/ees/goals/statsAdmin: per-goal completion stats
GET/ees/licence/statusAdmin: licence + evaluation + update status
POST/ees/licence/activateAdmin: activate a licence key from the admin UI
POST/ees/update/runAdmin: one-click in-app update + graceful restart

FAQ

Common questions.

How do I get a licence key?

Buy here — Stripe Checkout — monthly, annual (two months free) or lifetime. You'll receive the JWT key by email. Paste it into the plugin's admin settings (Activate) — no redeploy — or set it as HULO_LICENCE_KEY_VISITOR_ANALYTICS in your .env if you prefer config-as-code; the env key wins when both are present.

Does it work without a key?

Yes — every subscription starts with a 14-day free trial. Install the plugin, open its admin page and click Start 14-day free trial: a card is required, nothing is charged until day 15, and you can cancel any time before then. The licence installs itself and every premium feature is on for the whole trial with your real traffic.

Which databases are supported?

MySQL, MariaDB and PostgreSQL (verified against PostgreSQL 17). The plugin follows your Vendure dbConnectionOptions automatically — there is nothing to configure.

How do updates work?

The plugin checks the npm registry daily. When a newer version exists, the admin dashboard shows an update banner with a What's-new link to the changelog and an "Update now" button that installs the registry-verified release via your own package manager and gracefully restarts under your process supervisor. Prefer manual control? Copy the install command instead, or set HULO_SELF_UPDATE=off.

Where is data stored?

In your Vendure database. The plugin adds its own tables (created on boot, or via a migration for the plugins that register entities) — your data never leaves your server.

Will it survive a Vendure upgrade?

Tested against Vendure >=3.5.0 <4.0.0 — 3.5, 3.6 and 3.7 are all covered by CI. A boot-time compatibility check emits a non-fatal warning if @vendure/core is outside that range, so upgrades to a future 3.x are safe to try. The 4.0 line will be tested and re-declared once its changelog lands.

Ready to ship?

Install in five minutes, run the trial on real traffic, keep it if it earns its place.