Your FIRE Number Is 25x Annual Expenses: Beancount Queries to Track the Journey

The FIRE community talks a lot about “your number”—that magic portfolio value where you can retire early. But the math behind it is surprisingly simple: 25x your annual expenses = financial independence.

Why 25x?

The 25x rule comes directly from the famous 4% safe withdrawal rate. If you can safely withdraw 4% of your portfolio each year in retirement, then you need a portfolio that’s 25 times your annual spending (because 1 ÷ 0.04 = 25). The Trinity Study showed this withdrawal rate has historically had a 95%+ success rate for 30+ year retirements.

So if you spend $40,000/year, your FIRE number is $1,000,000.
If you spend $60,000/year, you need $1,500,000.
If you’re lean FIRE at $30,000/year, you’re looking at $750,000.

Why Beancount Is Perfect for This

The challenge isn’t the math—it’s knowing your true annual expenses. Most people dramatically underestimate what they actually spend. That’s where Beancount shines.

I’ve been tracking every transaction in Beancount for 3 years now, and here are the queries I use to track my FIRE journey:

1. Calculate Annual Burn Rate

SELECT 
  year(date) AS year,
  sum(convert(cost(position), 'USD')) AS total_expenses
FROM OPEN ON 2023-01-01 CLOSE ON 2025-12-31
WHERE account ~ 'Expenses:'
GROUP BY year
ORDER BY year;

This shows me exactly what I spent each year, not what I think I spent.

2. Track Progress to 25x

SELECT 
  date,
  convert(value(sum(position)), 'USD') AS net_worth
FROM OPEN ON 2023-01-01 CLOSE ON 2026-03-27
WHERE account ~ 'Assets:' OR account ~ 'Liabilities:'
GROUP BY date
ORDER BY date DESC
LIMIT 1;

With my current annual expenses at $48,000, my FIRE number is $1,200,000. Beancount tells me I’m at $720,000, so I’m 60% of the way there. That’s incredibly motivating.

3. Monitor Lifestyle Inflation

Here’s where it gets interesting. I also track expenses by category over time to catch lifestyle inflation:

SELECT 
  year(date) AS year,
  account,
  sum(convert(cost(position), 'USD')) AS total
FROM OPEN ON 2023-01-01 CLOSE ON 2025-12-31
WHERE account ~ 'Expenses:'
GROUP BY year, account
ORDER BY year, total DESC;

This revealed that my restaurant spending crept from $3,600/year to $6,000/year—a 67% increase! That kind of lifestyle inflation can push your FIRE number up by $60,000 (25x the additional $2,400/year). Seeing the data helped me course-correct.

The Beautiful Feedback Loop

What I love about Beancount for FIRE tracking:

  1. Every transaction affects your FIRE timeline
  2. Expense optimization directly reduces your FIRE number (spend less = need less to retire)
  3. Savings accelerates the journey (getting closer to the target faster)
  4. It’s all in plain text, version controlled, and completely transparent

When you track this way, you start thinking: “Is this $100 purchase worth working 2 extra days?” That’s the mindset shift that accelerates FIRE.

My Current Status

  • Annual expenses (trailing 12 months): $48,000
  • FIRE number (25x): $1,200,000
  • Current net worth: $720,000
  • Progress: 60%
  • Estimated years to FIRE (at 50% savings rate): ~5.5 years

What about you? How are you tracking your FIRE journey in Beancount? What queries do you use? What surprised you when you started tracking accurately?

This is such a clear explanation of the 25x rule! I’ve been using Beancount for 4+ years now, and I can’t emphasize enough how accurate expense tracking transforms FIRE planning.

The Most Common Mistake I See

People calculate their FIRE number based on their current spending, but they forget about expenses that will change in retirement:

  • Healthcare before Medicare (age 55-65): This can be $800-$1,500/month for a couple
  • Property maintenance: When you’re home all day, deferred maintenance becomes harder to ignore
  • Hobby/travel inflation: More free time often means higher discretionary spending

I learned this the hard way. My initial FIRE number was $900,000 based on $36,000/year spending. But when I modeled out retirement expenses more carefully, I realized I needed closer to $1,100,000 to cover healthcare and have a real safety margin.

My Beancount Tracking Approach

Here’s a query I use to separate essential vs discretionary expenses, which helps me understand my true floor:

SELECT 
  account,
  sum(convert(cost(position), 'USD')) AS total
FROM OPEN ON 2025-01-01 CLOSE ON 2025-12-31
WHERE account ~ 'Expenses:' 
  AND NOT account ~ 'Expenses:Discretionary'
GROUP BY account
ORDER BY total DESC;

I tag discretionary expenses explicitly (dining out, entertainment, travel), so I know my baseline is around $32,000/year, but my comfortable spending is $44,000/year.

