2.0: los dos ultimos pasos del onboarding (aha moment + paywall) no se muestran nunca #1

Closed
opened 2026-08-05 18:32:51 +00:00 by alexandrev · 1 comment
Owner

Detectado al revisar en GA4 quien esta usando la 2.0.

Sintoma en datos

GA4 (28d, appVersion 2.0): pasos 0-4 registran eventos onboarding_step_viewed (5,4,4,4,4 usuarios) y hay 3 onboarding_completed, pero cero eventos con step 5 o 6. Si esos pasos se renderizaran, el onChange de OnboardingView los habria emitido.

Causa

El onboarding tiene 7 pasos (tags 0-6 en OnboardingView.swift). Al terminar el paso 4:

onFinish: {
    _ = viewModel.completeOnboarding(context: context)
    viewModel.autoFillFirstWeek(context: context)
    viewModel.nextStep()
}

completeOnboarding pone settings.onboardingCompleted = true (OnboardingViewModel.swift:140) y hace context.save(). Ese flag es el que decide en ContentView.swift:22 si se pinta HomeView u OnboardingView. Como settings es un @Query de SwiftData, el save re-renderiza y destruye OnboardingView antes de que nextStep() pinte el paso 5.

Impacto

  • WeekReadyStepView (paso 5, el aha moment del release 1.2.0) nunca se ve. El auto-fill si se ejecuta, pero el usuario no ve la celebracion.
  • PaywallStepView (paso 6) nunca se ve. Se recupera a medias via pendingPremiumPromptKey en HomeView.

Bug secundario

AnalyticsService.swift:112-115 tiene los nombres de paso desalineados: el indice 5 es 5_paywall cuando el paso 5 es WeekReady, y el paso 6 no tiene nombre.

Fix propuesto

Separar persistir los datos de marcar el onboarding como terminado: el paso 4 guarda platos/plan sin tocar el flag, y el flag se escribe al salir del paso 6 (paywall). Revisar pendingPremiumPromptKey para no mostrar el paywall dos veces.

Detectado al revisar en GA4 quien esta usando la 2.0. ## Sintoma en datos GA4 (28d, appVersion 2.0): pasos 0-4 registran eventos `onboarding_step_viewed` (5,4,4,4,4 usuarios) y hay 3 `onboarding_completed`, pero **cero eventos con step 5 o 6**. Si esos pasos se renderizaran, el `onChange` de OnboardingView los habria emitido. ## Causa El onboarding tiene 7 pasos (tags 0-6 en `OnboardingView.swift`). Al terminar el paso 4: ```swift onFinish: { _ = viewModel.completeOnboarding(context: context) viewModel.autoFillFirstWeek(context: context) viewModel.nextStep() } ``` `completeOnboarding` pone `settings.onboardingCompleted = true` (OnboardingViewModel.swift:140) y hace `context.save()`. Ese flag es el que decide en `ContentView.swift:22` si se pinta `HomeView` u `OnboardingView`. Como `settings` es un `@Query` de SwiftData, el save re-renderiza y destruye `OnboardingView` antes de que `nextStep()` pinte el paso 5. ## Impacto - **WeekReadyStepView** (paso 5, el aha moment del release 1.2.0) nunca se ve. El auto-fill si se ejecuta, pero el usuario no ve la celebracion. - **PaywallStepView** (paso 6) nunca se ve. Se recupera a medias via `pendingPremiumPromptKey` en HomeView. ## Bug secundario `AnalyticsService.swift:112-115` tiene los nombres de paso desalineados: el indice 5 es `5_paywall` cuando el paso 5 es WeekReady, y el paso 6 no tiene nombre. ## Fix propuesto Separar persistir los datos de marcar el onboarding como terminado: el paso 4 guarda platos/plan sin tocar el flag, y el flag se escribe al salir del paso 6 (paywall). Revisar `pendingPremiumPromptKey` para no mostrar el paywall dos veces.
Author
Owner

Implementado en 3694297.

  • OnboardingViewModel.completeOnboarding(context:markFinished:) — el paso 4 pasa markFinished: false, asi que commitea platos y plan sin tocar el flag y el flujo sigue en pantalla.
  • OnboardingViewModel.finishOnboarding(context:) (nuevo) — escribe onboardingCompleted y hace save; se llama desde onSkip/onConverted de PaywallStepView.
  • AnalyticsService — nombres de paso corregidos: 5_week_ready, 6_paywall.

No hizo falta tocar el prompt premium: schedulePostOnboardingPremiumPromptIfNeeded en HomeView ya lo difiere a la segunda sesion (el codigo estaba escrito asumiendo que el paso 6 se veia).

Verificado: build OK y suite completa de MealMoodTests en verde, con tres tests nuevos que cubren el contrato (markFinished: false deja el flag a false pero persiste dish + weekplan; finishOnboarding lo pone a true; el comportamiento por defecto sigue marcando terminado).

Pendiente de comprobacion visual: no he podido pulsar por los 5 pasos en el simulador (AppleScript no puede controlarlo sin permisos de accesibilidad), asi que los pasos 5 y 6 no se han visto renderizar con los ojos. La logica esta cubierta por tests, pero conviene un pase manual antes de subir build.

Implementado en `3694297`. - `OnboardingViewModel.completeOnboarding(context:markFinished:)` — el paso 4 pasa `markFinished: false`, asi que commitea platos y plan sin tocar el flag y el flujo sigue en pantalla. - `OnboardingViewModel.finishOnboarding(context:)` (nuevo) — escribe `onboardingCompleted` y hace save; se llama desde `onSkip`/`onConverted` de PaywallStepView. - `AnalyticsService` — nombres de paso corregidos: `5_week_ready`, `6_paywall`. No hizo falta tocar el prompt premium: `schedulePostOnboardingPremiumPromptIfNeeded` en HomeView ya lo difiere a la segunda sesion (el codigo estaba escrito asumiendo que el paso 6 se veia). **Verificado**: build OK y suite completa de MealMoodTests en verde, con tres tests nuevos que cubren el contrato (`markFinished: false` deja el flag a false pero persiste dish + weekplan; `finishOnboarding` lo pone a true; el comportamiento por defecto sigue marcando terminado). **Pendiente de comprobacion visual**: no he podido pulsar por los 5 pasos en el simulador (AppleScript no puede controlarlo sin permisos de accesibilidad), asi que los pasos 5 y 6 no se han visto renderizar con los ojos. La logica esta cubierta por tests, pero conviene un pase manual antes de subir build.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: alexandrev/FamilyMealPlanner#1