$995 Winter Heating Bill: Seasonal Expense Tracking and Sinking Funds

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:

  1. Budget for the highest month year-round ($995 in my case)
  2. In low-usage months, transfer the surplus to a sinking fund
  3. 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:

  1. How much cushion you have for unexpected cold snaps
  2. When you can reduce your monthly budget (if sinking fund is over-funded)
  3. 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:

  1. Monthly budget never changes ($995/month year-round)
  2. Surplus months feel like “wins” (banking money for winter)
  3. 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):

  1. Find your highest bill from the past 3 years
  2. Add 10% for inflation and cold snaps
  3. 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

  1. Budget $1,020/month year-round (highest bill + 10% buffer)
  2. Bank surplus in sinking fund during spring/summer/fall
  3. Track sinking fund balance monthly to ensure it’s growing
  4. Adjust budget annually based on inflation (projected +7.6% for 2027)
  5. 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?

This is EXACTLY the problem I’ve been having! I live in Wisconsin and my heating bills are:

  • Summer: $38/month
  • Winter: $1,127/month (January 2026 peak)

That’s a $1,089 swing, and it completely destroys my monthly budget tracking. I feel like I’m “failing” at budgeting 3 months a year.

My biggest question: When do you start building the sinking fund?

If I start in June 2026, I’ll have:

  • June surplus: $982 ($1,020 budget - $38 bill)
  • July surplus: $982
  • August surplus: $982
  • Total by September: $2,946

But my winter bills start in October:

  • October: $450 (need to withdraw $0, still under budget)
  • November: $687 (need to withdraw $0, still under budget)
  • December: $998 (need to withdraw $0, still under budget)
  • January: $1,127 (need to withdraw $107 from sinking fund)

So I’d have $2,946 - $107 = $2,839 left in my sinking fund after the worst month.

That seems like it works, but what if I had started in October (fall) instead of June (summer)? Would I have enough cushion to survive January?

Another question: How do you handle “warmer than expected” winters?

Last year (2024-2025 winter), my January bill was $925. This year it’s $1,127. That’s a 22% increase year-over-year.

If I budgeted based on last year’s peak ($925), I would have been $202 short this January.

Should I always budget with a 20% buffer to account for colder-than-normal winters? Or is 10% enough?

My tracking so far:

; I just started tracking this month
2026-01-15 * "Gas Company" "January 2026 bill"
  Expenses:Utilities:Gas    1,127 USD
  Assets:Checking          -1,127 USD
  note: "OUCH - highest bill ever"

; I want to set up a sinking fund going forward
open Assets:SavingsGoals:HeatingBills

; Should I seed it now, or wait until summer to start?

How would you recommend I bootstrap this sinking fund mid-winter? Should I:

Option A: Seed it now with $3,000 from savings, then follow the normal monthly budget process

Option B: Wait until April when bills drop, then start banking surplus

Option C: Use a lower monthly budget ($600) and manually transfer extra money during winter months

I’m leaning toward Option A (seed it now) so I don’t have to think about it for the rest of winter, but I’m not sure if that’s the “right” Beancount way to do it.

How do you handle mid-year sinking fund setup?

As a bookkeeper, I help clients set up sinking funds for seasonal expenses, and heating bills are the #1 use case.

The “Right” Way to Bootstrap a Sinking Fund Mid-Year

Option A is correct - seed it immediately with a one-time transfer. Here’s why:

The purpose of a sinking fund is to smooth out cash flow. If you wait until summer to start building it, you’ll have another brutal winter next year with no cushion.

Instead, calculate the total winter deficit and fund it now:

; Calculate required seed amount (mid-year setup)
; Winter months remaining: Feb, Mar (assume bills drop in Apr)
; Feb estimated: $980
; Mar estimated: $520
; Total remaining winter costs: $1,500
; Seed amount: $1,500

2026-01-31 * "Transfer" "Seed heating sinking fund (mid-year setup)"
  Assets:SavingsGoals:HeatingBills   1,500 USD
  Assets:Checking                   -1,500 USD
  note: "One-time seed to cover remaining winter 2025-2026"

; Now set up monthly budget for rest of year
2026-02-01 budget Expenses:Utilities:Gas "Monthly heating budget"
  Expenses:Utilities:Gas   1,150 USD  ; Last year's peak + 20% buffer

; February bill
2026-02-15 * "Gas Company" "February bill"
  Expenses:Utilities:Gas    980 USD
  Assets:Checking          -980 USD

; Transfer surplus to sinking fund
2026-02-28 * "Sinking fund" "February surplus"
  Assets:SavingsGoals:HeatingBills   170 USD  ; $1,150 - $980
  Income:BudgetSurplus              -170 USD

By April, you’ll have:

  • Seed: $1,500
  • Feb surplus: $170
  • Mar surplus: $630 ($1,150 budget - $520 bill)
  • Total: $2,300