That’s the difference between an $800,000 FIRE number and a $1,100,000 FIRE number.

Start Simple, Then Get Detailed

For anyone just starting with FIRE tracking in Beancount: don’t overthink the categories at first. Track everything for 3-6 months just to get a baseline. The patterns will emerge naturally, and then you can start optimizing.

The plain text format makes it easy to go back and reclassify transactions if you realize your initial category structure wasn’t quite right. That’s way harder in a GUI tool.

Great post—this is exactly the kind of practical FIRE + Beancount content this community needs!

This is exactly what I needed to see! I’m a DevOps engineer who just discovered Beancount a few months ago, and the FIRE philosophy is what drew me to plain text accounting in the first place.

My Beginner Questions

I love the queries you shared, but I’m struggling with a practical issue: how do you handle irregular expenses in your annual burn rate?

For example, I paid car insurance as a lump sum ($1,200 in January), and I had a one-time dental expense ($2,800 in March). If I calculate my trailing 12-month expenses naively, those spikes make it hard to know my “true” annual spending.

Do you:

  1. Smooth them out manually (like dividing car insurance by 12)?
  2. Just accept the lumpiness and look at multi-year averages?
  3. Use some kind of Beancount metadata to tag irregular vs recurring?

Essential vs Optional Spending

@helpful_veteran your comment about separating essential vs discretionary spending really resonates! I’m trying to figure out my baseline floor too.

Right now I’m categorizing like this:

  • Expenses:Essential:Housing
  • Expenses:Essential:Food
  • Expenses:Essential:Transport
  • Expenses:Discretionary:Dining
  • Expenses:Discretionary:Entertainment

But there’s a gray area—like, my phone bill is “essential,” but I could definitely downgrade the plan. My gym membership feels essential for my health, but technically it’s optional. How granular do I need to get?

The Version Control Appeal

One thing I absolutely love about Beancount for FIRE tracking: it’s all in Git. I can look at my ledger from 6 months ago and see exactly what I was thinking then. That historical context is gold when you’re trying to understand spending patterns.

Thanks for sharing your actual numbers—it’s really motivating to see someone else tracking this way!

Great discussion on FIRE tracking! As a CPA specializing in tax planning, I want to add an important dimension that often gets overlooked: your FIRE number needs to account for taxes.

The Tax Reality Check

When you calculate 25x annual expenses, you need to be crystal clear: are those pre-tax or post-tax expenses?

Most people track their spending post-tax (you’re recording what you actually paid at the store). But if your FIRE portfolio is in traditional 401(k)/IRA accounts, every withdrawal is taxable income.

Example Scenario

Let’s say you need $50,000/year post-tax to live on, and you’re in a 22% marginal tax bracket in retirement.

  • You actually need to withdraw $64,103/year pre-tax to net $50,000
  • Your FIRE number isn’t $1,250,000 (25x $50k)
  • Your FIRE number is $1,602,575 (25x $64,103)

That’s a $350,000 difference!

Tax-Advantaged Account Strategy

This is where Beancount really shines for tax-aware FIRE planning. I track my accounts with tax metadata:

2024-01-01 open Assets:Retirement:Trad401k
  tax_status: "tax_deferred"
  
2024-01-01 open Assets:Retirement:RothIRA
  tax_status: "tax_free"
  
2024-01-01 open Assets:Brokerage:Taxable
  tax_status: "taxable"

Then I can model different withdrawal strategies (Roth conversions, capital gains harvesting, etc.) and see the actual after-tax impact.

Healthcare Costs Before Medicare

@helpful_veteran already mentioned this, but I want to emphasize it from a tax perspective: healthcare costs age 55-65 are both expensive AND potentially deductible.

If your healthcare costs exceed 7.5% of AGI, you can deduct the excess. But that requires careful planning of your withdrawal strategy to keep AGI low enough to maximize deductions.

Beancount can help you model this:

  • Track projected healthcare costs as separate expense category
  • Model different AGI scenarios
  • Calculate potential tax savings from medical deductions

My Recommendation

If you’re serious about FIRE, add a “tax adjustment factor” to your calculations:

  • Mostly Roth/taxable: Minimal adjustment needed (maybe 1.05x for capital gains)
  • Mostly traditional 401k/IRA: Add 1.25x-1.35x to account for tax drag
  • Mix of accounts: Calculate your effective tax rate based on withdrawal sequencing

Track your actual tax liability in Beancount too! I have Expenses:Taxes:Federal and Expenses:Taxes:State categories, which helps me understand my true cost of living including the tax burden.

Bottom line: Don’t forget that Uncle Sam is a silent partner in your FIRE plan!