Real Estate Portfolio in Beancount: How Do You Track Multiple Rentals with Property-Level P&L?

I’ve been using Beancount for personal finances for 3 years now, and it’s been fantastic for tracking my path to FIRE. But I’ve recently expanded into real estate investing (3 rental properties), and I’m struggling with how to structure my accounts for true property-level visibility.

My Current Challenge

Right now, I have a basic setup that tracks rental income and expenses, but I can’t easily answer questions like:

  • Which property is actually profitable after all expenses?
  • Am I tracking depreciation correctly for each property?
  • How do I separate capital improvements from repairs in a way that makes tax time easier?

I also need to track accumulated depreciation per property since that affects basis calculations when I eventually sell (or do a 1031 exchange).

Specific Questions

1. Account Structure: What’s the recommended account hierarchy for multiple rental properties? Should I do:

  • `Assets:RealEstate:Property1`, `Assets:RealEstate:Property2`, etc.?
  • Or something more granular with subaccounts per property?

2. Depreciation Tracking: How do you track depreciation schedules in plain text? I know residential rentals depreciate over 27.5 years, but how do you structure the accounts and transactions? Do you:

  • Create a separate asset account for the depreciable basis?
  • Use an accumulated depreciation contra-account?
  • Generate annual depreciation entries manually or with a script?

3. Capital Improvements vs Repairs: This is where I’m really confused. I just spent $8,000 replacing the HVAC system in one property. Under 2026 IRS rules, is this a capital improvement (depreciate over 27.5 years) or can I deduct it as a repair?

How do you use metadata or tags to track this distinction in Beancount? I want an audit trail that makes it obvious which expenses were capitalized vs expensed.

4. Property-Level P&L: Can Fava generate property-level profit/loss reports, or do I need custom queries? I’d love to see each property’s:

  • Gross rental income
  • Operating expenses (property tax, insurance, maintenance, utilities)
  • Net operating income
  • Depreciation expense
  • Net income after depreciation

5. 1031 Exchange Planning: I’m considering a 1031 exchange in the next 1-2 years. Any Beancount-specific tips for maintaining the records needed for like-kind exchange documentation?

My Current (Inadequate) Setup

Right now I basically have:

```beancount
2024-01-01 open Assets:RealEstate:Properties
2024-01-01 open Income:Rental
2024-01-01 open Expenses:Rental:Maintenance
2024-01-01 open Expenses:Rental:PropertyTax
```

This doesn’t give me property-level granularity, and I’m not tracking depreciation at all yet (which I know is a tax compliance problem waiting to happen).

What I’m Looking For

If you manage rental properties in Beancount, I’d love to see:

  • Your account structure (even just a high-level example)
  • Example transactions for capital improvements, depreciation entries
  • Any custom queries or reports you use for property analysis
  • Metadata strategies for tagging expenses by property

I’m analytical by nature and love optimizing systems, so I want to build this right from the start rather than migrate again in 6 months.

Thanks in advance for any guidance! This community has been incredibly helpful for my personal finance journey, and I’m excited to level up my real estate tracking.

Fred, these are excellent questions and I’m glad you’re thinking through the structure before you get too far in. As a CPA who works with real estate investors, I see too many people cobble together accounting systems that cause headaches at tax time.

Recommended Account Structure

For multiple rental properties, you absolutely need property-level separation. Here’s what I recommend:

Assets:

Assets:RealEstate:123MainSt:Building
Assets:RealEstate:123MainSt:Land
Assets:RealEstate:123MainSt:AccumulatedDepreciation  ; contra-asset
Assets:RealEstate:123MainSt:Improvements:HVAC2026
Assets:RealEstate:456OakAve:Building
Assets:RealEstate:456OakAve:Land
Assets:RealEstate:456OakAve:AccumulatedDepreciation

Income/Expenses per property:

Income:Rental:123MainSt
Expenses:Rental:123MainSt:Maintenance
Expenses:Rental:123MainSt:PropertyTax
Expenses:Rental:123MainSt:Insurance
Expenses:Rental:123MainSt:Depreciation

The key is to separate land from building in your asset accounts because land is not depreciable. When you purchase a property, you need to allocate the purchase price between land and building based on the property tax assessment or appraisal.

