User Onboarding
Overview
After account creation, users progress through a configurable series of onboarding steps. Each step represents a task the user must complete (or that can be skipped by platform configuration) before they are fully onboarded. The onboarding system is:- Step-based — a linear sequence of steps, each with a status
- Configurable — steps can be enabled or disabled per-user by the platform
- Idempotent — submitting the same step twice is a no-op, not an error
- Event-sourced — every transition is recorded as an auditable event
Quick Start
1. Create an account
2. Check onboarding state
onboarding field shows the current step, all steps with their status, and whether onboarding is complete.
3. Complete steps
For each step that requires user action, call submit when the user finishes:4. Onboarding complete
When all steps are done,is_complete becomes true and current_step becomes "complete".
Onboarding State
Reading State
Fetch the current onboarding state by expanding theonboarding field on the user profile:
Response Shape
| Field | Type | Description |
|---|---|---|
current_step | string | The step the user is currently on, or "complete" |
is_complete | boolean | true when all steps are finished |
steps | array | All onboarding steps in order |
steps[].step | string | Step identifier |
steps[].status | string | One of: pending, current, submitted, completed, skipped |
steps[].gated | boolean | Whether this step is configurable (can be skipped by the platform) |
Step Statuses
| Status | Meaning |
|---|---|
pending | Step has not been reached yet |
current | User is on this step now — action required |
submitted | User submitted this step (transient — auto-advances immediately) |
completed | Step finished successfully |
skipped | Step was skipped by platform configuration |
State Machine
Any gated step that is disabled will be automatically skipped during advancement. The state machine jumps to the next enabled step (or tocomplete if all remaining steps are skipped).
Endpoints
Check Onboarding State
Submit Step Completion
- Records a
step_submittedevent, then immediately advances to the next step - If
stepdoes not match the user’s current step, returns the current state with 200 OK — no error, no state change - Calling submit on an already-completed step is a safe no-op
Advance Step
step_submitted event.
Request body:
- Advances the user past the specified step without recording a submission event
- Same idempotency rules as submit — mismatched step returns current state
Get Event History
| Field | Type | Description |
|---|---|---|
step | string | The step this event relates to |
event_type | string | One of: step_entered, step_submitted, step_completed, step_skipped |
from_step | string or null | The previous step at the time of transition |
duration_ms | integer or null | Time spent in the step (only on step_completed events) |
created_at | integer | Event timestamp (epoch milliseconds) |
Step Reference
| Step | Description | Related Endpoints | Auto-advances? |
|---|---|---|---|
phone_verification | Verify phone number via SMS code | PUT /v0/user/me/phone (send code), PUT /v0/user/me/phone/code (verify) | Yes — successful code verification auto-submits this step |
kyc_verification | Complete identity verification | POST /v0/kyc/start (begin KYC), GET /v0/kyc/status (check result) | Yes — approved KYC status auto-submits this step |
open_banking | Connect bank accounts | Explicit submit only | No |
card_setup | Set up payment card | Explicit submit only | No |
feature_selection | Choose platform features | Explicit submit only | No |
Integration Patterns
Building an Onboarding UI
- After account creation, fetch onboarding state with
GET /v0/user/me?expand=onboarding - Find the step with
"status": "current"and render that step’s UI - When the user completes the step’s action, call
POST /v0/user/me/onboarding/submit - The response contains the updated state — re-render based on the new
currentstep - Repeat until
is_completeistrue
Handling Configurable Steps
Steps with"gated": true may have "status": "skipped" if the platform has disabled them. When building a step list UI:
- Filter the
stepsarray to excludeskippedsteps, or show them as completed - Do not hardcode which steps exist — always derive from the
stepsarray - The order in the array is the canonical step order
Implicit Step Advancement
Two steps auto-advance without requiring an explicit submit call: Phone verification: When the user successfully verifies their phone viaPUT /v0/user/me/phone/code, the phone_verification onboarding step is automatically submitted. After calling the phone verification endpoint, re-fetch onboarding state to see the updated step.
KYC verification: When checking KYC status via GET /v0/kyc/status returns an approved result and the user is currently on the kyc_verification step, it is automatically submitted. After initiating KYC, poll the status endpoint and re-fetch onboarding state once approved.
In both cases, the client should re-fetch state after the triggering action to see the advancement:
Error Handling
All error responses follow RFC 7807 Problem Details format:| Status | Meaning |
|---|---|
| 401 Unauthorized | Missing or invalid authentication token |
| 404 Not Found | User account does not exist (create account first) |
| 422 Unprocessable Content | Request body missing required step field |
Reference Tables
Step Identifiers
| Value | Description |
|---|---|
created | Initial state after account creation (not a user-facing step) |
phone_verification | Phone number verification via SMS |
kyc_verification | Identity verification (KYC) |
open_banking | Bank account connection |
card_setup | Payment card setup |
feature_selection | Platform feature selection |
complete | Terminal state — onboarding finished |
Event Types
| Value | Description |
|---|---|
step_entered | User arrived at a new step |
step_submitted | User submitted a step (recorded by submit endpoint, not advance) |
step_completed | Step was completed and user advanced past it |
step_skipped | Step was skipped by platform configuration |
Status Values
| Value | Description |
|---|---|
pending | Step not yet reached |
current | User is on this step — action required |
submitted | Step was submitted (transient — advances immediately) |
completed | Step finished |
skipped | Step disabled by platform configuration |