This covers next winter’s first 2 months ($2,300 ÷ 2 = $1,150/month), and you’ll continue banking surplus through summer.

The 10% vs. 20% Buffer Question

Use 20% for heating, 10% for most other expenses.

Why? Heating bills are weather-dependent, not usage-dependent. You can’t conserve your way out of a polar vortex.

Example: Chicago 2025-2026 winter

"Normal" winter (2024-2025):
  Jan bill: $925
  Based on 3,200 therms used

"Polar vortex" winter (2025-2026):
  Jan bill: $1,127
  Based on 3,900 therms used (+22% usage due to extreme cold)

The 22% increase was driven by weather, not behavioral changes. If you budgeted with only 10% buffer, you’d be $112 short.

My recommendation:

; Budget formula for heating
; Peak historical bill × 1.20 (20% buffer)

; Find your peak bill from last 3 years
; 2023 peak: $845
; 2024 peak: $925
; 2025 peak: $1,127 ← use this
; Budget: $1,127 × 1.20 = $1,352

2026-01-01 budget Expenses:Utilities:Gas "Heating budget (peak + 20%)"
  Expenses:Utilities:Gas   1,350 USD  ; Rounded up from $1,352

This gives you:

  • $225 cushion if winter is “normal” ($1,350 - $1,127)
  • Coverage if winter is 20% colder (unlikely but possible)
  • Huge surplus in summer months ($1,350 - $38 = $1,312/month)

After 1 year, your sinking fund will have $10,000+ in it, which covers multiple years of extreme winters.

The “Sinking Fund is Too Large” Problem

After 2-3 years, you might have $15,000 in your heating sinking fund. At that point, you can:

Option 1: Reduce monthly budget

; Sinking fund is over-funded, reduce budget to $900/month
2028-01-01 budget Expenses:Utilities:Gas "Reduced budget (sinking fund healthy)"
  Expenses:Utilities:Gas   900 USD

Option 2: Transfer excess to emergency fund

; Sinking fund has $15,000, only need $5,000 for safety
2028-01-31 * "Transfer" "Excess heating fund → emergency fund"
  Assets:EmergencyFund:Cash           10,000 USD
  Assets:SavingsGoals:HeatingBills   -10,000 USD
  note: "Sinking fund over-funded, moving $10K to general emergency fund"

Option 3: Keep it and never worry about heating bills again

Personally, I keep sinking funds “fat” because it removes all mental stress. When January’s $1,200 bill arrives, I don’t even blink - the sinking fund covers it.

Tracking Multiple Sinking Funds

If you have multiple seasonal expenses, track them separately:

open Assets:SavingsGoals:HeatingBills
open Assets:SavingsGoals:PropertyTax
open Assets:SavingsGoals:CarInsurance
open Assets:SavingsGoals:Vacation

; Quarterly property tax
2026-03-31 * "County" "Q1 property tax"
  Expenses:Housing:PropertyTax     3,200 USD
  Assets:Checking                 -3,200 USD

2026-03-31 * "Sinking fund" "Property tax withdrawn"
  Income:SavingsGoalWithdrawal      3,200 USD
  Assets:SavingsGoals:PropertyTax  -3,200 USD

This keeps each sinking fund purpose-specific, so you know exactly how much you have for each seasonal expense.

Year-End Reconciliation

At year-end, verify your sinking fund matches your intended target:

2026-12-31 note Assets:SavingsGoals:HeatingBills "\
=== HEATING SINKING FUND STATUS (Dec 31, 2026) ===

Balance: $8,245

Target balance: $5,000 (covers 4 winter months @ $1,250/month)
Status: OVER-FUNDED by $3,245

Options:
  1. Reduce 2027 monthly budget to $900 (from $1,350)
  2. Transfer $3,000 to emergency fund
  3. Keep as-is (extra protection for polar vortex)

Recommendation: Keep as-is. Over-funding = peace of mind.
"

The bottom line: There’s no such thing as an over-funded sinking fund. Worst case, you have extra money saved. Best case, you’re protected against extreme winter weather and rate hikes.

Seed it now, budget high, and never stress about winter heating bills again.

I’ve been using a heating sinking fund for 4 years now, and here’s the single most important lesson I learned:

Don’t just track the sinking fund balance - track the FUNDED MONTHS.

What I mean is, your sinking fund should show “how many winter months am I covered for?” rather than just a dollar amount.

; Track funded months in metadata
2026-06-30 note Assets:SavingsGoals:HeatingBills "\
=== HEATING SINKING FUND (June 30, 2026) ===

Balance: $4,325
Average winter month cost: $865 (Dec-Feb average)
Funded months: 5.0 months ($4,325 ÷ $865)

