diff --git a/docs/pr-screenshots/admin-onboarding-activation-milestones.webp b/docs/pr-screenshots/admin-onboarding-activation-milestones.webp index d9a28ba7ff..4d65589605 100644 Binary files a/docs/pr-screenshots/admin-onboarding-activation-milestones.webp and b/docs/pr-screenshots/admin-onboarding-activation-milestones.webp differ diff --git a/messages/en.json b/messages/en.json index f0601f615b..8676f7b090 100644 --- a/messages/en.json +++ b/messages/en.json @@ -260,11 +260,11 @@ "admin-debug-description": "Replicate your bundle across our global infrastructure so updates are available faster, and verify the rollout toast flow you see in production.", "admin-debug-hint": "This runs the exact same toast lifecycle as production: live progress while the update replicates in each region, then completion once all regions are updated.", "admin-debug-trigger-toast": "Run replication toast simulation", - "activation-signals": "Activation signals", "activation-telemetry-unavailable": "Activation telemetry is unavailable for this date range. Select a range within the last 3 months.", + "bundle-to-production-device": "Bundle → Production device", "completed-update-download": "Completed update download", "completed-update-download-within-7-days": "Completed Update Download (within 7 days)", - "of-new-organizations": "of new organizations", + "production-device-to-update-download": "Production device → Update download", "production-plugin-device": "Production plugin device", "production-plugin-device-within-7-days": "Production Plugin Device (within 7 days)", "all-billing-cycles": "All billing cycles", @@ -1648,7 +1648,7 @@ "onboarding-demo-option-title": "Just want to explore Capgo?", "onboarding-demo-success": "Demo app created! Welcome to Capgo! This demo will be deleted in 14 days.", "onboarding-funnel": "Onboarding Funnel", - "onboarding-funnel-description": "Track user progression from organization creation to first bundle upload", + "onboarding-funnel-description": "Track organization activation from creation through the first completed update download", "onboarding-invite-option-cta": "Invite a technical teammate", "onboarding-invite-option-dialog-desc": "We will email them detailed instructions to create the first app for this organization.", "onboarding-invite-option-helper": "They will receive an email asking them to create the first app for this organization.", diff --git a/src/pages/admin/dashboard/users.vue b/src/pages/admin/dashboard/users.vue index aed0c5700b..47d1a9a012 100644 --- a/src/pages/admin/dashboard/users.vue +++ b/src/pages/admin/dashboard/users.vue @@ -767,8 +767,8 @@ const onboardingFunnelRates = computed(() => { channel: orgsWithApp > 0 ? (orgsWithChannel / orgsWithApp) * 100 : 0, bundle: orgsWithChannel > 0 ? (orgsWithBundle / orgsWithChannel) * 100 : 0, subscribed: orgsWithBundle > 0 ? (orgsSubscribed / orgsWithBundle) * 100 : 0, - productionDevice: totalOrgs > 0 ? (orgsWithProductionDevice / totalOrgs) * 100 : 0, - updateDownload: totalOrgs > 0 ? (orgsWithUpdateDownload / totalOrgs) * 100 : 0, + productionDevice: orgsWithBundle > 0 ? (orgsWithProductionDevice / orgsWithBundle) * 100 : 0, + updateDownload: orgsWithProductionDevice > 0 ? (orgsWithUpdateDownload / orgsWithProductionDevice) * 100 : 0, } }) @@ -804,12 +804,22 @@ const onboardingFunnelStages = computed(() => { percentage: rates.bundle, color: '#10b981', // green }, - { - label: t('subscribed'), - value: Number(data.orgs_subscribed) || 0, - percentage: rates.subscribed, - color: '#ef4444', // red - }, + ...(data.activation_telemetry_available + ? [ + { + label: t('production-plugin-device'), + value: Number(data.orgs_with_production_device) || 0, + percentage: rates.productionDevice, + color: '#ec4899', // pink + }, + { + label: t('completed-update-download'), + value: Number(data.orgs_with_update_download) || 0, + percentage: rates.updateDownload, + color: '#6366f1', // indigo + }, + ] + : []), ] }) @@ -964,12 +974,12 @@ displayStore.defaultBack = '/dashboard'
{{ formatOneDecimal(onboardingFunnelRates.app) }}% @@ -994,47 +1004,38 @@ displayStore.defaultBack = '/dashboard' {{ t('channel-to-bundle') }}
- {{ formatOneDecimal(onboardingFunnelRates.subscribed) }}% +
+ {{ formatOneDecimal(onboardingFunnelRates.productionDevice) }}%
- {{ t('bundle-to-subscribed') }} + {{ t('bundle-to-production-device') }} +
++ {{ formatOneDecimal(onboardingFunnelRates.updateDownload) }}% +
++ {{ t('production-device-to-update-download') }}
+ {{ t('activation-telemetry-unavailable') }} +
+ +- {{ formatNumberValue(onboardingFunnelData?.orgs_with_production_device || 0) }} -
-- {{ t('production-plugin-device') }} -
-- {{ formatOneDecimal(onboardingFunnelRates.productionDevice) }}% {{ t('of-new-organizations') }} -
-- {{ formatNumberValue(onboardingFunnelData?.orgs_with_update_download || 0) }} -
-- {{ t('completed-update-download') }} -
-- {{ formatOneDecimal(onboardingFunnelRates.updateDownload) }}% {{ t('of-new-organizations') }} -
-+ {{ formatOneDecimal(onboardingFunnelRates.subscribed) }}% +
++ {{ t('bundle-to-subscribed') }} +
- {{ t('activation-telemetry-unavailable') }} -