diff --git a/backend/app/site_settings/default_settings.yml b/backend/app/site_settings/default_settings.yml
index d6ecfe5a..7709fea2 100644
--- a/backend/app/site_settings/default_settings.yml
+++ b/backend/app/site_settings/default_settings.yml
@@ -58,6 +58,11 @@ website:
data_type: str
description: "The link to the discord"
client: true
+ ga_id:
+ default: ""
+ data_type: str
+ description: "Google Analytics ID"
+ client: true
custom_js:
custom_js_example_questions:
diff --git a/frontend/app/package.json b/frontend/app/package.json
index 4236b2f6..009f071a 100644
--- a/frontend/app/package.json
+++ b/frontend/app/package.json
@@ -13,6 +13,7 @@
},
"dependencies": {
"@hookform/resolvers": "^3.6.0",
+ "@next/third-parties": "^14.2.5",
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-alert-dialog": "^1.1.1",
"@radix-ui/react-aspect-ratio": "^1.1.0",
diff --git a/frontend/app/src/api/site-settings.ts b/frontend/app/src/api/site-settings.ts
index 8a95c53a..f494e75e 100644
--- a/frontend/app/src/api/site-settings.ts
+++ b/frontend/app/src/api/site-settings.ts
@@ -41,6 +41,7 @@ export interface PublicWebsiteSettings {
'custom_js_button_label': string;
'custom_js_button_img_src': string;
'custom_js_logo_src': string;
+ 'ga_id': string | null;
}
const settingsItemSchema = z.object({
diff --git a/frontend/app/src/app/layout.tsx b/frontend/app/src/app/layout.tsx
index 033dacc7..6c3c5093 100644
--- a/frontend/app/src/app/layout.tsx
+++ b/frontend/app/src/app/layout.tsx
@@ -1,6 +1,7 @@
import { getPublicSiteSettings } from '@/api/site-settings';
import { RootProviders } from '@/app/RootProviders';
import { auth } from '@/lib/auth';
+import { GoogleAnalytics } from '@next/third-parties/google';
import type { Metadata } from 'next';
import { Inter } from 'next/font/google';
import './globals.css';
@@ -39,6 +40,7 @@ export default async function RootLayout ({
{children}
+ {settings.ga_id && }