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.

%%{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

Budget Mindset

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

Fixed vs. Variable Expenses

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

Zero-Based Budgeting

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

Which Budget To Choose?

TipMy recommendation

Start with zero-based for 2-3 months to truly understand your spending. Then transition to a percentage-based system with automation. You get the awareness without the long-term burden.

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

Spreadsheet

What Actually Matters

Don’t overthink this. The best budgeting tool is the one you’ll actually use.

Features that matter:

  1. Automatic transaction imports (saves hours per month)
  2. Easy categorization (you’ll do this weekly)
  3. A clear summary view (your dashboard)
  4. 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) * 100

Return 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 * 2
def double_fun(x):
    return x * 2
show/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] 30
show/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.0

Annualizing 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.5
show/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.5

Opportunity 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.4
show/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.37606655105

Break-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.333333
show/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.333333333333334

3.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

Put It All Together

3.7 Key takeaways

A budget is just a plan for your money in advance. Good budgets:

  1. Match your personality. Don’t fight your nature; work with it.
  2. Automate the boring stuff. Investments, bills, sinking funds: set and forget.
  3. Leave room for joy. Sethi’s guilt-free spending isn’t optional; it’s what makes budgets sustainable.
  4. Track one number above all: the important number is your savings rate (which we will cover in Savings). Everything else is detail.
  5. 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.


  1. This plan is covered on his website and in this Reddit post↩︎