diff --git a/dev-packages/browser-integration-tests/suites/sessions/initial-scope/init.js b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/init.js
new file mode 100644
index 000000000000..c22f576ca681
--- /dev/null
+++ b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/init.js
@@ -0,0 +1,16 @@
+import * as Sentry from '@sentry/browser';
+
+window.Sentry = Sentry;
+
+Sentry.init({
+ dsn: 'https://public@dsn.ingest.sentry.io/1337',
+ release: '0.1',
+ initialScope: {
+ user: {
+ id: '1337',
+ email: 'user@name.com',
+ username: 'user1337',
+ },
+ },
+ debug: true,
+});
diff --git a/dev-packages/browser-integration-tests/suites/sessions/initial-scope/template.html b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/template.html
new file mode 100644
index 000000000000..77906444cbce
--- /dev/null
+++ b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/template.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+ Navigate
+
+
diff --git a/dev-packages/browser-integration-tests/suites/sessions/initial-scope/test.ts b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/test.ts
new file mode 100644
index 000000000000..b7de815b7825
--- /dev/null
+++ b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/test.ts
@@ -0,0 +1,41 @@
+import type { Route } from '@playwright/test';
+import { expect } from '@playwright/test';
+import type { SessionContext } from '@sentry/types';
+
+import { sentryTest } from '../../../utils/fixtures';
+import { getFirstSentryEnvelopeRequest } from '../../../utils/helpers';
+
+sentryTest('should start a new session on pageload.', async ({ getLocalTestPath, page }) => {
+ const url = await getLocalTestPath({ testDir: __dirname });
+ const session = await getFirstSentryEnvelopeRequest(page, url);
+
+ expect(session).toBeDefined();
+ expect(session.init).toBe(true);
+ expect(session.errors).toBe(0);
+ expect(session.status).toBe('ok');
+ expect(session.did).toBe('1337');
+});
+
+sentryTest('should start a new session with navigation.', async ({ getLocalTestPath, page, browserName }) => {
+ // Navigations get CORS error on Firefox and WebKit as we're using `file://` protocol.
+ if (browserName !== 'chromium') {
+ sentryTest.skip();
+ }
+
+ const url = await getLocalTestPath({ testDir: __dirname });
+ await page.route('**/foo', (route: Route) => route.fulfill({ path: `${__dirname}/dist/index.html` }));
+
+ const initSession = await getFirstSentryEnvelopeRequest(page, url);
+
+ await page.click('#navigate');
+
+ const newSession = await getFirstSentryEnvelopeRequest(page, url);
+
+ expect(newSession).toBeDefined();
+ expect(newSession.init).toBe(true);
+ expect(newSession.errors).toBe(0);
+ expect(newSession.status).toBe('ok');
+ expect(newSession.sid).toBeDefined();
+ expect(initSession.sid).not.toBe(newSession.sid);
+ expect(newSession.did).toBe('1337');
+});
diff --git a/packages/core/src/exports.ts b/packages/core/src/exports.ts
index e92114a024dd..c1d7cd96e6d8 100644
--- a/packages/core/src/exports.ts
+++ b/packages/core/src/exports.ts
@@ -383,7 +383,7 @@ export function startSession(context?: SessionContext): Session {
const session = makeSession({
release,
environment,
- user: isolationScope.getUser(),
+ user: currentScope.getUser() || isolationScope.getUser(),
...(userAgent && { userAgent }),
...context,
});
@@ -413,7 +413,7 @@ export function endSession(): void {
const isolationScope = getIsolationScope();
const currentScope = getCurrentScope();
- const session = isolationScope.getSession();
+ const session = currentScope.getSession() || isolationScope.getSession();
if (session) {
closeSession(session);
}