Description
Fixes the infinite onboarding loop where users could never reach the actual dashboard after completing onboarding. Both consumer and developer flows were affected.
Root cause — Consumer flow (the reported bug):
- User selects "Use Composio" → "Founder" → "Claude Code" → "Connect Apps" → clicks Continue
- Onboarding exits to
/~/org/connect/clients/claude-code
- Connect layout checks
hasConsumerProject(userId) → false (no consumer project was ever provisioned — it only gets created by consumerMiddleware when a consumer tRPC procedure runs, but the layout gate prevents the page from loading)
- Redirects to
/onboarding/consumer-role → infinite loop
- Gmail connection fails with "please log in again" because
defaultOrgMiddleware may fail for new users (read replica lag after signup), so the onboardingConsumerProcedure throws UNAUTHORIZED
Root cause — Developer flow (also broken):
onboardingComplete was never persisted — the hasDeveloperOnboardingComplete() checker existed but no mutation to set the flag was ever created
- Root page only gated on consumer projects — developer-flow users don't create consumer projects, so they always got redirected back
Changes:
Consumer flow fix:
- New
provisionConsumerProject tRPC mutation using onboardingConsumerProcedure — triggers the consumerMiddleware which auto-provisions via ensureConsumerProject
- Called from onboarding
navigate() when consumer flow exits (alongside completeOnboarding)
- Connect layout gate now also accepts the
onboardingComplete metadata flag as a fallback — if provisioning failed during exit, the page's tRPC calls will auto-provision via consumerMiddleware
Developer flow fix:
- New
completeOnboarding tRPC mutation sets onboardingComplete: true via Apollo admin endpoint
- Called from onboarding
navigate() when any flow exits (awaited before redirect)
- Root page now checks both
hasConsumerProject and hasDeveloperOnboardingComplete — passes if either is true
/~/project/ and /~/org/ smart redirect fallbacks route onboarding-complete users to /create-workspace instead of back into the loop
How did I test this PR
- Verified lint (
pnpm lint) and typecheck (pnpm typecheck) — no new errors (all failures are pre-existing)
- Traced the full consumer redirect chain: login →
/ → /onboarding/platform → consumer-role → consumer-choose-client → consumer-connect-apps → provisionConsumerProject + completeOnboarding mutations → redirect to /~/org/connect/clients/claude-code → Connect layout passes (hasConsumerProject OR onboardingComplete)
- Traced the full developer redirect chain: login →
/ → /onboarding/platform → developer-role → developer-path → completeOnboarding mutation → redirect to /~/project/playground → root page passes (hasDeveloperOnboarding)
- Confirmed
provisionConsumerProject follows the onboardingConsumerProcedure middleware chain (defaultOrgMiddleware → consumerMiddleware → ensureConsumerProject)
- Confirmed
completeOnboarding follows the same pattern as existing savePlatformMetadata and saveSeenFlow mutations
Triggered by: palash@composio.dev | Source: slack
Session: https://zen-api-production-4c98.up.railway.app/dashboard/#/chat/zen-f2d81e62b6ed