Skip to content

Commit 22b5bdf

Browse files
Track add_api_credit_button_clicked from SubscriptionPanel (#6470)
- Adds telemetry event `app:add_api_credit_button_clicked` and provider method `trackAddApiCreditButtonClicked` - Wires tracking to SubscriptionPanel “Add API credits” button - Removes the same tracking from CurrentUserPopover’s “Top Up” button (requested) Verified with `pnpm lint:fix` and `pnpm typecheck`. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6470-Track-add_api_credit_button_clicked-from-SubscriptionPanel-29c6d73d3650812d9ac4f3bc4b42d40a) by [Unito](https://www.unito.io)
1 parent 6d37917 commit 22b5bdf

File tree

3 files changed

+51
-12
lines changed

3 files changed

+51
-12
lines changed

src/platform/cloud/subscription/components/SubscriptionPanel.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ import { useFirebaseAuthActions } from '@/composables/auth/useFirebaseAuthAction
206206
import SubscribeButton from '@/platform/cloud/subscription/components/SubscribeButton.vue'
207207
import SubscriptionBenefits from '@/platform/cloud/subscription/components/SubscriptionBenefits.vue'
208208
import { useSubscription } from '@/platform/cloud/subscription/composables/useSubscription'
209+
import { useTelemetry } from '@/platform/telemetry'
209210
import type { AuditLog } from '@/services/customerEventsService'
210211
import { useCustomerEventsService } from '@/services/customerEventsService'
211212
import { useDialogService } from '@/services/dialogService'
@@ -218,6 +219,7 @@ const authActions = useFirebaseAuthActions()
218219
const commandStore = useCommandStore()
219220
const authStore = useFirebaseAuthStore()
220221
const customerEventService = useCustomerEventsService()
222+
const telemetry = useTelemetry()
221223
222224
const {
223225
isActiveSubscription,
@@ -260,6 +262,7 @@ onMounted(() => {
260262
})
261263
262264
const handleAddApiCredits = () => {
265+
telemetry?.trackAddApiCreditButtonClicked()
263266
dialogService.showTopUpCreditsDialog()
264267
}
265268

src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
149149
this.trackEvent(eventName)
150150
}
151151

152+
trackAddApiCreditButtonClicked(): void {
153+
this.trackEvent(TelemetryEvents.ADD_API_CREDIT_BUTTON_CLICKED)
154+
}
155+
152156
trackMonthlySubscriptionSucceeded(): void {
153157
this.trackEvent(TelemetryEvents.MONTHLY_SUBSCRIPTION_SUCCEEDED)
154158
}
@@ -170,7 +174,10 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
170174
subscribe_to_run: options?.subscribe_to_run || false,
171175
workflow_type: executionContext.is_template ? 'template' : 'custom',
172176
workflow_name: executionContext.workflow_name ?? 'untitled',
173-
total_node_count: executionContext.total_node_count
177+
total_node_count: executionContext.total_node_count,
178+
subgraph_count: executionContext.subgraph_count,
179+
has_api_nodes: executionContext.has_api_nodes,
180+
api_node_names: executionContext.api_node_names
174181
}
175182

176183
this.trackEvent(TelemetryEvents.RUN_BUTTON_CLICKED, runButtonProperties)
@@ -272,27 +279,49 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
272279
const activeWorkflow = workflowStore.activeWorkflow
273280

