Pular para o conteúdo principal

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

TypeCore traitFinancial instinct
HOTSHOTRisk-taker, growth-orientedPrioritizes return on investment; comfortable with aggressive allocation toward lifestyle and future
STOCKPILERSecurity-firstPrioritizes savings above all; high goal allocation, disciplined daily spending
GIVERPeople-centeredPrioritizes spending on others; high people envelope allocation
INDEPENDENTSelf-directedResists 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_speedEffect on goal_pct
conservative−5 percentage points — more disposable income, slower goal
moderateNo 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_typeBase goal boostplan_speedCombined effect
STOCKPILER+5%aggressive+10% total
STOCKPILER+5%conservative+0% net (5 − 5)
GIVER−5% (lower goal weight)aggressive0% net
HOTSHOT0%aggressive+5%
INDEPENDENT0%moderate0% (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 https://api.ozzieapp.com/v1/personality/questions \
-H "Authorization: Bearer YOUR_TOKEN"

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 -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" }
]
}'

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:

TypeChat / plan tone
HOTSHOTGrowth-focused language; frames savings in terms of future returns; celebrates bold moves
STOCKPILERSecurity framing; emphasizes fund milestones, savings rates, and emergency buffers
GIVERPeople-first language; acknowledges generosity as a value; helps balance giving with saving
INDEPENDENTNon-prescriptive; presents options rather than directives; respects autonomy

For decision questions ("should I…"), the AI also adjusts its clarifying question style:

TypeClarifying question style
HOTSHOTProbes expected upside and worst-case scenario
STOCKPILERAsks about impact on emergency fund and savings rate
GIVERExplores who else the decision affects
INDEPENDENTAsks what alternatives the user already considered

Errors

CodeHTTPWhen
NOT_FOUND404User does not exist
VALIDATION_ERROR400Answers array is missing or malformed