diff --git a/packages/insomnia/src/common/export.tsx b/packages/insomnia/src/common/export.tsx index bceb6d380b..df572d5a1c 100644 --- a/packages/insomnia/src/common/export.tsx +++ b/packages/insomnia/src/common/export.tsx @@ -6,8 +6,8 @@ import React from 'react'; import { type Environment } from '../models/environment'; import * as requestOperations from '../models/helpers/request-operations'; -import { type BaseModel, environment } from '../models/index'; import * as models from '../models/index'; +import { type BaseModel, environment } from '../models/index'; import { isRequest } from '../models/request'; import { isWorkspace, type Workspace } from '../models/workspace'; import { SegmentEvent } from '../ui/analytics'; @@ -268,7 +268,7 @@ export const exportProjectToFile = (activeProjectName: string, workspacesForActi throw new Error(`selected export format "${selectedFormat}" is invalid`); } } - window.main.trackSegmentEvent({ event: SegmentEvent.dataExport, properties: { type: selectedFormat } }); + window.main.trackSegmentEvent({ event: SegmentEvent.exportCompleted }); } catch (err) { showError({ title: 'Export Failed', diff --git a/packages/insomnia/src/main/analytics.ts b/packages/insomnia/src/main/analytics.ts index 2dc8bea7e7..1b2a65289c 100644 --- a/packages/insomnia/src/main/analytics.ts +++ b/packages/insomnia/src/main/analytics.ts @@ -83,7 +83,10 @@ export async function trackSegmentEvent(event: SegmentEvent, properties?: Record analytics.track( { event, - properties, + properties: { + ...properties, + platform: 'app', + }, context, anonymousId, userId: userSession?.hashedAccountId || '', diff --git a/packages/insomnia/src/ui/analytics.ts b/packages/insomnia/src/ui/analytics.ts index 95b0a8b905..3910cbd88d 100644 --- a/packages/insomnia/src/ui/analytics.ts +++ b/packages/insomnia/src/ui/analytics.ts @@ -3,7 +3,11 @@ export enum SegmentEvent { analyticsDisabled = 'Analytics Disabled', collectionCreate = 'Collection Created', dataExport = 'Data Exported', + exportCompleted = 'Export Completed', dataImport = 'Data Imported', + importStarted = 'Import Started', + importScanned = 'Import Scanned', + importCompleted = 'Import Completed', documentCreate = 'Document Created', mockCreate = 'Mock Created', environmentWorkspaceCreate = 'Environment Workspace Created', @@ -33,6 +37,12 @@ export enum SegmentEvent { vcsAction = 'VCS Action Executed', buttonClick = 'Button Clicked', inviteMember = 'Invite Member', + inviteResent = 'Invite Resent', + inviteRevoked = 'Invite Revoked', + projectCreated = 'Project Created', + projectUpdated = 'Project Updated', + exportStarted = 'Export Started', + exportRequestsChosen = 'Export Requests Chosen', } type PushPull = 'push' | 'pull'; diff --git a/packages/insomnia/src/ui/components/dropdowns/workspace-card-dropdown.tsx b/packages/insomnia/src/ui/components/dropdowns/workspace-card-dropdown.tsx index 598c8fb2dc..9eccc13b9e 100644 --- a/packages/insomnia/src/ui/components/dropdowns/workspace-card-dropdown.tsx +++ b/packages/insomnia/src/ui/components/dropdowns/workspace-card-dropdown.tsx @@ -14,6 +14,7 @@ import { WorkspaceScopeKeys } from '../../../models/workspace'; import type { DocumentAction } from '../../../plugins'; import { getDocumentActions } from '../../../plugins'; import * as pluginContexts from '../../../plugins/context'; +import { SegmentEvent } from '../../analytics'; import { useLoadingRecord } from '../../hooks/use-loading-record'; import { Dropdown, DropdownItem, DropdownSection, ItemContent } from '../base/dropdown'; import { Icon } from '../icon'; @@ -143,13 +144,33 @@ export const WorkspaceCardDropdown: FC = props => { - setIsImportModalOpen(true)} /> + { + window.main.trackSegmentEvent({ + event: SegmentEvent.importStarted, + properties: { + source: `${workspace.scope}-list`, + }, + }); + + setIsImportModalOpen(true); + }} + /> { + window.main.trackSegmentEvent({ + event: SegmentEvent.exportStarted, + properties: { + source: `${workspace.scope}-list`, + }, + }); + if (workspace.scope === 'mock-server') { return exportMockServerToFile(workspace); } diff --git a/packages/insomnia/src/ui/components/dropdowns/workspace-dropdown.tsx b/packages/insomnia/src/ui/components/dropdowns/workspace-dropdown.tsx index 3e36a17eaf..4666bcb5bf 100644 --- a/packages/insomnia/src/ui/components/dropdowns/workspace-dropdown.tsx +++ b/packages/insomnia/src/ui/components/dropdowns/workspace-dropdown.tsx @@ -29,6 +29,7 @@ import type { WorkspaceAction } from '../../../plugins'; import { getWorkspaceActions } from '../../../plugins'; import * as pluginContexts from '../../../plugins/context'; import { invariant } from '../../../utils/invariant'; +import { SegmentEvent } from '../../analytics'; import { useAIContext } from '../../context/app/ai-context'; import { useRootLoaderData } from '../../routes/root'; import type { WorkspaceLoaderData } from '../../routes/workspace'; @@ -133,13 +134,28 @@ export const WorkspaceDropdown: FC<{}> = () => { id: 'Import', name: 'Import', icon: , - action: () => setIsImportModalOpen(true), + action: () => { + window.main.trackSegmentEvent({ + event: SegmentEvent.importStarted, + properties: { + source: `scratchpad-${activeWorkspace.scope}-menu`, + }, + }); + + setIsImportModalOpen(true); + }, }, { id: 'Export', name: 'Export', icon: , action: () => { + window.main.trackSegmentEvent({ + event: SegmentEvent.exportStarted, + properties: { + source: `scratchpad-${activeWorkspace.scope}-menu`, + }, + }); if (activeWorkspace.scope === 'mock-server') { return exportMockServerToFile(activeWorkspace); } @@ -176,7 +192,15 @@ export const WorkspaceDropdown: FC<{}> = () => { id: 'from-file', name: 'From File', icon: , - action: () => setIsImportModalOpen(true), + action: () => { + window.main.trackSegmentEvent({ + event: SegmentEvent.importStarted, + properties: { + source: `${activeWorkspace.scope}-menu`, + }, + }); + setIsImportModalOpen(true); + }, }, ], }, @@ -235,6 +259,13 @@ export const WorkspaceDropdown: FC<{}> = () => { name: 'Export', icon: , action: () => { + window.main.trackSegmentEvent({ + event: SegmentEvent.exportStarted, + properties: { + source: `${activeWorkspace.scope}-menu`, + }, + }); + if (activeWorkspace.scope === 'mock-server') { return exportMockServerToFile(activeWorkspace); } diff --git a/packages/insomnia/src/ui/components/modals/export-requests-modal.tsx b/packages/insomnia/src/ui/components/modals/export-requests-modal.tsx index c59fd55a6e..26295f5f18 100644 --- a/packages/insomnia/src/ui/components/modals/export-requests-modal.tsx +++ b/packages/insomnia/src/ui/components/modals/export-requests-modal.tsx @@ -8,6 +8,7 @@ import { type GrpcRequest, isGrpcRequest } from '../../../models/grpc-request'; import { isRequest, type Request } from '../../../models/request'; import type { RequestGroup } from '../../../models/request-group'; import { isWebSocketRequest, type WebSocketRequest } from '../../../models/websocket-request'; +import { SegmentEvent } from '../../analytics'; import type { Child, WorkspaceLoaderData } from '../../routes/workspace'; import { Icon } from '../icon'; import { getMethodShortHand } from '../tags/method-tag'; @@ -330,6 +331,15 @@ export const ExportRequestsModal = ({