Coverage status:
  ✓ Oct 2026: FUNDED ($450 estimated)
  ✓ Nov 2026: FUNDED ($687 estimated)
  ✓ Dec 2026: FUNDED ($865 estimated)
  ✓ Jan 2027: FUNDED ($950 estimated)
  ✓ Feb 2027: FUNDED ($820 estimated)
  ~ Mar 2027: PARTIAL ($450 estimated, partially funded)

Target: 6 months funded (Oct-Mar)
Status: 83% funded (5.0 / 6.0 months)
Action: Continue banking $1,100/month surplus through summer
"

This tells you exactly when you’ll run out of cushion if you stop contributing.

The “Funded Months” Formula

Funded Months = Sinking Fund Balance ÷ Average Winter Month Cost

Average Winter Month Cost = (Dec + Jan + Feb bills) ÷ 3

Example:

2025-2026 winter bills:
  Dec: $845
  Jan: $995
  Feb: $890
  Average: $910

Sinking fund balance: $5,460
Funded months: $5,460 ÷ $910 = 6.0 months

This means you’re fully covered for 2 winters (3 months × 2 = 6 months).

When to Stop Contributing to Sinking Fund

I stop banking surplus once I reach 12 funded months (2 full winters).

Why 12 months? Two reasons:

  1. Protection against rate hikes: If heating costs spike 20% next year, I still have 10 months of coverage
  2. “Set it and forget it” mentality: Once funded, I never think about it again

After that, I redirect the surplus to other goals:

; Sinking fund is fully funded (12 months = 2 winters)
2027-06-30 note Assets:SavingsGoals:HeatingBills "\
Sinking fund: $10,920 (12 months funded @ $910/month)
Status: FULLY FUNDED

Action: Redirect summer surplus to other goals
"

; July - redirect surplus to vacation fund instead
2027-07-31 * "Sinking fund" "Redirect surplus (heating fund fully funded)"
  Assets:SavingsGoals:Vacation   1,100 USD  ; Summer surplus
  Income:BudgetSurplus          -1,100 USD
  note: "Heating fund fully funded, redirecting to vacation"

This way, you’re not “over-saving” for heating indefinitely - once funded, move on to other goals.

Tracking Weather vs. Rate Increases

I also track why my bill increased using metadata:

2026-01-15 * "Gas Company" "January 2026 bill"
  Expenses:Utilities:Gas    995 USD
  Assets:Checking          -995 USD
  usage_therms: 3900
  rate_per_therm: "$0.255"
  yoy_usage: "+22% (polar vortex)"
  yoy_rate: "+3% (rate hike)"
  yoy_total: "+26%"
  note: "Usage up 22% (weather), rate up 3% (inflation)"

This breakdown tells me:

  • 22% increase due to colder weather (temporary, can’t control)
  • 3% increase due to rate hikes (permanent, affects all future bills)

Why this matters:

If my bill went up only due to weather, I don’t need to increase my budget for next year. But if it went up due to rate hikes, I need to adjust my budget upward.

Budget adjustment logic:

2025-2026 winter: $995 peak (polar vortex year)
2024-2025 winter: $925 peak (normal year)

Weather-adjusted 2025 peak: $925 (ignore polar vortex outlier)
Rate increase: +3%
2026-2027 budget: $925 × 1.03 = $953

Add 20% buffer: $953 × 1.20 = $1,144
Monthly budget: $1,150 (rounded up)

This ensures my budget grows with rate inflation but doesn’t overreact to temporary weather spikes.

Historical Comparison Query

Run this to see how your winter bills have changed over time:

SELECT
  YEAR(date) as winter_year,
  SUM(CASE WHEN MONTH(date) IN (12, 1, 2) THEN position ELSE 0 END) as winter_total,
  MAX(CASE WHEN MONTH(date) IN (12, 1, 2) THEN position ELSE 0 END) as winter_peak
FROM CLOSE
WHERE account = 'Expenses:Utilities:Gas'
GROUP BY YEAR(date)
ORDER BY winter_year

Results:

Year  Winter Total  Peak Month
2022  $2,145        $785
2023  $2,385        $845
2024  $2,615        $925
2025  $2,730        $995

Average increase: +8.3% per year

That 8.3% annual increase is way higher than general inflation (3%), so you need to increase your sinking fund budget by at least 8% every year to keep up.

The Peace of Mind Factor

The real benefit of a sinking fund isn’t just financial - it’s psychological.

Before sinking fund:

  • January bill arrives: “Oh no, $995, how will I pay this?”
  • Stress about whether to pay rent or heating
  • Feel like a budget failure

After sinking fund:

  • January bill arrives: “Yep, $995, expected”
  • Withdraw from sinking fund (or budget already covers it)
  • Zero stress, move on with life

Once you set it up, heating bills become completely invisible in your monthly finances. That’s worth way more than the actual dollar savings.

The sinking fund is the single best Beancount strategy I’ve ever implemented for seasonal expenses.