Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions cli/src/ai/telemetry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ export async function trackAiAnalysisChoice(input: TrackAiAnalysisChoiceInput):
channel: 'build-lifecycle',
icon: '🤖',
notify: false,
user_id: input.orgId,
org_id: input.orgId,
tracking_version: 2,
tags: {
app_id: input.appId,
platform: input.platform,
Expand Down Expand Up @@ -76,7 +77,8 @@ export async function trackAiAnalysisResult(input: TrackAiAnalysisResultInput):
channel: 'build-lifecycle',
icon: '🤖',
notify: false,
user_id: input.orgId,
org_id: input.orgId,
tracking_version: 2,
tags,
})
}
Expand Down
3 changes: 2 additions & 1 deletion cli/src/build/credentials-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,8 @@ export async function saveCredentialsCommand(options: SaveCredentialsOptions): P
channel: 'credentials',
event: 'Credentials saved',
icon: '🔐',
user_id: orgId,
org_id: orgId,
tracking_version: 2,
tags: {
'app-id': appId,
'platform': platform,
Expand Down
6 changes: 4 additions & 2 deletions cli/src/build/onboarding/telemetry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ export async function trackBuilderOnboardingStep(input: TrackBuilderOnboardingSt
channel: 'builder-onboarding',
icon: '🧭',
notify: false,
user_id: input.orgId,
org_id: input.orgId,
tracking_version: 2,
tags,
})
}
Expand All @@ -83,7 +84,8 @@ export async function trackBuilderOnboardingAction(input: TrackBuilderOnboarding
channel: 'builder-onboarding',
icon: '🧭',
notify: false,
user_id: input.orgId,
org_id: input.orgId,
tracking_version: 2,
tags,
})
}
Expand Down
6 changes: 4 additions & 2 deletions cli/src/build/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1658,7 +1658,8 @@ export async function requestBuildInternal(appId: string, options: BuildRequestO
channel: 'native-builder',
event: 'Build requested',
icon: '🏗️',
user_id: orgId,
org_id: orgId,
tracking_version: 2,
tags: {
'app-id': appId,
'platform': platform,
Expand Down Expand Up @@ -2165,7 +2166,8 @@ export async function requestBuildInternal(appId: string, options: BuildRequestO
channel: 'native-builder',
event: finalStatus === 'succeeded' ? 'Build succeeded' : 'Build failed',
icon: finalStatus === 'succeeded' ? '✅' : '❌',
user_id: orgId,
org_id: orgId,
tracking_version: 2,
tags: {
'app-id': appId,
'platform': platform,
Expand Down
3 changes: 2 additions & 1 deletion cli/src/build/telemetry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ export async function trackBuilderUpload(input: TrackBuilderUploadInput): Promis
channel: 'build-lifecycle',
icon: ICON_BY_PHASE[input.phase],
notify: false,
user_id: input.orgId,
org_id: input.orgId,
tracking_version: 2,
tags,
})
}
Expand Down
8 changes: 8 additions & 0 deletions cli/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,14 @@ interface TrackOptions {
* example: "user-123"
*/
user_id?: string
/**
* Organization ID for actor-scoped tracking.
*/
org_id?: string
/**
* Tracking payload contract version.
*/
tracking_version?: number
/**
* Event icon (emoji)
* must be a single emoji
Expand Down
3 changes: 2 additions & 1 deletion cli/test/test-onboarding-telemetry.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ try {
assert.equal(body.event, 'Builder Onboarding Action')
assert.equal(body.channel, 'builder-onboarding')
assert.equal(body.notify, false)
assert.equal(body.user_id, 'org-id')
assert.equal(body.org_id, 'org-id')
assert.equal(body.tracking_version, 2)
assert.deepEqual(body.tags, {
accepted: 'true',
action: 'android_sa_method_selected',
Expand Down
22 changes: 13 additions & 9 deletions src/components/dashboard/DemoOnboardingModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -184,15 +184,19 @@ const confettiTimer = ref<number | null>(null)
const timers = ref<number[]>([])

function trackNoAppDemoEvent(event: string, tags: Record<string, string | number | boolean> = {}) {
sendEvent({
channel: 'demo-onboarding',
event,
icon: '🧪',
user_id: organizationStore.currentOrganization?.gid,
notify: false,
tags,
}).catch()
pushEvent(`user:${event}`, config.supaHost)
const orgId = organizationStore.currentOrganization?.gid
if (orgId) {
sendEvent({
channel: 'demo-onboarding',
event,
icon: '🧪',
org_id: orgId,
tracking_version: 2,
notify: false,
tags,
}).catch()
pushEvent(`user:${event}`, config.supaHost, { org_id: orgId })
}
}

function trackNoAppDemoStepEvent(stepId: DemoStep | 'global', action: string, tags: Record<string, string | number | boolean> = {}) {
Expand Down
18 changes: 11 additions & 7 deletions src/components/dashboard/InviteTeammateModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -174,13 +174,17 @@ function completeInviteSuccess(payload: InviteSuccessPayload) {
isEmailDialogOpen.value = false
isFullDetailsDialogOpen.value = false
emit('success', payload)
sendEvent({
channel: 'onboarding-v2',
event: `onboarding-step-invite-teammate`,
icon: '👥',
user_id: organizationStore.currentOrganization?.gid,
notify: false,
}).catch()
const orgId = organizationStore.currentOrganization?.gid
if (orgId) {
sendEvent({
channel: 'onboarding-v2',
event: `onboarding-step-invite-teammate`,
icon: '👥',
org_id: orgId,
tracking_version: 2,
notify: false,
}).catch()
}
}

async function handleEmailSubmit() {
Expand Down
45 changes: 27 additions & 18 deletions src/components/dashboard/StepsApp.vue
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,18 @@ function stepToName(stepNumber: number): string {

function setLog() {
if (props.onboarding && main.user?.id) {
sendEvent({
channel: 'onboarding-v2',
event: `onboarding-step-${stepToName(step.value)}`,
icon: '👶',
user_id: organizationStore.currentOrganization?.gid,
notify: false,
}).catch()
pushEvent(`user:onboarding-step-${stepToName(step.value)}`, config.supaHost)
const orgId = organizationStore.currentOrganization?.gid
if (orgId) {
sendEvent({
channel: 'onboarding-v2',
event: `onboarding-step-${stepToName(step.value)}`,
icon: '👶',
org_id: orgId,
tracking_version: 2,
notify: false,
}).catch()
pushEvent(`user:onboarding-step-${stepToName(step.value)}`, config.supaHost, { org_id: orgId })
}
}
if (step.value === 2) {
console.log('Finished onboarding for app ID:', appId.value)
Expand Down Expand Up @@ -121,14 +125,18 @@ function goToNextStep(scrollTargetId?: string) {

function openInviteDialog() {
inviteModalRef.value?.openDialog()
sendEvent({
channel: 'onboarding-v2',
event: `onboarding-alternative-send-invite`,
icon: '👶',
user_id: organizationStore.currentOrganization?.gid,
notify: false,
}).catch()
pushEvent(`user:onboarding-alternative-send-invite`, config.supaHost)
const orgId = organizationStore.currentOrganization?.gid
if (orgId) {
sendEvent({
channel: 'onboarding-v2',
event: `onboarding-alternative-send-invite`,
icon: '👶',
org_id: orgId,
tracking_version: 2,
notify: false,
}).catch()
pushEvent(`user:onboarding-alternative-send-invite`, config.supaHost, { org_id: orgId })
}
}

function onInviteSuccess() {
Expand All @@ -153,10 +161,11 @@ async function createDemoApp() {
channel: 'onboarding-v2',
event: 'onboarding-create-demo-app',
icon: '👶',
user_id: orgId,
org_id: orgId,
tracking_version: 2,
notify: false,
}).catch()
pushEvent('user:onboarding-create-demo-app', config.supaHost)
pushEvent('user:onboarding-create-demo-app', config.supaHost, { org_id: orgId })

const { data, error } = await supabase.functions.invoke('app/demo', {
method: 'POST',
Expand Down
20 changes: 12 additions & 8 deletions src/components/dashboard/StepsBuild.vue
Original file line number Diff line number Diff line change
Expand Up @@ -141,14 +141,18 @@ function stepToName(stepNumber: number): string {

function setLog() {
if (initialOnboarding && main.user?.id) {
sendEvent({
channel: 'onboarding-build',
event: `onboarding-build-step-${stepToName(step.value)}`,
icon: 'build',
user_id: organizationStore.currentOrganization?.gid,
notify: false,
}).catch()
pushEvent(`user:onboarding-build-${stepToName(step.value)}`, config.supaHost)
const orgId = organizationStore.currentOrganization?.gid
if (orgId) {
sendEvent({
channel: 'onboarding-build',
event: `onboarding-build-step-${stepToName(step.value)}`,
icon: 'build',
org_id: orgId,
tracking_version: 2,
notify: false,
}).catch()
pushEvent(`user:onboarding-build-${stepToName(step.value)}`, config.supaHost, { org_id: orgId })
}
}
if (step.value === completedStepIndex.value) {
emit('done')
Expand Down
20 changes: 12 additions & 8 deletions src/components/dashboard/StepsBundle.vue
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,18 @@ function stepToName(stepNumber: number): string {
function setLog() {
console.log('setLog', props.onboarding, main.user?.id, step.value)
if (props.onboarding && main.user?.id) {
sendEvent({
channel: 'onboarding-bundle',
event: `onboarding-bundle-step-${stepToName(step.value)}`,
icon: '👶',
user_id: organizationStore.currentOrganization?.gid,
notify: false,
}).catch()
pushEvent(`user:onboarding-bundle-${stepToName(step.value)}`, config.supaHost)
const orgId = organizationStore.currentOrganization?.gid
if (orgId) {
sendEvent({
channel: 'onboarding-bundle',
event: `onboarding-bundle-step-${stepToName(step.value)}`,
icon: '👶',
org_id: orgId,
tracking_version: 2,
notify: false,
}).catch()
pushEvent(`user:onboarding-bundle-${stepToName(step.value)}`, config.supaHost, { org_id: orgId })
}
}
if (step.value === 2) {
emit('done')
Expand Down
1 change: 1 addition & 0 deletions src/components/dashboard/TrialBanner.vue
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ const config = getLocalConfig()
function trackBannerEvent(eventName: string) {
const org = currentOrg.value
pushEvent(eventName, config.supaHost, {
...(org?.gid ? { org_id: org.gid } : {}),
trial_days_left: org?.trial_left ?? 0,
org_gid: org?.gid ?? '',
})
Expand Down
18 changes: 11 additions & 7 deletions src/pages/settings/organization/Plans.vue
Original file line number Diff line number Diff line change
Expand Up @@ -369,13 +369,17 @@ watchEffect(async () => {
}

loadData(true)
sendEvent({
channel: 'usage',
event: 'User visit',
icon: '💳',
user_id: currentOrganization.value?.gid,
notify: false,
}).catch()
const orgId = currentOrganization.value?.gid
if (orgId) {
sendEvent({
channel: 'usage',
event: 'User visit',
icon: '💳',
org_id: orgId,
tracking_version: 2,
notify: false,
}).catch()
}
}
}
})
Expand Down
18 changes: 11 additions & 7 deletions src/pages/settings/organization/Usage.vue
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,17 @@ watchEffect(async () => {
toast.success(t('usage-success'))
}
else if (main.user?.id) {
sendEvent({
channel: 'usage',
event: 'User visit',
icon: '💳',
user_id: currentOrganization.value?.gid,
notify: false,
}).catch()
const orgId = currentOrganization.value?.gid
if (orgId) {
sendEvent({
channel: 'usage',
event: 'User visit',
icon: '💳',
org_id: orgId,
tracking_version: 2,
notify: false,
}).catch()
}
}
}
})
Expand Down
8 changes: 8 additions & 0 deletions src/services/tracking.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ interface TrackOptions {
* example: "user-123"
*/
user_id?: string
/**
* Organization ID for actor-scoped tracking.
*/
org_id?: string
/**
* Tracking payload contract version.
*/
tracking_version?: number
/**
* Event icon (emoji)
* must be a single emoji
Expand Down
Loading
Loading