%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "darkMode":false, "fontSize":"16px"}}}%%
flowchart TD
AllDebt("Your Debts") --> Toxic("TOXIC DEBT<br>15% to 29% APR")
AllDebt --> Moderate("MODERATE DEBT<br>5% to 10% APR")
AllDebt --> Strategic("STRATEGIC DEBT<br>3% to 7% APR")
Toxic --> CreditCards("Credit Cards<br>Payday Loans")
Moderate --> CarLoans("Car Loans<br>Private Student Loans")
Strategic --> Mortgages("Mortgages<br>Federal Student Loans")
CreditCards --> Attack1("Attack Aggressively<br>Pay Off First")
CarLoans --> Attack2("Pay Down Steadily<br>Avoid New Ones")
Mortgages --> Attack3("Pay on Schedule<br>Invest the Difference")
style AllDebt fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Toxic fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Moderate fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Strategic fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style CreditCards fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style CarLoans fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Mortgages fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Attack1 fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Attack2 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Attack3 fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
4 Managing Debt
Debt isn’t inherently good or bad; it’s a tool. Used wisely, it can help you build wealth faster (think of a low-rate loan for a degree that raises your pay, or a mortgage later in life). Used poorly, it can quietly destroy decades of financial progress. Let’s break down each type with evidence-based advice from Housel, Sethi, Bogle, and Ben Felix.
4.1 The Debt Hierarchy (know your enemy)
Every debt has a price, called the APR (annual percentage rate): the yearly cost of borrowing, shown as a percentage of what you owe. A 20% APR on $1,000 costs about $200 a year in interest. Not all debt is created equal, so attack it in order of damage potential.
4.2 Credit Cards (destroyers of wealth)
Credit card debt is the single most destructive financial product most people will ever encounter. At 20% APR or more, it grows faster than any reasonable investment can.
The rule here is uncompromising: credit card debt gets paid off before nearly every other financial goal. The exceptions are covering your insurance deductibles and capturing an employer match (see Section 4.5). The math is brutal: you cannot out-invest 24% interest.
The Playbook
| Step | Action |
|---|---|
| 1. Stop the bleeding | Stop using cards. Pay cash or debit until balances are zero. |
| 2. Call and negotiate | Call each issuer. Ask for a lower APR. It works more often than you’d think. |
| 3. Choose a method | Avalanche (highest APR first; saves the most money) or Snowball (smallest balance first; builds momentum). |
| 4. Consider consolidation | Consolidation means moving several debts into one cheaper one. A 0% balance transfer card (a new card that charges no interest on debt you move to it, usually for 12 to 21 months) or a personal loan at 8% to 10% beats 24% every time. |
| 5. Automate minimums | Never miss a payment; it can raise your APR (a penalty APR) and lower your credit score. |
Use Credit Cards as a Tool, Not a Trap
Once you’re paying off your balance in full every month, credit cards become powerful: cash back, travel rewards, fraud protection, and a stronger credit score. The key is using them as a way to pay, not a way to borrow.
4.3 Student Loans
Student loans sit in a complicated middle ground. Ben Felix’s human capital framework applies powerfully here: education is an investment in your future earning potential, but only when the math works.
Before Taking Loans
Felix would frame it this way: the return on a student loan depends on how much more you’ll earn because of the degree. A $40,000 loan for a degree that adds $1 million or more to your lifetime earnings is a great trade. The same $40,000 for a degree with no clear earnings path is not.
Choosing a Major
Felix’s human capital lens turns the major decision into a measurable one: which degree returns the most on the investment relative to its cost?
The 1× Rule: total student debt at graduation should not exceed your expected first-year salary. Above that threshold, loan payments begin to crowd out saving and investing before your financial life has really started.
The 1× ceiling itself isn’t very illuminating (it’s just the salary number again). What matters is the monthly bill that ceiling produces. Under a standard 10-year federal repayment plan at about 6.5%, every dollar borrowed costs roughly $0.0114/month. Applied to each major:
| Major Category | Typical Starting Salary | Monthly Payment at 1× Ceiling |
|---|---|---|
| Engineering / Computer Science | $70,000–$95,000 | $795–$1,080 |
| Nursing / Health Sciences | $60,000–$80,000 | $680–$910 |
| Business / Finance | $50,000–$70,000 | $570–$795 |
| Social Sciences / Communications | $38,000–$52,000 | $430–$590 |
| Education | $38,000–$46,000 | $430–$520 |
| Fine Arts / Humanities | $35,000–$48,000 | $395–$545 |
Salaries: BLS Occupational Outlook Handbook median entry-level estimates. Payments: 10-year standard repayment at 6.5%, close to the federal undergraduate loan rate for 2026–27 (6.52%).
At the 1× ceiling, every borrower pays roughly the same share of gross income (about 14%) to student loans. What changes dramatically is what’s left over.
A Fine Arts grad with a $545 payment has roughly $2,500 to $2,600 after taxes to cover rent, food, transportation, and everything else.
An engineer with a $1,080 payment still has $4,500 to $4,700 for the same categories. Same share of income going to the loan, very different amount left to live on.
This is why the 1× rule is a ceiling, not a target, and why lower-earning majors often need a lower personal cap.
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "darkMode":false, "fontSize":"16px"}}}%%
flowchart TD
MajorChoice(["Choose a Major"]) --> ResearchSal("Research Expected<br>Starting Salary")
ResearchSal --> EstDebt("Estimate Total<br>Loan Debt")
EstDebt --> RatioCheck{"Debt ÷ Salary"}
RatioCheck -->|"Below 1.0"| Viable("Financially<br>Viable Path")
RatioCheck -->|"1.0 to 1.5"| IDRPath("Manageable<br>with IDR Plan")
RatioCheck -->|"Above 1.5"| HighRisk("High Risk:<br>Reconsider")
HighRisk --> Alternatives["Alternatives:<br>Community College<br>In-State Tuition<br>Scholarships<br>Change Major"]
IDRPath --> IDRSection(["See: IDR Plans below"])
style MajorChoice fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style ResearchSal fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style EstDebt fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style RatioCheck fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Viable fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style IDRPath fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style HighRisk fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Alternatives fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style IDRSection fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
Why 1× works: a loan equal to first-year salary on a standard 10-year plan at about 6.5% interest produces monthly payments of roughly 14% of gross income. This is a level most budgets absorb without crowding out investing. At 2× salary, that doubles and competes directly with building wealth.
See Math for Managing Debt below for the loan_income_ratio() and monthly_standard_payment() functions in R and Python.
After Taking Loans
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "darkMode":false, "fontSize":"16px"}}}%%
flowchart TD
StudentLoans("Student<br>Loan<br>Balance") --> Type{"Federal<br>or Private?"}
Type -->|"Federal"| FedOptions("Federal<br>Options")
Type -->|"Private"| PrivOptions("Private<br>Options")
FedOptions --> IDR("Income-Driven<br>Repayment")
FedOptions --> PSLF("Public<br>Service<br>Forgiveness")
FedOptions --> Standard("Standard<br>10-Year")
PrivOptions --> Refi("Refinance<br>for<br>Lower Rate")
PrivOptions --> PayDown("Aggressive<br>Paydown")
style StudentLoans fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Type fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style FedOptions fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style PrivOptions fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style IDR fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style PSLF fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Standard fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Refi fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style PayDown fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
Federal IDR Plans: SAVE vs. RAP
When the 1× rule is out of reach, income-driven repayment (IDR) caps monthly payments as a percentage of discretionary income rather than loan balance:
Discretionary Income = AGI − (threshold × Federal Poverty Guideline)
Here, AGI is your adjusted gross income (your yearly income after a few tax adjustments, found on your tax return). The Federal Poverty Guideline (FPG) is the yearly income level the government uses to define poverty; it changes with household size and from year to year.
The threshold and payment rate differ by plan. Using the 2026 federal poverty guideline of $15,960 for a single person in the contiguous U.S.:
| Plan | Income Threshold | Payment Rate | Forgiveness |
|---|---|---|---|
| IBR (loans from July 2014 to June 2026) | 150% FPG | 10% | 20 years |
| PAYE | 150% FPG | 10% | 20 years |
| SAVE (ended, March 2026) | 225% FPG | 5% undergrad / 10% grad | 10 to 25 years |
| RAP (since July 2026) | 100% FPG | 1% to 10% sliding | 30 years |
SAVE Plan (Saving on a Valuable Education)
Introduced by the Biden administration in 2023 as a replacement for REPAYE, SAVE was the most borrower-friendly IDR plan ever offered:
- Raised the income exemption to 225% of FPG (from 150% under older plans), lowering monthly payments substantially for most borrowers
- Applied 5% of discretionary income to undergraduate loan balances; 10% to graduate balances
- Forgave balances under $12,000 after 10 years; larger balances after 20 to 25 years
Status (2026): Ended. A federal court order ended SAVE in March 2026. Starting July 1, 2026, loan servicers began telling enrolled borrowers to pick a new plan; anyone who doesn’t choose within 90 days is moved to a standard plan.
RAP (Repayment Assistance Plan)
The replacement for SAVE, created by federal law and open to borrowers since July 1, 2026:
- Sliding payment scale from 1% of AGI at low incomes to 10% at higher incomes
- Income exemption at 100% of FPG (narrower than SAVE) means somewhat higher payments for most borrowers at low and moderate incomes
- Forgiveness timeline extended to 30 years (longer than SAVE’s 10 to 25 years)
- If your first federal loan is made on or after July 1, 2026, RAP is the only income-driven plan you can use (your other choice is a standard plan). If you borrowed before then, you can choose between RAP and IBR until July 1, 2028.
Status (2026): Law, and open since July 1, 2026. Details such as dependents and minimum payments can change, so verify current terms at studentaid.gov before enrolling.
IBR: the stable fallback
IBR predates both SAVE and RAP and has survived every administration since 2007. For borrowers with loans from July 2014 on: 10% of discretionary income, forgiveness after 20 years. It’s closed to loans made on or after July 1, 2026, so it only helps if you borrowed before then.
PSLF
If you work for a government agency or qualifying nonprofit, Public Service Loan Forgiveness cancels the remaining balance after 10 years of qualifying IDR payments (regardless of what’s left). Teachers, nurses, social workers, and public defenders are common candidates. An income-driven plan (RAP, or IBR for older loans) plus PSLF is often the most powerful tool available for high-debt borrowers in public service careers.
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "darkMode":false, "fontSize":"16px"}}}%%
flowchart TD
FedLoans(["Federal Loans"]) --> LICheck{"Loan-to-Income<br>Ratio?"}
LICheck -->|"Below 1.0"| StdPlan("Standard<br>10-Year Plan")
LICheck -->|"Above 1.0"| PubSvc{"Public Sector<br>or Non-Profit?"}
PubSvc -->|"Yes"| PSLFTrack("RAP or IBR + PSLF<br>10-Year Forgiveness")
PubSvc -->|"No"| PlanAvail{"When was your<br>first loan made?"}
PlanAvail -->|"July 2026 or later"| RAPOpt("RAP<br>1% to 10% / 30 yrs")
PlanAvail -->|"Before July 2026"| IBROpt("Compare RAP<br>and IBR (10% / 20 yrs)")
style FedLoans fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style LICheck fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style StdPlan fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style PubSvc fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style PSLFTrack fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style PlanAvail fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style RAPOpt fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style IBROpt fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
See Math for Managing Debt below for the idr_monthly_payment() function in R and Python (with examples for IBR, SAVE, and other plans).
The Pay-Off vs. Invest Decision
A key insight from Felix’s research-driven approach: compare your loan interest rate to what you expect your investments to earn after taxes.
- Interest rate above about 6%: Prioritize paying off
- Interest rate 4% to 6%: Roughly a wash; do both
- Interest rate below 4%: Pay the minimum, invest the difference
Don’t forget the psychological factor Housel emphasizes: some people sleep better debt-free, even if the math slightly favors investing. That peace of mind has real value.
Brian Preston’s Financial Order of Operations puts low-interest debt (like a mortgage) last, step 9, after retirement saving is on track and future expenses are funded. Paying it early means giving up years of investment growth 1.
Morgan Housel paid off his own mortgage anyway. He calls it the worst financial decision and the best money decision his family has made: the math said invest, but owning the house outright gave them a feeling of independence that was worth more to them than the returns 2.
What they agree on: high-interest debt comes first, always. For cheap debt the math usually favors investing, and choosing peace of mind instead is a fair trade as long as you know what it costs.
4.4 Car Payments (wealth killers in disguise)
Cars are where middle-class wealth quietly dies. Here’s why:
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "darkMode":false, "fontSize":"16px"}}}%%
flowchart TD
NewCar("New Car<br>Purchase") --> Depreciation("Loses 20% to 30%<br>in Year 1")
NewCar --> Payment("$500 to $700<br>Monthly Payment")
NewCar --> Insurance("Higher<br>Insurance")
NewCar --> Opportunity("Opportunity<br>Cost")
Opportunity --> LostWealth("$600/mo<br>invested over<br>30 years<br>= ~$700,000")
style NewCar fill:#f0cfcf,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Depreciation fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Payment fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Insurance fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Opportunity fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style LostWealth fill:#f44242,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
Felix has been blunt: cars are things you use up, not investments. A car depreciates (loses value) every year you own it. Borrowing at 7% to 9% interest to buy something that’s losing value is one of the worst financial moves available, yet almost everyone does it.
The Rules of Smart Car Ownership
- Buy used, 2 to 4 years old. Let someone else take the big loss in value from the first year.
- Pay cash when possible. If you can’t pay cash, you can’t really afford it.
- If financing, keep it under 36 months at the lowest rate available.
- The 20/4/10 rule: 20% down, financed no longer than 4 years, total transportation costs under 10% of gross income.
- Drive it until the wheels fall off. The cheapest car you’ll ever own is the reliable one you already have.
The status trap: Housel’s insight applies here. Nobody is impressed by your car; they’re imagining themselves in it. You’re paying a fortune for a status signal no one is sending back.
4.5 Debt and the FOO
Brian Preston’s Financial Order of Operations (FOO), introduced in Budgeting, splits debt into two separate steps rather than treating it as one problem:
- Step 3: High-interest debt. Credit cards, payday loans, and anything else in the toxic tier (see The Debt Hierarchy above) get paid off before you build a full emergency fund or invest beyond an employer match. The rate is simply too punishing to justify waiting.
- Step 9: Low-interest debt. Mortgages and other strategic-tier debt sit at the very end of the sequence, after retirement accounts are maxed and future expenses are funded. There’s no urgency to pay off a 4% mortgage early while your money could still be growing in retirement accounts, where it isn’t taxed every year.
Moderate-tier debt (car loans, private student loans) falls between these two steps in practice: attack it aggressively, but not ahead of the emergency reserves in step 4 (see Emergency Fund).
4.6 Putting It All Together
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "darkMode":false, "fontSize":"16px"}}}%%
flowchart TD
Start("Manage Your Debt") --> Step1["Eliminate Credit<br>Card Debt"]
Step1 --> Step2["Build Emergency Fund<br>3 to 6 Months Expenses"]
Step2 --> Step3["Address Student Loans<br>Based on Interest Rate"]
Step3 --> Step4["Drive Used,<br>Modest Cars"]
Step4 --> Freedom["Financial Freedom"]
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 Freedom fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
4.7 Math for Managing Debt
Debt is fundamentally a math problem dressed up in emotional clothing. Lenders count on you not running the numbers, because if you did, many borrowing decisions would look very different. Here are the calculations every borrower should be fluent in.
Each calculation is also written as an R and Python function, following the same pattern introduced in the Budgeting chapter, now applied to lending math.
APR vs. APY
These two terms get used interchangeably, but they’re different, and lenders often quote whichever number makes the loan look better.
APR (Annual Percentage Rate): The stated annual interest rate, not accounting for compounding.
APY (Annual Percentage Yield): The effective annual rate, including the impact of compounding.
Credit card companies quote APR, but compounding (charging interest on interest you haven’t paid yet) means you actually pay more. Both bars below represent one year’s interest on a $5,000 balance; the taller one is what you really owe.
The formula converts the stated rate into the effective rate by accounting for how many times interest compounds within the year.
Formula: APY = (1 + APR/n)^n − 1
- Where: APR = the stated yearly rate, and n = number of compounding periods per year.
Example: A credit card with a 24% APR compounded daily
APY = (1 + 0.24/365)^365 − 1 = ~27.1%
That 3.1% gap is real money. On a $5,000 balance, it’s an extra $156 a year you didn’t realize you were paying.
Check: compounding monthly gives (1 + 0.24/12)^12 − 1 ≈ 26.8%, and compounding more often always adds a little more, so daily compounding at about 27.1% fits.
Assuming the APR is in A2 (as a decimal) and the compounding periods per year are in B2:
=(1+A2/B2)^B2-1The built-in EFFECT() function returns the same number:
=EFFECT(A2, B2)The Python version of apr_to_apy() works the same way:
show/hide
def apr_to_apy(apr, periods_per_year=365):
return (1 + apr / periods_per_year) ** periods_per_year - 1
# 24% APR compounded daily
apr_to_apy(apr=0.24)
#> 0.27114889144128895In R, apr_to_apy() converts a quoted APR into the APY you actually pay.
show/hide
apr_to_apy <- function(apr, periods_per_year = 365) {
(1 + apr / periods_per_year)^periods_per_year - 1
}
# 24% APR compounded daily
apr_to_apy(apr = 0.24)
#> [1] 0.2711489Minimum Payments
This is the single most important debt calculation you can master. Credit card companies set minimum payments low because the longer you pay, the more they earn.
A $100 minimum payment on a $5,000 credit card balance sounds reasonable, until you see how little of it actually reduces the debt. The principal is the amount you borrowed; interest is what the lender charges on top.
Only the principal slice (the green bar) shrinks the debt. But as the balance falls, the interest slice shrinks too, so each payment retires a little more principal than the last. The payoff time formula accounts for that.
Formula: Months to pay off = −ln(1 − r × Balance ÷ Payment) ÷ ln(1 + r)
- Where: r = APR ÷ 12, Balance = what you owe today, and Payment = your fixed monthly payment (this only works if the payment is larger than the first month’s interest).
Example: $5,000 balance at 22% APR, paying $100/month minimum
Monthly interest in month one: $5,000 × (0.22/12) = ~$92, so only $8 of the first payment reduces the balance
Payoff time: ~137 months (about 11 years)
Total paid: ~$13,700 on a $5,000 purchase
Check: plug the numbers back in: −ln(1 − (0.22 ÷ 12) × $5,000 ÷ $100) ÷ ln(1 + 0.22 ÷ 12) ≈ 136.8, which rounds to 137 months, and 137 × $100 = $13,700 matches the total paid.
That’s not a typo. Minimum payments are designed to keep you in debt for years.
Assuming the balance is in A2, the monthly payment is in B2, and the APR is in C2 (as a decimal), the NPER() function solves for the number of months:
=NPER(C2/12, -B2, A2)The Python version of months_to_payoff() works the same way:
show/hide
import math
def months_to_payoff(balance, monthly_payment, apr):
r = apr / 12
return -math.log(1 - r * balance / monthly_payment) / math.log(1 + r)
# $5,000 balance, $100/month, 22% APR
months_to_payoff(balance=5000, monthly_payment=100, apr=0.22)
#> 136.77905405676339In R, months_to_payoff() estimates how long a balance lasts under a fixed monthly payment.
show/hide
months_to_payoff <- function(balance, monthly_payment, apr) {
r <- apr / 12
-log(1 - r * balance / monthly_payment) / log(1 + r)
}
# $5,000 balance, $100/month, 22% APR
months_to_payoff(balance = 5000, monthly_payment = 100, apr = 0.22)
#> [1] 136.7791Total Interest Over a Loan’s Life
For any installment loan (a loan you repay in equal monthly payments, like a car loan, student loan, or mortgage), this is the number that should drive your decisions.
Picture a $20,000 loan for a used car. The amount borrowed is the same either way, but the loan term (how many years you take to repay it) determines how much extra you pay in interest. The chart below stacks the principal and interest layers so the true cost of each term is visible.
Subtract the principal from the total payments and the interest layer is what’s left. That’s the formula.
Formula: Total Interest = (Monthly Payment × Number of Payments) − Loan Principal
- Where: Monthly Payment = the fixed amount you pay each month, Number of Payments = the loan term in months, and Loan Principal = the amount you borrowed.
Example: $20,000 car loan at 7% for 6 years ($340.98 a month):
Total paid: $340.98 × 72 = $24,550.56
Total interest: $24,550.56 − $20,000 = $4,550.56 in interest
Now run the same loan at 4 years instead of 6:
Monthly payment: $478.92
Total paid: $478.92 × 48 = $22,988.16
Total interest: $2,988.16
You save $1,562.40 by shortening the term: the math behind the 20/4/10 car rule.
Check: $4,550.56 ÷ 6 years ≈ $758 of interest a year, about 3.8% of the $20,000 you borrowed, which is roughly half of 7% because you pay down the balance as you go.
Assuming the monthly payment is in A2, the number of months is in B2, and the principal is in C2:
=A2*B2-C2The Python version of total_interest() works the same way:
show/hide
def total_interest(monthly_payment, n_months, principal):
return (monthly_payment * n_months) - principal
# 6-year car loan vs. 4-year, $20,000 principal at 7%
print(round(total_interest(monthly_payment=340.98, n_months=72, principal=20000), 2))
#> 4550.56
print(round(total_interest(monthly_payment=478.92, n_months=48, principal=20000), 2))
#> 2988.16In R, total_interest() subtracts the principal from everything you pay over the life of the loan.
show/hide
total_interest <- function(monthly_payment, n_months, principal) {
(monthly_payment * n_months) - principal
}
# 6-year car loan vs. 4-year, $20,000 principal at 7%
total_interest(monthly_payment = 340.98, n_months = 72, principal = 20000)
#> [1] 4550.56
total_interest(monthly_payment = 478.92, n_months = 48, principal = 20000)
#> [1] 2988.16Student Loan-to-Income & Standard Payment
The 1× rule from Choosing a Major needs two calculations: the ratio of total debt to expected first-year salary, and the standard 10-year monthly payment that ratio produces. Picture two bars side by side: what you borrowed and what your first job pays. The rule says the loan bar shouldn’t be longer than the salary bar.
The loan bar runs past the dashed salary line, so this borrower is a little over the 1× rule. Dividing the loan bar by the salary bar gives the ratio. The monthly payment then spreads the loan, plus interest, over 120 equal payments.
Formula: Loan to income ratio = Total loans ÷ Expected salary, and Monthly payment = Loan × r(1 + r)^n ÷ ((1 + r)^n − 1)
- Where: Total loans = everything you borrow for school, Expected salary = your expected starting salary, Loan = the amount you repay, r = the yearly interest rate ÷ 12, and n = the number of monthly payments (120 for 10 years).
Example: $45,000 ÷ $42,000 = about 1.07×, and the standard payment at 6.5% is about $511 a month.
Check: 1.07 × $42,000 = $44,940, close to the $45,000 loan, and $511 × 120 = $61,320 repays the $45,000 plus about $16,320 of interest.
Assuming total loans are in A2 and expected salary is in B2, the ratio goes in C2:
=A2/B2The standard 10-year payment at 6.5% (using PMT(), with the sign flipped) goes in D2:
=-PMT(0.065/12, 10*12, A2)The Python version of loan_income_ratio() works the same way:
show/hide
def loan_income_ratio(loan_total, expected_salary):
return loan_total / expected_salary
def monthly_standard_payment(principal, annual_rate=0.065, years=10):
r = annual_rate / 12
n = years * 12
return principal * (r * (1 + r)**n) / ((1 + r)**n - 1)
# $45,000 in loans, $42,000 expected starting salary
print(loan_income_ratio(loan_total=45000, expected_salary=42000))
#> 1.0714285714285714
# standard 10-year monthly payment on that $45,000
print(monthly_standard_payment(principal=45000))
#> 510.96589749011986In R, loan_income_ratio() divides your total student loans by your expected salary, which checks the 1× rule.
show/hide
loan_income_ratio <- function(loan_total, expected_salary) {
loan_total / expected_salary
}
monthly_standard_payment <- function(principal, annual_rate = 0.065, years = 10) {
r <- annual_rate / 12
n <- years * 12
principal * (r * (1 + r)^n) / ((1 + r)^n - 1)
}
# $45,000 in loans, $42,000 expected starting salary
loan_income_ratio(loan_total = 45000, expected_salary = 42000)
#> [1] 1.071429
# standard 10-year monthly payment on that $45,000
monthly_standard_payment(principal = 45000)
#> [1] 510.9659Income-Driven Repayment Monthly Payment
When the 1× rule is out of reach, federal IDR plans cap monthly payments as a percentage of discretionary income, where:
Discretionary income = AGI − (threshold × Federal Poverty Guideline)
Think of your income (AGI) as one bar. The plan protects the first part of it, a multiple of the poverty guideline, and only the rest counts as discretionary. Your payment is a small slice of that discretionary part.
Subtract the protected part from the bar, take the payment rate of what’s left, and divide by 12 for the monthly amount.
Formula: Monthly payment = (AGI − threshold × Federal Poverty Guideline) × payment rate ÷ 12
- Where: AGI = your adjusted gross income, threshold = the multiple of the guideline that is protected (1.5 for IBR), Federal Poverty Guideline = $15,960 for a single person, and payment rate = the share of the rest you pay (10% or 15% for IBR).
Example: ($50,000 − 1.5 × $15,960) × 10% ÷ 12 = about $217 a month.
Check: $217 × 12 = $2,604 a year, which is 10% of $26,060, and $26,060 + $23,940 (1.5 × $15,960) = $50,000.
The function below takes the AGI, the FPG threshold multiplier (1.5 for IBR), and the payment rate (0.10 for IBR on loans from July 2014 on, 0.15 for older loans), and returns the monthly payment. SAVE used the same formula with a 225% threshold, but it ended in 2026. RAP, its replacement, bases payments on a percentage of your total AGI instead (see Federal IDR Plans above), so this function doesn’t cover it.
Assuming AGI is in A2, the poverty guideline is in B2 (15960), the threshold multiplier is in C2 (1.5), and the payment rate is in D2 (0.10):
=ROUND(MAX(0, A2-B2*C2)*D2/12, 2)For IBR on loans from before July 2014, change D2 to 0.15.
The Python version of idr_monthly_payment() works the same way:
show/hide
def idr_monthly_payment(agi, poverty_guideline=15960,
threshold_pct=1.5, payment_rate=0.10):
discretionary = max(0, agi - poverty_guideline * threshold_pct)
return round((discretionary * payment_rate) / 12, 2)
# IBR: $50,000 AGI, 150% FPG threshold, 10% rate
print(idr_monthly_payment(agi=50000))
#> 217.17
# IBR for loans before July 2014: 15% rate
print(idr_monthly_payment(agi=50000, payment_rate=0.15))
#> 325.75In R, idr_monthly_payment() applies the income-driven repayment formula to your AGI.
show/hide
idr_monthly_payment <- function(agi,
poverty_guideline = 15960,
threshold_pct = 1.5,
payment_rate = 0.10) {
discretionary <- max(0, agi - poverty_guideline * threshold_pct)
round((discretionary * payment_rate) / 12, 2)
}
# IBR: $50,000 AGI, 150% FPG threshold, 10% rate
idr_monthly_payment(agi = 50000)
#> [1] 217.17
# IBR for loans before July 2014: 15% rate
idr_monthly_payment(agi = 50000, payment_rate = 0.15)
#> [1] 325.75Debt-to-Income Ratio (DTI)
This is what lenders calculate about you. You should calculate it about yourself.
Lenders look at how much of your gross income (your pay before taxes) is already spoken for by debt. Picture a first job paying $45,000 a year, or $3,750 a month before taxes, with a $511 student loan payment, a $450 car payment, and $100 in credit card minimums. The chart below shows that income divided into what goes to debt and what’s left.
DTI is just the debt slice as a fraction of the whole income bar, expressed as a percentage.
Formula: DTI = (Total Monthly Debt Payments ÷ Gross Monthly Income) × 100
- Where: Total Monthly Debt Payments = the minimum you owe each month on all your debts, and Gross Monthly Income = what you earn each month before taxes.
Example:
$1,061 in monthly debt payments on $3,750 gross income → 1,061 ÷ 3,750 = about 28% DTI, which is manageable but worth watching. Another loan or two would push it into the stretched range.
Check: 28% of $3,750 is $1,050, just under the $1,061 you pay, so the DTI rounds to about 28%.
Benchmarks:
Below 20%: Healthy
20% to 35%: Manageable but watch carefully
Over 35% to 43%: Stretched; lenders get cautious
Above 43%: Danger zone; most mortgage lenders won’t approve you
Assuming monthly debt payments are in A2 and gross monthly income is in B2:
=A2/B2*100The Python version of dti_ratio() works the same way:
show/hide
def dti_ratio(monthly_debt_payments, gross_monthly_income):
return (monthly_debt_payments / gross_monthly_income) * 100
# $1,061 in debt payments on $3,750 gross income
dti_ratio(monthly_debt_payments=1061, gross_monthly_income=3750)
#> 28.293333333333333In R, dti_ratio() divides your monthly debt payments by your gross monthly income.
show/hide
dti_ratio <- function(monthly_debt_payments, gross_monthly_income) {
(monthly_debt_payments / gross_monthly_income) * 100
}
# $1,061 in debt payments on $3,750 gross income
dti_ratio(monthly_debt_payments = 1061, gross_monthly_income = 3750)
#> [1] 28.29333Pay-Off vs. Invest Comparison
This is the math behind every “should I pay extra on my student loans or invest?” debate.
The math slightly favors investing when the loan rate is below expected returns, but the chart adds what the math alone misses: one bar is certain, the other is a probability.
When the investment bar exceeds the debt bar, the math says invest; when the debt bar is higher, pay off. But the certainty of paying off debt is worth something the formula can’t capture.
Formula: Yearly edge of investing = Expected after-tax investment return − After-tax loan interest rate
- Where: Expected after-tax investment return = what you expect your investments to earn each year after taxes, and After-tax loan interest rate = what the loan costs each year after any tax break.
A positive answer means the math favors investing; a negative answer means paying off the debt wins.
Example: 5% student loan vs. expected 7% stock market return → 7% − 5% = 2%
The math favors investing by ~2% per year
But: the return from paying off the loan is guaranteed, the investment return is not
Check: on $10,000, investing at 7% earns about $700 a year and paying off the 5% loan saves $500, a gap of $200, which is 2% of $10,000.
This is where Housel’s wisdom matters: a guaranteed 5% beats a probable 7% for many people psychologically. Run the math, then add your peace-of-mind premium.
Assuming the loan rate is in A2 and the expected return is in B2:
=IF(A2>B2, "Pay off the debt", IF(A2<B2, "Invest the difference", "Roughly a wash; do both"))The Python version of payoff_vs_invest() works the same way:
show/hide
def payoff_vs_invest(loan_rate, expected_return):
if loan_rate > expected_return:
return "Pay off the debt"
elif loan_rate < expected_return:
return "Invest the difference"
else:
return "Roughly a wash; do both"
# 5% student loan vs. expected 7% return
payoff_vs_invest(loan_rate=0.05, expected_return=0.07)
#> 'Invest the difference'In R, payoff_vs_invest() compares your loan rate to your expected return and tells you which one wins.
show/hide
payoff_vs_invest <- function(loan_rate, expected_return) {
if (loan_rate > expected_return) {
"Pay off the debt"
} else if (loan_rate < expected_return) {
"Invest the difference"
} else {
"Roughly a wash; do both"
}
}
# 5% student loan vs. expected 7% return
payoff_vs_invest(loan_rate = 0.05, expected_return = 0.07)
#> [1] "Invest the difference"Avalanche vs. Snowball Math
For multiple debts, the choice between methods has a calculable cost.
Both methods attack the same three debts, but in different order. The chart below lays the debts out in each order so the trade-off is visible: avalanche minimizes total interest, snowball builds momentum fastest.
Which order saves the most comes down to one number for each debt: how much interest each extra dollar stops. A dollar sent to the debt with the highest APR stops the most interest, which is why avalanche wins on paper.
Formula: Monthly interest saved by an extra payment = Extra payment × APR ÷ 12
- Where: Extra payment = the dollars you send above the minimum, and APR = the yearly rate on the debt you send them to.
Example: An extra $100 on Card B (24%) saves $100 × 0.24 ÷ 12 = $2.00 of interest next month; the same $100 on Card A (18%) saves $1.50. The code below returns the debts sorted in each order so you can see the plan and decide.
Avalanche method: Highest APR first. Mathematically optimal.
Snowball method: Smallest balance first. Psychologically motivating.
- The hidden cost of snowball: To calculate, find total interest paid under each method using a debt payoff calculator. The difference is what you’re “paying” for the psychological win of quick early payoffs.
Check: over 12 months, $2.00 × 12 = $24 on Card B and $1.50 × 12 = $18 on Card A, which is 24% and 18% of $100, each card’s APR.
For most people with moderate debt, the snowball costs $200 to $1,000 extra in interest. If that’s the price of actually finishing the journey, it’s often worth it. If you’re disciplined enough for avalanche, take the savings.
These two functions take a list of your debts and return them in the order each method says to attack them.
Put the debts in a small table with headers in row 1 (name, balance, apr) and the data in A2:C4. For the avalanche order (highest APR first), sort by the APR column from largest to smallest, either with Data → Sort or with the SORT() function:
=SORT(A2:C4, 3, -1)For the snowball order (smallest balance first), sort by the balance column from smallest to largest:
=SORT(A2:C4, 2, 1)The Python versions sort the debts the same two ways:
show/hide
# avalanche: highest APR first
def order_avalanche(debts):
return sorted(debts, key=lambda d: d["apr"], reverse=True)
# snowball: smallest balance first
def order_snowball(debts):
return sorted(debts, key=lambda d: d["balance"])
# your debts, as a list of small records
debts = [
{"name": "Card A", "balance": 1000, "apr": 0.18},
{"name": "Card B", "balance": 5000, "apr": 0.24},
{"name": "Card C", "balance": 2000, "apr": 0.15},
]
order_avalanche(debts)
#> [{'name': 'Card B', 'balance': 5000, 'apr': 0.24}, {'name': 'Card A', 'balance': 1000, 'apr': 0.18}, {'name': 'Card C', 'balance': 2000, 'apr': 0.15}]
order_snowball(debts)
#> [{'name': 'Card A', 'balance': 1000, 'apr': 0.18}, {'name': 'Card C', 'balance': 2000, 'apr': 0.15}, {'name': 'Card B', 'balance': 5000, 'apr': 0.24}]In R, these two functions sort a list of debts in avalanche order (highest APR first) and snowball order (smallest balance first):
show/hide
# avalanche: highest APR first
order_avalanche <- function(debts) {
debts[order(-debts$apr), ]
}
# snowball: smallest balance first
order_snowball <- function(debts) {
debts[order(debts$balance), ]
}
# your debts, as a small table
debts <- data.frame(
name = c("Card A", "Card B", "Card C"),
balance = c(1000, 5000, 2000),
apr = c(0.18, 0.24, 0.15)
)
order_avalanche(debts)
#> # A tibble: 3 × 3
#> name balance apr
#> <chr> <dbl> <dbl>
#> 1 Card B 5000 0.24
#> 2 Card A 1000 0.18
#> 3 Card C 2000 0.15
order_snowball(debts)
#> # A tibble: 3 × 3
#> name balance apr
#> <chr> <dbl> <dbl>
#> 1 Card A 1000 0.18
#> 2 Card C 2000 0.15
#> 3 Card B 5000 0.24Credit Utilization Ratio
For credit score health, this calculation matters month to month.
Credit utilization is how much of your available credit you’re using. Credit scores penalize high utilization, not because the credit bureaus (the companies that calculate your score) are arbitrary, but because using most of your available credit is a sign of money trouble. Picture a first credit card with a $3,000 limit.
Utilization is just the used slice as a fraction of the total bar, converted to a percentage.
Formula: Utilization = (Current Balance ÷ Credit Limit) × 100
- Where: Current Balance = what you owe on the card now, and Credit Limit = the most the card lets you borrow.
Keep this under 30% on any individual card and across all cards in total. Under 10% is ideal for maximum score impact.
Example: $900 balance on a $3,000 limit = 30% utilization, right at the threshold.
Check: 10% of $3,000 is $300, and $900 is three times that, so the balance uses 3 × 10% = 30% of the limit.
Assuming the balance is in A2 and the credit limit is in B2:
=A2/B2*100The Python version of credit_utilization() works the same way:
show/hide
def credit_utilization(balance, credit_limit):
return (balance / credit_limit) * 100
# $900 balance on a $3,000 limit
credit_utilization(balance=900, credit_limit=3000)
#> 30.0In R, credit_utilization() divides your balance by your credit limit.
show/hide
credit_utilization <- function(balance, credit_limit) {
(balance / credit_limit) * 100
}
# $900 balance on a $3,000 limit
credit_utilization(balance = 900, credit_limit = 3000)
#> [1] 304.8 Putting the Math to Work
%%{init: {'theme': 'neutral', 'themeVariables': { 'fontFamily': 'monospace', "darkMode":false, "fontSize":"16px"}}}%%
flowchart TD
DebtMath("Debt Math Mastery") --> Decision1("Before Borrowing:<br/>Calculate Total Interest")
DebtMath --> Decision2("While Paying Off:<br/>Compare APR to Returns")
DebtMath --> Decision3("Managing Credit:<br/>Monitor DTI & Utilization")
Decision1 --> Outcome("Intentional<br/>Borrowing Decisions")
Decision2 --> Outcome
Decision3 --> Outcome
Outcome --> Freedom("Financial Freedom")
style DebtMath fill:#48a56a,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Decision1 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Decision2 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Decision3 fill:#0e9aa7,color:#F5F2E8,stroke:#1C1C1E,stroke-width:2px
style Outcome fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
style Freedom fill:#86ddcd,color:#1C1C1E,stroke:#1C1C1E,stroke-width:2px
4.9 Recap
Debt management isn’t about avoiding all debt; it’s about being intentional with it. The right framework:
- Eliminate toxic debt ruthlessly. Credit cards first, always.
- Think in human capital. Student loans are an investment; evaluate the return.
- Resist depreciating debt. Cars financed at high rates are wealth-killers.
You don’t need to be a math genius to do this well, but you do need to be numerically fluent in the calculations above, because lenders absolutely are. The math always tells the truth. Marketing tells you what’s possible. Emotions tell you what feels right. The math tells you what’s actually happening to your money.
As Housel reminds us: the goal isn’t to be debt-free for its own sake. The goal is freedom. And freedom comes from controlling your money before it controls you. As Bogle reminded investors: “The miracle of compounding returns is overwhelmed by the tyranny of compounding costs.” The same principle applies in reverse to debt: compounding interest is wealth-destroying when it’s working against you. Master the math, and you take that weapon out of the lender’s hands.
The Financial Order of Operations. Preston, Brian. 2024.↩︎
The Psychology of Money: Timeless Lessons on Wealth, Greed, and Happiness. Housel, Morgan. 2020.↩︎

