Depreciation Tracking

Yes, you need an accumulated depreciation contra-asset account per property. Here’s how it works:

Initial purchase (simplified):

2024-01-15 * "Purchase 123 Main St rental property"
  Assets:RealEstate:123MainSt:Building        250000 USD  ; depreciable
  Assets:RealEstate:123MainSt:Land             50000 USD  ; not depreciable
  Expenses:Closing:123MainSt                    5000 USD  ; closing costs
  Assets:Bank:Checking                       -305000 USD

Annual depreciation entry:

2024-12-31 * "Annual depreciation - 123 Main St"
  Expenses:Rental:123MainSt:Depreciation       9091 USD  ; $250k / 27.5 years
  Assets:RealEstate:123MainSt:AccumulatedDepreciation  -9091 USD

I use a Python script to generate these entries automatically based on my depreciation schedules, but you can create them manually if you only have a few properties.

Your HVAC Question

This is almost certainly a capital improvement, not a repair. Here’s why:

Under the IRS BAR test (Betterment, Adaptation, Restoration):

  • Betterment: A full HVAC system replacement improves the property beyond its original condition
  • Restoration: It’s a substantial structural component replacement

The IRS also has a rule of thumb: if you replace 30% or more of a major building system, it must be capitalized. A complete HVAC replacement definitely qualifies.

In 2026, you have a couple options:

  1. Bonus depreciation: You can take 20% ($1,600) as bonus depreciation in year one, then depreciate the remaining $6,400 over 27.5 years
  2. Regular depreciation: Depreciate the full $8,000 over 27.5 years = $291/year

Note that bonus depreciation drops to 0% in 2027, so if you have major capital projects planned, there’s a timing advantage to completing them in 2026.

Metadata Strategy

I strongly recommend using metadata to create an audit trail:

2026-03-15 * "HVAC replacement - 123 Main St" #capitalized
  Assets:RealEstate:123MainSt:Improvements:HVAC2026    8000 USD
    property: "123-main-st"
    improvement_type: "HVAC"
    placed_in_service: 2026-03-15
    contractor: "ABC Heating & Cooling"
    invoice: "INV-2026-0315"
  Assets:Bank:Checking                                -8000 USD

This metadata will be invaluable during an audit or when you do a 1031 exchange.

1031 Exchange Considerations

Beancount is actually excellent for 1031 documentation because every transaction has a complete history. Make sure you’re tracking:

  • Original basis (purchase price + closing costs + capital improvements)
  • Accumulated depreciation (this gets “recaptured” on the sale)
  • All capital improvements with dates and amounts
  • Operating expense history (helpful for demonstrating property performance to exchange intermediary)

The key is maintaining clean records that clearly show the adjusted basis of each property. Your accountant will love you for having everything in plain text with full transaction history.

Property-Level P&L

Fava can generate property-level reports if you use the account hierarchy I showed above. You can also use Beancount’s query language (BQL) for custom analysis. Would you like me to share some example queries?

Let me know if you want more detail on any of these areas. Happy to share more specific examples from my client work (anonymized, of course).

Fred, I was exactly where you are about 2 years ago when I bought my second rental property! Alice’s advice is spot-on from the professional CPA perspective. Let me share what actually works for me in practice managing 2 rental properties in Beancount.

My Working Account Structure

Here’s my real structure (simplified addresses):

; Property 1: Condo
2022-01-01 open Assets:RealEstate:MarketStCondo:Building
2022-01-01 open Assets:RealEstate:MarketStCondo:Land
2022-01-01 open Assets:RealEstate:MarketStCondo:AccumulatedDepreciation
2022-01-01 open Income:Rental:MarketStCondo
2022-01-01 open Expenses:Rental:MarketStCondo:HOA
2022-01-01 open Expenses:Rental:MarketStCondo:Maintenance
2022-01-01 open Expenses:Rental:MarketStCondo:Insurance
2022-01-01 open Expenses:Rental:MarketStCondo:PropertyTax
2022-01-01 open Expenses:Rental:MarketStCondo:Depreciation

