Skip to content

User Journey

Last updated: June 2026 (revised — messaging conv-ID links, MongoDB references corrected, Firebase removal)


User Types at a Glance

Type How they get it Platform access Notes
Free user Self-register Assessment + Phase 01 of Report only Phases 02–13 shown as locked previews (3–4 lines visible)
Explorer Pays RM 99 via Stripe Full platform (all 3 stages) 1-year access; planExpiresAt set by Stripe webhook
Explorer (complimentary) Admin grants it Full platform (permanent) plan: 'explorer' with no planExpiresAt
Coach Full application + Stripe payment + admin activation Full platform + Coach Portal plan: 'coach' — never expires; managed via Stripe Subscription Schedule
Org Member Joins via org invite link Full platform (while org plan active) Covered by the organisation's subscription
Org Admin Designated by Platform Admin Manages their org's members + coaches orgRole: 'admin' — not a platform-wide admin
Platform Admin Set in MongoDB (role: 'admin') Every feature, no gates Can manage users, orgs, coaches, workshops, promo codes

1. Individual User Journey

1a. Free User

Register
  └─ Complete profile
       └─ Take assessment (`DiscoveryPage.tsx`)
            └─ View basic Report
                 └─ [Gate] Future Studio, Growth Loop, Coach/Workshop CTAs
                       └─ Upgrade prompt → /pricing

What a free user can do:

  • Register and complete their profile
  • Take the 45-question personality assessment
  • View Phase 01 — Core Identity of the report in full (archetype, radar chart, strength bars)
  • See Phases 02–13 as locked teaser cards — each shows 3–4 lines of preview content and an upgrade prompt
  • See "Find a Coach" and "Workshops" CTAs — locked with an "Upgrade" prompt
  • Cannot access Future Studio, Growth Loop, Financial Plan, Wellness Profile, or Compatibility Compare

1b. Explorer (Paid)

/pricing page
  └─ Enter promo code (optional) or pay RM 99 via Stripe
       └─ Stripe webhook sets plan: 'explorer' + planExpiresAt (1 year)
            └─ Full platform unlocked:
                 ├─ Stage 2 — Future Studio (requires Discovery first)
                 ├─ Stage 3 — Growth Loop (requires Discovery + Future Studio first)
                 ├─ Financial Plan, Wellness Profile, Life Design
                 ├─ Self Mastery (`SelfMasteryPage.tsx`) — 5-phase AI-guided self-coaching (requires Discovery)
                 ├─ People Blueprint (`PeopleBlueprintPage.tsx`) — workplace relationship guides + AI team coach (requires Discovery + Life Design)
                 ├─ Find a Coach (direct request to coaches in our network)
                 └─ Workshops

Access expiry: planExpiresAt is checked on every gate. When expired, the user is downgraded to free-tier experience until they renew.

Promo code paths:

  • free_access type — skips Stripe entirely; admin grants plan directly
  • percent_off / fixed_off — Stripe coupon applied at checkout; payment still processed

1c. Explorer (Complimentary — Admin Granted)

Admin Dashboard → Users tab
  └─ Grant Full Access button (sets plan: 'explorer', no planExpiresAt)
       └─ User gets permanent Explorer access — never expires

This is the correct path for beta testers, partners, or staff. Do not use Stripe coupons for this.


1d. Coach User

The coach onboarding flow has five distinct stages. The portal is not automatically activated on payment — it requires admin review and activation after payment is confirmed.

Note: /coach-apply requires a paid Explorer or Coach plan and a completed assessment. Coaches must have personally used the platform before applying.

Anyone fills in /coach-apply (public form)
  └─ coachApplications doc created (status: 'pending')
       └─ Admin reviews in AdminDashboard → Coaches tab → Applications
            └─ Admin clicks "Pre-Approve"
                 └─ coachApplications → status: 'approved_pending_payment'
                      user doc: coachAppStatus = 'approved_pending_payment'
                           └─ "Coach Portal" nav link appears for this user
                                └─ CoachPortal shows Payment Gate (RM 599 Stripe button + promo option)
                                     └─ Coach pays via Stripe Checkout
                                          └─ Stripe Webhook (checkout.session.completed):
                                               coachApplications → status: 'payment_received'
                                               user doc: coachAppStatus = 'payment_received'
                                               Subscription Schedule created (RM 599 → RM 199/year)
                                                    └─ CoachPortal shows "Payment Confirmed!" screen
                                                         └─ Admin sees "Activate Coach" button (only on payment_received)
                                                              └─ Admin activates:
                                                                   coaches doc created/reactivated
                                                                   user: plan = 'coach', coachAppStatus cleared
                                                                        └─ Full Coach Portal unlocked

