Skip to content

Growth Loop — Product Documentation

The execution engine that turns your goals into daily actions and consistent progress.

Version 5.0 · Last updated June 26 2026 Route: /growth-loop · Page: GrowthLoopPage.tsx (export: DailyGrowthPage) Gate: Discovery completed + Explorer paid plan Nav section: Master (Explorer plan users only)


1. What Is the Growth Loop?

Growth Loop is where plans become behaviour.

The Personality Test tells you who you are. Career Path helps you plan where you want to go. Growth Loop is how you actually get there — daily check-ins, goal tracking, and a cross-pillar 90-day plan built from your real data.


2. How It Fits the Journey

Discovery → Explore (Mind & Body · Money Plan · Career Path) → Growth Loop
 (Who)       (Foundation)                                      (Execution)
Source page What it contributes to Growth Loop
Career Path 90-day sprint goals → pushed to Goals tab on commit
Financial Plan financialPlan.goals → read-only legacy sync
Wellness Profile wellnessProfile.goals → read-only legacy sync
AI 90-Day Plan Generated from Health + Financial + Career data → goals in Goals tab

3. The Three Tabs

# Tab key Label Icon Purpose
1 dashboard Today BarChart3 Daily Stack check-in, streak, life score, daily insight
2 goals Goals Target All goals across 4 pillars — add, track, cycle status
3 myplan My Plan Map View, build, and rebuild the AI-generated 90-day master plan

Tab 1: Today (Daily Dashboard)

Purpose. A fast daily check-in — see your state, check off one action per pillar, keep the streak alive.

Daily Stack

  • One card per active pillar (health / career / finances / people)
  • Each card shows the first goal in that pillar
  • Tap to check off → saves to growthLoop.dailyCheckins[date][pillar]
  • Streak increments when ≥3 pillars checked on consecutive days
Element Description
🔥 Streak badge Current consecutive-day streak count
Checked count X/4 pillars done today
Progress bar Visual completion of today's stack
Completion celebration Appears when all pillars checked
Daily Archetype Insight Archetype-specific tip rotating by day-of-year. Uses dailyInsights.json via useTranslatedData — full i18n (EN/MS/TA/ZH)
Life Score section Computed stats: total goals, done, in-progress, overdue tasks, due-soon tasks, goals with focus/reflection this week
Weekly check-in hint Nudge to keep Today tab lightweight and use Goals tab for detailed status updates

Weekly Pulse (modal — Sundays only)

On Sundays, if no pulse has been submitted for the current ISO week, a modal appears automatically with 4 sliders (0–10): - Health · Career · Finances · People

Saved to growthLoop.weeklyPulse[weekKey]. Tracks life balance trends over time.

Day-of-week nudges

  • Monday → amber motivational nudge
  • Thursday/Friday → violet end-of-week nudge
  • Saturday/Sunday → emerald weekend nudge

Tab 2: Goals

Purpose. Keep all 4-pillar goals visible and moving. Single source of truth for what you're working on.

Goal Data Sources (priority order)

Source Written to Editable from here
Manual add growthLoop.goals[] (source: 'manual') ✅ Delete allowed
AI 90-Day Plan growthLoop.goals[] (source: 'masterPlan') ✅ Delete allowed
Career Path commit growthLoop.goals[] (source: 'career') ❌ Manage in Career Path
Financial Plan (legacy) financialPlan.goals[] (read-only) ❌ Manage in Money Plan
Wellness Profile (legacy) wellnessProfile.goals[] (read-only) ❌ Manage in Wellness Profile
Life Design (legacy) lifeDesign.pillars.goals.* (read-only) ❌ Life Design removed June 24 2026

New goals are always written to growthLoop.goals[]. Legacy sources display for backward compatibility only.

The 4 Pillars

Pillar Key Emoji Colour
Mind & Body health 💪 Emerald
Career & Skills career 🚀 Blue
Financial Freedom finances 💰 Amber
My People people 🤝 Rose

Goal card

  • Title (strikethrough when done)
  • Status badge — tap to cycle: Not started → In progress → Done ✓
  • Pillar colour badge + emoji
  • Target date (if set)
  • 🗑 Delete button (new/masterPlan goals only)