; Property 2: Single Family Home
2023-06-01 open Assets:RealEstate:PineAveSFH:Building
2023-06-01 open Assets:RealEstate:PineAveSFH:Land
2023-06-01 open Assets:RealEstate:PineAveSFH:AccumulatedDepreciation
2023-06-01 open Income:Rental:PineAveSFH
2023-06-01 open Expenses:Rental:PineAveSFH:Maintenance
2023-06-01 open Expenses:Rental:PineAveSFH:Insurance
2023-06-01 open Expenses:Rental:PineAveSFH:PropertyTax
2023-06-01 open Expenses:Rental:PineAveSFH:Depreciation

Key lesson I learned: Start simple! I initially tried to track every possible subaccount (utilities, landscaping, pest control, etc.) but it became overwhelming. Now I use broader categories and rely on transaction descriptions and metadata for details.

Metadata Strategy for Capital Improvements

This is where metadata really shines. Here’s an example from when I replaced the water heater last year:

2025-08-12 * "Water heater replacement - Market St Condo" #capital-improvement
  Assets:RealEstate:MarketStCondo:Building     3200 USD
    property: "market-st-condo"
    improvement_type: "water-heater"
    placed_in_service: 2025-08-12
    vendor: "Bay Area Plumbing"
    receipt: "receipt-2025-0812.pdf"
    depreciation_method: "MACRS-27.5"
  Assets:Bank:Checking                        -3200 USD

For repairs (deductible immediately), I use #repair tag:

2025-09-20 * "Fix leaking faucet - Pine Ave SFH" #repair
  Expenses:Rental:PineAveSFH:Maintenance       150 USD
    property: "pine-ave-sfh"
    vendor: "Quick Fix Plumbing"
  Assets:Bank:Checking                        -150 USD

The tags make it super easy to filter at tax time!

Property-Level P&L Query

Here’s a custom BQL query I use to see property-level performance:

SELECT
  account,
  sum(position) as total
WHERE
  account ~ 'Income:Rental:MarketStCondo' OR
  account ~ 'Expenses:Rental:MarketStCondo'
GROUP BY account
ORDER BY account

You can adjust the property name in the WHERE clause to analyze each property separately. Fava also lets you filter by account patterns in the UI, which is great for quick checks.

Depreciation Automation

I use a simple Python script that reads my property metadata and generates annual depreciation entries. Here’s the basic idea (pseudocode):

# Read all capital asset transactions with placed_in_service dates
# For each asset:
#   - Calculate annual depreciation (cost / 27.5 years for residential)
#   - Generate entry: Debit Depreciation Expense, Credit Accumulated Depreciation
# Output to a separate depreciation.beancount file that I include in my main ledger

I run this at year-end and review the generated transactions before including them. It saves tons of manual work!

Lessons from My Migration

When I started tracking rentals in Beancount, I made some mistakes:

Mistake 1: Tried to track tenant deposits in Assets:RealEstate accounts. Don’t do this! Create a separate Liabilities:TenantDeposits:PropertyName account. Tenant deposits are liabilities, not assets.

Mistake 2: Didn’t separate land value at purchase. Had to go back and correct this to get depreciation right. Do it from day one!

Mistake 3: Over-complicated my expense categories. Now I keep it simple and use metadata for granular tracking when I need it.

The Balance Assertion Lifesaver

I can’t stress this enough: use balance assertions regularly for your rental accounts:

2025-12-31 balance Assets:RealEstate:MarketStCondo:AccumulatedDepreciation  -18182 USD

This catches depreciation calculation errors immediately. I set a yearly reminder to verify these.

My Recommendation for You

