From 48f2306759113781cd65b55546f8a6fadd382f9d Mon Sep 17 00:00:00 2001 From: internxt-yu Date: Thu, 9 Jul 2026 18:19:38 +0200 Subject: [PATCH 1/2] google analytics parameters stored in cookie --- src/components/layout/Layout.tsx | 6 +++- src/lib/cookies.ts | 48 ++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/components/layout/Layout.tsx b/src/components/layout/Layout.tsx index da956183e..96c9e6156 100644 --- a/src/components/layout/Layout.tsx +++ b/src/components/layout/Layout.tsx @@ -5,7 +5,7 @@ import Script from 'next/script'; import { INTERNXT_URL } from '@/constants'; import { useGlobalDialog } from '@/contexts/GlobalUIManager'; import { handleImpact } from '@/services/impact.service'; -import { saveGclidToCookie } from '@/lib/cookies'; +import { saveGclidToCookie, saveTrackingParamsToCookies } from '@/lib/cookies'; const slogan = { en: "Internxt is a secure cloud storage service based on encryption and absolute privacy. Internxt's open-source suite of cloud storage services protects your right to privacy. Internxt Drive, Photos, Send, and more.", @@ -55,6 +55,10 @@ export default function Layout({ saveGclidToCookie(gclid); } + if (source) { + saveTrackingParamsToCookies(); + } + if (source !== 'Impact') return; handleImpact({ diff --git a/src/lib/cookies.ts b/src/lib/cookies.ts index 6893b09af..9757effbc 100644 --- a/src/lib/cookies.ts +++ b/src/lib/cookies.ts @@ -9,6 +9,20 @@ const GCLID_COOKIE_LIFESPAN_DAYS = 90; const CELLO_EXPIRATION_DAYS = 30; const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000; +const TRACKING_PARAMS = [ + 'utm_medium', + 'utm_source', + 'utm_campaign', + 'utm_name', + 'utm_id', + 'gclid', + 'irclickid', + 'ga_campaign', + 'ga_adgroup', + 'ga_keyword', + 'ga_network', +] as const; + function parseUri(ctx: GetServerSidePropsContext) { const { query } = url.parse(ctx.req.url); const parsedQuery = queryString.parse(query); @@ -24,7 +38,7 @@ function setCookie({ cookieValue: string; expiration?: Date; }) { - const domain = process.env.NODE_ENV === 'production' ? 'internxt.com' : 'localhost'; + const domain = process.env.NODE_ENV === 'production' ? '.internxt.com' : 'localhost'; const expirationDate = expiration ? new Date(expiration).toUTCString() : moment().add(100, 'days').toDate(); @@ -80,9 +94,38 @@ function setPublicCookie(ctx: GetServerSidePropsContext, name: string, value: st export const saveGclidToCookie = (gclid: string) => { const expiryDate = new Date(); expiryDate.setTime(expiryDate.getTime() + GCLID_COOKIE_LIFESPAN_DAYS * MILLISECONDS_PER_DAY); - document.cookie = `gclid=${gclid}; expires=${expiryDate.toUTCString()}; path=/`; + setCookie({ + cookieName: 'gclid', + cookieValue: gclid, + expiration: expiryDate, + }); }; +export const saveTrackingParamsToCookies = () => { + if (typeof window === 'undefined') return; + + const params = new URLSearchParams(window.location.search); + + const expiryDate = new Date(); + + expiryDate.setTime( + expiryDate.getTime() + + GCLID_COOKIE_LIFESPAN_DAYS * MILLISECONDS_PER_DAY, + ); + + TRACKING_PARAMS.forEach((param) => { + const value = params.get(param); + + if (!value) return; + + setCookie({ + cookieName: param, + cookieValue: value, + expiration: expiryDate, + }); + }); +} + export const getGclidFromURL = (): string | null => { if (typeof window === 'undefined') return null; const params = new URLSearchParams(window.location.search); @@ -116,4 +159,5 @@ export default { saveCelloFirstVisit, getCelloFirstVisitDate, isCelloExpired, + saveTrackingParamsToCookies }; From ed7ce427e6b47a43f391ed4fa79cac2181c85f5c Mon Sep 17 00:00:00 2001 From: internxt-yu Date: Fri, 10 Jul 2026 11:42:16 +0200 Subject: [PATCH 2/2] eliminated decorate url method in footer --- src/components/layout/footers/Footer.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/layout/footers/Footer.tsx b/src/components/layout/footers/Footer.tsx index 4bdb2f005..fc2a6c401 100644 --- a/src/components/layout/footers/Footer.tsx +++ b/src/components/layout/footers/Footer.tsx @@ -3,7 +3,6 @@ import { useEffect, useState } from 'react'; import { Transition, Disclosure } from '@headlessui/react'; import Link from 'next/link'; -import setUTM from '@/lib/conversions'; import LanguageMobileBox from '../components/LanguageMobileBox'; import Image from 'next/image'; import axios from 'axios'; @@ -40,8 +39,6 @@ export default function Footer({ const year = moment().format('YYYY'); useEffect(() => { - setUTM(); - axios.get(`${window.location.origin}/api/download`).then((res) => { setPlatforms(res.data.platforms); });