Pillar filter tabs

All / Health / Career / Finance / People — each shows a count badge.

Overall progress bar

done/total goals with percentage.

Add goal inline

  • Title input + pillar chip selector
  • Enter to submit, Escape to cancel
  • Written to growthLoop.goals[] as source: 'manual'

When no goals exist, shows: - Career Path → run analysis → career goals appear here - Financial Plan → set goals → finance goals sync here - Wellness Profile → health goals → health goals sync here


Tab 3: My Plan (90-Day Master Plan)

Purpose. View and manage the AI-generated 90-day plan built from your Health + Financial + Career data.

What it shows

  • Plan header: generation date + total goal count
  • Per-pillar goal cards showing: title · why explanation · Week 1: action · live status badge
  • "Rebuild plan" button (top-right when plan exists)
  • Empty state with "Build My 90-Day Plan" CTA

Availability

Shows "Your 90-Day Plan is ready to build ✨" banner (above tab bar) when: - hasAllSources = wellnessProfile OR financialPlan is present on user doc - masterPlan does not yet exist


4. AI 90-Day Plan

Generation flow

  1. User taps "Build My Plan"
  2. POST /api/ai/generate-growth-plan (no body — server reads the full profile)
  3. 4-step animated progress indicator:
  4. Reading your Health profile…
  5. Reading your Financial plan…
  6. Reading your Career path…
  7. Crafting your 90-day plan…
  8. Plan review modal: user can remove individual goals before accepting
  9. On Accept:
  10. Goals written to growthLoop.goals[] as SimpleGoal items (appear in Goals tab immediately)
  11. Full plan (with why + week1Action) saved to growthLoop.masterPlan
  12. Previous masterPlan goal IDs purged from growthLoop.goals[] before insert (no duplicates on rebuild)

Plan review modal

  • Goals grouped by pillar
  • Each card shows: title · why · Week 1: action
  • 🗑 Remove a goal before accepting
  • "Looks good, start my plan!" → saves; "Cancel" → discards

Rebuild

"Rebuild plan" or "Refresh" → same flow; previous masterPlan goals replaced.


5. Data Model

// growthLoop sub-document on user doc
interface GrowthLoopData {
  // Primary — unified goals list
  goals: SimpleGoal[];

  // AI-generated 90-day plan
  masterPlan?: { generatedAt: string; goals: MasterPlanGoal[]; };
  aiPlan?: any;                           // legacy field — read-only backward compat

  // Legacy kanban execution state (for goals not yet in growthLoop.goals[])
  goalKanban: Record<goalId, GoalKanbanCard>;

  // Daily Stack check-ins
  dailyCheckins: Record<dateStr, Record<pillarKey, boolean>>;
  currentStreak: number;
  lastCheckDate: string;                  // YYYY-MM-DD

  // Weekly Pulse (Sunday check-in)
  weeklyPulse: Record<weekKey, { health: number; career: number; finances: number; people: number; submittedAt: string; }>;

  // Legacy — preserved but no longer written
  weeklyReflections: any[];
  habits: any[];
  monthlyReviews: any[];
}

interface SimpleGoal {
  id: string;
  title: string;
  pillar: 'health' | 'career' | 'finances' | 'people';
  status: 'not-started' | 'in-progress' | 'done';
  targetDate?: string;
  source?: 'manual' | 'masterPlan' | 'career' | 'legacy';
  createdAt: string;
}

interface GoalKanbanCard {
  status: 'not-started' | 'in-progress' | 'done';
  tasks: { id?: string; title?: string; dueDate?: string; completedAt?: string; }[];
  weeklyFocus?: { focus: string; why: string; weekKey: string; };
  weeklyReflection?: { q1: string; q2: string; q3: string; alignmentScore: number; weekKey: string; savedAt: string; };
}

Effective status resolution

  1. Goal in growthLoop.goals[] → use goal.status
  2. Legacy goal → use goalKanban[goalId].status (default: 'not-started')

Kanban auto-sync

On profile load, GrowthLoopPage syncs goalKanban: - Adds missing kanban entries for all current goal IDs - Removes entries for IDs that no longer exist in any source


