%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "fontSize":"16px"}}}%%
flowchart TD
OldBudget([Old Budget Mindset]) --> Restrict[Restrict Everything]
Restrict --> Fail(Fails Within Weeks)
NewBudget([Conscious Spending Plan]) --> Prioritize[Prioritize What Matters]
Prioritize --> Sustain(Sustains for Years)
style OldBudget fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Restrict fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Fail fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style NewBudget fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Prioritize fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Sustain fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
3 Budgeting
Most people hate budgeting because they’re approaching it with some bad assumptions. Traditional budgets typically fail because they assume humans will robotically track every penny and restrict every joy, all with a kind of mindless automation. I’ve included frameworks from Sethi, Housel, Bogle, and Felix because they are designed for how humans actually behave.
“A budget tells your money where to go instead of wondering where it went.” (Ramit Sethi)
3.1 The Budget Mindset Shift
Budgets aren’t about restriction; they’re about conscious allocation. A good budget builds in flexibility, not rigidity. Morgan Housel’s insight is powerful here: “room for error is the most underrated financial concept.”
3.2 Fixed vs. Variable Expenses
The first skill in budgeting is correctly categorizing your money. Most people lump everything together and then get overwhelmed by how to allocate or account for the money they spend.
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "fontSize":"16px"}}}%%
flowchart LR
Expenses(["Monthly<br>Expenses"]) --> Fixed["FIXED EXPENSES:<br/>Predictable & Recurring"]
Expenses --> Variable["VARIABLE EXPENSES:<br/>Fluctuate Month to Month"]
Expenses --> Periodic["PERIODIC EXPENSES:<br/>Annual or Irregular"]
Fixed --> Rent("Rent/Mortgage")
Fixed --> Insurance("Insurance<br>Premiums")
Fixed --> Subs("Subscriptions")
Fixed --> Loans("Loan<br>Payments")
Variable --> Groceries("Groceries")
Variable --> Utilities("Utilities")
Variable --> Gas("Gas/Transport")
Variable --> Dining("Dining<br>Out")
Periodic --> Taxes("Property<br>Taxes")
Periodic --> CarMaint("Car<br>Maintenance")
Periodic --> Gifts("Gifts/Holidays")
Periodic --> Medical("Medical Costs")
style Expenses fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Fixed fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Variable fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Periodic fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Rent fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Insurance fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Subs fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Loans fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Groceries fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Utilities fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Gas fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Dining fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Taxes fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style CarMaint fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Gifts fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Medical fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
Why Categories Matter
Fixed and variable expenses should employ different strategies. Periodic expenses are trickier because they are specific to the item/person.
| Category | Strategy |
|---|---|
| Fixed Expenses | Lock these in and forget them (minimize them once, then automate). Biggest leverage point: housing. |
| Variable Expenses | This is the category where most budgeting efforts fail. Use categories with limits, not line-by-line tracking. |
| Periodic Expenses | These are silent budget killers. Set aside 1/12 of the annual cost for these each month. |
Sinking fund for periodic expenses
If your car insurance is $1,200/year, don’t get blindsided every six months. Save $100/month into a “Car Insurance” sub-account. When the bill arrives, the money is already there. Repeat for every periodic expense:
- Christmas/gifts: $600/year → $50/month
- Car maintenance: $1,200/year → $100/month
- Annual vacation: $2,400/year → $200/month
This single technique eliminates 80% of “budget emergencies.”
3.3 Zero-Based vs. Percentage Budgets
Two dominant frameworks exist. Both work; pick the one that matches your personality. Zero-based budgets offer tight control and are detail-oriented, making them ideal for anyone rebuilding from debt or with irregular income. Percentage budgets are for big-picture thinkers, stable income earners, and people who hate detailed tracking.
Zero-Based Budgeting
Every dollar gets a job. Income minus all allocations equals zero.
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "fontSize":"16px"}}}%%
flowchart LR
Income(["$5,000<br>Income"]) --> Rent2["$1,500<br>Rent"]
Income --> Food[$500<br>Groceries]
Income --> Transport[$300<br>Transport]
Income --> Invest[$1,000<br>Investments]
Income --> Save[$500<br>Savings]
Income --> Fun[$700<br>Fun Money]
Income --> Misc[$500<br>Other]
Misc --> Zero("Total = $5,000<br>Remaining = $0")
style Income fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Rent2 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Food fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Transport fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Invest fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Save fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Fun fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Misc fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Zero fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
These types of budgets provide maximum awareness, make every dollar spent/saved/invested intentional, and immediately expose leaks. However, these are high-maintenance, can feel a little restrictive, and require monthly re-budgeting.
Percentage-Based Budgeting
Allocate by percentages, not dollars. This is the foundation of Sethi’s Conscious Spending Plan1 and another popular framework (50/30/20).
| Bucket | Conscious Spending Plan (Sethi) | 50/30/20 Rule |
|---|---|---|
| Fixed Costs | 50–60% | 50% Needs |
| Investments | 10%+ | 20% Savings/Debt |
| Savings Goals | 5–10% | (combined above) |
| Guilt-Free Spending | 20–35% | 30% Wants |
Percentages are great because they’re the proportion of your earnings assigned to each category, which means they scale to any income and, after you’ve categorized your expenses, they are low maintenance. However, they are also less granular, can mask overspending in certain categories, and require you to be brutally honest about the category boundaries.
Which Should You Choose?
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "fontSize":"16px"}}}%%
flowchart TD
Choose[Which Budget Style?] --> Question1{In Debt or<br/>Just Starting?}
Question1 -->|Yes| ZeroBased[Zero-Based<br/>for 6-12 months]
Question1 -->|No| Question2{Love Spreadsheets<br/>& Details?}
Question2 -->|Yes| Hybrid[Hybrid Approach]
Question2 -->|No| Percentage[Percentage-Based<br/>Conscious Spending]
ZeroBased --> Eventually[Graduate to Percentage<br/>Once Stable]
style Choose fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Question1 fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Question2 fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style ZeroBased fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Hybrid fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Percentage fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Eventually fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
3.4 Build a Budgeting Tool
Applications like Microsoft Excel or Google Sheets offer tools and templates to customize each sheet/tab to fit your needs (search for “budget template”). Most personal finance blogs also offer a free downloadable classic envelope spreadsheet. For hands-on work with a real bank export, see Tracking Spending.
Using Spreadsheets
The bank_statement dataset introduced in Tracking Spending is the foundation for the examples that follow. A well-structured spreadsheet maps those transactions into tabs that mirror your budget categories:
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "fontSize":"16px"}}}%%
flowchart LR
Spreadsheet(["Budget<br>Spreadsheet"]) --> Tab1[Tab 1: Income]
Spreadsheet --> Tab2[Tab 2: Fixed Expenses]
Spreadsheet --> Tab3[Tab 3: Variable Expenses]
Spreadsheet --> Tab4[Tab 4: Sinking Funds]
Spreadsheet --> Tab5[Tab 5: Net Worth Tracker]
Spreadsheet --> Tab6[Tab 6: Summary Dashboard]
Tab6 --> Metrics("Key Metrics:<br/>Savings Rate<br/>Fixed Cost %<br/>Monthly Cash Flow")
style Spreadsheet fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Tab1 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Tab2 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Tab3 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Tab4 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Tab5 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Tab6 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Metrics fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
What Actually Matters
Don’t overthink this. The best budgeting tool is the one you’ll actually use.
Features that matter:
- Automatic transaction imports (saves hours per month)
- Easy categorization (you’ll do this weekly)
- A clear summary view (your dashboard)
- Goal tracking (motivation matters)
Features that don’t matter as much: fancy graphs, AI insights, social features. Substance over style.
3.5 Budgeting Math
Here’s the secret most personal finance content avoids: budgeting requires only middle-school math. However, you need to be fluent in a few specific calculations.
Percentages (Your Most-Used Skill)
You need to instantly answer: “What percentage of my income is X?”
Formula: (Expense ÷ Income) × 100
Example: Rent is $1,500, income is $5,000. → 1,500 ÷ 5,000 = 0.30 → 30% of income on rent.
Practice until you can do this in your head for the big categories.
Two more syntax differences become visible the moment you write a function with a body.
Code block structure
R wraps the body in curly braces {}. Indentation is purely stylistic.
Python uses a colon and an indented body. Indentation is part of the syntax (inconsistent indentation raises IndentationError).
percent_of_income <- function(expense, income) {
(expense / income) * 100
}def percent_of_income(expense, income):
return (expense / income) * 100Return values
R automatically returns the last evaluated expression. The return() function is optional.
Python requires an explicit return statement; otherwise the function returns None.
double_fun <- function(x) x * 2def double_fun(x):
return x * 2show/hide
percent_of_income <- function(expense, income) {
(expense / income) * 100
}
# rent of $1,500 against $5,000 take-home pay
percent_of_income(expense = 1500, income = 5000)
#> [1] 30show/hide
def percent_of_income(expense, income):
return (expense / income) * 100
# rent of $1,500 against $5,000 take-home pay
percent_of_income(expense=1500, income=5000)
#> 30.0Annualizing and Monthly-izing
The skill of converting between time periods. Budgets fail because people don’t see annual costs in monthly terms (or vice versa).
Annual → Monthly: Divide by 12
Monthly → Annual: Multiply by 12
Weekly → Monthly: Multiply by 4.33 (not 4)
Daily habit → Annual: Multiply by 365
Example: A $5 daily coffee → $5 × 365 = $1,825/year. Suddenly it’s a real number you can evaluate.
show/hide
to_annual <- function(amount, period = c("daily", "weekly", "monthly")) {
period <- match.arg(period)
factors <- c(daily = 365, weekly = 52, monthly = 12)
amount * factors[[period]]
}
to_monthly <- function(amount, period = c("daily", "weekly", "annual")) {
period <- match.arg(period)
factors <- c(daily = 30.44, weekly = 4.33, annual = 1 / 12)
amount * factors[[period]]
}
to_annual(amount = 5, period = "daily") # $5/day coffee → annual
#> [1] 1825
to_monthly(amount = 150, period = "weekly") # $150/week groceries → monthly
#> [1] 649.5show/hide
def to_annual(amount, period="daily"):
factors = {"daily": 365, "weekly": 52, "monthly": 12}
return amount * factors[period]
def to_monthly(amount, period="daily"):
factors = {"daily": 30.44, "weekly": 4.33, "annual": 1 / 12}
return amount * factors[period]
print(to_annual(amount=5, period="daily")) # $5/day coffee → annual
#> 1825
print(to_monthly(amount=150, period="weekly")) # $150/week groceries → monthly
#> 649.5Opportunity Cost Math
This is Felix’s signature framework. Every dollar spent isn’t just that dollar; it’s what that dollar could have become.
Formula: Cost × (1 + r)^n = Opportunity cost in future dollars
Example: A $40,000 new car vs. a $15,000 used car. The $25,000 difference, invested at 7% real return over 30 years:
$25,000 × (1.07)^30 = ~$190,000
That’s not a car payment difference; that’s a retirement chapter.
show/hide
opportunity_cost <- function(amount, rate, years) {
amount * (1 + rate)^years
}
# $25,000 gap between two car choices, invested at 7% for 30 years
opportunity_cost(amount = 25000, rate = 0.07, years = 30)
#> [1] 190306.4show/hide
def opportunity_cost(amount, rate, years):
return amount * (1 + rate) ** years
# $25,000 gap between two car choices, invested at 7% for 30 years
opportunity_cost(amount=25000, rate=0.07, years=30)
#> 190306.37606655105Break-Even and Payback Calculations
Useful for evaluating subscriptions, refinances, and big purchases.
Formula: Upfront cost ÷ monthly savings = months to break even
Example: A $500 annual membership saves you $60/month → 500 ÷ 60 = 8.3 months to break even. Worth it if you’ll use it longer than that.
show/hide
months_to_break_even <- function(upfront_cost, monthly_savings) {
upfront_cost / monthly_savings
}
# a $500 membership that saves $60/month
months_to_break_even(upfront_cost = 500, monthly_savings = 60)
#> [1] 8.333333show/hide
def months_to_break_even(upfront_cost, monthly_savings):
return upfront_cost / monthly_savings
# a $500 membership that saves $60/month
months_to_break_even(upfront_cost=500, monthly_savings=60)
#> 8.3333333333333343.6 Putting It All Together: A Budget That Actually Works
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "fontSize":"16px"}}}%%
flowchart TD
Start(["Build Your Budget"]) --> Step1("Step 1. Track<br>Spending for<br>30 Days")
Step1 --> Step2("Step 2. Categorize Fixed vs. Variable vs. Periodic")
Step2 --> Step3("Step 3. Calculate<br>Current Savings Rate")
Step3 --> Step4("Step 4. Choose Framework (Zero-Based or Percentage)")
Step4 --> Step5("Step 5. Set Up<br>Sinking Funds for<br>Periodic Expenses")
Step5 --> Step6("Step 6. Automate Everything<br>Investments First")
Step6 --> Step7("Step 7. Review<br>Weekly, Adjust Monthly")
Step7 --> Step8(["Step 8. Recalibrate<br>Quarterly"])
style Start fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Step1 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Step2 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Step3 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Step4 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Step5 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Step6 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Step7 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Step8 fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
3.7 Key takeaways
A budget is just a plan for your money in advance. Good budgets:
- Match your personality. Don’t fight your nature; work with it.
- Automate the boring stuff. Investments, bills, sinking funds: set and forget.
- Leave room for joy. Sethi’s guilt-free spending isn’t optional; it’s what makes budgets sustainable.
- Track one number above all: the important number is your savings rate (which we will cover in Savings). Everything else is detail.
- Builds in margin for error. Housel’s principle, “reality is messier than spreadsheets.”
Budgeting math isn’t hard. The categories aren’t complicated. The tools are abundant. What’s actually required is the decision to be intentional, and the patience to let small, consistent allocations compound into a life of financial freedom.
As Bogle reminded us about investing, the same applies to budgeting: don’t do something, just stand there. Set up the system, then let it work.
This plan is covered on his website and in this Reddit post↩︎