diff --git a/dev/prod/.env b/dev/prod/.env index 15eafa18bdd..ff49722415b 100644 --- a/dev/prod/.env +++ b/dev/prod/.env @@ -9,5 +9,5 @@ COLLABORATOR_URL=ws://locahost:3078 PRINT_URL=http://localhost:4005 SIGN_URL=http://localhost:4006 -ANALYTICS_COLLECTOR_URL=http://localhost:4007 +ANALYTICS_COLLECTOR_URL=http://huly.local:4017 AI_URL=http://localhost:4010 diff --git a/packages/analytics-providers/src/analyticsCollector.ts b/packages/analytics-providers/src/analyticsCollector.ts index 02103e54be2..fb3e69b2e04 100644 --- a/packages/analytics-providers/src/analyticsCollector.ts +++ b/packages/analytics-providers/src/analyticsCollector.ts @@ -214,7 +214,8 @@ export class AnalyticsCollectorProvider implements AnalyticProvider { ) } - setWorkspace (ws: string): void { + setWorkspace (ws: string, guest: boolean): void { + const prop: string = guest ? 'visited-workspace' : 'workspace' this.addEvent( AnalyticEventType.SetGroup, { @@ -224,8 +225,8 @@ export class AnalyticsCollectorProvider implements AnalyticProvider { name: ws, joined_at: new Date().toISOString() }, - $group_type: 'workspace', - $groups: { workspace: ws } + $group_type: prop, + $groups: { [prop]: ws } }, '$groupidentify' ) diff --git a/packages/analytics-providers/src/posthog.ts b/packages/analytics-providers/src/posthog.ts index 47a9cec8471..a15614f216e 100644 --- a/packages/analytics-providers/src/posthog.ts +++ b/packages/analytics-providers/src/posthog.ts @@ -44,11 +44,10 @@ export class PosthogAnalyticProvider implements AnalyticProvider { posthog.setPersonProperties({ [key]: value }) } - setWorkspace (ws: string): void { - this.setTag('workspace', ws) - posthog.group('workspace', ws, { - name: `${ws}` - }) + setWorkspace (ws: string, guest: boolean): void { + const prop: string = guest ? 'visited-workspace' : 'workspace' + this.setTag(prop, ws) + if (!guest) posthog.group(prop, ws, { name: `${ws}` }) } logout (): void { diff --git a/packages/analytics-providers/src/sentry.ts b/packages/analytics-providers/src/sentry.ts index c98c6d48a77..22b7ba33216 100644 --- a/packages/analytics-providers/src/sentry.ts +++ b/packages/analytics-providers/src/sentry.ts @@ -59,8 +59,9 @@ export class SentryAnalyticProvider implements AnalyticProvider { Sentry.setTag(key, value) } - setWorkspace (ws: string): void { - this.setTag('workspace', ws) + setWorkspace (ws: string, guest: boolean): void { + const prop: string = guest ? 'visited-workspace' : 'workspace' + this.setTag(prop, ws) } handleEvent (event: string): void { diff --git a/packages/analytics-providers/src/utils.ts b/packages/analytics-providers/src/utils.ts index 0188d303ea1..fc81309eb4b 100644 --- a/packages/analytics-providers/src/utils.ts +++ b/packages/analytics-providers/src/utils.ts @@ -16,10 +16,21 @@ import { UAParser } from 'ua-parser-js' import { getMetadata } from '@hcengineering/platform' import presentation from '@hcengineering/presentation' -import { desktopPlatform } from '@hcengineering/ui' +import { desktopPlatform, getCurrentLocation } from '@hcengineering/ui' +import { Analytics } from '@hcengineering/analytics' const parser = UAParser() +let _isSignUp: boolean = false +export const signupStore = { + setSignUpFlow: (isSignUp: boolean) => { + _isSignUp = isSignUp + }, + getSignUpFlow: () => { + return _isSignUp + } +} + function getUrlTrackingParams (): Record { const params = new URLSearchParams(window.location.search) return { @@ -102,3 +113,43 @@ export function collectEventMetadata (properties: Record = {}): Rec ...trackingParams } } + +function getProviderFromUrl (): string | null { + const location = getCurrentLocation() + const referrer = document.referrer + + if (referrer !== '') { + try { + const referrerUrl = new URL(referrer) + const hostname = referrerUrl.hostname + + if (hostname === 'accounts.google.com') { + return 'google' + } else if (hostname === 'github.com') { + return 'github' + } + } catch (error) { + // Invalid URL, ignored + } + } + + if (location.query?.provider != null && location.query.provider !== '') { + return location.query.provider + } + + return null +} + +export function trackOAuthCompletion (result: any): void { + const provider = getProviderFromUrl() + if (provider == null) return + + const isSignUp = signupStore.getSignUpFlow() + const success = result != null + + const eventPrefix = isSignUp ? 'signup' : 'login' + const eventSuffix = success ? 'completed' : 'error' + const eventName: string = `${eventPrefix}.${provider}.${eventSuffix}` + + Analytics.handleEvent(eventName) +} diff --git a/packages/analytics-service/src/sentry.ts b/packages/analytics-service/src/sentry.ts index ad3196fcf77..40446e79849 100644 --- a/packages/analytics-service/src/sentry.ts +++ b/packages/analytics-service/src/sentry.ts @@ -37,8 +37,9 @@ export class SentryAnalyticProvider implements AnalyticProvider { Sentry.setTag(key, value) } - setWorkspace (ws: string): void { - this.setTag('workspace', ws) + setWorkspace (ws: string, guest: boolean): void { + const prop: string = guest ? 'visited-workspace' : 'workspace' + this.setTag(prop, ws) } handleEvent (event: string): void { diff --git a/packages/analytics/src/index.ts b/packages/analytics/src/index.ts index db90fdbec38..31f28b4a025 100644 --- a/packages/analytics/src/index.ts +++ b/packages/analytics/src/index.ts @@ -10,7 +10,7 @@ export interface AnalyticProvider { setUser: (email: string, data: any) => void setAlias: (distinctId: string, alias: string) => void setTag: (key: string, value: string) => void - setWorkspace: (ws: string) => void + setWorkspace: (ws: string, guest: boolean) => void handleEvent: (event: string, params: Record) => void handleError: (error: Error) => void navigate: (path: string) => void @@ -45,9 +45,9 @@ export const Analytics = { }) }, - setWorkspace (ws: string): void { + setWorkspace (ws: string, guest: boolean): void { providers.forEach((provider) => { - provider.setWorkspace(ws) + provider.setWorkspace(ws, guest) }) }, diff --git a/plugins/guest-resources/src/connect.ts b/plugins/guest-resources/src/connect.ts index fc54ea3beb4..cb7e9789d95 100644 --- a/plugins/guest-resources/src/connect.ts +++ b/plugins/guest-resources/src/connect.ts @@ -178,8 +178,6 @@ export async function connect (title: string): Promise { } }) console.log('logging in as guest') - Analytics.handleEvent('GUEST LOGIN') - // Analytics.setWorkspace(wsUrl) const account = workspaceLoginInfo.account @@ -191,9 +189,16 @@ export async function connect (title: string): Promise { fullSocialIds: [] } + const data: Record = { + guest_uuid: account, + visited_workspace: wsUrl, + visited_workspace_uuid: workspaceLoginInfo.workspace + } + Analytics.handleEvent('GUEST LOGIN', data) + if (me !== undefined) { - Analytics.setUser(account, { account }) - Analytics.setWorkspace(wsUrl) + Analytics.setUser(data.guest_uuid, data) + Analytics.setWorkspace(wsUrl, true) console.log('login: employee account', me) setCurrentAccount(me) setCurrentEmployee('' as Ref) diff --git a/plugins/login-resources/package.json b/plugins/login-resources/package.json index f29e2cefd34..e26b2ae527b 100644 --- a/plugins/login-resources/package.json +++ b/plugins/login-resources/package.json @@ -49,6 +49,7 @@ "@hcengineering/setting": "^0.6.17", "@hcengineering/theme": "^0.6.5", "@hcengineering/analytics": "^0.6.0", - "@hcengineering/account-client": "^0.6.0" + "@hcengineering/account-client": "^0.6.0", + "@hcengineering/analytics-providers": "^0.6.0" } } diff --git a/plugins/login-resources/src/analytics.ts b/plugins/login-resources/src/analytics.ts index 8f5c12d6bb5..d259d6a93be 100644 --- a/plugins/login-resources/src/analytics.ts +++ b/plugins/login-resources/src/analytics.ts @@ -24,6 +24,10 @@ export const LoginEvents = { LoginGoogle: 'login.viaGoogle', LoginGithub: 'login.viaGitHub', + LoginGuestStarted: 'login.guest.started', + LoginGuestCompleted: 'login.guest.completed', + LoginGuestError: 'login.guest.error', + CreateWorkspace: 'onboard.createWorkspace', SelectWorkspace: 'onboard.selectWorkspace' } diff --git a/plugins/login-resources/src/components/Auth.svelte b/plugins/login-resources/src/components/Auth.svelte index 8f23703c976..8323083ecd6 100644 --- a/plugins/login-resources/src/components/Auth.svelte +++ b/plugins/login-resources/src/components/Auth.svelte @@ -1,6 +1,7 @@ {#if !$deviceOptionsStore.isMobile}
{#each enabledProviders as provider} - + { + handleProviderClick(provider) + }} + >