Story 1.2: Email Verification Wireframe
Header Information
Story
Screen
Email Verification (Account Confirmation)
User Role
Public (newly registered, unconfirmed user)
Related FR
- FR1: Role-based authentication with distinct interfaces for organizers, speakers, partners, and attendees
- NFR3: Integration with external services (AWS Cognito for verification, AWS SES for email delivery)
- NFR4: Platform shall support multi-language content (German, English) with internationalization framework
Visual Wireframe
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β BATbern Event Platform π EN βΌ | DE β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β
β βββββββββββββββββββββββββββ β
β β β β
β β π§ Verify Your Email β β
β β β β
β β We've sent a β β
β β verification code to: β β
β β β β
β β john.doe@example.com β β
β β β β
β βββββββββββββββββββββββββββ β
β β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Enter the 6-digit code from your email: β β
β β β β
β β βββββ βββββ βββββ βββββ βββββ βββββ β β
β β β 1 β β 2 β β 3 β β 4 β β 5 β β 6 β β β
β β βββββ βββββ βββββ βββββ βββββ βββββ β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
β βββββββββββββββββββββββββββ β
β β [Verify Email] ββββββΊ β β
β βββββββββββββββββββββββββββ β
β β
β β
β Didn't receive the code? β
β [Resend Verification Email] β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββ β
β β βΉοΈ The verification code expires in 24 hours.β β
β β Check your spam folder if you don't see β β
β β the email. β β
β βββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
β Need help? [Contact Support] β
β β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββ AFTER VERIFICATION ββββββββββββββββββββββββββ
β β
β BATbern Event Platform π EN βΌ | DE β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β
β βββββββββββββββββββββββββββ β
β β β β
β β β
Email Verified! β β
β β β β
β β Your account is now β β
β β active. β β
β β β β
β β Welcome to BATbern! β β
β β β β
β βββββββββββββββββββββββββββ β
β β
β β
β βββββββββββββββββββββββββββ β
β β [Go to Dashboard] ββββΊ β β
β βββββββββββββββββββββββββββ β
β β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββ β
β β You will be automatically redirected in 3 β β
β β seconds... β β
β βββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββ ALTERNATIVE: LINK VERIFICATION βββββββββββββββββββ
β β
β BATbern Event Platform π EN βΌ | DE β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β
β βββββββββββββββββββββββββββ β
β β β β
β β π Verifying... β β
β β β β
β β Please wait while we β β
β β verify your email β β
β β address. β β
β β β β
β β [β β β β β βββββ] 50% β β
β β β β
β βββββββββββββββββββββββββββ β
β β
β Note: You were redirected from the verification link β
β in your email. This may take a moment. β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key Interactive Elements
Primary Verification Method (Code Entry)
- Language Selector Dropdown: Switch between English and German (π EN βΌ | DE)
- 6-Digit Code Input Boxes: Six individual input fields for verification code digits with auto-advance
- Verify Email Button: Primary action button to submit verification code
- Resend Verification Email Link: Allows user to request a new verification code
- Contact Support Link: Navigate to support/help page
Alternative Verification Method (Email Link)
- Auto-Verification: When user clicks link in email, code is extracted from URL and auto-submitted
- Loading Indicator: Progress bar showing verification in progress
- Success Message: Confirmation screen after successful verification
Common Elements
- Email Address Display: Shows the email address where verification was sent (partially masked for security)
- Expiration Notice: Information box showing code validity period (24 hours)
- Auto-Redirect: Countdown timer for automatic navigation to dashboard after success
Functional Requirements Met
- FR1: Email verification as part of role-based authentication flow for all user roles
- NFR3: Integration with AWS Cognito for verification code validation and AWS SES for email delivery
- NFR4: β Multi-language support from MVP launch - German (de-CH) and English (en-US) for UI and verification emails, bilingual AWS SES templates configured from day 1
- Security: Time-limited verification codes (24 hours) with single-use tokens
- User Experience: Two verification methods: manual code entry or one-click email link
- Accessibility: Clear instructions and error messages for verification process
- Spam Protection: Resend cooldown (60 seconds) to prevent email spam
User Interactions
Primary Flow: Manual Code Entry
- User completes account registration (story-1.2-account-creation.md)
- System navigates to Email Verification screen
- System displays email address where code was sent
- User opens email inbox
- User finds verification email from BATbern
- User reads 6-digit verification code (e.g., β123456β)
- User enters code digits in input boxes (auto-advance on each digit)
- Code input auto-fills from left to right
- User clicks [Verify Email] button (or code auto-submits when all 6 digits entered)
- System calls Cognito ConfirmSignUp API with code
- Cognito validates code and updates user status to βCONFIRMEDβ
- System displays success screen: ββ Email Verified!β
- System auto-redirects to role-based dashboard after 3 seconds
- User can click [Go to Dashboard] for immediate redirect
Alternative Flow: Email Link Verification
- User opens verification email
- User clicks βVerify Emailβ link in email
- Link opens in browser:
/auth/verify-email?code={code}&email={email} - System displays loading screen: βπ Verifyingβ¦β
- System automatically extracts code from URL
- System calls Cognito ConfirmSignUp API
- System displays success screen
- System auto-redirects to role-based dashboard
Secondary Flow: Resend Verification Code
- User doesnβt receive email or code expired
- User clicks [Resend Verification Email] link
- System calls Cognito ResendConfirmationCode API
- System sends new verification email
- System displays toast notification: βVerification email sent againβ
- System starts 60-second cooldown on resend button
- User receives new email with fresh code
- User continues with manual code entry flow
Error Flow: Invalid Code
- User enters incorrect 6-digit code
- User clicks [Verify Email] button
- System receives βCodeMismatchExceptionβ from Cognito
- System displays error message: βInvalid code. Please check and try again.β
- System highlights code input boxes in red
- System clears entered code
- User can retry with correct code
Error Flow: Expired Code
- User enters verification code after 24 hours
- User clicks [Verify Email] button
- System receives βExpiredCodeExceptionβ from Cognito
- System displays error message: βThis code has expired. Click βResendβ to get a new one.β
- System clears entered code
- User clicks [Resend Verification Email]
- User receives fresh code and retries
Error Flow: Too Many Failed Attempts
- User enters wrong code multiple times (5+ attempts)
- System receives βLimitExceededExceptionβ from Cognito
- System displays error: βToo many failed attempts. Please wait 15 minutes or request a new code.β
- System disables [Verify Email] button temporarily
- User waits or clicks [Resend Verification Email]
Error Flow: Network Error
- User enters code and clicks [Verify Email]
- Network request fails or times out
- System displays error: βConnection error. Please check your internet and try again.β
- Code remains in input boxes
- User can retry immediately
Technical Notes
AWS Cognito Email Verification
- Cognito API: Use
confirmSignUpmethod from AWS Cognito SDK - Verification Code: 6-digit numeric code generated by Cognito
- Code Expiration: 24 hours from email send time
- Single-Use: Code invalidated after successful verification
- Email Format: HTML email with code and verification link
- Language Detection: Email sent in userβs selected language during registration (from Cognito
custom:languageattribute) - Bilingual Templates: AWS SES templates configured for German (de) and English (en) from day 1
Email Templates (AWS SES)
FROM MVP LAUNCH: Bilingual templates configured in AWS SES
English Version (en-US):
Subject: Verify Your BATbern Account
Hello John,
Welcome to BATbern! Please verify your email address to activate your account.
Your verification code is: 123456
Alternatively, click the link below to verify instantly:
https://app.batbern.ch/auth/verify-email?code=123456&email=john.doe@example.com
This code will expire in 24 hours.
If you didn't create a BATbern account, please ignore this email.
Best regards,
BATbern Team
German Version (de-CH):
Subject: Verifizieren Sie Ihr BATbern-Konto
Hallo John,
Willkommen bei BATbern! Bitte verifizieren Sie Ihre E-Mail-Adresse, um Ihr Konto zu aktivieren.
Ihr Verifizierungscode lautet: 123456
Alternativ kΓΆnnen Sie auf den untenstehenden Link klicken, um sofort zu verifizieren:
https://app.batbern.ch/auth/verify-email?code=123456&email=john.doe@example.com
Dieser Code lΓ€uft in 24 Stunden ab.
Falls Sie kein BATbern-Konto erstellt haben, ignorieren Sie diese E-Mail bitte.
Mit freundlichen GrΓΌΓen,
BATbern Team
Note: Email language determined by userβs language preference stored during registration (custom:language attribute in Cognito).
Frontend Framework
- React 18.2+ with TypeScript
- Material-UI for UI components (TextField, Button)
- React Hook Form or custom state management for code input
- Auto-Advance Logic: Automatically move focus to next input box on digit entry
- Paste Support: Allow pasting full 6-digit code that auto-distributes across boxes
- react-i18next for internationalization (German/English from day 1)
- i18next-browser-languagedetector for automatic locale detection
Verification Methods Supported
- Manual Code Entry: User types 6-digit code from email
- Email Link Click: User clicks link in email, code auto-extracted from URL
- Auto-Submit: When all 6 digits entered, auto-submit verification (no button click needed)
URL Parameters
- Email Link Format:
/auth/verify-email?code={verification_code}&email={user_email} - Code Parameter: Verification code from Cognito
- Email Parameter: Userβs email address for validation
Security Measures
- Time-Limited Codes: 24-hour expiration
- Single-Use Codes: Code invalidated after use
- Rate Limiting: Maximum 5 verification attempts before lockout
- Resend Cooldown: 60 seconds between resend requests
- Code Masking: Donβt show code in URL (for manual entry method)
- HTTPS Only: All verification requests over TLS 1.3
Accessibility
- WCAG 2.1 AA Compliance: All elements keyboard accessible
- ARIA Labels: Each code input box properly labeled
- Focus Management: Auto-advance focus between input boxes
- Screen Reader Support: Announce success/error messages
- High Contrast: Code input boxes clearly visible
Internationalization (i18n)
FROM MVP LAUNCH (Day 1):
- Language Support: German (de-CH) and English (en-US) with language selector in header
- Default Language: German (de-CH), respects userβs language selection from registration
- UI Text: All screen text, instructions, buttons, error messages translated from day 1
- Email Templates: Bilingual AWS SES templates (de/en) configured from day 1
- Verification Emails: Sent in userβs selected language during registration (Cognito
custom:languageattribute) - Success Messages: βEmail Verified!β / βE-Mail verifiziert!β
- Error Messages: All validation and API errors localized (German/English)
- Dynamic Switching: Language change applies immediately without page reload using react-i18next
- Language Persistence: Respects userβs language selection from previous screens (stored in localStorage)
- Translation Keys:
auth.verify.title,auth.verify.codeLabel,auth.verify.submitButton, etc. - Framework: react-i18next with i18next-browser-languagedetector
- Translation Files:
/locales/de/auth.json,/locales/en/auth.json
API Requirements
Initial Page Load APIs
- GET /api/v1/auth/verification-status (Optional)
- Query params:
email=john.doe@example.com - Returns:json
{ "emailVerified": false, "codeSentAt": "2025-10-04T12:00:00Z", "codeExpiresAt": "2025-10-05T12:00:00Z", "resendAvailableAt": "2025-10-04T12:01:00Z" } - Used for: Checking if code already sent, when it expires, and resend cooldown
- Triggered: On page load
- Query params:
User Action APIs
-
POST /cognito/confirmSignUp (AWS Cognito SDK method)
- Triggered by: [Verify Email] button click or auto-submit
- Payload:typescript
{ ClientId: "<cognito_client_id>", Username: "john.doe@example.com", ConfirmationCode: "123456" } - Response (Success):json
{} - Response (Error - Invalid Code):json
{ "__type": "CodeMismatchException", "message": "Invalid verification code provided, please try again." } - Used for: Confirming user email and activating account
-
POST /api/v1/auth/verify-email (Optional wrapper endpoint)
- Triggered by: [Verify Email] button click
- Payload:json
{ "email": "john.doe@example.com", "code": "123456" } - Response:json
{ "success": true, "user": { "id": "user-uuid", "email": "john.doe@example.com", "role": "SPEAKER", "emailVerified": true }, "redirectTo": "/speaker/dashboard" } - Used for: Simplified verification with backend handling Cognito integration
-
POST /cognito/resendConfirmationCode (AWS Cognito SDK method)
- Triggered by: [Resend Verification Email] link click
- Payload:typescript
{ ClientId: "<cognito_client_id>", Username: "john.doe@example.com" } - Response:json
{ "CodeDeliveryDetails": { "Destination": "j***@example.com", "DeliveryMedium": "EMAIL", "AttributeName": "email" } } - Used for: Resending verification email with new code
-
POST /api/v1/auth/resend-verification (Optional wrapper endpoint)
- Triggered by: [Resend Verification Email] link click
- Payload:json
{ "email": "john.doe@example.com" } - Response:json
{ "success": true, "message": "Verification email sent again.", "nextResendAvailableAt": "2025-10-04T12:02:00Z" } - Used for: Resending verification with cooldown enforcement
Navigation Map
Primary Navigation Actions
-
[Verify Email] Button β Navigate to Role-Based Dashboard
- Target: Dynamic based on user role (extracted from Cognito attributes)
ORGANIZERβ/organizer/dashboard(Event Management Dashboard - story-1.16-event-management-dashboard.md)SPEAKERβ/speaker/dashboard(Speaker Dashboard)PARTNERβ/partner/dashboard(Partner Analytics Dashboard - story-6.1-partner-analytics-dashboard.md)ATTENDEEβ/attendee/dashboard(Personal Attendee Dashboard - story-5.2-personal-dashboard.md)
- Navigation Type: Full page redirect after 3-second success screen
- Context Passed: User object with verified email status, JWT tokens
- Validation: 6-digit code must be valid
- Target: Dynamic based on user role (extracted from Cognito attributes)
-
[Go to Dashboard] Button β Navigate to Role-Based Dashboard (Immediate)
- Target: Same as above, based on role
- Navigation Type: Immediate redirect (skip countdown)
- Context Passed: User object, tokens
- Validation: None (only shown after successful verification)
-
[Resend Verification Email] Link β Refresh Page State
- Target: Same screen, refreshed state
- Navigation Type: In-page action (no navigation)
- Context Passed: None
- Side Effects: New verification email sent
-
[Contact Support] Link β Navigate to Support Page
- Target:
/supportormailto:support@batbern.ch - Navigation Type: Full page or open email client
- Context Passed: None
- Validation: None
- Target:
Secondary Navigation (Data Interactions)
None - this screen focuses on verification action only.
Event-Driven Navigation
-
Successful Verification Event β Navigate to Role Dashboard
- Trigger: Successful response from Cognito
confirmSignUp - Target: Role-based dashboard
- Context: User profile with verified status, authentication tokens
- Side Effects:
- User status in Cognito updated to βCONFIRMEDβ
- User can now log in
- Analytics event tracked
- Welcome email sent (optional)
- Trigger: Successful response from Cognito
-
Email Link Auto-Verification β Navigate to Dashboard After Processing
- Trigger: Page load with
codeandemailURL parameters - Target: Auto-verify, then redirect to dashboard
- Context: Code and email from URL
- Behavior: Show loading screen β verify β show success β redirect
- Trigger: Page load with
-
Auto-Submit on Complete Code β Trigger Verification
- Trigger: All 6 digits entered in code input boxes
- Target: Call verification API automatically
- Behavior: No need to click [Verify Email] button
Error States & Redirects
-
Invalid Code Error β Show Error Message (Stay on Screen)
- Trigger: βCodeMismatchExceptionβ from Cognito
- Action: Display error message, highlight inputs, clear code
- Message: βInvalid code. Please check and try again.β
- User Action: Re-enter correct code
-
Expired Code Error β Show Error + Suggest Resend
- Trigger: βExpiredCodeExceptionβ from Cognito
- Action: Display error message with resend suggestion
- Message: βThis code has expired. Click βResendβ to get a new one.β
- User Action: Click [Resend Verification Email]
-
Too Many Attempts Error β Show Error + Disable Submit
- Trigger: βLimitExceededExceptionβ from Cognito
- Action: Display error, disable button with cooldown
- Message: βToo many failed attempts. Please wait 15 minutes or request a new code.β
- User Action: Wait or request new code
-
Network Error β Show Error + Retry
- Trigger: Network timeout or connection error
- Action: Display error banner
- Message: βConnection error. Please check your internet and try again.β
- User Action: Click [Verify Email] to retry
-
User Already Verified β Redirect to Login
- Trigger: User navigates to verification screen but already verified
- Action: Display message βYour email is already verifiedβ + redirect
- Message: βYour email is already verified. Redirecting to sign inβ¦β
- User Action: Auto-redirected to Login screen
Responsive Design Considerations
Mobile Layout Changes
Screen Width < 768px (Mobile):
- Code input boxes maintain 44x44px touch target size
- Reduce spacing between input boxes for mobile
- Buttons expand to full width
- Information box text size reduced
- Success screen maintains centered layout
- Auto-redirect countdown more prominent
Tablet Layout Changes
Screen Width 768px - 1024px (Tablet):
- Code input boxes slightly larger (48x48px)
- Maintain horizontal code entry layout
- Adequate padding around content
Mobile-Specific Interactions
- Auto-focus First Input: Auto-focus first code input box on page load
- Numeric Keyboard: Use
inputmode="numeric"to trigger numeric keyboard - Paste Support: Detect paste event and distribute digits across boxes
- Auto-Submit: Submit verification when all 6 digits entered (no button tap needed)
- Haptic Feedback: Vibrate on error (invalid code) for mobile devices
Accessibility Notes
- Keyboard Navigation: Full keyboard support for code input boxes with arrow key navigation
- ARIA Labels:
- Code input container:
role="group"witharia-label="Verification code input" - Each input box:
aria-label="Digit {1-6}"andaria-required="true" - Success screen:
role="status"witharia-live="polite"
- Code input container:
- Focus Management:
- Auto-focus first input on page load
- Auto-advance focus on digit entry
- Move focus to [Verify Email] button when all digits entered
- Screen Reader Announcements:
- βVerification code sent to {email}β
- βDigit 1 of 6β, βDigit 2 of 6β, etc. as user types
- βEmail verified successfullyβ on success
- Error messages announced with
aria-live="assertive"
- Color Contrast: 4.5:1 minimum for all text and input borders
- Loading States: βVerifying your emailβ¦β announced to screen readers
State Management
Local Component State
-
Verification State:
codeDigits: string[]- Array of 6 digits (e.g., [β1β, β2β, β3β, β4β, β5β, β6β])isVerifying: boolean- Loading state during verificationisVerified: boolean- Success state after verificationerror: string | null- Current error messageresendCooldown: number- Countdown timer for resend button (seconds)redirectCountdown: number- Auto-redirect countdown (3 seconds)
-
UI State:
currentInputIndex: number- Currently focused input box (0-5)showSuccess: boolean- Toggle success screen view
Global State (Zustand Store)
Update auth store after successful verification:
interface AuthState {
user: User | null;
isEmailVerified: boolean;
updateEmailVerified: (verified: boolean) => void;
}
Server State (React Query)
-
Verification Mutation:
- Mutation Key:
['auth', 'verifyEmail'] - Mutator:
POST /api/v1/auth/verify-emailor CognitoconfirmSignUp - On Success: Set
isVerified = true, start redirect countdown - On Error: Display error message, clear code inputs
- Retry: 1 time for network errors only
- Mutation Key:
-
Resend Verification Mutation:
- Mutation Key:
['auth', 'resendVerification'] - Mutator:
POST /api/v1/auth/resend-verificationor CognitoresendConfirmationCode - On Success: Show toast βEmail sent againβ, start cooldown
- On Error: Display error message
- Retry: 0 times (user can manually retry)
- Mutation Key:
Real-Time Updates
None required for verification screen.
Form Validation Rules
Field-Level Validations
- Code Digits (each box):
- Required: Yes (all 6 digits required)
- Format: Single numeric digit (0-9) per box
- Length: Exactly 1 character per box
- Pattern:
/^[0-9]$/ - Validation Timing: On each keystroke (real-time)
Form-Level Validations
- Complete Code: All 6 digits must be entered before submission
- Auto-Submit: When all 6 boxes filled, auto-submit verification
- Button State: [Verify Email] button disabled until all 6 digits entered
Edge Cases & Error Handling
- Empty State: Page loads with 6 empty input boxes, focus on first box
- Loading State - Auto-Verification (from email link):
- Loading screen: βπ Verifyingβ¦β
- Progress bar animation
- Auto-submit verification with code from URL
- Loading State - Manual Submission:
- [Verify Email] button disabled with spinner
- Input boxes disabled during verification
- Success State:
- Success screen: ββ Email Verified!β
- Welcome message
- [Go to Dashboard] button enabled
- Auto-redirect countdown: βRedirecting in 3β¦ 2β¦ 1β¦β
- Error State - Invalid Code:
- Error message above inputs: βInvalid code. Please check and try again.β
- All input boxes outlined in red
- Code inputs cleared
- Focus returns to first input box
- Error State - Expired Code:
- Error message: βThis code has expired. Click βResendβ to get a new one.β
- Highlight [Resend Verification Email] link
- Clear code inputs
- Error State - Too Many Attempts:
- Error message: βToo many failed attempts. Please wait 15 minutes or request a new code.β
- [Verify Email] button disabled
- Show countdown timer if cooldown active
- Already Verified: If user already verified email and navigates to this page:
- Show message: βYour email is already verified.β
- Auto-redirect to Login or Dashboard
- Paste Handling:
- User pastes full 6-digit code (e.g., β123456β)
- System detects paste event
- System distributes digits across 6 input boxes
- System auto-submits verification
- Backspace Handling:
- User presses backspace in empty box
- Focus moves to previous box
- Previous digit is cleared
- Resend Cooldown:
- After resending, disable link for 60 seconds
- Show countdown: βResend available in 45 secondsβ
- Re-enable link when cooldown expires
- Email Not Found (rare edge case):
- User manually navigates to page without registration
- Show error: βNo pending verification found. Please register an account first.β
- Provide link to Account Creation screen
API Consolidation Notes
AWS Cognito Managed Endpoints: The following endpoints are part of AWS Cognitoβs managed authentication service and are intentionally not consolidated:
POST /cognito/confirmSignUp(SDK method) - AWS Cognito API for confirming user registration with verification codePOST /cognito/resendConfirmationCode(SDK method) - AWS Cognito API for resending email verification codes
These endpoints are part of AWS Cognitoβs specialized email verification flow and follow AWS SDK patterns. They are managed by AWS and provide infrastructure-level authentication capabilities.
Consolidated Custom Endpoints: Custom wrapper endpoints follow the consolidated API patterns from Story 1.16 (API Consolidation Foundation):
POST /api/v1/auth/verify-email(Story 1.16) - Wrapper endpoint that follows consolidated patterns and handles Cognito integrationPOST /api/v1/auth/resend-verification(Story 1.16) - Wrapper endpoint for resending verification emailsGET /api/v1/auth/verification-status(Story 1.16) - Optional endpoint for checking verification status and cooldown timers
Rationale:
- AWS Cognito endpoints are specialized managed services that handle email verification flows, verification code generation, email delivery coordination, and security features (24-hour expiration, single-use codes, rate limiting). These are infrastructure-level authentication services, not application domain APIs, and therefore exist outside the scope of API consolidation (Stories 1.16-1.27).
- Wrapper endpoints provide a simplified interface that abstracts AWS Cognito complexity while following the consolidated API patterns established in Story 1.16 (consistent error handling, request/response formats, logging, monitoring).
- Separation of concerns: Email verification flows are specialized authentication operations handled by Cognitoβs managed service. The consolidation effort (Stories 1.16-1.27) focuses on application domain APIs (events, partners, speakers, users, etc.), not managed authentication infrastructure.
- User management distinction: While user profile data is consolidated in Story 1.23 (Users API), the authentication flows (verification, password reset) remain with AWS Cognitoβs managed service. Once verified, user profile data is accessed through
GET /api/v1/users/me(Story 1.23).
Change Log
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-10-04 | 1.0 | Initial wireframe creation | Sally (UX Expert) |
| 2025-10-04 | 1.1 | Added language selector (EN/DE per NFR4); Added bilingual email templates (German/English); Added i18n implementation details | Sally (UX Expert) |
| 2025-10-04 | 1.2 | Added API Consolidation Notes section explaining AWS Cognito verification endpoints and their relationship to consolidated APIs | Claude (AI Assistant) |
Review Notes
Stakeholder Feedback
To be completed after stakeholder review
Design Iterations
To be completed as design evolves
Open Questions
All open questions have been resolved:
-
β Auto-Submit: Should we auto-submit verification when all 6 digits are entered, or require explicit button click?
- DECISION: Auto-submit for better UX, but keep button visible for manual submission option
-
β Multi-Language Support: Should verification emails and UI be sent in German or English?
- β DECISION: YES - Bilingual from MVP launch (NFR4)
- Verification emails sent in userβs selected language during registration
- Bilingual HTML email templates: German (de-CH) and English (en-US)
- All UI text on verification screens bilingual from day 1
-
β Code Masking: Should we mask the verification code digits (like password fields)?
- DECISION: No, verification codes are temporary and not sensitive like passwords
-
β Resend Limit: How many times can a user resend verification email within 24 hours?
- DECISION: Maximum 10 resends per 24 hours to prevent spam
-
β Email Link vs Code Entry: Should we prioritize email link verification and make code entry secondary?
- DECISION: Support both equally - some users prefer manual code entry
-
β Redirect Delay: How long should the auto-redirect countdown be after successful verification?
- DECISION: 3 seconds - enough time to read success message, short enough not to be annoying
-
β Welcome Email: Should we send a welcome email after successful verification?
- DECISION: Yes, send welcome email with getting started guide (separate from verification email)