Book Creation Wizard & Onboarding Flow
This document describes the complete book creation wizard flow and the post-payment onboarding experience that guides new users through their first book setup.
Overview
The book creation wizard guides users through a multi-step process to set up their first book, including optional print book pre-ordering and subscription selection. When users complete the wizard (including payment), they land on their book detail page. Without guidance, this can feel overwhelming - especially for our senior audience. The post-payment onboarding system provides a senior-friendly contextual experience that educates users about their options without forcing a rigid tutorial.
Book Creation Wizard Flow
The wizard consists of 9 steps that progressively gather information and preferences:
ββββββββββββββββββββ
β 1. Choose Path β β Who is this for?
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β 2. Storyteller β β (Conditional: if not "self")
β Info β
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β 3. Template β β Select story prompts
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β 4. Book Details β β Title, description, cover
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β 5. Goals β β Story count & timeline
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β 6. Reminders β β Weekly prompt emails
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β 7. Print Order β β Pre-order books (NEW!)
β [EARLY BIRD] β $79 first + $59 each
β β OR skip for later
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β 8. Subscription β β Choose plan
β [+ BOOKS ADDED] β Combined checkout
ββββββββββ¬ββββββββββ
β
βΌ
ββββββββββββββββββββ
β 9. Review β β Final confirmation
ββββββββββ¬ββββββββββ
β
βΌ
[PAYMENT]
β
βΌ
[BOOK CREATED]
β
βΌ
ββββββββββββββββββββ
β Book Detail β
β Page + Welcome β
β Onboarding β
ββββββββββββββββββββWizard Steps
-
Choose Path (
choose-path)- Determines who the book is for: self, family member, or gift
- Affects personalization throughout the wizard
- Component:
ChoosePathStep.tsx
-
Storyteller Info (
storyteller-info)- Shown only if path is NOT βselfβ
- Captures storytellerβs name and relationship
- Component:
StorytellerInfoStep.tsx
-
Template Selection (
template)- Choose from pre-defined story prompt templates
- Determines the structure and prompts for the book
- Component:
TemplateSelectionStep.tsx
-
Book Details (
book-details)- Book title and description
- Cover photo selection
- Component:
BookDetailsStep.tsx
-
Goals (
goals)- Set target number of stories (defaults to 10)
- Set target completion date (auto-calculated based on story count)
- Component:
GoalsStep.tsx
-
Reminders (
reminders)- Configure weekly story prompt emails
- Choose email frequency and preferences
- Component:
RemindersStep.tsx
-
Print Order (
print-order) - NEW- Pre-order 1-5 printed books at early bird pricing
- Pricing:
- First book: $79
- Additional books: $59 each (bulk discount)
- Maximum savings: $80 when ordering 5 books
- Skip option: Order later at full price ($79/book)
- Whatβs included:
- Hardcover, professionally printed
- Up to 200 pages of stories & photos
- Premium paper quality (100# silk)
- Custom cover with photos
- Free shipping in US & Canada
- Ships within 2 weeks of completion
- Component:
PrintOrderStep.tsx
-
Subscription (
subscription)- Choose between Starter, Family, or Premium plans
- Select monthly or annual billing
- Combined checkout: If books were pre-ordered in step 7, theyβre added to the subscription checkout
- Component:
SubscriptionStep.tsx
-
Review (
review)- Summary of all selections
- Final confirmation before creating book and processing payment
- Component:
ReviewAndStartStep.tsx
Wizard Navigation
The wizard provides:
- Progress indicator showing current step and completion
- Back button to return to previous steps
- Next/Continue button to advance (disabled until step is valid)
- Cancel button (hidden for first-time users with
isOnboarding={true})
Location: /apps/web-app/app/components/books/BookCreationWizard.tsx
Print Order Integration
The PrintOrderStep introduces a new revenue opportunity and user value:
Business Logic:
- Users can pre-order 1-5 books during wizard setup
- Early bird pricing provides up to $80 in savings
- Books are added to the subscription checkout (step 8)
- Orders are fulfilled after book completion (minimum 6 stories required)
User Experience:
- Clear pricing display with per-book breakdown
- βPopularβ badge on 2-book option
- Expandable details section (βWhatβs included?β)
- Gift idea callout to encourage multiple book purchases
- Skip button for users who want to order later
Technical Implementation:
export interface PrintOrderData {
number_of_books: number
skip_print_order: boolean
}Pricing Calculation:
// From config/pricing.ts
export const BOOK_PRICING = {
base: 79, // Base price for a printed book
bulk: 59, // Bulk price for additional books
minStories: 6, // Minimum stories required for a book
}
// First book: $79, additional books: $59
// Example: 3 books = $79 + $59 + $59 = $197 (save $40 vs 3 Γ $79)Consistency Note: This same book pricing structure is used across all purchase flows:
- Book Creation Wizard (self/family paths) - PrintOrderStep with early bird pre-order
- Gift Purchase Flow - Books Selection step (see Gift Purchase Flow)
Both flows use
calculateBookPricing()fromconfig/pricing.tsto ensure pricing consistency.
Post-Wizard Onboarding Experience
After completing the wizard and payment, users land on their book detail page. This is where the contextual onboarding system takes over to guide them through their first story creation.
Design Philosophy
Based on industry best practices for senior UXΒ and Nielsen Norman Group researchΒ , we implement:
Key Principles
- No Time Pressure - Users can take as long as they need
- Gradual Information - Show one thing at a time, not everything at once
- Simple Interactions - Tap/click only, no swipes or gestures required
- Large Touch Targets - Minimum 44x44px for all interactive elements (Apple HIG)
- Clear Language - Warm, helpful, non-condescending tone
- Consistent Patterns - Same UI patterns throughout the app
Components
Wizard Components
BookCreationWizard
Location: /apps/web-app/app/components/books/BookCreationWizard.tsx
The main wizard orchestrator component that manages step progression, data collection, and book creation.
Key Features:
- 9-step progressive wizard flow
- Step validation before allowing progression
- Back/Next navigation with state preservation
- Combined checkout for subscription + print books
- Conditional step display (storyteller-info only shown when needed)
Props:
interface BookCreationWizardProps {
onBookCreated: (bookId: string) => void
onCancel: () => void
isOnboarding?: boolean // Hides cancel for first-time users
}Wizard Step Components
All step components follow a consistent pattern:
| Component | Location | Data Interface |
|---|---|---|
| ChoosePathStep | wizard-steps/ChoosePathStep.tsx | UserPath |
| StorytellerInfoStep | wizard-steps/StorytellerInfoStep.tsx | StorytellerInfo |
| TemplateSelectionStep | wizard-steps/TemplateSelectionStep.tsx | TemplateInfo |
| BookDetailsStep | wizard-steps/BookDetailsStep.tsx | BookDetails |
| GoalsStep | wizard-steps/GoalsStep.tsx | BookGoals |
| RemindersStep | wizard-steps/RemindersStep.tsx | ReminderSettings |
| PrintOrderStep | wizard-steps/PrintOrderStep.tsx | PrintOrderData |
| SubscriptionStep | wizard-steps/SubscriptionStep.tsx | SubscriptionSelection |
| ReviewAndStartStep | wizard-steps/ReviewAndStartStep.tsx | N/A (display only) |
Standard Step Interface:
interface StepProps {
data: StepDataType
onChange: (data: Partial<StepDataType>) => void
// Additional context props as needed
storytellerName?: string
userPath?: UserPath
}Post-Wizard Components
1. BookWelcomeState
Location: /apps/web-app/app/components/books/BookWelcomeState.tsx
A rich empty state component that replaces the minimal βNo stories yetβ message with an educational, inviting experience.
Features
- Personalized Greeting: Uses
book.storyteller_nameandcreator_relationshipto personalize the welcome message - 3 Equal-Prominence Methods: Write, Record, and AI Chat options are presented with equal visual weight
- Time Estimates: Each method shows approximate completion time
- First Prompt Preview: Shows the first prompt from the selected template
- Reassurance Tip: Reminds users they can switch methods anytime
- Help Modal: βNeed help?β button opens a simple step-by-step guide
Usage
import { BookWelcomeState } from '@/app/components/books/BookWelcomeState'
// In your book detail page
{stories.length === 0 && isOwner && (
<BookWelcomeState
book={book}
onSelectWrite={handleSelectWrite}
onSelectRecord={handleSelectRecord}
onSelectChat={handleSelectChat}
/>
)}2. FirstTimeTip
Location: /apps/web-app/app/components/ui/FirstTimeTip.tsx
A contextual tip component that shows once per feature, helping users discover functionality without interrupting their flow.
Features
- Inline or Positioned: Can render as a banner or floating tooltip
- Animated Entrance: Smooth fade-in after configurable delay
- Large Dismiss Button: 44px+ touch target for easy dismissal
- Warm Styling: Amber/orange gradient matching brand colors
- Accessible: ARIA roles, focus management, keyboard support
Usage
import { FirstTimeTip } from '@/app/components/ui/FirstTimeTip'
import { useTip } from '@/lib/stores/onboardingTipsStore'
function MyComponent() {
const welcomeTip = useTip('book-welcome')
return (
<FirstTimeTip
show={welcomeTip.shouldShow}
onDismiss={welcomeTip.dismiss}
title="Welcome to your book!"
>
Pick any method below to start your first story.
</FirstTimeTip>
)
}3. Onboarding Tips Store
Location: /apps/web-app/lib/stores/onboardingTipsStore.ts
A Zustand store that tracks which tips have been dismissed, persisting to localStorage.
Available Tips
| Tip ID | Location | Shows When |
|---|---|---|
book-welcome | Book detail page | First visit with 0 stories |
story-editor-autosave | Story editor | First time entering editor |
recording-pause | Recording page | First recording session |
ai-chat-prompts | AI conversation | First AI chat |
API
import { useTip, useOnboardingTipsStore } from '@/lib/stores/onboardingTipsStore'
// Hook for individual tips
const { shouldShow, dismiss } = useTip('book-welcome')
// Full store access
const { dismissAllTips, resetAllTips } = useOnboardingTipsStore()4. InputMethodModal (Extended)
Location: /apps/web-app/app/components/books/InputMethodModal.tsx
The existing input method modal has been extended to include AI Chat as a third equal option.
New Props
interface InputMethodModalProps {
// ... existing props
onSelectChat?: () => void
showChatOption?: boolean // defaults to true
}Visual Assets
Animated SVG demos are provided in /public/onboarding/:
write-demo.svg- Typing animation with cursor blinkrecord-demo.svg- Microphone with sound wave animationchat-demo.svg- Chat bubbles with typing indicator
These are simple, fast-loading SVGs with CSS animations. They can be replaced with GIF/WebM videos for more detailed demos in the future.
Mobile Responsiveness
The onboarding components are mobile-first:
| Breakpoint | Behavior |
|---|---|
| Mobile (under 640px) | Cards stack vertically, full-width buttons |
| Tablet (640-1024px) | 3-column grid, larger touch targets |
| Desktop (over 1024px) | Side-by-side layout with more detail |
Mobile-Specific Features
- Cards stack vertically for easy thumb reach
- Animated demos auto-play (no tap required)
- Tip dismissal via large βGot itβ button
- Help button easily accessible
Accessibility
All onboarding components follow WCAG AA guidelines:
- Contrast: 4.5:1 minimum for all text
- Focus: Visible focus indicators on all interactive elements
- Screen Readers: Proper ARIA labels and roles
- Keyboard: Full keyboard navigation support
- Motion: Respects
prefers-reduced-motionfor animations
Success Metrics
Track these metrics to measure onboarding effectiveness:
| Metric | Target | How to Measure |
|---|---|---|
| First story within 24hr | >50% | Check stories.created_at vs books.created_at |
| Method balance | ~33% each | Track method query param on story creation |
| Tip engagement | >60% read | Track dismissal rate vs auto-hide |
| Time to first story | under 30 min | Measure time between book creation and first story |
Integration Points
New User Flow
- User clicks βCreate Bookβ (from dashboard or books page)
- BookCreationWizard opens in a modal/full-screen view
- User completes 9 steps including PrintOrderStep and SubscriptionStep
- Combined checkout processes subscription + book pre-order payment
- Book is created in Supabase with all wizard data
- User lands on book detail page with BookWelcomeState shown
Book Creation Entry Points
Primary Entry:
/apps/web-app/app/books/page.tsx- βCreate Your First Bookβ button/apps/web-app/app/page.tsx(Dashboard) - βStart Your Bookβ CTA
Wizard Usage:
import { BookCreationWizard } from '@/app/components/books/BookCreationWizard'
function BooksPage() {
const [showWizard, setShowWizard] = useState(false)
const handleBookCreated = (bookId: string) => {
router.push(`/books/${bookId}`)
setShowWizard(false)
}
return (
<>
<Button onClick={() => setShowWizard(true)}>
Create Your First Book
</Button>
{showWizard && (
<BookCreationWizard
onBookCreated={handleBookCreated}
onCancel={() => setShowWizard(false)}
isOnboarding={books.length === 0}
/>
)}
</>
)
}Book Detail Page
After wizard completion, users land on the book detail page at /apps/web-app/app/books/[id]/page.tsx:
// Lines 420-435
{stories.length === 0 ? (
isOwner ? (
<div className="py-2">
<FirstTimeTip
show={welcomeTip.shouldShow}
onDismiss={welcomeTip.dismiss}
title="Welcome to your book!"
>
Pick any method below to start your first story.
</FirstTimeTip>
<BookWelcomeState
book={book}
onSelectWrite={handleSelectWrite}
onSelectRecord={handleSelectRecord}
onSelectChat={handleSelectChat}
/>
</div>
) : (
// Non-owner empty state
)
) : (
// Story list
)}Story Creation Routes
The method selection navigates to:
- Write:
/books/[id]/stories/new?method=write - Record:
/books/[id]/stories/new?method=record - Chat:
/books/[id]/stories/new?method=chat
The method query param should be read by the story creation page to pre-select the appropriate input mode.
Future Enhancements
Wizard Enhancements
- Save & Resume: Allow users to save wizard progress and return later
- Gift Messaging: Add step for gift recipients to include personal message
- Book Preview: Show visual preview of book layout in Review step
- Bulk Discount Tiers: Add higher volume discounts (6-10 books, 11+ books)
- Shipping Options: Express shipping for additional fee
- Analytics Tracking: Track drop-off rates per wizard step
Post-Wizard Enhancements
- Video Demos: Replace SVG placeholders with recorded GIF/WebM demos
- Supabase Sync: Sync tip dismissal state to
profiles.onboarding_datafor cross-device consistency - Progressive Disclosure: Add more tips as users explore features
- A/B Testing: Test different tip wording and timing
- Method Analytics: Track which methods users choose and completion rates
- Smart Reminders: Use book goals and reminders data to send targeted nudges
Related Documentation
- v1.1 UX Roadmap - Overall UX strategy and simplification
- Database Schema - Schema for books, stories, subscriptions
- Unified Story Canvas - Story editing experience
- Pricing Configuration - Subscription and book pricing details
- Gift Purchase Flow - Alternative flow for gifting books to others (shares book pricing structure)