Personality Types
Every Ozzie user is classified into one of four money personality types. The type is determined by a quiz and stored by your application. It shapes the user's envelope weight distribution, plan action items, money move framing, and AI coaching tone.
The four types
| Type | Core trait | Financial instinct |
|---|---|---|
| HOTSHOT | Risk-taker, growth-oriented | Prioritizes return on investment; comfortable with aggressive allocation toward lifestyle and future |
| STOCKPILER | Security-first | Prioritizes savings above all; high goal allocation, disciplined daily spending |
| GIVER | People-centered | Prioritizes spending on others; high people envelope allocation |
| INDEPENDENT | Self-directed | Resists prescription; prefers an equal split across envelopes |
How personality affects the plan
When a plan is generated, the envelope allocations are weighted by personality type. The future and bills buckets are calculated by the plan algorithm from intake data; the four flexible envelopes are personality-weighted.
See the Envelope System guide for the full weight table per personality.
For STOCKPILER specifically, the goal allocation receives an additional +5% boost from the future envelope weight before other envelopes are distributed.
plan_speed — adjusting goal allocation
When generating a plan, callers can optionally pass plan_speed alongside personality_type. This lets users choose how aggressively they want to reach their goal:
| plan_speed | Effect on goal_pct |
|---|---|
conservative | −5 percentage points — more disposable income, slower goal |
moderate | No change — default behavior |
aggressive | +5 percentage points — less disposable income, faster goal |
How personality_type and plan_speed combine
The personality-type adjustment runs first, then plan_speed is applied on top. The effects are additive:
| personality_type | Base goal boost | plan_speed | Combined effect |
|---|---|---|---|
| STOCKPILER | +5% | aggressive | +10% total |
| STOCKPILER | +5% | conservative | +0% net (5 − 5) |
| GIVER | −5% (lower goal weight) | aggressive | 0% net |
| HOTSHOT | 0% | aggressive | +5% |
| INDEPENDENT | 0% | moderate | 0% (baseline) |
Example: STOCKPILER + aggressive
curl -X POST https://api.ozzieapp.com/v1/users/ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE/plan/generate \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "personality_type": "STOCKPILER", "plan_speed": "aggressive" }'
This produces a plan where the goal envelope receives the personality-type STOCKPILER base (+5%) plus the aggressive speed boost (+5%), resulting in +10% more allocated to the future envelope compared to an INDEPENDENT + moderate baseline.
Storing and passing plan_speed
Store plan_speed in your database alongside plan_tier after each plan generation. Pass it back in user_context.plan_speed when calling the chat endpoint so Ozzie can reference the user's chosen pace in conversation.
The quiz flow
Personality is scored during onboarding — between financial intake submission and plan generation. Your application calls the scoring endpoint, receives the result, and stores it.
1. GET /v1/personality/questions → quiz catalog
2. User answers the questions in your UI
3. POST /v1/personality/score → returns personality_type
4. Your app stores personality_type
5. POST /v1/users/:id/plan/generate → body: { personality_type }
Step 1 — Get quiz questions
- curl
- Node.js
curl https://api.ozzieapp.com/v1/personality/questions \
-H "Authorization: Bearer YOUR_TOKEN"
const res = await fetch(
'https://api.ozzieapp.com/v1/personality/questions',
{ headers: { 'Authorization': `Bearer ${token}` } }
);
const { data } = await res.json();
const questions = data.questions;
Response:
{
"object": "list",
"data": {
"questions": [
{
"id": "q_001",
"text": "When you get extra money, what do you do first?",
"options": [
{ "id": "q_001_a", "text": "Invest it right away" },
{ "id": "q_001_b", "text": "Move it to savings" },
{ "id": "q_001_c", "text": "Treat someone I love" },
{ "id": "q_001_d", "text": "Decide for myself based on my current priorities" }
]
},
{
"id": "q_002",
"text": "What makes you feel most secure about money?",
"options": [
{ "id": "q_002_a", "text": "Having it working hard for me in the market" },
{ "id": "q_002_b", "text": "A large emergency fund I can always count on" },
{ "id": "q_002_c", "text": "Knowing my family and friends are taken care of" },
{ "id": "q_002_d", "text": "Making my own decisions without a fixed plan" }
]
}
],
"total": 10
}
}
Step 2 — Score answers
After collecting answers from the user, submit them:
- curl
- Node.js
curl -X POST https://api.ozzieapp.com/v1/personality/score \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"answers": [
{ "question_id": "q_001", "option_id": "q_001_b" },
{ "question_id": "q_002", "option_id": "q_002_b" }
]
}'
const res = await fetch(
'https://api.ozzieapp.com/v1/personality/score',
{
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
answers: [
{ question_id: 'q_001', option_id: 'q_001_b' },
{ question_id: 'q_002', option_id: 'q_002_b' },
],
}),
}
);
const { data } = await res.json();
const personalityType = data.personality_type;
console.log(personalityType); // "STOCKPILER"
// Store personalityType in your database
Response:
{
"object": "personality_score",
"data": {
"personality_type": "STOCKPILER",
"score_breakdown": {
"HOTSHOT": 1,
"STOCKPILER": 7,
"GIVER": 1,
"INDEPENDENT": 1
}
}
}
Store the personality_type in your database. It is not stored in ozzie-openapi — you must pass it on every subsequent call that uses it.
How personality affects AI coaching tone
Pass personality_type in POST /v1/users/:id/chat/completion and the AI adjusts its framing accordingly:
| Type | Chat / plan tone |
|---|---|
| HOTSHOT | Growth-focused language; frames savings in terms of future returns; celebrates bold moves |
| STOCKPILER | Security framing; emphasizes fund milestones, savings rates, and emergency buffers |
| GIVER | People-first language; acknowledges generosity as a value; helps balance giving with saving |
| INDEPENDENT | Non-prescriptive; presents options rather than directives; respects autonomy |
For decision questions ("should I…"), the AI also adjusts its clarifying question style:
| Type | Clarifying question style |
|---|---|
| HOTSHOT | Probes expected upside and worst-case scenario |
| STOCKPILER | Asks about impact on emergency fund and savings rate |
| GIVER | Explores who else the decision affects |
| INDEPENDENT | Asks what alternatives the user already considered |
Errors
| Code | HTTP | When |
|---|---|---|
NOT_FOUND | 404 | User does not exist |
VALIDATION_ERROR | 400 | Answers array is missing or malformed |