Year-End Tax Moves: December Checklist Powered by Beancount

December is the most important month for tax planning. Here’s my comprehensive year-end checklist and how Beancount helps execute each move.

The December Tax Planning Dashboard

2026-12-01 custom "year-end-review" "Annual tax planning checklist"
  ; Income summary
  ytd-gross-income: 245000.00
  projected-december-income: 20000.00
  total-projected-income: 265000.00
  
  ; Deductions
  standard-deduction: 32200.00
  projected-taxable-income: 232800.00
  current-bracket: "24%"
  
  ; Action items
  tax-loss-harvest-opportunity: 8500.00
  roth-conversion-room: 0.00  ; already in 24%
  charitable-contribution-planned: 15000.00
  hsa-max-remaining: 2000.00

December Checklist by Category

1. Max Out Tax-Advantaged Accounts

SELECT 
  '401k' as account,
  24500 - sum(position) as remaining
WHERE account ~ 'Income:Salary:401k'
  AND year = 2026

UNION

SELECT
  'HSA' as account,
  8750 - sum(position) as remaining  
WHERE account ~ 'Income:HSA'
  AND year = 2026

2. Tax Loss Harvesting

SELECT 
  account,
  sum(position) as cost_basis,
  sum(value(position)) as current_value,
  sum(value(position)) - sum(position) as unrealized_gain_loss
WHERE account ~ 'Assets:Brokerage'
  AND commodity != 'USD'
GROUP BY account
HAVING sum(value(position)) - sum(position) < 0

3. Charitable Giving (Bunching Year?)

4. Roth Conversions

5. Required Minimum Distributions (if 73+)

6. Estimated Tax Payments Q4

What’s on your December checklist?

My December routine has become very systematic thanks to Beancount. Here’s my expanded checklist:

The “First Week of December” Queries

I run these on December 1st every year:

-- 1. Capital gains/losses YTD
SELECT 
  'Realized Gains' as category,
  sum(position) as amount
WHERE account ~ 'Income:.*:CapGains'
  AND year = 2026

-- 2. Unrealized losses for harvesting
-- (use Fava's holdings report)

-- 3. Retirement contribution room
SELECT
  account,
  sum(position) as contributed
WHERE account ~ 'Assets:Retirement'
  AND year = 2026
GROUP BY account

My Tax Loss Harvesting Protocol

; Step 1: Sell the loser
2026-12-10 * "Vanguard" "Tax loss harvest - sell VTI"
  Assets:Brokerage:Cash    9500.00 USD
  Assets:Brokerage:VTI    -100 VTI {120.00 USD}
  Income:Investment:CapGains:LongTerm    2500.00 USD  ; loss
    harvest-type: "tax-loss"
    wash-sale-window-ends: 2027-01-09

; Step 2: Buy similar (not identical) fund
2026-12-10 * "Vanguard" "Replace with ITOT"
  Assets:Brokerage:ITOT    95 ITOT @ 100.00 USD
  Assets:Brokerage:Cash    -9500.00 USD
    replacement-for: "VTI"
    substantially-identical: FALSE

Don’t Forget: Gifting!

Annual gift exclusion for 2026 is $19,000 per recipient. If you’re doing estate planning, December is the deadline.

As a CPA, December is my busiest month for client planning calls. Here’s what I always remind people:

Key December Deadlines

Deadline Action
Dec 31 Last day for Roth conversions to count in 2026
Dec 31 Last day to realize capital gains/losses
Dec 31 Charitable donations (cash must clear bank)
Dec 31 RMDs must be taken
Dec 31 HSA contributions via payroll
Apr 15, 2027 IRA/HSA contributions for 2026 (not employer plans!)

The Wash Sale Trap

@finance_fred mentioned this, but I can’t stress it enough. Watch ALL your accounts:

-- Check for potential wash sales across all accounts
SELECT 
  commodity,
  account,
  date,
  sum(position) as shares
WHERE commodity IN ('VTI', 'ITOT', 'VTSAX', 'FSKAX')  -- similar funds
  AND date >= 2026-11-01
  AND date <= 2027-01-31
GROUP BY commodity, account, date
ORDER BY commodity, date

The “Mid-December Review” Meeting

I schedule 30 minutes with every client in mid-December. We review:

  1. YTD income vs projection
  2. Unrealized gains/losses
  3. Retirement contribution status
  4. Any expected windfalls before year-end

Beancount users: your data makes this meeting SO much easier. Bring your queries!