From ac758f36ab07f9c03ba46fa88171c7c93e9fbeb2 Mon Sep 17 00:00:00 2001 From: Davinder Singh Date: Wed, 15 Oct 2025 14:06:04 +0100 Subject: [PATCH] Add user language segmentation to the home-page-view event (#28910) * adding server side events language accept information for the events and domain in event segmentation * only sending the first language * adding fixes for tests * adding domain for plans-page-view and paywall-plans-page-view * adding domain for gallery-page-view * adding it for payment-page-view * rename variable * removing language from login-page-view * adding a fallback value * removing domain from test * removing extra comment * adding test host * removing extra console added by mistake * format:fix GitOrigin-RevId: d1a1a30e4635abdc2b93f88de14a1d8937f974c8 --- .../Analytics/AnalyticsUTMTrackingMiddleware.mjs | 4 ++++ .../app/src/Features/StaticPages/HomeController.mjs | 7 +++++++ .../Subscription/SubscriptionController.mjs | 11 ++++++++++- .../AnalyticsUTMTrackingMiddleware.test.mjs | 13 +++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.mjs b/services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.mjs index d2f1f70b7c..8088c57d6b 100644 --- a/services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.mjs +++ b/services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.mjs @@ -17,9 +17,13 @@ function recordUTMTags() { if (utmValues) { const path = new URL(req.url, Settings.siteUrl).pathname + const host = req.headers.host + const domain = host?.split('.')[0] + AnalyticsManager.recordEventForSession(req.session, 'page-view', { path, ...utmValues, + domain, }) const propertyValue = `${utmValues.utm_source || 'N/A'};${ diff --git a/services/web/app/src/Features/StaticPages/HomeController.mjs b/services/web/app/src/Features/StaticPages/HomeController.mjs index 53575a0aa4..6ae497e240 100644 --- a/services/web/app/src/Features/StaticPages/HomeController.mjs +++ b/services/web/app/src/Features/StaticPages/HomeController.mjs @@ -28,8 +28,15 @@ async function index(req, res) { async function home(req, res) { if (Features.hasFeature('homepage') && homepageExists) { + const acceptLanguage = req.headers['accept-language'] || 'en' // returns in format => en-GB,en-US;q=0.9,en;q=0.8 + const language = acceptLanguage.split(',')[0].split(';')[0].trim() // filters the first language + const host = req.headers.host + const domain = host?.split('.')[0] + AnalyticsManager.recordEventForSession(req.session, 'home-page-view', { page: req.path, + language, + domain, }) const hotjarAssignment = await SplitTestHandler.promises.getAssignment( diff --git a/services/web/app/src/Features/Subscription/SubscriptionController.mjs b/services/web/app/src/Features/Subscription/SubscriptionController.mjs index 54780302f6..70f7ca8274 100644 --- a/services/web/app/src/Features/Subscription/SubscriptionController.mjs +++ b/services/web/app/src/Features/Subscription/SubscriptionController.mjs @@ -213,7 +213,16 @@ async function userSubscriptionPage(req, res) { isInTrial ) - AnalyticsManager.recordEventForSession(req.session, 'subscription-page-view') + const host = req.headers.host + const domain = host?.split('.')[0] + + AnalyticsManager.recordEventForSession( + req.session, + 'subscription-page-view', + { + domain, + } + ) const groupPlansDataForDash = formatGroupPlansDataForDash() diff --git a/services/web/test/unit/src/Analytics/AnalyticsUTMTrackingMiddleware.test.mjs b/services/web/test/unit/src/Analytics/AnalyticsUTMTrackingMiddleware.test.mjs index 463407b180..6c118a261d 100644 --- a/services/web/test/unit/src/Analytics/AnalyticsUTMTrackingMiddleware.test.mjs +++ b/services/web/test/unit/src/Analytics/AnalyticsUTMTrackingMiddleware.test.mjs @@ -77,6 +77,10 @@ describe('AnalyticsUTMTrackingMiddleware', function () { utm_content: 'foo-bar', utm_term: 'overridden', } + + ctx.req.headers = { + host: 'test-domain.overleaf.com', + } ctx.middleware(ctx.req, ctx.res, ctx.next) }) @@ -101,6 +105,7 @@ describe('AnalyticsUTMTrackingMiddleware', function () { utm_campaign: 'Some Campaign', utm_content: 'foo-bar', utm_term: 'overridden', + domain: 'test-domain', } ) }) @@ -124,6 +129,9 @@ describe('AnalyticsUTMTrackingMiddleware', function () { utm_campaign: 'Some Campaign', utm_term: 'foo', } + ctx.req.headers = { + host: 'test-domain.overleaf.com', + } ctx.middleware(ctx.req, ctx.res, ctx.next) }) @@ -146,6 +154,7 @@ describe('AnalyticsUTMTrackingMiddleware', function () { utm_medium: 'Facebook', utm_campaign: 'Some Campaign', utm_term: 'foo', + domain: 'test-domain', } ) }) @@ -169,6 +178,9 @@ describe('AnalyticsUTMTrackingMiddleware', function () { utm_campaign: 'Some Campaign', other_param: 'some-value', } + ctx.req.headers = { + host: 'test-domain.overleaf.com', + } ctx.middleware(ctx.req, ctx.res, ctx.next) }) @@ -190,6 +202,7 @@ describe('AnalyticsUTMTrackingMiddleware', function () { path: '/project', utm_medium: 'Facebook', utm_campaign: 'Some Campaign', + domain: 'test-domain', } ) })