CoachPortal state machine when no coaches doc exists:

coachAppStatus Screen shown
'approved_pending_payment' Payment gate (RM 599 + promo code option)
'payment_received' "Payment Confirmed!" — waiting for admin activation
(none, but plan === 'coach') "Activating portal…" fallback
(none) "Not a registered coach" + Apply link

Coach pricing: RM 599 first year, RM 199/year from year 2 onwards (auto-managed via Stripe Subscription Schedule).

Annual renewal reminder: CoachPortal shows an amber banner within 30 days of the annual anniversary, red if overdue. Based on coach.createdAt in Firestore.

Referral system: Every coach gets a unique referralCode. New users who register via /register?ref=CODE are linked to the coach. 20% referral commission tracked in Admin.


2. The 5-Stage Learning Journey (Explorer + Coach users)

Stage 1 — DISCOVER
  DiscoveryPage → ArchetypeReveal → Report
  [45-question assessment → animated archetype reveal screen → 13-phase personalised report]
  XP earned: +500 (assessment complete) → 🔓 Blueprint Unlocked badge → reaches ☄️ Comet level

        ↓ (requires Stage 1 complete + paid plan)

Stage 2 — KNOW SELF
  WellnessPage (`WellnessPage.tsx`)
  [Holistic wellness check-in across 8 dimensions — sets context before designing your future]
  XP earned: +200 (completion) → 🧘 Self Aware badge

        ↓ (requires Stage 1 complete + paid plan)

Stage 3 — DESIGN
  LifeDesignPage (`LifeDesignPage.tsx`) (Future Studio — 6 steps)
  Assessment Status → Future Path → Life Wheel → Guided Ikigai → Life Blueprint → Strategic Audit
  [Life Wheel Focus Zones → Ikigai Statement → Vision → Mission → SMART Goals across 6 life areas]
  XP earned: +400 (completion) → 🏗️ Life Designer badge → typically reaches 💫 Nova level

        ↓ (requires Stage 1 + Stage 3 complete + paid plan)

Stage 4 — DO
  GrowthLoop
  Overview → Weekly Reflection → Habit Tracker → Cycle Reviews
  [30 / 60 / 90 day review cycles with per-habit mastery tracking and 7-day consistency chart]
  XP earned per reflection: +100 → ⚔️ Week 1 Warrior badge (first reflection)
  XP earned at streak milestones: +150 (7/14/21/30/60/90 days) → 🔥 Habit Builder badge (7-day streak)
  XP earned per weekly challenge: +75
  Streak system: consecutive daily habit completions; streak freeze earned per weekly reflection

        ↓ (accessible alongside Stage 3 + paid plan)

Stage 5 — FUND
  FinancialPage (`FinancialPage.tsx`)
  Money Personality → Financial Snapshot → Budget Blueprint → Financial Goals → Health Score
  [Financial Freedom life area from Future Studio feeds directly into Goals step]
  XP earned: +300 (completion)

All 5 stages complete → 🌈 Full Spectrum badge + potential 🌟 Supernova level (2,100 XP total).

Gates are enforced in ProtectedRoute.tsx using helper functions from src/utils/journeyGates.ts:

Gate function What it checks Controls access to
hasPaidAccess(profile) role === 'admin', plan === 'coach', or plan === 'explorer' with valid/no expiry All paid modules
canAccessFutureStudio(profile) discoveryCompleted === true
canAccessGrowthLoop(profile) discoveryCompleted === true AND lifeDesignCompleted === true
canAccessSelfInquiry(profile) discoveryCompleted === true AND hasPaidAccess === true Self Mastery (SelfMasteryPage.tsx)
canAccessCorporate(profile) discoveryCompleted === true AND lifeDesignCompleted === true AND hasPaidAccess === true People Blueprint (PeopleBlueprintPage.tsx)

