Mortgage Payoff Tracking: Principal vs Interest Over Time

I just bought my first home last year and I’m trying to set up Beancount to track my mortgage properly. The thing is, I never really understood until now how different the principal vs interest breakdown is at the beginning of a loan compared to the end.

My mortgage is ,000 at 6.75% for 30 years. Looking at my statements, my monthly payment is about ,270 but only around goes to principal in the first year! The rest is interest. It feels like I’m barely making progress.

I want to build a Beancount setup that:

  1. Shows me how much I’ve actually paid down the principal vs how much went to interest
  2. Lets me track extra principal payments and see how they affect my payoff timeline
  3. Visualizes my equity growth over time

Here’s my basic setup so far:

2025-01-15 open Liabilities:Mortgage:Principal
2025-01-15 open Expenses:Home:Interest
2025-01-15 open Assets:RealEstate:Home

2025-01-15 * "Home Purchase"
  Assets:RealEstate:Home           450,000.00 USD
  Assets:Bank:Checking            -100,000.00 USD  ; down payment
  Liabilities:Mortgage:Principal  -350,000.00 USD

And for monthly payments:

2025-02-01 * "Mortgage Payment - February"
  Liabilities:Mortgage:Principal     305.23 USD
  Expenses:Home:Interest           1,968.75 USD
  Assets:Bank:Checking            -2,273.98 USD

A few questions:

  • Is there a way to automate or generate these monthly entries rather than copying my statement every month?
  • How do you track extra principal payments separately so you can see their impact?
  • Has anyone built queries to show cumulative interest paid vs principal over the life of the loan?

I know spreadsheets have amortization calculators built in, but I want everything in one place in my ledger. Would love to see how others are tracking their mortgage journey!

Welcome to homeownership, Sarah! Your setup looks really solid for a first attempt. I’ve been tracking my mortgage in Beancount for about 4 years now, so let me share what’s worked for me.

First, the emotional part: you’re right that seeing only $300 go to principal feels painful, but this is completely normal. The way amortization works, about 87% of your early payments go to interest. The good news? This ratio flips dramatically over time. By year 15, you’ll be paying roughly equal amounts to principal and interest, and in the final years, almost everything goes to principal.

For your questions:

1. Automating monthly entries

I built a simple Python script that generates my monthly entries based on an amortization schedule. The math is straightforward once you have it working:

# Monthly interest = Remaining Balance * (Annual Rate / 12)
# Principal = Payment - Interest

But honestly? For the first year, I’d recommend manually entering from your statements. The actual numbers sometimes differ slightly from the calculated schedule (escrow adjustments, rounding, etc.), and you want your ledger to match reality. After a year, you’ll have a feel for whether automation makes sense for you.

2. Extra principal payments

I use a separate sub-account to track extra payments:

2025-01-15 open Liabilities:Mortgage:Principal
2025-01-15 open Liabilities:Mortgage:ExtraPrincipal

2025-03-15 * "Extra Principal Payment"
  Liabilities:Mortgage:ExtraPrincipal    500.00 USD
  Assets:Bank:Checking                  -500.00 USD

Then you can query both to see your total paydown, but also isolate just the extra payments to see your “above and beyond” progress.

3. Cumulative interest query

Here’s the query I run monthly in Fava:

SELECT year, month, sum(position) as total
WHERE account ~ 'Expenses:Home:Interest'
GROUP BY year, month
ORDER BY year, month

And for a running total visualization, Fava’s built-in charts on the Interest expense account show cumulative spending beautifully.

One tip: track your home’s market value annually or quarterly with a balance assertion. It makes net worth calculations way more meaningful:

2026-01-01 balance Assets:RealEstate:Home   465,000.00 USD

Keep at it! Watching that mortgage liability shrink over time is incredibly satisfying, even if the first few years feel slow.

Great topic! As someone obsessed with optimizing my path to FI, I think about this stuff constantly.

Mike’s advice is excellent. I’ll add the FIRE perspective on mortgage tracking:

The “saved interest” calculation

When you make an extra principal payment, you’re not just paying down debt - you’re avoiding all the interest that would have accrued on that amount for the remaining life of the loan. I track this as a separate “phantom” income:

2025-03-15 * "Extra Principal - Interest Savings Memo"
  Liabilities:Mortgage:Principal     500.00 USD
  Assets:Bank:Checking              -500.00 USD
  ; saved-interest: 847.23 USD over remaining term

I use metadata to note the calculated interest savings. At 6.75%, that $500 extra payment on a 30-year loan saves you roughly $847 in interest over the remaining term. Tracking this helped me visualize why extra payments early in the loan are so powerful.

Equity vs Net Worth

