Customer/Tenant Journeys
This document maps all user journeys for authenticated customers/tenants of the SCORM API, organized by user type.
Overview
User Types:
- Unknown Users: New customers with no activity yet
- SCORM API Users: Customers using SCORM package hosting
- xAPI Users: Customers sending xAPI statements
- SCORM Dispatch Users: Customers creating dispatch packages
- Mixed Users: Customers using multiple features
Entry Point: /dashboard (after authentication)
Primary Goals: Manage SCORM packages, track learning, configure integrations, view analytics
Journey 1: New Customer First Login (Unknown Type)
Persona: New customer, just completed onboarding
Task: Get started with the service
Entry Point: /dashboard (first login)
User Type: Unknown (no activity detected)
Path
graph TD
A[Onboarding Success] --> B[Dashboard /dashboard]
B --> C[User type: Unknown]
C --> D[See Getting Started Guide]
D --> E{Choose path}
E -->|SCORM| F[Click 'SCORM Packages' widget]
E -->|xAPI| G[Click 'xAPI Statements' widget]
E -->|Dispatch| H[Click 'Dispatch Packages' widget]
F --> I[Packages Page /dashboard/packages]
G --> J[xAPI Page /dashboard/xapi]
H --> K[Dispatch Page /dashboard/dispatch]
I --> L[View API docs for upload]
J --> M[View API docs for xAPI]
K --> N[View dispatch creation guide]
Detailed Steps
- Start: User completes onboarding, redirected to
/dashboard - Dashboard Loads:
- Welcome message displayed
- User type badge: "Unknown" (or no badge)
- Quick stats: Storage 0%, Packages 0
- Getting Started Widget: Displays guide with three options:
- SCORM Packages: "Upload SCORM 1.2 or 2004 packages"
- xAPI Statements: "Send xAPI statements to track learning"
- Dispatch Packages: "Create dispatch packages for third-party LMSs"
- Action: Click on desired widget (e.g., "SCORM Packages")
- Feature Page: Navigate to relevant page:
/dashboard/packages- Shows empty state with API docs link/dashboard/xapi- Shows empty state with xAPI docs link/dashboard/dispatch- Shows empty state with dispatch guide
- Next Steps: User follows API documentation to start using the service
Buttons/Actions
- Widget cards (
/dashboard- click to navigate) - "View API Documentation" link (empty state pages)
- "Get Started" buttons (getting started guide)
Exit Point
Feature-specific pages (/dashboard/packages, /dashboard/xapi, /dashboard/dispatch)
Journey 2: SCORM API User Uploading First Package
Persona: SCORM API user (detected or self-selected)
Task: Upload and manage SCORM packages
Entry Point: /dashboard/packages
User Type: SCORM API
Path
graph TD
A[Dashboard /dashboard] --> B[Click 'SCORM Packages' widget]
B --> C[Packages Page /dashboard/packages]
C --> D{Has packages?}
D -->|No| E[See empty state]
D -->|Yes| F[View packages grid]
E --> G[Click 'View API Documentation']
G --> H[API Docs /api/docs]
H --> I[Review upload endpoint]
I --> J[Use API to upload package]
J --> K[Refresh packages page]
K --> F
F --> L[Click package card]
L --> M[Package Details /dashboard/packages/[id]]
M --> N[View package info]
N --> O[Click 'Launch' button]
O --> P[Launch Session /api/v1/packages/[id]/launch]
Detailed Steps
- Start: User on
/dashboard - Action: Click "SCORM Packages" widget (or navigate to
/dashboard/packages) - Packages Page:
/dashboard/packagesloads - Empty State (if no packages):
- Message: "No packages found"
- Description: "Get started by uploading your first SCORM package via the API."
- Action: Click "View API Documentation" button
- Opens
/api/docsin new tab
- API Documentation: User reviews upload flow:
POST /api/v1/packages/upload-url→PUTto presigned URL →POST /api/v1/packages/process- Auth: API key via
Authorization: BearerorX-API-Key - Response after process: package metadata and launch-ready package id
- Upload Package: User uses API (curl, Postman, or code) to upload SCORM package via the presigned flow
- Refresh: User clicks "Refresh" button on packages page
- Package Appears: Package card shows in grid:
- Title, SCORM version badge, file size
- Upload date, SCO count (if available)
- "Launch" and "View Details" buttons
- View Details: Click "View Details" →
/dashboard/packages/[id] - Package Details: View full package information:
- Metadata, versions, distribution settings
- Launch URL, manifest URL
- Session history
- Launch: Click "Launch" button → Opens session in new tab
Buttons/Actions
- "SCORM Packages" widget (
/dashboard) - "View API Documentation" button (empty state)
- "Upload via API" button (packages page header)
- "Refresh" button (packages page)
- "View Details" button (package card)
- "Launch" button (package card or details page)
Exit Point
/dashboard/packages/[id] (package details) or launched session
Journey 3: SCORM API User Launching Session
Persona: SCORM API user
Task: Launch a SCORM learning session
Entry Point: /dashboard/packages or /dashboard/packages/[id]
Path
graph TD
A[Packages Page /dashboard/packages] --> B[Click 'Launch' on package]
B --> C[API Launch /api/v1/packages/[id]/launch]
C --> D[Session created]
D --> E[Redirect to Player /player/[sessionId]]
E --> F[SCORM Player loads]
F --> G[Content in iframe]
G --> H[Learner interacts]
H --> I[CMI data synced]
I --> J{Exit?}
J -->|Yes| K[Click exit button]
J -->|No| H
K --> L[Session terminated]
L --> M[Return to packages]
Detailed Steps
- Start: User on packages page or package details
- Action: Click "Launch" button on package card
- API Call: Browser makes request to
/api/v1/packages/[id]/launch- Requires authentication (Clerk session or API key)
- Creates new session
- Returns session data with
sessionId
- Redirect: Browser redirected to
/player/[sessionId]?token=[launchToken] - Player Page: SCORM player loads:
- Fetches session data
- Initializes SCORM API bridge
- Loads SCORM content in iframe
- Content Interaction: Learner interacts with SCORM content
- CMI Data Sync: SCORM API bridge syncs data to backend:
- Progress, completion status, scores
- Suspend data, session time
- Exit: Learner clicks exit button or closes tab
- Session Terminated: Final CMI data saved
- Return: User returns to packages page to view updated session data
Buttons/Actions
- "Launch" button (package card or details page)
- Exit controls (SCORM player UI)
- Fullscreen toggle (player controls)
Exit Point
/dashboard/packages (after session completion)
Journey 4: xAPI User Sending Statements
Persona: xAPI user
Task: Send xAPI statements and view analytics
Entry Point: /dashboard/xapi
User Type: xAPI
Path
graph TD
A[Dashboard /dashboard] --> B[Click 'xAPI Statements' widget]
B --> C[xAPI Page /dashboard/xapi]
C --> D[View statements list]
D --> E[Review stats]
E --> F{Want to send?}
F -->|Yes| G[Click 'View API Docs']
F -->|No| H[Filter/search statements]
G --> I[API Docs /api/docs]
I --> J[Review xAPI endpoint]
J --> K[Use API to send statement]
K --> L[Refresh xAPI page]
L --> D
H --> M[View filtered results]
Detailed Steps
- Start: User on
/dashboard - Action: Click "xAPI Statements" widget
- xAPI Page:
/dashboard/xapiloads - Stats Display: View statistics:
- Total statements
- Unique verbs count
- Unique activities count
- Statements List: View recent statements:
- Actor (learner)
- Verb (action)
- Object (activity)
- Timestamp
- Result (if available)
- Filtering: Use filters:
- Search by actor, verb, or activity
- Filter by verb type
- Filter by activity
- Send Statements:
- Click "View API Documentation" link
- Review
POST /api/v1/xapi/statementsendpoint - Use API to send xAPI statements
- Refresh: Click "Refresh" to see new statements
Buttons/Actions
- "xAPI Statements" widget (
/dashboard) - "View API Documentation" link (xAPI page)
- "Refresh" button (xAPI page)
- Search input (filter statements)
- Filter dropdowns (verb, activity)
Exit Point
/dashboard/xapi (continues viewing statements)
Journey 5: Dispatch User Creating Dispatch Package
Persona: SCORM Dispatch user
Task: Create dispatch package for third-party LMS distribution
Entry Point: /dashboard/dispatch
User Type: SCORM Dispatch
Path
graph TD
A[Dashboard /dashboard] --> B[Click 'SCORM Dispatch' widget]
B --> C[Dispatch Page /dashboard/dispatch]
C --> D{Has dispatches?}
D -->|No| E[See empty state]
D -->|Yes| F[View dispatches list]
E --> G[Click 'Create Dispatch Package']
F --> H[Click 'Create Dispatch Package' button]
G --> I[Create Dispatch /dashboard/dispatch/create]
H --> I
I --> J[Select package]
J --> K[Configure settings]
K --> L[Set registration limit]
L --> M[Set expiration]
M --> N[Set allowed domains]
N --> O[Click 'Create Dispatch']
O --> P[Dispatch created]
P --> Q[View dispatch details]
Q --> R[Copy dispatch link]
R --> S[Share with third-party LMS]
Detailed Steps
- Start: User on
/dashboard - Action: Click "SCORM Dispatch" widget (or navigate to
/dashboard/dispatch) - Dispatch Page:
/dashboard/dispatchloads - Empty State (if no dispatches):
- Message: "No dispatch packages found"
- Action: Click "Create Dispatch Package" button
- Create Page:
/dashboard/dispatch/createloads - Select Package: Choose SCORM package from dropdown
- Configure Settings:
- Dispatch Name: Enter name (optional)
- Registration Limit: Set max registrations (optional)
- Expiration Date: Set expiration (optional)
- Allowed Domains: Add domains that can use dispatch (optional)
- Action: Click "Create Dispatch" button
- Dispatch Created: Success message shown
- Dispatch Details: View dispatch information:
- Dispatch token
- Launch URL
- Registration count
- Status
- Copy Link: Click "Copy" button to copy dispatch URL
- Share: Share dispatch URL with third-party LMS
Buttons/Actions
- "SCORM Dispatch" widget (
/dashboard) - "Create Dispatch Package" button (dispatch page)
- "Create Dispatch" button (create form)
- "Copy" button (dispatch details)
- "Download ZIP" button (if available)
- "Revoke" button (to disable dispatch)
Exit Point
/dashboard/dispatch (with new dispatch created)
Journey 6: Customer Managing API Keys
Persona: Any customer type
Task: Create and manage API keys for programmatic access
Entry Point: /dashboard/api-keys
Path
graph TD
A[Dashboard /dashboard] --> B[Click 'API Keys' widget]
B --> C[API Keys Page /dashboard/api-keys]
C --> D[View existing keys]
D --> E{Need new key?}
E -->|Yes| F[Click 'Create API Key']
E -->|No| G[Manage existing keys]
F --> H[Enter key name]
H --> I[Select scopes]
I --> J[Click 'Create']
J --> K[Key displayed once]
K --> L[Copy key]
L --> M[Save securely]
G --> N[Revoke key]
G --> O[View key details]
Detailed Steps
- Start: User on
/dashboard - Action: Click "API Keys" widget (or navigate to
/dashboard/api-keys) - API Keys Page:
/dashboard/api-keysloads - View Keys: See list of existing API keys:
- Key name
- Scopes (read, write, admin)
- Created date
- Last used date
- Expiration (if set)
- Create New Key:
- Click "Create API Key" button
- Enter key name (e.g., "Production API Key")
- Select scopes (read, write, admin)
- Click "Create" button
- Key Displayed: Key shown once (cannot be retrieved later)
- Action: Click "Copy" button to copy key
- Save key securely (password manager, secure storage)
- Manage Keys:
- Revoke: Click "Revoke" button to disable key
- View Details: See usage statistics, last used time
Buttons/Actions
- "API Keys" widget (
/dashboard) - "Create API Key" button (API keys page)
- "Create" button (create form)
- "Copy" button (new key display)
- "Revoke" button (existing keys)
- "Show Secret" / "Hide Secret" toggle (if applicable)
Exit Point
/dashboard/api-keys (keys managed)
Journey 7: Customer Viewing Reports
Persona: Any customer type with learning activity
Task: View learner progress and analytics
Entry Point: /dashboard/reports
Path
graph TD
A[Dashboard /dashboard] --> B[Click 'Reports' widget]
B --> C[Reports Page /dashboard/reports]
C --> D{Report type?}
D -->|Learner Progress| E[Click 'Learner Progress']
D -->|Custom| F[Click 'Custom Reports']
E --> G[Learner Progress /dashboard/reports/learner-progress]
F --> H[Custom Reports /dashboard/reports/custom]
G --> I[View progress data]
H --> J[Build custom report]
J --> K[Select filters]
K --> L[Choose visualization]
L --> M[Generate report]
M --> N[View results]
Detailed Steps
- Start: User on
/dashboard - Action: Click "Reports" widget
- Reports Page:
/dashboard/reportsloads - Report Options: Two main report types:
- Learner Progress: Pre-built progress reports
- Custom Reports: Build custom reports with filters
- Learner Progress:
- Click "Learner Progress" link
- View completion rates, scores, time spent
- Filter by package, learner, date range
- Custom Reports:
- Click "Custom Reports" link
- Select data source (sessions, statements, packages)
- Apply filters (date, package, learner, status)
- Choose visualization (table, chart, export)
- Click "Generate Report"
- View results
Buttons/Actions
- "Reports" widget (
/dashboard) - "Learner Progress" link (reports page)
- "Custom Reports" link (reports page)
- Filter controls (date pickers, dropdowns)
- "Generate Report" button (custom reports)
- "Export" button (if available)
Exit Point
/dashboard/reports/learner-progress or /dashboard/reports/custom
Journey 8: Customer Configuring Webhooks
Persona: Any customer type
Task: Set up webhooks for event notifications
Entry Point: /dashboard/webhooks
Path
graph TD
A[Dashboard /dashboard] --> B[Click 'Webhooks' widget]
B --> C[Webhooks Page /dashboard/webhooks]
C --> D[View existing webhooks]
D --> E{Need new webhook?}
E -->|Yes| F[Click 'Create Webhook']
E -->|No| G[Manage existing]
F --> H[Enter webhook URL]
H --> I[Select event type]
I --> J[Set secret optional]
J --> K[Click 'Create']
K --> L[Webhook created]
G --> M[Test webhook]
G --> N[Edit webhook]
G --> O[Delete webhook]
M --> P[View delivery logs]
Detailed Steps
- Start: User on
/dashboard - Action: Click "Webhooks" widget
- Webhooks Page:
/dashboard/webhooksloads - View Webhooks: See list of existing webhooks:
- URL
- Event type
- Status (active/inactive)
- Last delivery status
- Create Webhook:
- Click "Create Webhook" button
- Enter webhook URL (must be HTTPS)
- Select event type:
- Package Processing Completed
- Package Processing Failed
- Session Created
- Session Completed
- Session Progress
- Enter secret (optional, for signature verification)
- Click "Create" button
- Webhook Created: Webhook appears in list
- Manage Webhooks:
- Test: Click "Test" button to send test event
- Edit: Click "Edit" to modify settings
- Delete: Click "Delete" to remove webhook
- View Deliveries: Click webhook to see delivery logs
Buttons/Actions
- "Webhooks" widget (
/dashboard) - "Create Webhook" button (webhooks page)
- "Create" button (create form)
- "Test" button (webhook card)
- "Edit" button (webhook card)
- "Delete" button (webhook card)
- "Show Secret" / "Hide Secret" toggle
Exit Point
/dashboard/webhooks (webhooks configured)
Journey 9: Customer Checking Usage/Quota
Persona: Any customer type
Task: Monitor usage against plan limits
Entry Point: /dashboard/usage
Path
graph TD
A[Dashboard /dashboard] --> B[Click 'Usage' widget]
B --> C[Usage Page /dashboard/usage]
C --> D[View quota meters]
D --> E[Storage usage]
E --> F[Package count]
F --> G[API requests]
G --> H{Approaching limit?}
H -->|Yes| I[View upgrade options]
H -->|No| J[Continue using]
I --> K[Click 'Upgrade Plan']
K --> L[Billing Page /dashboard/billing]
Detailed Steps
- Start: User on
/dashboard - Action: Click "Usage" widget
- Usage Page:
/dashboard/usageloads - View Metrics: See usage statistics:
- Storage: Used / Total (e.g., 15 GB / 100 GB)
- Packages: Count / Limit (e.g., 45 / 200)
- API Requests: Requests per minute, daily total
- Sessions: Active sessions, total sessions
- Quota Meters: Visual progress bars show usage percentage
- Warnings: If approaching limits, warnings displayed
- Upgrade: If needed, click "Upgrade Plan" to go to billing
Buttons/Actions
- "Usage" widget (
/dashboard) - "Upgrade Plan" button (if approaching limits)
- "Refresh" button (to update metrics)
Exit Point
/dashboard/usage (usage monitored) or /dashboard/billing (if upgrading)
Journey 10: Customer Managing Billing
Persona: Any customer type
Task: Manage subscription and billing
Entry Point: /dashboard/billing
Path
graph TD
A[Dashboard /dashboard] --> B[Click 'Billing' widget]
B --> C[Billing Page /dashboard/billing]
C --> D[View current plan]
D --> E[View usage]
E --> F{Want to change?}
F -->|Upgrade| G[Click 'Upgrade Plan']
F -->|Downgrade| H[Click 'Change Plan']
F -->|Cancel| I[Click 'Cancel Subscription']
G --> J[Select new plan]
H --> J
J --> K[Stripe Checkout]
K --> L[Plan updated]
I --> M[Confirm cancellation]
M --> N[Subscription cancelled]
Detailed Steps
- Start: User on
/dashboard - Action: Click "Billing" widget
- Billing Page:
/dashboard/billingloads - Current Plan: View active subscription:
- Plan name (Starter, Professional, Enterprise)
- Monthly cost
- Renewal date
- Included features
- Usage Summary: See current usage vs. plan limits
- Manage Subscription:
- Upgrade: Click "Upgrade Plan" → Select higher tier → Stripe checkout
- Downgrade: Click "Change Plan" → Select lower tier → Confirm
- Cancel: Click "Cancel Subscription" → Confirm cancellation
- Payment Method: View and update payment method (Stripe)
- Invoices: View billing history and download invoices
Buttons/Actions
- "Billing" widget (
/dashboard) - "Upgrade Plan" button (billing page)
- "Change Plan" button (billing page)
- "Cancel Subscription" button (billing page)
- "Update Payment Method" button (billing page)
- "Download Invoice" links (invoice history)
Exit Point
/dashboard/billing (billing managed)
Journey 11: Mixed User Navigating Features
Persona: Mixed user (using multiple features)
Task: Switch between different feature areas
Entry Point: /dashboard
Path
graph TD
A[Dashboard /dashboard] --> B[User type: Mixed]
B --> C[See multiple widgets]
C --> D{Which feature?}
D -->|SCORM| E[Click 'SCORM Packages']
D -->|xAPI| F[Click 'xAPI Statements']
D -->|Dispatch| G[Click 'Dispatch Packages']
E --> H[Packages Page]
F --> I[xAPI Page]
G --> J[Dispatch Page]
H --> K[Switch to another feature]
I --> K
J --> K
K --> A
Detailed Steps
- Start: User on
/dashboard - User Type Badge: Shows "Mixed User"
- Multiple Widgets: See widgets for all used features:
- SCORM Packages
- xAPI Statements
- Dispatch Packages
- Navigation: Click any widget to navigate to that feature
- Feature Switching: Use navigation menu or dashboard to switch between features
- Unified Experience: All features accessible from single dashboard
Buttons/Actions
- All feature widgets (
/dashboard) - Navigation menu (Dashboard dropdown)
Exit Point
Various feature pages (packages, xAPI, dispatch, reports, etc.)
Common Customer Navigation Patterns
Pattern 1: SCORM-First Workflow
- Dashboard → Packages → Upload via API → Launch → View Reports
- Time: 10-15 minutes per package
- Path:
/dashboard→/dashboard/packages→ API upload → Launch →/dashboard/reports
Pattern 2: xAPI Analytics Workflow
- Dashboard → xAPI → Send statements → View analytics → Reports
- Time: 5-10 minutes
- Path:
/dashboard→/dashboard/xapi→ API calls →/dashboard/reports
Pattern 3: Dispatch Distribution Workflow
- Dashboard → Dispatch → Create dispatch → Share link → Monitor registrations
- Time: 5 minutes per dispatch
- Path:
/dashboard→/dashboard/dispatch→ Create → Share
Pattern 4: Configuration Workflow
- Dashboard → API Keys → Webhooks → Credentials (all in one)
- Time: 10-15 minutes
- Path:
/dashboard→/dashboard/api-keys→/dashboard/webhooks→/dashboard/credentials
Navigation Elements Available
Customer Navigation (Authenticated)
- Logo: Links to
/dashboard - Dashboard Dropdown:
- Dashboard →
/dashboard - My Learning →
/learner/dashboard - Reports →
/dashboard/reports - SCORM Dispatch →
/dashboard/dispatch - API Keys →
/dashboard/api-keys - Usage →
/dashboard/usage - Webhooks →
/dashboard/webhooks - Billing →
/dashboard/billing
- Dashboard →
- Admin Dropdown (if admin): Admin-only links
- Docs Dropdown: Documentation links
- User Button: Profile, settings, sign out
Technical Notes
- All customer pages require authentication via
requireCustomerAuth() - User type detection happens automatically based on usage
- Dashboard widgets are dynamically shown based on user type
- API keys are required for programmatic access (not for UI)
- Webhooks require HTTPS URLs
- Billing handled by Stripe integration