6. Streaks and Gamification

Streak. Day counts when ≥3 pillars checked. Saved in growthLoop.currentStreak + lastCheckDate.

Sprint XP (Career Path sprint integration): - SPRINT_TASK_COMPLETE: +25 XP per sprint task completed - Badge 90day_sprinter: first full 90-day sprint completed - Badge career_velocity: 3+ sprints across any paths - Badge path_explorer: 2+ different career paths tried


7. API

Method Endpoint Purpose
POST /api/ai/generate-growth-plan Generate 90-day plan (no body — reads full profile server-side)
PUT /api/users/me Save all Growth Loop state (growthLoop.* field)

All data writes use createUserProfile(uid, { growthLoop: { ...existing, [field]: value } }).


8. Stats (computed in Today tab)

Stat Description
totalGoals / doneGoals / inProgressGoals Across all sources
totalTasks / doneTasks Task level (from goalKanban)
overdueTasks Tasks with dueDate < today, not completed
dueSoonTasks Tasks due within 7 days
goalsWithFocusThisWeek Goals with weeklyFocus.weekKey === currentWeek
goalsWithReflection Goals with weeklyReflection.weekKey === currentWeek
upcoming Next 3 tasks by soonest due date

9. Removed Features

Feature Removed Data status
Habit Tracker tab May 2026 growthLoop.habits[] preserved in DB, not displayed
Global Reflect tab May 2026 growthLoop.weeklyReflections[] preserved in DB, not displayed
Global Weekly Intention May 2026 growthLoop.weeklyIntention preserved if set
6-pillar system (Faith/Family/Growth) June 24 2026 Legacy goals read-only in Goals tab
Self Mastery cross-integration June 24 2026 SelfMasteryPage.tsx deleted

10. Design Principles

  1. See before you act. Today is tab 1 — state visibility before action.
  2. growthLoop.goals[] is the canonical source. All new goals go here regardless of origin.
  3. AI plan, zero manual work. One call to /api/ai/generate-growth-plan produces an aligned cross-pillar 90-day plan from real data.
  4. Four pillars, not six. Health · Career · Finances · People.
  5. Streaks reward consistency, not perfection. Only 3 of 4 pillars required for a streak day.

11. Glossary

Term Definition
Daily Stack Per-pillar check-in (Today tab) — one checkbox per pillar showing first goal in that pillar
Master Plan AI-generated 90-day plan in growthLoop.masterPlan, built from Health + Financial + Career profile data
Simple Goal A goal in growthLoop.goals[] with id, title, pillar, status, targetDate, source
Weekly Pulse Sunday modal — 4 sliders (health/career/finances/people) to rate weekly life balance 0–10
Effective Status Goal status from growthLoop.goals[].status (new) or goalKanban[id].status (legacy)
Streak Consecutive days with ≥3 pillars checked in the Daily Stack
Goal Kanban goalKanban record on growthLoop — legacy execution state (status + tasks + weeklyFocus/Reflection per goal)

12. FAQ

Q: What is the difference between Goals tab and My Plan tab? Goals shows all goals (manual + AI + legacy) as a flat filterable list you update status on. My Plan shows only the AI 90-day master plan with the original why + week1Action context.

Q: How do Career Path goals appear here? When a user commits to a career plan in CareerFitLab, careerCommitment.goals[] is written. These goals sync into growthLoop.goals[] and appear as career goals in the Goals tab.

Q: What triggers the "Build My Plan" banner? hasAllSources = wellnessProfile OR financialPlan set AND no masterPlan exists yet.

Q: What happens to old habit tracker data? growthLoop.habits[] is preserved in MongoDB — never deleted, just not displayed.

Q: Can I delete a legacy goal from the Goals tab? No. Legacy goals (source: 'legacy') have no delete button. Manage them in their source page.

Q: How does the Daily Stack choose what to show per pillar? It uses the first goal in that pillar from the merged allGoalsFull list. One card per pillar regardless of total goal count.

Q: When does the Weekly Pulse modal appear? Automatically on Sundays if no pulse has been submitted for the current ISO week. Never appears on other days.