drop-onboarding-flow-spec Drop User Onboarding Flow Specification Version: 1.0 Date: 2026-02-17 Author: John (AI Director) Project: Drop Fintech Payment App MC Task: #1192 Status: Draft — Awaiting Approval 1. Executive Summary This specification defines the complete user onboarding flow for Drop, a fintech payment app that provides remittance and QR payment services using PSD2 pass-through architecture. The flow must enforce legal requirements (18+ age, Norwegian residency), implement BankID verification, and guide users through KYC compliance before enabling transactions. Key Constraints: Pass-through model: Drop NEVER holds customer money. AISP reads balance, PISP initiates payments from user's bank account. Legal requirement: Users must be 18+ and Norwegian residents (from landing/pages/vilkar.html ) BankID mandatory: Required before any transaction (PSD2 SCA compliance) KYC compliance: Sumsub integration for identity verification (auto-approved in demo mode) 2. Flow Overview 2.1 High-Level Journey Landing Page → Register → Phone OTP → Onboarding Tour → BankID Verification → KYC Check → Dashboard (1) (2) (3) (4) (5) (6) (7) 2.2 State Diagram ┌─────────────┐ │ VISITOR │ └──────┬──────┘ │ ▼ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │ REGISTER │────▶│ PHONE_OTP │────▶│ ONBOARDING │ └─────────────┘ └──────────────┘ └──────┬──────┘ │ ▼ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │ DASHBOARD │◀────│ KYC_CHECK │◀────│ BANKID │ └─────────────┘ └──────────────┘ └─────────────┘ │ ▼ ┌─────────────┐ │ VERIFIED │ (can transact) └─────────────┘ 2.3 User States State Description Can Transact? Next Action visitor Not registered No Register registered Account created, no phone verification No Verify phone OTP phone_verified Phone verified, no BankID No Complete onboarding tour onboarded Tour complete, no BankID No Link BankID bankid_linked BankID verified, pending KYC No Wait for KYC approval kyc_approved Fully verified Yes Full access kyc_pending KYC review in progress No Wait for approval kyc_rejected KYC failed No Contact support State persistence: Stored in users table: kyc_status enum: 'pending', 'approved', 'rejected' phone_verified boolean bankid_verified boolean onboarding_completed boolean (new field) 3. Detailed Flow Steps Step 1: Landing Page → Register Route: / → /register Entry: User clicks "Opprett konto" on landing page UI Reference: mockups/figma-make-export/src/components/Login.tsx (register section) Frontend (register/page.tsx) Current Implementation: ✅ Form: First name, last name, email, phone (+47), date of birth, password ✅ Client-side validation: email format, password complexity (8+ chars, upper/lower/digit) ✅ Age validation: DOB must result in age >= 18 ✅ XSS prevention: Blocks