We built a 3-step onboarding wizard that shows live regime signals on users' selected assets during signup, eliminating the blank-dashboard activation gap and placing the upgrade prompt at peak intent.
<1.2 sec
Intelligence fetch time (16 symbols)
<200ms
Clerk metadata update time
0
Post-completion redirect loops (after fix)
0 extra
Auth redirect overhead (onboarded)
CHAPTER 01
Activation rate is the metric that separates platforms that retain from platforms that churn. A user who completes a meaningful action within the first session is orders of magnitude more likely to convert from trial to paid than one who signs up and sees a blank dashboard.
The Avo intelligence platform launched with a functional but inert post-signup state. Users arrived at the dashboard with no prefilled watchlist, no context about the five market regimes the system tracked, and no demonstration that the intelligence layer was already computing on their behalf.
The business had a secondary problem: trial-to-paid conversion required the user to voluntarily navigate to a pricing page. There was no guided moment where the platform translated the user's stated preferences into a live intelligence preview and then connected that preview to the upgrade path.
CHAPTER 02
The onboarding flow was a three-step wizard rendered at /onboarding for any authenticated user whose Clerk publicMetadata.onboarded key was absent or false. Middleware redirected post-login traffic to /onboarding for this population.
Step 1 collected crypto category preferences across nine categories. Each category carried four pre-seeded symbols. The user selected any combination and the system derived a deduplicated symbol list capped at 16 entries. Step 2 fetched live intelligence for those symbols from /api/onboarding/intelligence, which proxied requests to the same Redis-backed intelligence API serving production users. Each symbol returned its market regime classification, regime confidence score, active timeframe count, and top three correlation pairs. This was the platform demonstrating its value with the user's own stated preferences, not with a static demo. Step 3 was the completion step, which updated Clerk publicMetadata with onboarded: true.
ARCHITECTURE OVERVIEW
PRESENTATION
Next.js 15 (App Router)
API LAYER
Clerk 6 (publicMetadata)
auth + rate limit + versioning
SERVICES
Redis 7.2 (regime/novelty/correlation keys)
DATABASE
Stripe API 2024
QUEUE
TypeScript 5.4
CHAPTER 03
The /api/onboarding/intelligence route accepted a symbols array in the request body and batched calls to the intelligence layer. For each symbol, it scanned the Redis keyspace for argus:regime:*, argus:novelty:*, and argus:correlation:* keys using the same pattern-matching logic as the production /api/intelligence/[symbol] route.
The onboarding completion and session invalidation: the POST /api/onboarding/complete handler retrieved the current Clerk session token and called invalidateSessionCache before returning. Without this invalidation, the middleware would have redirected the user back to /onboarding on the next navigation because the middleware read stale data.
The paid gate logic: the RegimeCard component accepted an isPaid boolean prop. Paid users saw full correlation data and all available regime timeframes. Free users saw a blurred overlay on correlation details with an inline upgrade prompt. The preview was functional enough to demonstrate value without exposing the full data payload.
TECH STACK
CHAPTER 04
The onboarding wizard reduced the post-signup dead-end state to zero. Every authenticated user without the onboarded flag hit the wizard before reaching the dashboard. The intelligence preview step loaded in under 1.2 seconds for a 16-symbol batch. The completion API updated Clerk metadata in under 200 milliseconds.
<1.2 sec
Intelligence fetch time (16 symbols)
<200ms
Clerk metadata update time
0
Post-completion redirect loops (after fix)
0 extra
Auth redirect overhead (onboarded)
CHAPTER 05
DECISION · 01
Show real data in onboarding, not placeholder data. The onboarding flow fetched live regime signals for the user's selected symbols rather than displaying a static mockup. A platform that demonstrates its intelligence on demand during onboarding is a different product from one that asks users to trust a screenshot.
DECISION · 02
Session cache invalidation is mandatory after metadata writes. The first implementation wrote the Clerk metadata but returned without invalidating the session cache. Every user in testing was redirected back to /onboarding on the next navigation because the middleware read stale data.
DECISION · 03
The paid gate needs to appear during onboarding, not after. Placing the upgrade prompt at the moment of maximum engagement, when the user has just seen live intelligence on their own preferred assets, is a different conversion context than a cold pricing page visit.
START A PROJECT
We build fast. Most projects ship in under two weeks. Start with a free 30-minute discovery call.
Start a ProjectWe launched a multi-tenant market intelligence SaaS serving computed signals from 425M rows, with all API routes under 500ms cold and unit economics positive from customer one.
425M+ ClickHouse rows at launch
Read case study →
PlatformsWe debugged 65 compounding bugs across seven subsystems of a live trading engine, fixed a score overflow that silently blocked all dark_matter_rs signals, and cut Redis memory from 11.8GB to 7.15GB.
65 Bugs fixed in one session
Read case study →
PlatformsWe built a retail investor dashboard serving live fund performance from a paper trading account, with compliance banners enforced as server-side dependencies and JavaScript bundle under 120KB.
7 Pages built and deployed
Read case study →