Skip to main content
Jahia Store
EN

Page Insights

community
Download 1.2.0

Information

Module ID
page-insights
Group ID
org.jahia.modules.se.javascript
Status
community
Category
Experience Optimization and customer data
Author
Stephane Monier
Developer website
https://github.com/smonier
Requires Jahia
8.2.1.0
Updated
2026-08-31
Source
https://github.com/smonier/page-insights
Tags
  • analytics
  • unomi
  • insights

Live visit analytics for any page, shown right in Page Builder. Powered by jExperience.

Editors work on a page with no idea whether anyone reads it. The numbers exist — jExperience has been collecting them all along — but they live in a separate analytics tool, behind a different login, organised by report rather than by page.

Page Insights closes that gap. It adds a collapsible panel to the page header in jContent, so the moment you open a page in Page Builder you can see how it is actually performing. No context switch, no dashboard hunting, no separate credentials.

What it shows

Choose a period — today, last week, last month, three months or six months — and the panel reports, for the page in front of you:

  • All visits — page views since tracking began
  • Visits — views in the period, with the change against the previous one
  • Unique visitors and unique sessions, each with their own trend
  • Direct entries — arrivals that did not come from elsewhere on the site
  • Sessions per visitor — above 1 means people came back
  • Site rank — where this page places among pages viewed in the same period
  • Activity — every event type recorded on the page, not only views
  • Views over time — a daily chart of the period

Built to be trusted

A trend arrow appears only when there is an honest comparison to draw. If the previous period had no traffic, or the analytics backend capped a distinct-value count, the panel says so plainly instead of printing a confident number it cannot stand behind.

Your data stays yours

Every figure comes from your own jExperience proxy and your own jCustomer, authenticated with the editor's existing session. Nothing is sent to a third party. Results are cached for five minutes, and queries run only while the panel is open, so a collapsed panel costs nothing.

Available in English and French; the panel follows the jContent interface language. Where the jExperience dashboards module is installed, a button opens the matching Kibana dashboard already filtered to the page.

Screenshots

Versions

Added

  • Activity breakdown — every event type recorded against the page, not only views. Matches either page field, since view events carry the page in target.properties.pageInfo.pagePath while other event types use source.…. Shown only when there is more than one type.
  • Period-over-period change on visits, unique sessions and unique visitors, measured against the equal-length window immediately before the selected one.
  • Sessions per visitor — above 1 means people came back. Derived from data already fetched, at no extra request.
  • Site rank — where the page places among all pages viewed in the same window. Re-scopes when the range changes.

Fixed

  • The panel was pinned to English. The language was hardcoded at initialisation and never changed, so the French bundle that shipped with the module was unreachable. It now follows the jContent interface language.
  • Raw translation keys on first paint. Translations were loaded through an async import, so the first render fell back to an instance without this module's namespace and showed key names.
  • "All visits" counted every event type recorded against the page — clicks, form submissions, custom events — rather than page views. Expect this figure to drop, and to be correct.
  • Unique visitors and sessions silently plateaued. They counted aggregation buckets, which jCustomer caps at 5,000 with no way for a client to raise the ceiling. The cap is now detected and the figure reported as a lower bound (5000+) instead of a confidently wrong total.
  • The dashboards check was stubbed to always pass, so the Page dashboard button appeared whether or not jexperience-dashboards was installed.
  • The module gate never ran. requireModuleInstalledOnSite was declared on the registry entry, which nothing reads — jContent renders every registered page header unconditionally — and was the wrong type besides. Gating now happens in the component, via useNodeChecks.
  • Nested interactive controls in the header (axe nested-interactive, serious): the toggle was a div[role="button"] containing the range selector and two buttons. It is now a real <button> with aria-expanded and aria-controls, and the controls are its siblings.
  • Cross-origin analytics calls sent no cookies, so a unomiBaseUrl on another host — which the documentation says is supported — was rejected with a 401.
  • Results were cached for the whole session with no expiry. Entries now expire after five minutes.
  • Switching range cleared the wrong cache entry — the one for the range being left, not the one being opened.
  • A hot redeploy inside an open jContent session threw Entry already exist for key.
  • The Kibana dashboard index is now escaped like the other URL parameters.

Changed

  • Deltas are suppressed rather than guessed at: no arrow is drawn when the previous window was empty, when a count was capped, or when that query failed. A missing arrow means "not known", never "no change".
  • Dependencies reclassified for the Module Federation shared scope, which decides what the module shares with jContent instead of bundling. @types/react corrected from 19 to the React 18 the module targets.
  • The README is now written for someone deciding whether to install the module, rather than for someone building it.

Removed

  • The content type definition left over from the project scaffold. It registered two example.com namespaces and an unused pageinsightsmix:component mixin that surfaced as an empty, unlabelled category in the content type selector. See upgrade note below.
  • Manifest entries pointing at paths that never existed: main, jahia.server, and four of the five declared static resource paths.
  • Hardcoded root:root credentials in the build config. Watch-mode deployment now goes through the existing watch:callback script and reads .env.
  • Build output from version control. It was tracked and git-ignored, so newly hashed chunks were silently dropped and the committed bundle referenced eight files absent from the repository.
  • Nine unused translation keys, six dead CSS rules, and an always-empty pageUuid threaded through the whole service API.
Requires Jahia 8.2.1.0Updated 2026-08-31
Requires Jahia 8.2.1.0Updated 2026-05-11
Requires Jahia 8.2.1.0Updated 2026-01-28