diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3f8cd2ac44ac..5ee7211b5a71 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1016,6 +1016,7 @@ jobs:
'node-exports-test-app',
'node-koa',
'node-connect',
+ 'nuxt-3',
'vue-3',
'webpack-4',
'webpack-5'
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/.gitignore b/dev-packages/e2e-tests/test-applications/nuxt-3/.gitignore
new file mode 100644
index 000000000000..4a7f73a2ed0d
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/.gitignore
@@ -0,0 +1,24 @@
+# Nuxt dev/build outputs
+.output
+.data
+.nuxt
+.nitro
+.cache
+dist
+
+# Node dependencies
+node_modules
+
+# Logs
+logs
+*.log
+
+# Misc
+.DS_Store
+.fleet
+.idea
+
+# Local env files
+.env
+.env.*
+!.env.example
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/.npmrc b/dev-packages/e2e-tests/test-applications/nuxt-3/.npmrc
new file mode 100644
index 000000000000..070f80f05092
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/.npmrc
@@ -0,0 +1,2 @@
+@sentry:registry=http://127.0.0.1:4873
+@sentry-internal:registry=http://127.0.0.1:4873
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/app.vue b/dev-packages/e2e-tests/test-applications/nuxt-3/app.vue
new file mode 100644
index 000000000000..06f3020220dd
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/app.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/components/ErrorButton.vue b/dev-packages/e2e-tests/test-applications/nuxt-3/components/ErrorButton.vue
new file mode 100644
index 000000000000..84d8a7ac05ef
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/components/ErrorButton.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/nuxt.config.ts b/dev-packages/e2e-tests/test-applications/nuxt-3/nuxt.config.ts
new file mode 100644
index 000000000000..87cff074ccd9
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/nuxt.config.ts
@@ -0,0 +1,4 @@
+// https://nuxt.com/docs/api/configuration/nuxt-config
+export default defineNuxtConfig({
+ modules: ['@sentry/nuxt/module'],
+});
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/package.json b/dev-packages/e2e-tests/test-applications/nuxt-3/package.json
new file mode 100644
index 000000000000..72acea9f33b6
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "nuxt-3",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "build": "nuxt build",
+ "dev": "nuxt dev",
+ "generate": "nuxt generate",
+ "preview": "nuxt preview",
+ "clean": "npx nuxi cleanup",
+ "test": "playwright test",
+ "test:build": "pnpm install && npx playwright install && pnpm build",
+ "test:assert": "pnpm test"
+ },
+ "dependencies": {
+ "@sentry/nuxt": "latest || *",
+ "nuxt": "3.11.2"
+ },
+ "devDependencies": {
+ "@nuxt/test-utils": "^3.13.1",
+ "@playwright/test": "^1.44.1",
+ "@sentry-internal/test-utils": "link:../../../test-utils"
+ }
+}
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/pages/client-error.vue b/dev-packages/e2e-tests/test-applications/nuxt-3/pages/client-error.vue
new file mode 100644
index 000000000000..d4054f7e8bee
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/pages/client-error.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/pages/index.vue b/dev-packages/e2e-tests/test-applications/nuxt-3/pages/index.vue
new file mode 100644
index 000000000000..74513c5697f3
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/pages/index.vue
@@ -0,0 +1,3 @@
+
+Hello!
+
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/playwright.config.ts b/dev-packages/e2e-tests/test-applications/nuxt-3/playwright.config.ts
new file mode 100644
index 000000000000..f270a5ad9b48
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/playwright.config.ts
@@ -0,0 +1,16 @@
+import { fileURLToPath } from 'node:url';
+import type { ConfigOptions } from '@nuxt/test-utils/playwright';
+import { getPlaywrightConfig } from '@sentry-internal/test-utils';
+
+const nuxtConfigOptions: ConfigOptions = {
+ nuxt: {
+ rootDir: fileURLToPath(new URL('.', import.meta.url)),
+ },
+};
+
+const config = getPlaywrightConfig({
+ startCommand: `pnpm preview`,
+ use: { ...nuxtConfigOptions },
+});
+
+export default config;
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/public/favicon.ico b/dev-packages/e2e-tests/test-applications/nuxt-3/public/favicon.ico
new file mode 100644
index 000000000000..18993ad91cfd
Binary files /dev/null and b/dev-packages/e2e-tests/test-applications/nuxt-3/public/favicon.ico differ
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/sentry.client.config.ts b/dev-packages/e2e-tests/test-applications/nuxt-3/sentry.client.config.ts
new file mode 100644
index 000000000000..755a0f43e919
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/sentry.client.config.ts
@@ -0,0 +1,9 @@
+import * as Sentry from '@sentry/nuxt';
+
+Sentry.init({
+ environment: 'qa', // dynamic sampling bias to keep transactions
+ dsn: 'https://public@dsn.ingest.sentry.io/1337',
+ tunnel: `http://localhost:3031/`, // proxy server
+ tracesSampleRate: 1.0,
+ integrations: [Sentry.browserTracingIntegration()],
+});
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/start-event-proxy.mjs b/dev-packages/e2e-tests/test-applications/nuxt-3/start-event-proxy.mjs
new file mode 100644
index 000000000000..acf5943b0168
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/start-event-proxy.mjs
@@ -0,0 +1,6 @@
+import { startEventProxyServer } from '@sentry-internal/test-utils';
+
+startEventProxyServer({
+ port: 3031,
+ proxyServerName: 'nuxt-3',
+});
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/tests/errors.client.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-3/tests/errors.client.test.ts
new file mode 100644
index 000000000000..cd0ae9051f71
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/tests/errors.client.test.ts
@@ -0,0 +1,30 @@
+import { expect, test } from '@nuxt/test-utils/playwright';
+import { waitForError } from '@sentry-internal/test-utils';
+
+test.describe('client-side errors', async () => {
+ test('captures error thrown on click', async ({ page }) => {
+ const errorPromise = waitForError('nuxt-3', async errorEvent => {
+ return errorEvent?.exception?.values?.[0]?.value === 'Error thrown from Nuxt-3 E2E test app';
+ });
+
+ await page.goto(`/client-error`);
+ await page.locator('#errorBtn').click();
+
+ const error = await errorPromise;
+
+ expect(error).toMatchObject({
+ exception: {
+ values: [
+ {
+ type: 'Error',
+ value: 'Error thrown from Nuxt-3 E2E test app',
+ mechanism: {
+ handled: false,
+ },
+ },
+ ],
+ },
+ });
+ expect(error.transaction).toEqual('/client-error');
+ });
+});
diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/tsconfig.json b/dev-packages/e2e-tests/test-applications/nuxt-3/tsconfig.json
new file mode 100644
index 000000000000..a746f2a70c28
--- /dev/null
+++ b/dev-packages/e2e-tests/test-applications/nuxt-3/tsconfig.json
@@ -0,0 +1,4 @@
+{
+ // https://nuxt.com/docs/guide/concepts/typescript
+ "extends": "./.nuxt/tsconfig.json"
+}