3. Organisation (Corporate) Journey

3a. Platform Admin sets up the org

AdminDashboard → Organisations tab
  └─ Create organisation (name)
       └─ Unique inviteCode generated (e.g. "ACME2026")
            └─ Invite link: https://yourapp.com/register?org=ACME2026
                 └─ Assign coaches to the org (updateOrgCoaches)
                      └─ Activate org plan (activateOrgPlan)
                           ├─ Sets plan: 'explorer' on the org doc
                           └─ Batch-updates ALL members to plan: 'explorer'

3b. Org Admin journey

An Org Admin is a regular user with orgRole: 'admin' (not a platform-wide admin). They are designated manually or via a future invite-admin flow.

What an Org Admin can do:

  • View all members in their organisation
  • Assign members to coaches (from the org's whitelisted coach list)
  • Monitor member progress (report summaries, growth loop activity)
  • Cannot access platform-wide admin features (user management, promo codes, etc.)

3c. Org Member journey

Employee receives invite link from Org Admin or HR
  └─ /register?org=ACME2026
       └─ Registers normally — orgId and orgRole: 'member' auto-assigned
            └─ If org has an active plan → plan: 'explorer' auto-set on their account
                 └─ Full platform access immediately
                      └─ Org Admin can assign them to a specific coach

Key rule: When the org's plan is deactivated, all members are automatically reverted to plan: 'free'. Their data is preserved.


4. Platform Admin Journey

The Platform Admin has role: 'admin' set directly in MongoDB. This bypasses all gates.

Admin capabilities (via /admin):

Tab What they can do
Overview Platform-wide stats (users, assessments, revenue, coaching)
Analytics Archetype distribution charts
Engagement Active user tracking
Users Search users, reset cooldown, grant/change plan, view any user's report
Profiles Browse completed profiles
Coaches Manage full coach lifecycle: Pre-Approve / Reject applications; view Payment Received status; Activate Coach; Delete Coach; Grant / Revoke portal access per active coach
Workshops Create, edit, delete workshop events
Promo Codes Create free-access / percent-off / fixed-off codes; toggle; delete
Feedback View all post-report ratings and written notes
Organisations Create orgs, manage invite codes, activate/deactivate org plans

5. How Access Gates Work (Summary)

hasPaidAccess(profile) returns true if ANY of:
  ├─ profile.role === 'admin'
  ├─ profile.plan === 'coach'
  └─ profile.plan === 'explorer'
       ├─ AND no planExpiresAt (admin-granted permanent access)
       └─ AND planExpiresAt is in the future (active paid/org subscription)

The gate logic lives entirely in src/utils/journeyGates.ts. Both ProtectedRoute.tsx (page-level blocking) and Layout.tsx (nav lock icons) import from this single source of truth.


6. Coaching Request Flow (Client → Coach)

Client (Explorer/Coach plan) browses /coaching
  └─ Finds a coach → clicks "Request to Work Together"
       └─ Sends message → CoachRequest created (status: 'pending')
            └─ Coach sees request in Coach Portal → Requests tab
                 └─ Coach sends a Proposal (price, format, payment details)
                      └─ Client reviews proposal → Accepts (agrees to T&Cs)
                           └─ Client sends payment (outside platform) → uploads receipt
                                └─ Coach confirms payment received
                                     └─ Coaching relationship begins
                                          └─ Shared conversation thread opened (conv ID embedded in notification link as `?conv=<uuid>`)

Request statuses: pendingproposedacceptedawaiting_paymentpayment_submittedactive


7. Retake Cooldown

Users are locked from retaking the assessment for 6 months after their first submission. This prevents mood-based score drift — meaningful archetype shifts take at least 6 months of new life experience.

  • Locked screen shows last assessment date + next unlock date
  • Admin can override: set responses/{uid}.createdAt to a date 6+ months ago in MongoDB (e.g. via mongosh or the AdminDashboard user panel)