Onboarding Experience - Feature Documentation
Owner: Casey Nguyen
Version: 0.5.0
| Owner | Last verified | Next verification due | Last CI run ID | Coverage % | Open risks |
|---|
| Casey Nguyen | 2025-12-05 | 2026-01-04 | ci.yml#2192 | 98.0 (jest coverage for onboarding hooks) | Voice onboarding sandbox not load-tested; Supabase demo seed only; hydration regression risk without Cypress reruns |
Verification
- CI jobs:
ci.yml API + Cypress (last run: ci.yml#2192)
- Commands (seeded demo portal; never use production tenants):
pnpm test:api --config jest.config.api.cjs --runTestsByPath tests/app/api/onboarding/complete/route.test.ts tests/app/api/onboarding/resume/route.test.ts tests/app/api/onboarding/availability/route.test.ts
pnpm test -- --runTestsByPath tests/lib/hooks/onboarding/useOnboardingState.test.ts tests/lib/hooks/onboarding/useOnboardingAvailability.test.ts
pnpm cypress:run --spec "cypress/e2e/onboarding/onboarding-flow.cy.ts","cypress/e2e/onboarding/onboarding-hydration.cy.ts"
pnpm db:health
- Test suites + environment:
tests/app/api/onboarding/complete/route.test.ts, .../resume/route.test.ts, .../availability/route.test.ts (CI seeded demo DB; Supabase mocked)
tests/lib/hooks/onboarding/useOnboardingState.test.ts, useOnboardingAvailability.test.ts (unit coverage driving 98% lines)
cypress/e2e/onboarding/onboarding-flow.cy.ts, onboarding-hydration.cy.ts (staging demo portal; avoids real clients)
- Next verification due: 2026-01-04
1. Problem / Job-to-Be-Done
The Problem
New users who sign up for Petunia face a cold start problem:
- They don't know what the platform can do for them
- They need to configure their business profile before getting value
- Traditional form-based onboarding is tedious and has high abandonment rates
- If something breaks during onboarding, users get stuck and leave forever
Why It Matters
Business Impact:
- First impressions determine whether a user becomes a paying customer
- Onboarding completion rate directly correlates with conversion to paid plans
- Users who complete onboarding are 3-5x more likely to activate features
User Pain Points:
- "I signed up but don't know what to do next"
- "The setup process is too long"
- "I got an error and now I'm stuck"
- "I don't have time to fill out forms"
Job-to-Be-Done
"When I sign up for a business tool, I want to get started quickly with minimal friction, so that I can see value without investing significant time upfront."
2. Solution Overview
Summary
A multi-modal, AI-powered onboarding experience that feels like a conversation with a helpful assistant named Petunia. Users choose their preferred interaction style (voice call, browser voice, or text chat), and Petunia extracts their business information naturally through conversation.
Outcome
Users complete business profile setup in 2-3 minutes through natural conversation, with their Company, Portal, and preferences automatically created. They arrive at their dashboard ready to use the platform.
Key User Flows
┌─────────────────────────────────────────────────────────────────┐
│ USER JOURNEY │
├─────────────────────────────────────────────────────────────────┤
│ 1. Signup complete → Cookie set → Redirect to /onboarding │
│ 2. Welcome animation plays (personalized greeting) │
│ 3. User selects mode: Voice Call | Browser Voice | Text Chat │
│ 4. Petunia asks: name, business name, industry │
│ 5. Summary screen shows extracted data (editable) │
│ 6. User confirms → Database records created │
│ 7. Redirect to /dashboard?from=onboarding │
└─────────────────────────────────────────────────────────────────┘
Key Flow Notes
- Voice Call: Retell calls user's phone, AI conducts conversation
- Browser Voice: Cartesia WebSocket for real-time mic + TTS
- Text Chat: Sequential state machine with progress indicators (collect name → business → industry)
- Quick Setup: 3-step form fallback when AI unavailable
- Emergency Skip: Always available - users are never stuck
- Session Replay: Sentry captures all onboarding sessions for debugging
3. Scope
What's Included (v0.4.0)
What's Explicitly Out of Scope
4. Acceptance Criteria (Gherkin)
Voice Call Mode
GIVEN a new user has completed signup
AND they have a valid phone number
AND Retell API is available
WHEN they select "Voice Call" mode and enter their phone number
THEN Petunia should call their phone within 10 seconds
AND conduct a natural conversation to collect business info
AND display a summary screen when the call ends
AND create their Company and Portal on confirmation
Browser Voice Mode
GIVEN a new user has completed signup
AND they grant microphone permission
AND Cartesia API is available
WHEN they select "Browser Voice" mode
THEN a WebSocket connection should be established
AND they can speak naturally to Petunia
AND Petunia responds with synthesized speech
AND business info is extracted and shown in summary
Text Chat Mode
GIVEN a new user has completed signup
AND Anthropic or OpenAI API is available
WHEN they select "Text Chat" mode
THEN they should see a progress indicator (Step 1 of 3)
AND Petunia asks for their name first
AND after name is collected, Petunia asks for business name (Step 2)
AND after business name, Petunia asks for industry (Step 3)
AND the progress bar fills as each step completes
AND summary screen shows all extracted data
Graceful Degradation
GIVEN a new user is in onboarding
AND all AI services become unavailable
WHEN the system detects service unavailability
THEN the user should see a non-blocking notification
AND be offered the Quick Setup form
AND still be able to complete onboarding
Emergency Skip
GIVEN a new user is stuck in onboarding
AND they click "Skip for now" or the emergency fallback triggers
WHEN the emergency completion runs
THEN completion cookies should be set
AND the user should be redirected to dashboard
AND they should NOT be redirected back to onboarding
Session Recovery
GIVEN a user started onboarding but didn't complete
AND they return to /onboarding
WHEN the page loads
THEN their previous progress should be restored
AND they should see a prompt to resume or start fresh
5. Dependencies & Risks
Dependencies
| Dependency | Type | Required | Fallback |
|---|
| Retell API | External | No | Browser voice or text |
| Cartesia API | External | No | Text chat |
| Anthropic API | External | No | OpenAI |
| OpenAI API | External | No | Quick Setup form |
| Supabase Auth | Internal | Yes | None (auth required) |
| PostgreSQL | Internal | Yes | None (data storage) |
| Pinecone | External | No | Upstash |
| Upstash Vector | External | No | Skip vector storage |
Risks & Mitigations
| Risk | Severity | Likelihood | Mitigation |
|---|
| All AI services down | High | Low | Quick Setup form fallback |
| User stuck in loop | Critical | Low | Emergency skip, safety timeout |
| Session not propagating | Medium | Medium | Verification retry (10 attempts) |
| PID collision | Low | Very Low | Transaction retry (3 attempts) |
| Microphone permission denied | Medium | Medium | Fall back to text mode |
| Phone number invalid | Low | Low | Validation + error message |
| Database transaction fails | High | Low | Detailed error codes, retry logic |
Trade-offs Made
- Complexity vs. Reliability: Multiple fallback layers add code complexity but ensure users never get stuck
- Performance vs. Features: Vector DB storage is async/non-blocking to not slow completion
- UX vs. Data Collection: We collect minimal required data (name, business, industry) to reduce friction
6. Technical Approach
Architecture
┌─────────────────────────────────────────────────────────────────┐
│ CLIENT LAYER │
├─────────────────────────────────────────────────────────────────┤
│ app/(client)/onboarding/page.tsx Main orchestrator │
│ components/onboarding/ UI components │
│ lib/hooks/onboarding/ State management │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ API LAYER │
├─────────────────────────────────────────────────────────────────┤
│ /api/onboarding/init Session initialization │
│ /api/onboarding/availability Service health checks │
│ /api/onboarding/complete Database transaction │
│ /api/chat/onboarding Streaming AI conversation │
│ /api/voice/onboarding Voice call initiation │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ SERVICE LAYER │
├─────────────────────────────────────────────────────────────────┤
│ Retell API Phone calls │
│ Cartesia API Browser voice (WebSocket) │
│ Anthropic API Text conversation │
│ Supabase Auth User metadata │
│ PostgreSQL Company, Portal, User records │
│ Pinecone/Upstash Vector embeddings for AI context │
└─────────────────────────────────────────────────────────────────┘
Key Components
| Component | Location | Purpose |
|---|
| OnboardingPage | app/(client)/onboarding/page.tsx | Main orchestrator |
| PetuniaVoiceOnboarding | components/onboarding/PetuniaVoiceOnboarding.tsx | Multi-mode UI |
| WelcomeAnimation | components/onboarding/WelcomeAnimation.tsx | Animated intro |
| useOnboardingState | lib/hooks/onboarding/useOnboardingState.ts | Session/PID management |
| useOnboardingAvailability | lib/hooks/onboarding/useOnboardingAvailability.ts | Service health |
| useBrowserVoice | lib/hooks/voice/useBrowserVoice.ts | Cartesia WebSocket |
| completion.ts | lib/onboarding/completion.ts | Client-side completion |
Implementation Notes
State Management:
useOnboardingState consolidates 8+ individual state checks into one hook
- Safety timeout (2s) forces content display to prevent blank screens
- PID resolution: URL param → Session storage → API
Completion Transaction:
// Atomic transaction creates all required records
await prisma.$transaction(async (tx) => {
const company = await tx.company.create({ ... });
await tx.userCompany.create({ userId, companyId, role: 'OWNER' });
const portal = await tx.portal.create({ petuniaID: generatePID() });
await tx.userPortalAccess.create({ userId, portalId, role: 'owner' });
await tx.user.update({ onboardingCompleted: true });
await tx.onboardingData.create({ ... });
});
Fallback Chain:
Voice Call → Browser Voice → Text Chat → Quick Setup → Emergency Skip
Security Considerations
| Aspect | Implementation |
|---|
| Authentication | Session required for all API routes |
| CSRF | addCSRFToken() on form submissions |
| Input Validation | validateBusinessName(), validateIndustry(), sanitizeInput() |
| Phone Numbers | Server-side validation before Retell call |
| Rate Limiting | Standard API rate limits apply |
| Data Isolation | User can only access their own onboarding data |
7. Testing Strategy
Unit Tests
| Test File | Coverage | Status |
|---|
tests/app/api/onboarding/init/route.test.ts | Init endpoint | ✅ |
tests/app/api/onboarding/availability/route.test.ts | Health checks | ✅ |
tests/app/api/onboarding/complete/route.test.ts | Completion logic | 11 pass, 11 skip* |
tests/app/api/onboarding/resume/route.test.ts | Resume flow | ✅ |
tests/lib/onboarding/completion.test.ts | Client completion | ✅ |
tests/lib/hooks/onboarding/useOnboardingState.test.ts | State hook | ✅ |
tests/components/onboarding/hydration.test.tsx | Hydration stability | ✅ |
tests/app/onboarding/blank-screen.test.tsx | Blank screen prevention | ✅ |
*Skipped Test Coverage (11 tests in route.test.ts)
| Skipped Category | Tests | E2E Coverage |
|---|
| Company/Portal Creation | 5 | onboarding-flow.cy.ts Tests 1-3: Email/Google signup → completion |
| Supabase Metadata Update | 3 | onboarding-flow.cy.ts Test 1: Full auth flow verification |
| Request Body Handling | 2 | onboarding-flow.cy.ts Tests 1-3: Various input scenarios |
| PID Retry Success | 1 | Production monitoring (Sentry orphan-cleanup-hourly) |
Technical note: The route uses prisma.$transaction(async (tx) => {...}) callback pattern. Jest can mock rejection paths (mockRejectedValue) but cannot execute the callback to return success values. Error paths (11 tests) are fully covered.
Integration Tests
| Scenario | Status |
|---|
| Auth → Onboarding → Dashboard flow | Covered |
| Supabase metadata sync | Covered |
| Cookie/localStorage persistence | Covered |
E2E Tests (Cypress)
| Test File | Coverage |
|---|
cypress/e2e/onboarding/onboarding-flow.cy.ts | Full user journey: signup → onboarding → dashboard |
cypress/e2e/onboarding/onboarding-hydration.cy.ts | Hydration stability, localStorage persistence |
Cron Jobs
| Cron | Schedule | Purpose |
|---|
/api/cron/orphan-cleanup | Every 6 hours | Cleanup orphaned Supabase users from failed signups |
Orphan cleanup is monitored by Sentry: orphan-cleanup-hourly
Manual Testing Required
| Scenario | Status |
|---|
| Voice call mode end-to-end | ⏳ Pending |
| Browser voice mode end-to-end | ⏳ Pending |
| Text chat mode end-to-end | ⏳ Pending |
| Graceful degradation (kill APIs) | ⏳ Pending |
| Emergency skip from each mode | ⏳ Pending |
| Resume after browser close | ⏳ Pending |
| Metric | Target | Status |
|---|
| Page load time | < 2s | Not measured |
| Time to interactive | < 3s | Not measured |
| Completion API response | < 500ms | Not measured |
Security Tests
| Test | Status |
|---|
| CSRF token validation | ✅ Implemented |
| Input sanitization | ✅ Implemented |
| Auth required on all endpoints | ✅ Implemented |
| No PII in logs | ✅ Verified |
8. Metrics & Success Criteria
Primary KPI
Onboarding Completion Rate
- Target: > 85% of users who start onboarding complete it
- Current: Not measured (pending analytics)
Secondary Metrics
| Metric | Target | Notes |
|---|
| Time to Complete | < 3 minutes | From landing on /onboarding to dashboard |
| Mode Selection Distribution | Track | Which modes users prefer |
| Fallback Usage Rate | < 10% | How often Quick Setup is used |
| Emergency Skip Rate | < 2% | How often users need to skip |
| Resume Rate | Track | How many users return to complete |
| Drop-off Points | Identify | Where users abandon |
Service Level Objectives (SLOs)
| SLO | Target |
|---|
| Onboarding page availability | 99.9% |
| Completion API success rate | 99.5% |
| Voice service availability | 95% (fallbacks available) |
| Time to first content | < 2 seconds |
9. Rollout & Release Plan
Feature Flag
// lib/config/flags.ts
ONBOARDING: toBoolean(process.env['FEATURE_ONBOARDING'], true),
- Flag Name:
FEATURE_ONBOARDING
- Default:
true (enabled)
- Can be disabled per-environment
Rollout Phases
| Phase | Audience | Status |
|---|
| 1. Development | Internal team | ✅ Complete |
| 2. Staging | QA testers | ✅ Complete |
| 3. Beta | First 50 users | ⏳ Pending manual testing |
| 4. General Availability | All users | ⏳ Pending beta feedback |
Migration Considerations
- Existing users (pre-onboarding): Already have
onboarding_completed=true via migration
- New users: Go through full onboarding flow
- No data migration required
Release Notes Draft
## New: Personalized Onboarding Experience
Meet Petunia, your AI assistant! New users can now set up their business through:
- **Voice Call**: Get a call from Petunia on your phone
- **Browser Voice**: Talk through your computer's microphone
- **Text Chat**: Have a conversation via chat
All methods extract your business info automatically - no forms to fill out!
10. Observability & Monitoring
Sentry Session Replay
Session replay is enabled for /onboarding route via SentryReplayProvider:
// app/(client)/onboarding/layout.tsx
<SentryReplayProvider enableReplay context="onboarding">
{children}
</SentryReplayProvider>
Features:
- Session replay is captured based on the global Sentry sampling config (production is sampled; sessions with errors are captured at a higher rate)
- Privacy-first: all text and inputs are masked
- Tagged with
replay_context: "onboarding" for filtering
- Breadcrumbs provide timeline of key events
- Welcome animation pauses heavy background cloud animations while the full-screen overlay is visible (reduces jank in replays and on-device)
How to find the onboarding replay in Sentry:
- Filter Replays by tag
replay_context:onboarding
- Look for breadcrumbs like
Welcome animation phase changed to confirm timing
- To force the welcome animation to show again, load onboarding with
?force_welcome=true
Sentry Breadcrumbs
| Event | Category | Level |
|---|
| Welcome animation entered | onboarding | info |
| Welcome animation phase changed | onboarding | info |
| Welcome animation skipped | onboarding | info |
| Welcome animation completed | onboarding | info |
| Mode changed | onboarding | info |
| Voice call initiated | onboarding | info |
| Voice call completed | onboarding | info |
| Voice call failed | onboarding | warning |
| Text data extracted | onboarding | info |
| Text mode complete | onboarding | info |
| AI marked complete prematurely | onboarding | warning |
Logs
| Logger | Location | Level |
|---|
onboarding-state-hook | Client | INFO, DEBUG |
onboarding-complete-api | Server | INFO, ERROR |
onboarding-availability | Server | INFO, WARN |
use-onboarding-availability | Client | INFO, ERROR |
Key Log Events:
Onboarding completion started
Portal init successful
Voice service health check failed
Emergency completion triggered
Session verification succeeded/failed
Metrics to Track
| Metric | Type | Tags |
|---|
onboarding.started | Counter | mode, user_id |
onboarding.completed | Counter | mode, duration |
onboarding.abandoned | Counter | mode, step |
onboarding.fallback_used | Counter | from_mode, to_mode |
onboarding.emergency_skip | Counter | reason |
onboarding.api_latency | Histogram | endpoint |
Alerts
| Alert | Condition | Severity |
|---|
| High emergency skip rate | > 5% in 1 hour | Warning |
| Completion API errors | > 5% error rate | Critical |
| All voice services down | 0 available | Warning |
| Completion rate drop | < 50% in 1 hour | Critical |
Dashboards
Proposed Panels:
- Completion funnel by mode
- Drop-off by step
- API latency percentiles
- Fallback usage over time
- Error rate by endpoint
11. Documentation
Technical Specs
| Document | Location |
|---|
| This feature doc | docs/features/ONBOARDING.md |
| QA Verification Checklist | docs/QA/ONBOARDING_CHECKLIST.md |
| Voice environment setup | docs/VOICE_ENV_VARIABLES.md |
| Auth + onboarding flow | docs/AUTHENTICATION_ONBOARDING_GUIDE.md |
| PR | Description |
|---|
eb9a49303 | Pass userName to WelcomeAnimation |
5bf29fbb5 | Complete signup-onboarding integration overhaul |
892c44ec0 | Add onboarding flow E2E tests |
8c00c48bc | Add welcome animation personalization |
1e18a564c | Add in-browser voice mode |
17d0953cd | Add availability awareness, quick setup validation |
e77b9cad2 | Wire streaming API, resume persistence |
f5b96c3ed | Add APIs, hooks, analytics, tests |
Runbooks
User Stuck in Onboarding Loop:
- Check
onboarding_completed cookie exists
- Verify Supabase
user_metadata.onboardingCompleted = true
- Check User table
onboardingCompleted = true
- If all true but still looping, clear cookies and try again
Voice Services Down:
- Check
/api/onboarding/availability response
- Verify API keys in environment variables
- Check external service status pages
- Users should auto-fallback to Quick Setup
12. Architecture Deep-Dive
API Routes (12 endpoints)
| Route | Method | Purpose | Runtime |
|---|
/api/onboarding/init | GET | Initialize session, get/create PID | Node.js |
/api/onboarding/availability | GET | Check voice/text service health | Node.js |
/api/onboarding/ai/process | POST | Process AI conversation turn | Node.js |
/api/onboarding/ai/tts | POST | Generate text-to-speech audio | Node.js |
/api/onboarding/business | POST | Save business profile data | Node.js |
/api/onboarding/complete | POST | Complete onboarding, create portal | Node.js |
/api/onboarding/data | GET/POST | Get/save onboarding progress | Node.js |
/api/onboarding/progress | GET/POST | Track step progress | Node.js |
/api/onboarding/resume | GET | Resume interrupted onboarding | Node.js |
/api/onboarding/enhance | POST | AI-enhance business data | Node.js |
/api/chat/onboarding | POST | Streaming chat for text mode | Node.js |
/api/voice/onboarding | POST | Voice call initiation | Node.js |
Hooks
useOnboardingState
interface OnboardingStateResult {
mounted: boolean;
canShowContent: boolean;
isNewUser: boolean;
pidResult: { pid: string | null; source: 'url' | 'session' | 'api' | 'none' };
session: any;
authLoading: boolean;
sessionHydrated: boolean;
initCompleted: boolean;
initError: InitError | null;
shouldShowVoiceOnboarding: boolean;
shouldShowLoading: boolean;
isForceShowingContent: boolean;
retryInit: () => void;
forceShowContent: () => void;
}
useOnboardingAvailability
interface UseOnboardingAvailabilityReturn {
voice: ModeAvailability;
text: ModeAvailability;
quickSetup: ModeAvailability;
isLoading: boolean;
error: string | null;
lastChecked: Date | null;
refresh: () => Promise<void>;
isAnyModeAvailable: boolean;
preferredMode: 'voice' | 'text' | 'quick-setup';
}
Data Collected
interface OnboardingData {
userName?: string;
businessName?: string;
industry?: string;
businessSize?: string;
location?: string;
phoneNumber?: string;
priorities?: string[];
onboardingMethod?: 'voice-call' | 'voice-browser' | 'text' | 'quick-setup' | 'skipped';
isVoiceOnboarding?: boolean;
}
Completion Transaction
The /api/onboarding/complete endpoint performs an atomic transaction:
- Company: Create if not exists, link user as OWNER
- Portal: Create with unique 9-digit PID
- UserPreference: Set default portal
- User: Mark
onboardingCompleted = true
- OnboardingData: Store for analytics
- CompanySettings: Configure based on priorities
- AutoresponderSettings: Enable based on mode used
Post-transaction (async):
- Update Supabase
user_metadata
- Store in Upstash Vector
- Store in Pinecone with real embeddings
13. Environment Variables
Required
| Variable | Purpose |
|---|
CARTESIA_API_KEY | Browser voice mode |
RETELL_API_KEY | Voice call mode |
ANTHROPIC_API_KEY | Text chat (primary) |
Optional
| Variable | Purpose | Default |
|---|
ELEVENLABS_API_KEY | TTS fallback | - |
OPENAI_API_KEY | Text fallback | - |
CARTESIA_VOICE_ID | Voice ID | Petunia's voice |
NEXT_PUBLIC_RETELL_AGENT_ID | Agent ID | - |
FEATURE_ONBOARDING | Feature flag | true |
14. Troubleshooting
Common Issues
| Issue | Cause | Solution |
|---|
| Blank screen | Session not ready | Safety timeout forces content after 2s |
| Voice mode unavailable | API key missing | Set CARTESIA_API_KEY or RETELL_API_KEY |
| Text mode not responding | API key missing | Set ANTHROPIC_API_KEY or OPENAI_API_KEY |
| Redirect loop after completion | Metadata not synced | Clear cookies, verify Supabase metadata |
| PID collision error | Rare (1 in 900M) | Auto-retry 3 times |
Debug Commands
# Check availability endpoint
curl -X GET http://localhost:3000/api/onboarding/availability \
-H "Cookie: <session_cookie>"
# Check init endpoint
curl -X GET http://localhost:3000/api/onboarding/init \
-H "Cookie: <session_cookie>"
15. File Reference
Core Files
| File | Lines | Purpose |
|---|
app/(client)/onboarding/page.tsx | ~320 | Main page |
app/(client)/onboarding/layout.tsx | ~145 | Layout with Sentry replay |
components/onboarding/PetuniaVoiceOnboarding.tsx | ~2300 | Multi-mode UI with state machine |
components/onboarding/WelcomeAnimation.tsx | ~465 | Animated intro with breadcrumbs |
lib/onboarding/completion.ts | ~450 | Completion logic |
lib/hooks/onboarding/useOnboardingState.ts | ~550 | State hook |
lib/providers/SentryReplayProvider.tsx | ~80 | Session replay provider |
app/api/onboarding/complete/route.ts | ~620 | Completion API |
app/(client)/onboarding/
├── page.tsx
├── layout.tsx
└── error.tsx
components/onboarding/
├── PetuniaVoiceOnboarding.tsx
├── WelcomeAnimation.tsx
├── CloudBackground.tsx
├── OnboardingErrorFallback.tsx
└── index.ts
lib/onboarding/
├── types.ts
├── completion.ts
├── validation.ts
├── conversation.ts
├── ai-engine.ts
├── persist.ts
└── ...
lib/hooks/onboarding/
├── useOnboardingState.ts
└── useOnboardingAvailability.ts
lib/providers/
└── SentryReplayProvider.tsx
app/api/onboarding/
├── init/route.ts
├── availability/route.ts
├── complete/route.ts
├── resume/route.ts
├── ai/process/route.ts
├── ai/tts/route.ts
├── business/route.ts
├── data/route.ts
├── progress/route.ts
└── enhance/route.ts
tests/
├── app/api/onboarding/...
├── lib/onboarding/...
├── lib/hooks/onboarding/...
└── components/onboarding/...
cypress/e2e/onboarding/
├── onboarding-flow.cy.ts
└── onboarding-hydration.cy.ts
16. Completion Checklist
Implementation
Testing
Documentation
Observability
Version History
| Version | Date | Changes |
|---|
| 0.5.0 | 2025-12-05 | Production hardening: text chat state machine with progress indicators, voice call timer fixes (no-answer/busy handling), Sentry session replay for all onboarding sessions, comprehensive breadcrumb instrumentation |
| 0.4.4 | 2025-12-04 | UX fixes: text mode completion validation, call status accuracy, summary validation, CloudBackground memoization, quick setup background, Sentry instrumentation |
| 0.4.3 | 2025-12-03 | Clarified test coverage (11 pass/11 skip), added cron docs, verification checklist |
| 0.4.2 | 2025-12-03 | Orphan cleanup cron with Sentry monitoring, partial signup recovery |
| 0.4.1 | 2025-12-03 | Cartesia voice onboarding, elegant cloud background UI |
| 0.4.0 | 2025-12-03 | Complete signup-onboarding overhaul (error recovery, session handling) |
| 0.3.9 | 2025-12-03 | Added periodic API availability check with auto-recovery |
| 0.3.8 | 2025-12-02 | Added in-browser voice mode (Cartesia WebSocket) |
| 0.3.7 | 2025-12-02 | Added input validation to quick setup |
| 0.3.6 | 2025-12-02 | Wired streaming API, availability hook, resume persistence |
| 0.3.5 | 2025-12-02 | Added inline editing for summary cards |
| 0.3.4 | 2025-12-01 | Added call duration display, call status polling |
| 0.3.3 | 2025-11-30 | Added summary screen, smart fallback responses |
| 0.3.2 | 2025-11-28 | Added welcome animation personalization |
| 0.3.1 | 2025-11-27 | Initial voice modes implementation |
| 0.3.0 | 2025-11-25 | Major architecture overhaul |