One thing I struggled with early on: should mortgage paydown count toward savings rate? The FIRE community debates this constantly. I settled on tracking two metrics:

  1. Cash savings rate - excludes mortgage principal
  2. Total savings rate - includes principal (both scheduled and extra)

Query for monthly equity increase:

SELECT month, sum(position) as equity_gained
WHERE account ~ 'Liabilities:Mortgage'
GROUP BY month
ORDER BY month DESC
LIMIT 12

The refinance decision framework

With rates having moved around so much, I built a simple model to evaluate refinancing:

; Current mortgage status
2026-02-01 custom "mortgage-analysis"
  remaining-balance: 345000 USD
  current-rate: 6.75%
  remaining-months: 348
  monthly-payment: 2273.98 USD
  total-remaining-interest: 446344 USD

This helps me quickly calculate break-even points when rates drop. If you can refinance to 5.9% (where rates seem to be heading), you’d save about $180/month - with closing costs around $6,800, that’s a 38-month break-even.

The psychological win

I also maintain a “milestone” file that celebrates payoff progress:

  • 5% equity: $22,500 principal paid
  • 10% equity: $45,000 principal paid
  • etc.

Running queries against milestones keeps me motivated when the monthly numbers feel small. Your first 5% takes forever. The last 5% flies by.

Chiming in from the bookkeeping perspective - I handle mortgages for several small business clients with commercial properties, and the same principles apply.

Escrow tracking is often missed

Most residential mortgages include escrow for property taxes and insurance. Your statement shows one total payment, but it’s actually three or four components:

2025-02-01 * "Mortgage Payment - February" ^mortgage-2025-02
  Liabilities:Mortgage:Principal       305.23 USD
  Expenses:Home:Interest             1,968.75 USD
  Assets:Escrow:PropertyTax            283.33 USD
  Assets:Escrow:HomeInsurance          116.67 USD
  Assets:Bank:Checking              -2,673.98 USD

Then when taxes and insurance are actually paid from escrow:

2025-12-15 * "Property Tax Payment from Escrow"
  Expenses:Home:PropertyTax          3,400.00 USD
  Assets:Escrow:PropertyTax         -3,400.00 USD

This matters because Fava will show your true housing costs including taxes and insurance, not just P&I.

Document linking

I use the link syntax to connect each payment to the original loan document:

2025-01-15 * "Mortgage Origination" ^mortgage-closing
  document: "2025/mortgage/closing-disclosure.pdf"
  ; loan-number: 12345678
  ; lender: "First National Bank"
  ; origination-date: 2025-01-15
  ; maturity-date: 2055-01-15
  ; original-balance: 350000 USD
  ; rate: 6.75%

This becomes invaluable when you need to verify details years later, especially for refinancing decisions.

Reconciliation tip

Your monthly statement balance should match your Beancount liability balance. I add a balance assertion after each payment:

2025-02-01 balance Liabilities:Mortgage:Principal  -349694.77 USD

If it doesn’t match, you’ll catch errors immediately rather than discovering them at tax time.

Adding the tax angle since that’s my world!

Mortgage interest deduction tracking

If you itemize (and with a $350K mortgage at 6.75%, you probably will), your interest payments are deductible. The key is making sure your Beancount data matches your Form 1098 from the lender.

I run this query every January:

SELECT sum(position) as total_interest
WHERE account = 'Expenses:Home:Interest'
  AND year = 2025

This should match Box 1 on your 1098. If it doesn’t, investigate before filing.

Points paid at closing

If you paid points to buy down your rate, those are also deductible but tracked differently:

2025-01-15 * "Closing - Points Paid"
  Expenses:Home:MortgagePoints      3,500.00 USD  ; 1 point on 350K
  Assets:Bank:Checking             -3,500.00 USD

Points on a home purchase are usually fully deductible in the year paid (different rules for refinancing where you amortize over the loan term).

Property tax considerations

Bob mentioned escrow tracking - this is crucial for taxes. The SALT cap is now $40,000 in 2026 (up from the old $10K limit), so more people can fully deduct their property taxes. Make sure you’re tracking:

  1. What goes into escrow monthly
  2. What actually gets paid to the county
  3. When it gets paid (cash basis for most taxpayers)

The deductible amount is what’s actually paid, not what’s escrowed.

Keep records for future sale

Your cost basis includes more than just the purchase price. Track these in metadata:

2025-01-15 * "Home Purchase" ^home-basis
  ; purchase-price: 450000 USD
  ; closing-costs-added-to-basis: 8500 USD
  ; total-basis: 458500 USD

When you eventually sell, capital improvements also add to basis. This matters for the $250K/$500K home sale exclusion calculation years from now.