diff --git a/packages/server/lib/controllers/onboarding.controller.ts b/packages/server/lib/controllers/onboarding.controller.ts index 06c787d1c5..f437a5f2a4 100644 --- a/packages/server/lib/controllers/onboarding.controller.ts +++ b/packages/server/lib/controllers/onboarding.controller.ts @@ -55,7 +55,7 @@ class OnboardingController { return; } - const { user, environment } = response; + const { user, environment, account } = response; if (environment.name !== 'dev') { res.status(400).json({ error: 'onboarding_dev_only' }); @@ -68,6 +68,7 @@ class OnboardingController { // Create an onboarding state to remember where user left const onboardingId = await initOnboarding(user.id); if (!onboardingId) { + void analytics.track(AnalyticsTypes.DEMO_1_ERR, account.id, { user_id: user.id }); res.status(500).json({ error: 'Failed to create onboarding' }); @@ -80,6 +81,7 @@ class OnboardingController { await createOnboardingProvider({ envId: environment.id }); } + void analytics.track(AnalyticsTypes.DEMO_1_SUCCESS, account.id, { user_id: user.id }); res.status(201).json({ id: onboardingId }); @@ -185,10 +187,11 @@ class OnboardingController { return; } - const { environment } = response; + const { environment, account, user } = response; const githubDemoSync = flowService.getFlow(DEMO_SYNC_NAME); const githubDemoAction = flowService.getFlow(DEMO_ACTION_NAME); if (!githubDemoSync || !githubDemoAction) { + void analytics.track(AnalyticsTypes.DEMO_2_ERR, account.id, { user_id: user.id }); throw new Error('failed_to_find_demo_sync'); } @@ -224,12 +227,14 @@ class OnboardingController { const deploy = await deployPreBuiltSyncConfig(environment.id, config, ''); if (!deploy.success || deploy.response === null) { + void analytics.track(AnalyticsTypes.DEMO_2_ERR, account.id, { user_id: user.id }); errorManager.errResFromNangoErr(res, deploy.error); return; } await syncOrchestrator.triggerIfConnectionsExist(deploy.response.result, environment.id); + void analytics.track(AnalyticsTypes.DEMO_2_SUCCESS, account.id, { user_id: user.id }); res.status(200).json({ success: true }); } catch (err) { next(err); @@ -254,7 +259,7 @@ class OnboardingController { return; } - const { environment } = response; + const { environment, account, user } = response; const { success, error, @@ -262,6 +267,7 @@ class OnboardingController { } = await syncOrchestrator.getSyncStatus(environment.id, DEMO_GITHUB_CONFIG_KEY, [DEMO_SYNC_NAME], req.body.connectionId, true); if (!success || !status) { + void analytics.track(AnalyticsTypes.DEMO_4_ERR, account.id, { user_id: user.id }); errorManager.errResFromNangoErr(res, error); return; } @@ -288,6 +294,10 @@ class OnboardingController { await syncOrchestrator.runSyncCommand(environment.id, DEMO_GITHUB_CONFIG_KEY, [DEMO_SYNC_NAME], SyncCommand.RUN_FULL, req.body.connectionId); } + if (job.jobStatus === SyncStatus.SUCCESS) { + void analytics.track(AnalyticsTypes.DEMO_4_SUCCESS, account.id, { user_id: user.id }); + } + res.status(200).json(job); } catch (err) { next(err); @@ -358,9 +368,10 @@ class OnboardingController { return; } - const { environment } = response; + const { environment, account, user } = response; const syncClient = await SyncClient.getInstance(); if (!syncClient) { + void analytics.track(AnalyticsTypes.DEMO_5_ERR, account.id, { user_id: user.id }); throw new NangoError('failed_to_get_sync_client'); } @@ -370,6 +381,7 @@ class OnboardingController { response: connection } = await connectionService.getConnection(req.body.connectionId, DEMO_GITHUB_CONFIG_KEY, environment.id); if (!success || !connection) { + void analytics.track(AnalyticsTypes.DEMO_5_ERR, account.id, { user_id: user.id }); errorManager.errResFromNangoErr(res, error); return; } @@ -393,10 +405,12 @@ class OnboardingController { const actionResponse = await syncClient.triggerAction(connection, DEMO_ACTION_NAME, { title: req.body.title }, activityLogId, environment.id); if (isErr(actionResponse)) { + void analytics.track(AnalyticsTypes.DEMO_5_ERR, account.id, { user_id: user.id }); errorManager.errResFromNangoErr(res, actionResponse.err); return; } + void analytics.track(AnalyticsTypes.DEMO_5_SUCCESS, account.id, { user_id: user.id }); res.status(200).json({ action: actionResponse.res }); } catch (err) { next(err); diff --git a/packages/shared/lib/utils/analytics.ts b/packages/shared/lib/utils/analytics.ts index 59fac245da..e7670c80c0 100644 --- a/packages/shared/lib/utils/analytics.ts +++ b/packages/shared/lib/utils/analytics.ts @@ -19,10 +19,18 @@ export enum AnalyticsTypes { CONNECTION_UPDATED = 'server:connection_updated', DEMO_0 = 'demo:step_0', DEMO_1 = 'demo:step_1', + DEMO_1_ERR = 'demo:step_1:error', + DEMO_1_SUCCESS = 'demo:step_1:success', DEMO_2 = 'demo:step_2', + DEMO_2_ERR = 'demo:step_2:error', + DEMO_2_SUCCESS = 'demo:step_2:success', DEMO_3 = 'demo:step_3', DEMO_4 = 'demo:step_4', + DEMO_4_ERR = 'demo:step_4:error', + DEMO_4_SUCCESS = 'demo:step_4:success', DEMO_5 = 'demo:step_5', + DEMO_5_ERR = 'demo:step_5:error', + DEMO_5_SUCCESS = 'demo:step_5:success', DEMO_6 = 'demo:step_6', PRE_API_KEY_AUTH = 'server:pre_api_key_auth', PRE_APP_AUTH = 'server:pre_appauth',