My January 2026 heating bill just arrived: $995. That’s more than my rent was in college.
I live in Minnesota, and winter heating is brutal. My gas bills go from $45/month in summer to $995/month in January. That’s a $950 monthly swing that destroys any budget that doesn’t account for seasonal expenses.
If you’re tracking your finances in Beancount and you live anywhere with real winter, you need a seasonal expense strategy or your budget will look broken 4 months out of the year.
The Problem: Seasonal Expense Spikes
Most people budget utilities as a fixed monthly amount:
; DON'T DO THIS - Averaging seasonal expenses
2026-01-01 budget Expenses:Utilities:Gas "Monthly budget"
Expenses:Utilities:Gas 250 USD ; Annual average
But that $250 “average” is meaningless when your actual bills look like this:
Summer (Jun-Aug): $45/month
Fall (Sep-Nov): $120/month
Winter (Dec-Feb): $850/month
Spring (Mar-May): $180/month
Annual average: $250/month
Reality: You're $600 over budget 3 months/year
When January’s $995 bill hits, it feels like a financial emergency, even though it happens every single year.
The Winter Heating Cost Crisis (2026)
Home heating costs are rising significantly this winter:
National averages (2025-2026 winter):
- Overall heating costs: +7.6% increase
- Average seasonal bill: $976 (up from $907 last year)
- Natural gas heating: $693 average (up from $639)
- Electric heating: +12.2% increase, averaging $1,130
Regional variations:
- Northeast electric heating: $1,519 for the winter
- Midwest natural gas: Additional $3-$8/month increases
- National electric bills: +4% (Nov-Mar)
The problem is worse if you’re in a cold climate state like Minnesota, Wisconsin, or North Dakota where winter bills can easily exceed $1,000/month.
The Sinking Fund Solution
Instead of budgeting a useless “average,” create a sinking fund that smooths out seasonal spikes:
The strategy:
- Budget for the highest month year-round ($995 in my case)
- In low-usage months, transfer the surplus to a sinking fund
- In high-usage months, withdraw from the sinking fund to cover the spike
Beancount implementation:
; Create sinking fund account
open Assets:SavingsGoals:Utilities
; Budget $995/month year-round (highest winter bill)
2026-01-01 budget Expenses:Utilities:Gas "Seasonal sinking fund budget"
Expenses:Utilities:Gas 995 USD
; June bill (summer low usage)
2026-06-15 * "Gas Company" "June heating bill"
Expenses:Utilities:Gas 45 USD
Assets:Checking -45 USD
; Transfer surplus to sinking fund
2026-06-30 * "Sinking fund" "June utility surplus"
Assets:SavingsGoals:Utilities 950 USD ; $995 budget - $45 actual
Income:BudgetSurplus -950 USD
note: "Banking summer surplus for winter heating spike"
; January bill (winter peak)
2026-01-15 * "Gas Company" "January heating bill"
Expenses:Utilities:Gas 995 USD
Assets:Checking -995 USD
; No sinking fund withdrawal needed - budgeted amount covers it
By June, you’ve accumulated $950 × 3 months = $2,850 in your sinking fund, which fully covers the winter spikes.
Year-Round Budget vs. Sinking Fund
Without sinking fund (budget $250/month average):
Jan: Budget $250, Actual $995 → OVER by $745
Feb: Budget $250, Actual $890 → OVER by $640
Mar: Budget $250, Actual $340 → OVER by $90
Jun: Budget $250, Actual $45 → UNDER by $205
Jul: Budget $250, Actual $45 → UNDER by $205
Aug: Budget $250, Actual $45 → UNDER by $205
Result: Budget feels broken 9 months/year
With sinking fund (budget $995/month, actual $995/month):
Jan: Budget $995, Pay $995, Sinking fund $0
Feb: Budget $995, Pay $890, Sinking fund +$105
Mar: Budget $995, Pay $340, Sinking fund +$655
Jun: Budget $995, Pay $45, Sinking fund +$950
Jul: Budget $995, Pay $45, Sinking fund +$950
Aug: Budget $995, Pay $45, Sinking fund +$950
Result: Budget is ALWAYS on track, surplus accumulates
The psychological benefit is huge: You never feel like you’re over budget.
Tracking Sinking Fund Balance
Use a dedicated account and track the balance over time:
; January - withdraw from sinking fund for winter spike
2026-01-15 * "Gas Company" "January heating bill"
Expenses:Utilities:Gas 995 USD
Assets:Checking -995 USD
; Check sinking fund balance (should have surplus from prior months)
2026-01-31 note Assets:SavingsGoals:Utilities "\
=== UTILITY SINKING FUND (Jan 31, 2026) ===
Balance: $2,105
- Oct surplus: $715
- Nov surplus: $540
- Dec surplus: $145
- Jan surplus: $0 (used full budget)
- Remaining: $2,105
Projected through winter:
Feb budget: $995, Expected bill: $890 → +$105
Mar budget: $995, Expected bill: $340 → +$655
Apr budget: $995, Expected bill: $180 → +$815
Sinking fund will grow to $3,680 by April
"
This tells you:
- How much cushion you have for unexpected cold snaps
- When you can reduce your monthly budget (if sinking fund is over-funded)
- Whether you’re on track for next winter
Seasonal Budget Adjustments
You can also use seasonal budgets instead of a constant $995/month:
; Winter heating season (Dec-Feb)
2025-12-01 budget Expenses:Utilities:Gas "Winter season"
Expenses:Utilities:Gas 950 USD
; Spring/Fall transition (Mar-May, Sep-Nov)
2026-03-01 budget Expenses:Utilities:Gas "Shoulder season"
Expenses:Utilities:Gas 180 USD
; Summer cooling (Jun-Aug)
2026-06-01 budget Expenses:Utilities:Gas "Summer season"
Expenses:Utilities:Gas 45 USD
This is more “realistic” but psychologically harder - you feel like your budget changes every 3 months.
I prefer the constant budget + sinking fund approach because:
- Monthly budget never changes ($995/month year-round)
- Surplus months feel like “wins” (banking money for winter)
- Deficit months are covered (no surprises)
Historical Comparison: Track Heating Inflation
Winter heating costs are rising faster than general inflation. Track year-over-year changes:
2026-01-15 * "Gas Company" "January 2026 heating bill"
Expenses:Utilities:Gas 995 USD
Assets:Checking -995 USD
yoy_2025: "$925 (Jan 2025)"
yoy_increase: "7.6%"
note: "7.6% YoY increase matches national average"
; Year-end summary
2026-12-31 note Expenses:Utilities:Gas "\
=== 2026 HEATING COST SUMMARY ===
Winter 2025-2026 (Dec-Feb):
Dec 2025: $845
Jan 2026: $995
Feb 2026: $890
Total: $2,730
Winter 2024-2025 (Dec-Feb):
Dec 2024: $785
Jan 2025: $925
Feb 2025: $825
Total: $2,535
Increase: $195 (7.7% YoY)
2027 projection (assume +7.6% inflation):
Jan 2027: $1,071 (budget accordingly!)
"
This shows that heating inflation (7.6% annually) is outpacing general inflation (~3%), so you need to increase your sinking fund budget every year.
How Much to Budget for Your Sinking Fund
Conservative approach (my recommendation):
- Find your highest bill from the past 3 years
- Add 10% for inflation and cold snaps
- Use that as your monthly budget year-round
Example:
Highest bill (Jan 2025): $925
+ 10% buffer: $925 × 1.10 = $1,018
Monthly budget: $1,020 (rounded up)
Now budget $1,020/month year-round, and bank the surplus in your sinking fund.
Result:
- Summer months: Bank ~$975/month ($1,020 - $45 actual)
- Winter months: Withdraw ~$0-200/month (budget mostly covers it)
- Sinking fund grows to $5,000+ after 1 year
- You’re protected against 10% colder winters or rate hikes
The “First Winter” Problem
If you’re setting this up for the first time in summer, you don’t have a sinking fund yet for the coming winter.
Solution: Jump-start the sinking fund
; One-time contribution to seed the sinking fund (June 2026)
2026-06-01 * "Transfer" "Seed utility sinking fund for winter"
Assets:SavingsGoals:Utilities 2,500 USD
Assets:Checking -2,500 USD
note: "One-time seed to cover first winter (3 months × $850/month)"
; Now follow normal monthly budget process
2026-06-15 * "Gas Company" "June bill"
Expenses:Utilities:Gas 45 USD
Assets:Checking -45 USD
2026-06-30 * "Sinking fund" "June surplus"
Assets:SavingsGoals:Utilities 955 USD
Income:BudgetSurplus -955 USD
After one full year, your sinking fund will be self-sustaining and you’ll never think about heating bill spikes again.
Query: Annual Heating Cost by Season
Track how much you actually spend by season:
SELECT
CASE
WHEN MONTH(date) IN (12, 1, 2) THEN 'Winter'
WHEN MONTH(date) IN (3, 4, 5) THEN 'Spring'
WHEN MONTH(date) IN (6, 7, 8) THEN 'Summer'
WHEN MONTH(date) IN (9, 10, 11) THEN 'Fall'
END AS season,
SUM(CONVERT(position, 'USD')) AS total_cost,
COUNT(*) AS num_bills,
SUM(CONVERT(position, 'USD')) / COUNT(*) AS avg_per_bill
FROM CLOSE
WHERE account = 'Expenses:Utilities:Gas'
AND YEAR(date) = 2026
GROUP BY season
ORDER BY total_cost DESC
Results:
Season Total Bills Avg/Bill
Winter $2,730 3 $910
Fall $1,185 3 $395
Spring $975 3 $325
Summer $135 3 $45
This confirms that 60% of your annual heating cost happens in 3 winter months.
My 2026 Heating Strategy
- Budget $1,020/month year-round (highest bill + 10% buffer)
- Bank surplus in sinking fund during spring/summer/fall
- Track sinking fund balance monthly to ensure it’s growing
- Adjust budget annually based on inflation (projected +7.6% for 2027)
- Never panic about winter bills - sinking fund covers it
This approach turns an unpredictable seasonal spike into a smooth, manageable monthly expense.
Anyone else dealing with crazy winter heating bills? How are you budgeting for seasonal spikes in Beancount?