diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py
index 80d00ddc2dc23af32e0cc57f11940f4eff5bcc3f..2b4c5a4aa72da1f55e12d24071a7080c0c72fd9a 100644
--- a/aleksis/core/settings.py
+++ b/aleksis/core/settings.py
@@ -855,22 +855,31 @@ else:
 
 SASS_PROCESSOR_STORAGE = DEFAULT_FILE_STORAGE
 
-if _settings.get("health.sentry.enabled", False):
+SENTRY_ENABLED = _settings.get("health.sentry.enabled", False)
+if SENTRY_ENABLED:
     import sentry_sdk
     from sentry_sdk.integrations.django import DjangoIntegration
     from aleksis.core import __version__
 
+    SENTRY_SETTINGS = {
+        "dsn": _settings.get("health.sentry.dsn"),
+        "environment": _settings.get("health.sentry.environment"),
+        "traces_sample_rate": _settings.get("health.sentry.traces_sample_rate", 1.0),
+        "send_default_pii": _settings.get("health.sentry.send_default_pii", False),
+        "release": f"aleksis-core@{__version__}",
+        "in_app_include": "aleksis",
+    }
     sentry_sdk.init(
-        dsn=_settings.get("health.sentry.dsn"),
-        environment=_settings.get("health.sentry.environment"),
         integrations=[DjangoIntegration(
             transaction_style="function_name",
         )],
-        traces_sample_rate=_settings.get("health.sentry.traces_sample_rate", 1.0),
-        send_default_pii=_settings.get("health.sentry.send_default_pii", False),
-        release=f"aleksis-core@{__version__}",
-        in_app_include="aleksis",
+        **SENTRY_SETTINGS
     )
 
+    YARN_INSTALLED_APPS += [
+        "@sentry/tracing",
+    ]
+    ANY_JS["Sentry"] = {"js_url": JS_URL + "/@sentry/tracing/build/bundle.tracing.js"}
+
 # Add django-cleanup after all apps to ensure that it gets all signals as last app
 INSTALLED_APPS.append("django_cleanup.apps.CleanupConfig")
diff --git a/aleksis/core/templates/core/base.html b/aleksis/core/templates/core/base.html
index 23f4060e5d3f5735023b9f5b7a307bb665582907..76825b16c5bbec33c1a4a6dc54944bed5bdea0ff 100644
--- a/aleksis/core/templates/core/base.html
+++ b/aleksis/core/templates/core/base.html
@@ -35,6 +35,18 @@
   <script src="{% url "calendarweek_i18n_js" %}?first_day=6&amp;locale={{ LANGUAGE_CODE }}"
           type="text/javascript"></script>
 
+  {% if SENTRY_ENABLED %}
+    {% include_js "Sentry" %}
+    <script type="text/javascript">
+      Sentry.init({
+        dsn: '{{ SENTRY_SETTINGS.dsn }}',
+        environment: '{{ SENTRY_SETTINGS.environment }}',
+        tracesSampleRate: {{ SENTRY_SETTINGS.traces_sample_rate }},
+        integrations: [new Sentry.Integrations.BrowserTracing()]
+      });
+    </script>
+  {% endif %}
+
   {# Include jQuery early to provide $(document).ready #}
   {% include_js "jQuery" %}
 
diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py
index 2c40caf51d41045685a74b67800cc9575d3cf2de..72b4f90a2b642490f1e2123dcb24a9b1d41182d7 100644
--- a/aleksis/core/util/core_helpers.py
+++ b/aleksis/core/util/core_helpers.py
@@ -208,12 +208,17 @@ def custom_information_processor(request: HttpRequest) -> dict:
         regrouped_pwa_icons.setdefault(pwa_icon.rel, {})
         regrouped_pwa_icons[pwa_icon.rel][pwa_icon.size] = pwa_icon
 
-    return {
+    context = {
         "FOOTER_MENU": CustomMenu.get_default("footer"),
         "ADMINS": settings.ADMINS,
         "PWA_ICONS": regrouped_pwa_icons,
+        "SENTRY_ENABLED": settings.SENTRY_ENABLED,
     }
 
+    if settings.SENTRY_ENABLED:
+        context["SENTRY_SETTINGS"] = settings.SENTRY_SETTINGS
+
+    return context
 
 def now_tomorrow() -> datetime:
     """Return current time tomorrow."""