274281
// Calculate node metrics in a single traversal
275-
const nodeMetrics = reduceAllNodes(
282+
type NodeMetrics = {
283+
custom_node_count: number
284+
api_node_count: number
285+
subgraph_count: number
286+
total_node_count: number
287+
has_api_nodes: boolean
288+
api_node_names: string[]
289+
}
290+
291+
const nodeCounts = reduceAllNodes<NodeMetrics>(
276292
app.graph,
277-
(acc, node) => {
293+
(metrics, node) => {
278294
const nodeDef = nodeDefStore.nodeDefsByName[node.type]
279295
const isCustomNode =
280296
nodeDef?.nodeSource?.type === NodeSourceType.CustomNodes
281297
const isApiNode = nodeDef?.api_node === true
282298
const isSubgraph = node.isSubgraphNode?.() === true
283299

284-
return {
285-
custom_node_count: acc.custom_node_count + (isCustomNode ? 1 : 0),
286-
api_node_count: acc.api_node_count + (isApiNode ? 1 : 0),
287-
subgraph_count: acc.subgraph_count + (isSubgraph ? 1 : 0),
288-
total_node_count: acc.total_node_count + 1
300+
if (isApiNode) {
301+
metrics.has_api_nodes = true
302+
const canonicalName = nodeDef?.name
303+
if (
304+
canonicalName &&
305+
!metrics.api_node_names.includes(canonicalName)
306+
) {
307+
metrics.api_node_names.push(canonicalName)
308+
}
289309
}
310+
311+
metrics.custom_node_count += isCustomNode ? 1 : 0
312+
metrics.api_node_count += isApiNode ? 1 : 0
313+
metrics.subgraph_count += isSubgraph ? 1 : 0
314+
metrics.total_node_count += 1
315+
316+
return metrics
290317
},
291318
{
292319
custom_node_count: 0,
293320
api_node_count: 0,
294321
subgraph_count: 0,
295-
total_node_count: 0
322+
total_node_count: 0,
323+
has_api_nodes: false,
324+
api_node_names: []
296325
}
297326
)
298327

@@ -319,21 +348,21 @@ export class MixpanelTelemetryProvider implements TelemetryProvider {
319348
template_models: englishMetadata?.models ?? template?.models,
320349
template_use_case: englishMetadata?.useCase ?? template?.useCase,
321350
template_license: englishMetadata?.license ?? template?.license,
322-
...nodeMetrics
351+
...nodeCounts
323352
}
324353
}
325354

326355
return {
327356
is_template: false,
328357
workflow_name: activeWorkflow.filename,
329-
...nodeMetrics
358+
...nodeCounts
330359
}
331360
}
332361

333362
return {
334363
is_template: false,
335364
workflow_name: undefined,
336-
...nodeMetrics
365+
...nodeCounts
337366
}
338367
}
339368
}

src/platform/telemetry/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ export interface RunButtonProperties {
4343
workflow_type: 'template' | 'custom'
4444
workflow_name: string
4545
total_node_count: number
46+
subgraph_count: number
47+
has_api_nodes: boolean
48+
api_node_names: string[]
4649
}
4750

4851
/**
@@ -63,6 +66,8 @@ export interface ExecutionContext {
6366
api_node_count: number
6467
subgraph_count: number
6568
total_node_count: number
69+
has_api_nodes: boolean
70+
api_node_names: string[]
6671
}
6772

6873
/**
@@ -175,6 +180,7 @@ export interface TelemetryProvider {
175180
// Subscription flow events
176181
trackSubscription(event: 'modal_opened' | 'subscribe_clicked'): void
177182
trackMonthlySubscriptionSucceeded(): void
183+
trackAddApiCreditButtonClicked(): void
178184
trackApiCreditTopupButtonPurchaseClicked(amount: number): void
179185
trackRunButton(options?: { subscribe_to_run?: boolean }): void
180186

@@ -227,6 +233,7 @@ export const TelemetryEvents = {
227233
SUBSCRIPTION_REQUIRED_MODAL_OPENED: 'app:subscription_required_modal_opened',
228234
SUBSCRIBE_NOW_BUTTON_CLICKED: 'app:subscribe_now_button_clicked',
229235
MONTHLY_SUBSCRIPTION_SUCCEEDED: 'app:monthly_subscription_succeeded',
236+
ADD_API_CREDIT_BUTTON_CLICKED: 'app:add_api_credit_button_clicked',
230237
API_CREDIT_TOPUP_BUTTON_PURCHASE_CLICKED:
231238
'app:api_credit_topup_button_purchase_clicked',
232239

0 commit comments

Comments
 (0)