From a537124a9f244544080093858d5b921265a184a9 Mon Sep 17 00:00:00 2001 From: Simula_r <18093452+simula-r@users.noreply.github.com> Date: Fri, 31 Oct 2025 14:45:59 -0700 Subject: [PATCH] feat: add telemetry to answer for user failed to find template (#6489) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Adds mixpanel telemetry with goal of: "We currently only know when a user opens a template workflow. But we also want to know if they failed to find what they want" Example mixpanel query: ``` app:template_library_closed WHERE template_selected = false AND time_spent_seconds >= 10 ``` But can drill down further into what filters were selected etc to answer what they were looking for but couldn't find. ``` 1. Event: app:template_filter_changed 2. Filter: - Add formula: "Where user also triggered app:template_library_closed with template_selected = false in same session" 3. Breakdown by: search_query 4. Sort by: Total Count (descending) Search Query Failed Sessions ----------------------------------- "flux video" 45 times "sdxl controlnet" 32 times "upscaler" 28 times (empty/just filter) 20 times ``` ``` Event: app:template_filter_changed WHERE filtered_count = 0 AND user did app:template_library_closed with template_selected = false Breakdown by: search_query ``` etc. https://www.notion.so/comfy-org/Number-of-users-who-open-the-template-library-and-where-do-they-click-29b6d73d36508044a595c0fb653ca6dc?source=copy_link ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6489-feat-add-telemetry-to-answer-for-user-failed-to-find-template-29d6d73d365081cdad72fd7c6ada5dc7) by [Unito](https://www.unito.io) --- .../widget/WorkflowTemplateSelectorDialog.vue | 31 +++++++++++++++++-- src/components/sidebar/ComfyMenuButton.vue | 3 +- .../sidebar/SidebarTemplatesButton.vue | 5 ++- .../useWorkflowTemplateSelectorDialog.ts | 4 +-- .../cloud/MixpanelTelemetryProvider.ts | 5 +++ src/platform/telemetry/types.ts | 11 +++++++ 6 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/components/custom/widget/WorkflowTemplateSelectorDialog.vue b/src/components/custom/widget/WorkflowTemplateSelectorDialog.vue index 751bc05742..eab22c01dd 100644 --- a/src/components/custom/widget/WorkflowTemplateSelectorDialog.vue +++ b/src/components/custom/widget/WorkflowTemplateSelectorDialog.vue @@ -382,7 +382,7 @@ diff --git a/src/composables/useWorkflowTemplateSelectorDialog.ts b/src/composables/useWorkflowTemplateSelectorDialog.ts index 558860af2b..db2993698f 100644 --- a/src/composables/useWorkflowTemplateSelectorDialog.ts +++ b/src/composables/useWorkflowTemplateSelectorDialog.ts @@ -13,8 +13,8 @@ export const useWorkflowTemplateSelectorDialog = () => { dialogStore.closeDialog({ key: DIALOG_KEY }) } - function show() { - useTelemetry()?.trackTemplateLibraryOpened({ source: 'command' }) + function show(source: 'sidebar' | 'menu' | 'command' = 'command') { + useTelemetry()?.trackTemplateLibraryOpened({ source }) dialogService.showLayoutDialog({ key: DIALOG_KEY, diff --git a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts index b09041dab2..12f4eaa392 100644 --- a/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts +++ b/src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts @@ -26,6 +26,7 @@ import type { TelemetryProvider, TemplateFilterMetadata, TemplateLibraryMetadata, + TemplateLibraryClosedMetadata, TemplateMetadata, WorkflowImportMetadata } from '../../types' @@ -235,6 +236,10 @@ export class MixpanelTelemetryProvider implements TelemetryProvider { this.trackEvent(TelemetryEvents.TEMPLATE_LIBRARY_OPENED, metadata) } + trackTemplateLibraryClosed(metadata: TemplateLibraryClosedMetadata): void { + this.trackEvent(TelemetryEvents.TEMPLATE_LIBRARY_CLOSED, metadata) + } + trackWorkflowImported(metadata: WorkflowImportMetadata): void { this.trackEvent(TelemetryEvents.WORKFLOW_IMPORTED, metadata) } diff --git a/src/platform/telemetry/types.ts b/src/platform/telemetry/types.ts index 71df735d2e..21e0a83dcb 100644 --- a/src/platform/telemetry/types.ts +++ b/src/platform/telemetry/types.ts @@ -122,6 +122,14 @@ export interface TemplateLibraryMetadata { source: 'sidebar' | 'menu' | 'command' } +/** + * Template library closed metadata + */ +export interface TemplateLibraryClosedMetadata { + template_selected: boolean + time_spent_seconds: number +} + /** * Page visibility metadata */ @@ -193,6 +201,7 @@ export interface TelemetryProvider { // Template workflow events trackTemplate(metadata: TemplateMetadata): void trackTemplateLibraryOpened(metadata: TemplateLibraryMetadata): void + trackTemplateLibraryClosed(metadata: TemplateLibraryClosedMetadata): void // Workflow management events trackWorkflowImported(metadata: WorkflowImportMetadata): void @@ -249,6 +258,7 @@ export const TelemetryEvents = { // Template Tracking TEMPLATE_WORKFLOW_OPENED: 'app:template_workflow_opened', TEMPLATE_LIBRARY_OPENED: 'app:template_library_opened', + TEMPLATE_LIBRARY_CLOSED: 'app:template_library_closed', // Workflow Management WORKFLOW_IMPORTED: 'app:workflow_imported', @@ -289,6 +299,7 @@ export type TelemetryEventProperties = | CreditTopupMetadata | WorkflowImportMetadata | TemplateLibraryMetadata + | TemplateLibraryClosedMetadata | PageVisibilityMetadata | TabCountMetadata | NodeSearchMetadata