Start with the structure Alice outlined (it’s exactly what I use). Focus on getting these basics right:

  1. :white_check_mark: Separate land from building at purchase
  2. :white_check_mark: Use metadata tags for capital improvements (#capital-improvement) vs repairs (#repair)
  3. :white_check_mark: Set up accumulated depreciation contra-accounts per property
  4. :white_check_mark: Create property-specific income/expense accounts
  5. :white_check_mark: Use balance assertions to catch errors

Don’t worry about fancy automation yet - just get transactions flowing correctly. Once you have 3-6 months of data, you’ll see patterns and know where you want more automation or better reporting.

Feel free to DM me if you want to see more examples from my actual ledger (with addresses changed, of course). Happy to help a fellow FIRE-pursuing real estate investor! :house::bar_chart:

Fred, Alice and Mike have given you excellent structural advice. As a tax specialist who deals with rental property audits, let me add some critical timing and compliance considerations that could save you thousands of dollars.

Urgent: 2026 Bonus Depreciation Window

This is time-sensitive. Your $8,000 HVAC replacement qualifies for 20% bonus depreciation in 2026, but here’s what most people don’t realize:

2026: 20% bonus depreciation = $1,600 immediate deduction + $6,400 depreciated over 27.5 years
2027: 0% bonus depreciation = $8,000 depreciated over 27.5 years (only $291/year)

If you’re planning other capital improvements (roof, windows, major appliances), consider accelerating them into 2026 if financially feasible. Next year, bonus depreciation disappears entirely. That’s a $1,600 tax benefit you’ll lose on this HVAC alone if it were done in 2027.

The placed-in-service date matters - it’s when the improvement is ready and available for use, not when you paid for it.

Depreciation Recapture: The Hidden Tax Trap

Alice mentioned this briefly, but I want to emphasize it because I see clients surprised by this constantly:

When you sell a rental property (or do a 1031 exchange), all the depreciation you’ve taken gets “recaptured” and taxed at 25%. This is why tracking accumulated depreciation per property is absolutely critical.

Example scenario:

  • You buy a property for $300,000 ($250K building, $50K land)
  • Over 10 years, you take $90,910 in depreciation deductions ($250K / 27.5 years × 10)
  • You sell for $400,000
  • Your capital gain: $400,000 - ($300,000 - $90,910) = $190,910
  • But $90,910 is depreciation recapture taxed at 25%, the rest at capital gains rates

If you don’t have accurate depreciation records, the IRS will estimate it (and not in your favor). Beancount’s accumulated depreciation accounts give you ironclad documentation.

IRS Audit Defense: Your Metadata Strategy

Mike’s metadata approach is excellent. Let me add what I recommend for audit-proof documentation:

2026-03-15 * "HVAC system replacement - 123 Main St" #capital-improvement
  Assets:RealEstate:123MainSt:Improvements:HVAC2026    8000 USD
    property: "123-main-st"
    improvement_type: "hvac-system"
    placed_in_service: 2026-03-15
    vendor: "ABC Heating & Cooling"
    vendor_ein: "12-3456789"
    invoice_num: "INV-2026-0315"
    invoice_file: "123MainSt_HVAC_Invoice_2026-03-15.pdf"
    depreciation_class: "MACRS-27.5"
    bar_test_justification: "Betterment - full system replacement improves beyond original"
  Assets:Bank:Checking                                -8000 USD

The bar_test_justification field is gold during an audit. Document why you classified it as a capital improvement vs repair at the time you made the decision.

The Repair vs Capital Improvement Gray Area

The IRS rules have nuances most people miss:

Safe Harbor for Small Taxpayers (SHST): If your property’s basis is ≤$1M and annual receipts ≤$10M, you can currently deduct up to the lesser of $10,000 or 2% of the property’s unadjusted basis for repairs AND improvements combined.

For a $300K property: 2% = $6,000
Your $8K HVAC exceeds this, so you can’t use SHST for it. But smaller projects might qualify.

De Minimis Safe Harbor: Items ≤$2,500 can be immediately expensed without analysis. This is per invoice/item, not per year.

Track these in Beancount with metadata so your tax preparer knows what safe harbors you’re using:

2026-04-10 * "Garbage disposal replacement - 123 Main St" #repair #de-minimis
  Expenses:Rental:123MainSt:Maintenance    450 USD
    safe_harbor: "de-minimis"
  Assets:Bank:Checking                    -450 USD

1031 Exchange Planning: Start Documentation Now

If you’re considering a 1031 exchange in 1-2 years, your Beancount records are a huge advantage, but you need to track a few additional things:

  1. Debt basis: If you have mortgages, track the principal paydown separately. In a 1031 exchange, you must replace debt with equal or greater debt to defer all taxes.

  2. Related party considerations: If you’re selling to/buying from family, there are special holding period rules.

  3. Timeline documentation: Once you list a property, you have 45 days to identify replacement property and 180 days to close. Document everything in Beancount transactions.

  4. Boot calculation: Any cash received that isn’t reinvested is taxable “boot.” Track this carefully.

Common Mistakes to Avoid

Mistake 1: Forgetting to Capitalize Depreciation
Even if you forget to take depreciation on your tax return, the IRS still treats it as if you did when you sell. Use Beancount to ensure you claim it annually!

Mistake 2: Inconsistent Cost Segregation
Some investors do cost segregation studies to accelerate depreciation. If you go this route, make sure your Beancount structure supports tracking different asset classes (5-year, 15-year, 27.5-year).

Mistake 3: Missing the Material Participation Test
If rental real estate is your profession, you can deduct losses against ordinary income. Track your hours! I’ve seen people lose huge deductions because they couldn’t document 750+ hours.

My Recommendation

  1. :white_check_mark: Adopt Alice’s account structure immediately
  2. :white_check_mark: Use Mike’s metadata strategy with the audit trail additions I suggested
  3. :white_check_mark: Set up a quarterly meeting with your CPA to review classification decisions
  4. :white_check_mark: Create a “Tax Year Summary” query in Beancount that pulls:
    • Total depreciation by property
    • Capital improvements placed in service (for Form 4562)
    • Accumulated depreciation balance for basis calculation
    • Repair expenses claimed under safe harbors

If you want, I can share example queries I provide to my clients for these reports. And definitely talk to your tax preparer about whether bonus depreciation or immediate expensing makes sense for your specific tax situation - everyone’s different.

One last thing: Your HVAC was placed in service in March 2026, so yes, you get the 2026 bonus depreciation rate (20%) if you elect it. Just make sure to file Form 4562 with your 2026 return.

Happy to answer follow-up questions! Real estate tax planning is one of my favorite areas. :clipboard:

Wow, this is exactly the kind of comprehensive guidance I was hoping for! Thank you Alice, Mike, and Tina for taking the time to share such detailed advice.

My Takeaways

Immediate action items:

  1. Restructure my accounts using Alice’s hierarchy with property-level separation
  2. Separate land from building value for each property (I have the tax assessments, so this should be straightforward)
  3. Set up accumulated depreciation contra-accounts per property
  4. Implement metadata tagging strategy (Mike’s approach + Tina’s audit defense additions)

HVAC Decision:
Tina, your point about the 2026 bonus depreciation window is critical. Since the HVAC was installed in March 2026, I’ll definitely elect the 20% bonus depreciation ($1,600 immediate + $6,400 over 27.5 years). That’s a no-brainer given that 2027 drops to 0%.

I have two other potential capital projects (roof repair on Property 2, water heater on Property 3) that I was planning for 2027, but now I’m reconsidering the timing given the tax implications.

Follow-up Questions

For Mike: You mentioned a Python script for depreciation automation. Is this something you’d be willing to share (or point me to resources)? I’m comfortable with Python and would love to automate this rather than manually calculating each year.

For Alice: I’d love to see those BQL query examples for property-level P&L if you’re willing to share. I want to build a “rental portfolio dashboard” that shows:

  • Individual property performance
  • Aggregate portfolio metrics
  • Depreciation tracking across all properties
  • Capital improvement timeline

For Tina: Great point about depreciation recapture. I hadn’t fully grasped the 25% tax hit on all accumulated depreciation. This makes the 1031 exchange path even more attractive. Do you recommend any specific metadata fields to track for 1031 exchange preparation beyond what you listed?

My Plan

I’m going to spend this weekend restructuring my Beancount ledger with the proper account hierarchy. I’ll start simple as Mike recommended - get the basic structure right, then add complexity as needed.

I’ll also schedule a meeting with my CPA to review:

  • The capital improvement classifications I’ve made
  • Whether to accelerate my other 2027 projects into 2026 for bonus depreciation
  • Overall 1031 exchange strategy and timeline

Committing to Document My Journey

Once I have this set up and running for a few months, I’ll write a follow-up post sharing my final structure, any lessons learned, and maybe some example queries. This community has given me so much value - I want to pay it forward.

Thank you all again! This is why I love the Beancount community - practical, professional advice from people who actually do this work. :folded_hands: