Story 1.2: Account Creation Wireframe
Header Information
Story
Screen
Account Creation (User Registration)
User Role
Public (unauthenticated)
Related FR
- FR1: Role-based authentication with distinct interfaces for organizers, speakers, partners, and attendees
- FR22: Event organizers shall manage user roles with capabilities to promote users to speaker or organizer roles (all new accounts created as ATTENDEE)
- NFR3: Integration with external services (AWS Cognito for user registration, AWS SES for verification emails)
- NFR4: Platform shall support multi-language content (German, English) with internationalization framework
Visual Wireframe
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β β Back to Login BATbern Event Platform π EN βΌ | DE β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββ β
β β β β
β β π€ Create Account β β
β β β β
β β Join the BATbern β β
β β community β β
β β β β
β βββββββββββββββββββββββββββ β
β β
β ββββ STEP 1 of 2: Personal Information ββββββββββββββββββββββββ β
β β β β
β β Full Name * β β
β β [_____________________________] β β
β β β β
β β Email Address * β β
β β [_____________________________] β β
β β β β
β β Password * β β
β β [_____________________________] π β β
β β β’ At least 8 characters β β
β β β’ Include uppercase and lowercase β β
β β β’ Include at least one number β β
β β β β
β β Confirm Password * β β
β β [_____________________________] π β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
β [Continue to Confirmation β] β
β β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββ STEP 2: CONFIRMATION βββββββββββββββββββββββββββ
β β
β β Back BATbern Event Platform π EN βΌ | DE β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββ β
β β β β
β β π€ Create Account β β
β β β β
β β Join the BATbern β β
β β community β β
β β β β
β βββββββββββββββββββββββββββ β
β β
β ββββ STEP 2 of 2: Review & Confirm βββββββββββββββββββββββββββββ β
β β β β
β β Review your information: β β
β β β β
β β Name: John Doe β β
β β Email: john.doe@example.com β β
β β [Edit] β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β I agree to the Terms of Service and β β β
β β β Privacy Policy β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β I would like to receive event updates and β β β
β β β newsletters (optional) β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
β [β Back] [Create Account] β
β β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββ β
β β βΉοΈ You will receive a verification email at β β
β β john.doe@example.com β β
β βββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key Interactive Elements
Step 1: Personal Information
- Language Selector Dropdown: Switch between English and German (π EN βΌ | DE)
- Full Name Input: Text field for userβs full name
- Email Address Input: Email field with format validation
- Password Input: Password field with strength indicator and show/hide toggle
- Confirm Password Input: Password confirmation field with show/hide toggle
- Password Requirements Display: Real-time validation feedback for password strength
- Continue Button: Navigate to Step 2 after validation
Step 2: Review & Confirmation
- Information Summary: Display of entered data (name, email) with Edit link
- Terms & Conditions Checkbox: Required agreement to T&C and privacy policy
- Newsletter Opt-in Checkbox: Optional subscription to updates
- Back Button: Return to Step 1
- Create Account Button: Submit registration form
Common Elements
- β Back to Login Link: Navigate back to login screen (both steps)
- Step Progress Indicator: Shows current step (1 of 2, 2 of 2)
- Loading Spinner: Shown during account creation API call
- Error Messages: Field-specific and form-level error messages
Functional Requirements Met
- FR1: Role-based authentication - all self-registered accounts created as ATTENDEE role
- FR22: Role promotion by organizers - users cannot select their own role during registration; only organizers can promote users to Speaker, Partner, or Organizer roles post-registration via Story 1.20 workflows
- NFR3: Integration with AWS Cognito for user registration and AWS SES for email verification
- NFR4: β Multi-language support from MVP launch - German (de-CH) and English (en-US) with language selector, react-i18next framework, bilingual email templates
- Security: Secure password requirements following AWS Cognito security policies
- Email Verification: AWS Cognito triggers email verification flow after registration (bilingual emails)
- User Experience: Simple 2-step wizard for streamlined registration
- Data Collection: Collects minimum required information (name, email, password, language preference, newsletter opt-in)
User Interactions
Primary Flow: Successful Account Creation
Step 1: Personal Information
- User navigates to Account Creation from Login screen
- User selects language preference if needed (defaults to browser locale)
- User enters full name
- User enters email address
- System validates email format in real-time
- User enters password
- System displays password strength indicator
- User enters password confirmation
- System validates password match in real-time
- User clicks [Continue to Confirmation β]
- System validates all fields
- System transitions to Step 2
Step 2: Review & Confirmation
13. User reviews entered information (name, email)
14. User checks βI agree to Terms of Serviceβ checkbox
15. (Optional) User checks newsletter opt-in checkbox
16. User clicks [Create Account] button
17. System submits registration to AWS Cognito with:
- User attributes: name, email, language preference
- Custom attribute: custom:role = βATTENDEEβ (automatically assigned by backend)
18. Cognito creates ATTENDEE user account
19. Cognito sends verification email via AWS SES (in userβs selected language)
20. System navigates to Email Verification screen (story-1.2-email-verification.md)
21. System displays success message: βAccount created! Please check your email.β
Post-Registration (Future Role Promotion via Story 1.20): 22. User verifies email and logs in β Attendee Dashboard 23. If user needs different role (Speaker/Partner/Organizer): - Organizer promotes user via Role Management Panel - User receives role change notification - Next login redirects to new role-appropriate dashboard
Secondary Flow: Edit Information
- From Step 2 (Review & Confirmation), user clicks [Edit] link
- System returns to Step 1 with pre-filled values
- User makes changes
- User clicks [Continue to Confirmation β] to return to Step 2
Secondary Flow: Back Navigation
- User clicks [β Back] button at any step
- System returns to previous step with values preserved
- User can continue forward again or make changes
Secondary Flow: Return to Login
- User clicks [β Back to Login] link
- System navigates to Login Screen (story-1.2-login-screen.md)
- User data is cleared (not saved)
Error Flow: Email Already Exists
- User completes all steps and clicks [Create Account]
- AWS Cognito returns βUsernameExistsExceptionβ
- System displays error banner: βAn account with this email already exists. [Sign In]β
- User can click [Sign In] to go to Login screen
Error Flow: Password Requirements Not Met
- User enters weak password in Step 1
- User clicks [Continue]
- System highlights password field in red
- System displays error: βPassword must meet all requirementsβ
- User updates password and retries
Error Flow: Terms Not Accepted
- User reaches Step 2 (Review & Confirmation)
- User clicks [Create Account] without checking T&C checkbox
- System displays error: βYou must agree to the Terms of Service to continueβ
- T&C checkbox outlined in red
- User checks checkbox and retries
Error Flow: Network Error
- User clicks [Create Account]
- Network request fails
- System displays error banner: βConnection error. Please try again.β
- User can retry immediately
Technical Notes
AWS Cognito User Registration
- Cognito API: Use
signUpmethod from AWS Cognito SDK - Custom Attributes: Store language preference in Cognito user attributes (
custom:language= βdeβ or βenβ);custom:roleautomatically set to βATTENDEEβ by backend - Password Policy: Enforce Cognito password policy (min 8 chars, uppercase, lowercase, number)
- Email Verification: Cognito automatically sends verification email with confirmation code in userβs selected language (AWS SES bilingual templates configured from day 1)
- User Status: New users have βUNCONFIRMEDβ status until email verified
- Default Role: All self-registered users created as ATTENDEE; role promotion handled via Story 1.20
- Language Preference: Userβs selected language (de/en) stored in Cognito
custom:languageattribute and used for all future communications
Frontend Framework
- React 18.2+ with TypeScript
- Material-UI for form components and wizard stepper
- React Hook Form for multi-step form state management
- Zustand for wizard state persistence across steps
- React Query for API calls
- react-i18next for internationalization (German/English from day 1)
- i18next-browser-languagedetector for automatic locale detection
Multi-Step Form Management
- State Persistence: Store form data in Zustand store to preserve values across steps
- Validation: Field-level validation on blur, form-level validation on Continue/Submit
- Step Transitions: Smooth transitions with validation gates
- Browser History: Each step updates URL (e.g.,
/auth/register?step=2) for bookmarking
Email Verification Flow
- AWS Cognito sends verification email with 6-digit code
- User clicks link in email or enters code manually
- See story-1.2-email-verification.md for detailed flow
Security Measures
- Password Strength: Client-side and server-side password validation
- Email Validation: Format validation + existence check (bounce handling)
- CSRF Protection: CSRF tokens on registration form
- Rate Limiting: Maximum 5 registration attempts per IP per hour
- Spam Prevention: Honeypot field (hidden from users) to catch bots
- Input Sanitization: XSS prevention on all text inputs
Accessibility
- WCAG 2.1 AA Compliance: Full keyboard navigation
- ARIA Labels: All form inputs properly labeled
- Step Navigation: Announce step changes to screen readers
- Progress Indicator:
aria-current="step"on current step - Error Announcements:
aria-liveregions for validation errors
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) with fallback to browser locale detection
- UI Text: All screen text, labels, buttons, error messages translated from day 1
- Step Indicators: βStep 1 of 2β / βSchritt 1 von 2β
- Password Requirements: Translated requirement text (German/English)
- Terms & Conditions: Links to language-specific T&C documents (de/en)
- Validation Messages: All field-level and form-level errors localized
- Language Persistence: Selected language stored in localStorage and passed to backend (Cognito attribute)
- Email Language: Verification email sent in userβs selected language (AWS SES templates: de/en)
- Translation Keys:
auth.register.step1.title,auth.register.fullNameLabel, etc. - Dynamic Switching: Language change applies immediately to all visible text without page reload
- Framework: react-i18next with i18next-browser-languagedetector
- Translation Files:
/locales/de/auth.json,/locales/en/auth.json
API Requirements
Initial Page Load APIs
None - this screen does not require data fetching on initial load.
User Action APIs
-
POST /cognito/signUp (AWS Cognito SDK method)
- Triggered by: [Create Account] button click in Step 2
- Payload:typescript
{ ClientId: "<cognito_client_id>", Username: "john.doe@example.com", Password: "SecurePass123", UserAttributes: [ { Name: "email", Value: "john.doe@example.com" }, { Name: "name", Value: "John Doe" }, { Name: "custom:role", Value: "ATTENDEE" }, // Always ATTENDEE for self-registration { Name: "custom:language", Value: "en" }, // User's selected language (en|de) { Name: "custom:newsletter_optin", Value: "true" } ] } - Response:json
{ "UserConfirmed": false, "CodeDeliveryDetails": { "Destination": "j***@example.com", "DeliveryMedium": "EMAIL", "AttributeName": "email" }, "UserSub": "user-uuid-1234" } - Used for: Creating ATTENDEE user account in AWS Cognito
- Note: Backend automatically sets role to ATTENDEE; role promotions handled via Story 1.20
-
POST /api/v1/auth/register (Optional wrapper endpoint)
- Triggered by: [Create Account] button click
- Payload:json
{ "fullName": "John Doe", "email": "john.doe@example.com", "password": "SecurePass123", "language": "en", "agreedToTerms": true, "newsletterOptIn": true } - Response:json
{ "success": true, "userId": "user-uuid-1234", "email": "john.doe@example.com", "role": "ATTENDEE", "language": "en", "requiresVerification": true, "message": "Account created successfully. Please check your email for verification." } - Used for: Simplified registration with backend handling Cognito integration
- Note: Backend always creates ATTENDEE accounts; no role parameter accepted
-
GET /api/v1/auth/check-email-availability (Email uniqueness check)
- Triggered by: Email field on blur in Step 1
- Query params:
email=john.doe@example.com - Response:json
{ "available": true } - Used for: Real-time feedback if email already registered (optional, nice-to-have)
Navigation Map
Primary Navigation Actions
-
[β Back to Login] Link β Navigate to
Login Screen- Target:
/auth/login(story-1.2-login-screen.md) - Navigation Type: Full page navigation
- Context Passed: None
- Validation: Confirmation dialog if user has entered data
- Target:
-
[Continue to Confirmation β] Button β Transition to Step 2
- Target: Same component, Step 2 view
- Navigation Type: In-page state transition
- URL Update:
/auth/register?step=2 - Context Passed: Form data (name, email, password, language) stored in state
- Validation: All Step 1 fields must be valid
-
[β Back] Button β Return to Previous Step
- Target: Previous step in wizard
- Navigation Type: In-page state transition
- Context Passed: Form data preserved
- Validation: None required
-
[Create Account] Button β Navigate to
Email Verification Screen- Target:
/auth/verify-email(story-1.2-email-verification.md) - Navigation Type: Full page navigation
- Context Passed: Email address for verification
- Validation: T&C checkbox must be checked, all data must be valid
- Target:
-
[Edit] Link β Return to Step 1
- Target: Step 1 with pre-filled data
- Navigation Type: In-page state transition
- Context Passed: Current form values
- Validation: None required
Secondary Navigation (Data Interactions)
None - this is a form wizard with no data-driven navigation.
Event-Driven Navigation
-
Successful Account Creation Event β Navigate to Email Verification
- Trigger: Successful response from Cognito
signUpAPI - Target:
/auth/verify-email?email={email}(story-1.2-email-verification.md) - Context: Email address and user ID
- Side Effects:
- Verification email sent to user
- User account created in Cognito with βUNCONFIRMEDβ status
- Analytics event tracked
- Trigger: Successful response from Cognito
-
Browser Back Button β Navigate to Previous Step or Login
- Trigger: User presses browser back button
- Behavior: Respect browser history (URL param
step={n}) - Data: Form data preserved in state
Error States & Redirects
-
Email Already Exists Error β Show Error Banner + Link to Login
- Trigger: βUsernameExistsExceptionβ from Cognito
- Action: Display error banner with Sign In link
- Message: βAn account with this email already exists. [Sign In]β
- User Action: Click [Sign In] to navigate to Login screen
-
Invalid Password Error β Show Error at Password Field (Step 1)
- Trigger: Client-side password validation fails
- Action: Highlight password field, display error message
- Message: βPassword must meet all requirementsβ
- User Action: Update password to meet requirements
-
Terms Not Accepted Error β Show Error at Checkbox (Step 3)
- Trigger: Form submission without T&C checkbox checked
- Action: Highlight checkbox, display error message
- Message: βYou must agree to the Terms of Service to continueβ
- User Action: Check T&C checkbox and retry
-
Network Error β Show Error Banner + Retry
- Trigger: Network timeout or connection error
- Action: Display error banner
- Message: βConnection error. Please check your internet and try again.β
- User Action: Click [Create Account] again to retry
-
Server Error β Show Error Banner
- Trigger: 500 Internal Server Error
- Action: Display error banner
- Message: βAn unexpected error occurred. Please try again later.β
- User Action: Retry later or contact support
-
Rate Limit Error β Show Error Banner with Cooldown
- Trigger: Too many registration attempts from same IP
- Action: Display error banner with wait time
- Message: βToo many registration attempts. Please wait 15 minutes and try again.β
- User Action: Wait for cooldown period
Responsive Design Considerations
Mobile Layout Changes
Screen Width < 768px (Mobile):
- Single-column layout with full-width form elements
- All inputs expand to full width minus padding
- Step progress indicator shown as βStep 1 of 3β text instead of visual stepper
- Role selection cards stack vertically
- Buttons stack vertically ([Back] above [Continue])
- Reduce padding and font sizes for mobile
- Increase touch targets to minimum 44x44px
Tablet Layout Changes
Screen Width 768px - 1024px (Tablet):
- Form container max-width of 600px, centered
- Maintain horizontal layout for buttons
- Adequate padding around form
- Touch targets 44x44px minimum
Mobile-Specific Interactions
- Auto-focus: Donβt auto-focus first field on mobile (prevents keyboard pop-up)
- Email Keyboard: Use
type="email"for email-optimized keyboard - Password Show/Hide: Larger touch target for visibility toggle
- Step Navigation: Swipe gestures to move between steps (optional enhancement)
- Form Submission: Support βEnterβ key on virtual keyboard
Accessibility Notes
- Keyboard Navigation: Full keyboard support with logical tab order across all steps
- ARIA Labels:
- Inputs:
aria-labelandaria-required="true"on required fields - Step indicator:
aria-current="step"on active step - Role radio buttons:
aria-describedbypointing to role descriptions - Form:
role="form"andaria-label="Account registration form"
- Inputs:
- Focus Management: Focus moves to first field of next step on Continue
- Step Announcements: Screen reader announces βStep 2 of 3: Select Your Roleβ on transition
- Error Announcements:
aria-live="polite"for validation errors - Progress Indicator:
<ol>list with proper semantic HTML - Color Contrast: 4.5:1 minimum for all text and UI elements
- Loading States: Button shows βCreating accountβ¦β with
aria-busy="true"
State Management
Local Component State
-
Wizard State:
currentStep: 1 | 2- Active step in wizard (2-step flow)formData: RegistrationFormData- All form field valuesisSubmitting: boolean- Loading state during registrationerrors: Record<string, string>- Validation errors per field
-
Form Data:
typescriptinterface RegistrationFormData { fullName: string; email: string; password: string; confirmPassword: string; language: 'en' | 'de'; // User's selected language agreedToTerms: boolean; newsletterOptIn: boolean; // Note: role is NOT stored in form state // Backend automatically assigns role = "ATTENDEE" }
Global State (Zustand Store)
Persist wizard data in case of accidental navigation away:
interface RegistrationState {
draftRegistration: RegistrationFormData | null;
saveDraft: (data: RegistrationFormData) => void;
clearDraft: () => void;
}
Server State (React Query)
-
Registration Mutation:
- Mutation Key:
['auth', 'register'] - Mutator:
POST /api/v1/auth/registeror CognitosignUp - On Success: Navigate to email verification screen
- On Error: Display error message based on error type
- Retry: 1 time for network errors only
- Mutation Key:
-
Email Availability Query (Optional):
- Query Key:
['auth', 'emailAvailable', email] - Fetcher:
GET /api/v1/auth/check-email-availability - Enabled: Only when email field has valid format
- Stale Time: Infinity (emails donβt change availability frequently)
- Query Key:
Real-Time Updates
None required for registration screen.
Form Validation Rules
Field-Level Validations
Step 1: Personal Information
-
Full Name:
- Required: Yes - βFull name is requiredβ
- Min Length: 2 characters - βName must be at least 2 charactersβ
- Max Length: 100 characters - βName is too longβ
- Pattern: Letters, spaces, hyphens only - βName contains invalid charactersβ
- Validation Timing: On blur
-
Email Address:
- Required: Yes - βEmail address is requiredβ
- Format: Valid email (regex:
/^[^\s@]+@[^\s@]+\.[^\s@]+$/) - βPlease enter a valid emailβ - Max Length: 255 characters - βEmail is too longβ
- Uniqueness: Not already registered (optional check) - βEmail already in useβ
- Validation Timing: On blur
-
Password:
- Required: Yes - βPassword is requiredβ
- Min Length: 8 characters - βPassword must be at least 8 charactersβ
- Max Length: 128 characters - βPassword is too longβ
- Uppercase: At least one - βInclude at least one uppercase letterβ
- Lowercase: At least one - βInclude at least one lowercase letterβ
- Number: At least one - βInclude at least one numberβ
- Special Character: Optional but recommended - βFor stronger security, add a special characterβ
- Validation Timing: Real-time strength indicator
-
Confirm Password:
- Required: Yes - βPlease confirm your passwordβ
- Match: Must match Password field - βPasswords do not matchβ
- Validation Timing: On blur and real-time after first blur
Step 2: Review & Confirmation
-
Terms & Conditions:
- Required: Yes - βYou must agree to the Terms of Serviceβ
- Validation Timing: On Create Account button click
-
Newsletter Opt-in:
- Required: No (optional)
Form-Level Validations
- Step Transitions: All fields in current step must be valid before proceeding to next step
- Submit Validation: All required fields across all steps must be valid before account creation
- Password Strength: Overall password strength must be βMediumβ or higher
- Email Format: Final validation of email before submission
Edge Cases & Error Handling
- Empty State: Step 1 loads with empty fields, no errors shown
- Loading State - Step Transition: Brief loading animation when transitioning between steps
- Loading State - Account Creation:
- [Create Account] button disabled with spinner + βCreating accountβ¦β text
- All form inputs disabled
- Prevent navigation during submission
- Success State:
- Success message: βAccount created! Please check your email for verification.β
- Automatic redirect to Email Verification screen after 2 seconds
- Error State - Email Exists:
- Error banner: βAn account with this email already exists. [Sign In]β
- Highlight email field in Step 1
- Provide direct link to Login screen
- Error State - Weak Password:
- Password field outlined in red
- Display all unmet requirements
- Password strength indicator shows βWeakβ or βToo Weakβ
- Error State - Password Mismatch:
- Confirm Password field outlined in red
- Error message: βPasswords do not matchβ
- Clear Confirm Password field on error
- Error State - Terms Not Accepted:
- T&C checkbox outlined in red
- Error message: βYou must agree to the Terms of Serviceβ
- [Create Account] button remains disabled
- Browser Back/Forward: Wizard state synchronized with URL parameters (step=1, step=2)
- Page Refresh: Show confirmation dialog βAre you sure? Your progress will be lostβ
- Session Timeout: No session yet (unauthenticated), no timeout concerns
- Duplicate Submission Prevention: Disable submit button and form after first submission
- Password Visibility Toggle: Each password field has independent show/hide state
Change Log
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-10-04 | 1.0 | Initial wireframe creation | Sally (UX Expert) |
| 2025-10-04 | 2.0 | MAJOR UPDATE per FR22: Removed Step 2 (Role Selection) - all accounts created as ATTENDEE; Changed to 2-step flow; Added language selector (EN/DE per NFR4); Updated API to remove role parameter and add language; Added i18n implementation details; Role promotion deferred to Story 1.20 | Sally (UX Expert) |
Review Notes
Stakeholder Feedback
To be completed after stakeholder review
Design Iterations
To be completed as design evolves
Open Questions
-
Company Selection for Partners: Should we add company selection in the registration flow, or defer it to post-verification profile setup?
- Decision: Defer to profile setup after email verification - simpler registration flow
-
Role Approval Workflow: How should we notify users when Organizer role is approved?
- Decision: Email notification + in-app notification when they log in
-
Social Registration: Should we support βSign up with Googleβ or other OAuth providers?
- Decision: Not in MVP - can be added as enhancement
-
CAPTCHA: Should we add reCAPTCHA to prevent automated bot registrations?
- Decision: Yes, add reCAPTCHA in Step 3 before final submission (non-MVP)
-
Multi-Language: Should registration form support German language?
- β DECISION: YES - German and English from MVP launch (NFR4)
- Language selector in registration form (Step 1)
- All UI text, labels, validation messages, and email templates bilingual from day 1
- Default: German (de-CH), with English (en-US) option
-
Email Verification Timeout: How long is the verification code valid?
- Decision: 24 hours, consistent with Cognito default
-
Password Strength Indicator: Should we show a visual strength meter (weak/medium/strong)?
- Decision: Yes, show color-coded strength indicator below password field