Proper Spreadsheets

Templates › Household money

Sinking Funds Tracker

Made for households tired of big yearly bills catching them out.

One fund for each big yearly bill, a log of every payment in or out, and a summary showing each balance and whether it will be ready in time. The summary carries a chart that redraws itself as you type.

Tabs
3
Columns
16
Fill themselves in
18

£4.99one payment, yours to keep

  • Opens in Excel, Google Sheets and Numbers
  • Delivered straight away
  • No macros, nothing to install
  • Change it free before you buy

Payment is handled by Stripe. Your card details go to them and never to us. Sales are final, which is why every tab, column and calculation is shown on this page first.

The workbook's summary and the table behind it
A row typed into the real file. Every figure that changes is the spreadsheet's own arithmetic.
The summary page, every figure calculated from the tables
The chart, drawn from the totals in the table beside it
What is inside: the tabs, the columns and what fills itself in
Where you type, and the shaded columns that work themselves out
The guide sheet that opens first and explains the file
Everything included in the download

Everything inside, before you pay

This is the whole design: every tab, every column and how each calculated one is worked out. White cells are yours to fill in; the shaded ones work themselves out and are locked so a formula cannot be overwritten by accident. There is room for 640 rows.

Funds

One row for each thing you save for. After a bill is paid, move its due date on a year. Room for 40 rows.

ColumnTypeWorked out as
Fundtext
Categorychoice (list)
Costcurrency
Next Duedate
BalancecurrencyIF(ISBLANK([fund]), "", SUMIF([Log!fund], [fund], [Log!change]))
Still NeededcurrencyIF(OR(ISBLANK([fund]), ISBLANK([target])), "", MAX(0, [target] - SUMIF([Log!fund], [fund], [Log!change])))
Months LeftnumberIF(ISBLANK([due_date]), "", MAX(0, (YEAR([due_date]) - YEAR(TODAY())) * 12 + MONTH([due_date]) - MONTH(TODAY())))
Steady MonthlycurrencyIF(ISBLANK([target]), "", ROUND([target] / 12, 2))
Needed Each Month NowcurrencyIF(OR(ISBLANK([fund]), ISBLANK([target]), ISBLANK([due_date])), "", ROUND(IFERROR(MAX(0, [target] - SUMIF([Log!fund], [fund], [Log!change])) / MAX(0, (YEAR([due_date]) - YEAR(TODAY())) * 12 + MONTH([due_date]) - MONTH(TODAY())), MAX(0, [target] - SUMIF([Log!fund], [fund], [Log!change]))), 2))
Ready In Time?textIF(OR(ISBLANK([fund]), ISBLANK([target]), ISBLANK([due_date])), "", IF(SUMIF([Log!fund], [fund], [Log!change]) >= [target], "Ready", IF(MAX(0, (YEAR([due_date]) - YEAR(TODAY())) * 12 + MONTH([due_date]) - MONTH(TODAY())) = 0, "Short", IF(SUMIF([Log!fund], [fund], [Log!change]) >= [target] - [target] / 12 * MAX(0, (YEAR([due_date]) - YEAR(TODAY())) * 12 + MONTH([due_date]) - MONTH(TODAY())), "On track", "Behind"))))

Log

Every payment into a fund or out of it, one row each. Room for 600 rows.

ColumnTypeWorked out as
Datedate
Fundchoice (from Funds › fund)
In or Outchoice (list)
Amountcurrency
Change to FundcurrencyIF(ISBLANK([amount]), "", IF([direction] = "Paid out", -[amount], [amount]))
Detailstext

Summary

Where every fund stands today.

MeasureWorked out as
Total saved across all fundsSUM([Log!change])
Total of yearly billsSUM([Funds!target])
Still needed across all fundsSUM([Funds!shortfall])
Steady monthly saving for all billsSUM([Funds!steady_monthly])
Needed each month from now to be readySUM([Funds!needed_monthly])
Funds readyCOUNTIF([Funds!status], "Ready")
Funds on trackCOUNTIF([Funds!status], "On track")
Funds behind or shortCOUNTIF([Funds!status], "Behind") + COUNTIF([Funds!status], "Short")
Next bill dueIF(COUNT([Funds!due_date]) = 0, "", MIN([Funds!due_date]))
Paid in this monthSUMIFS([Log!amount], [Log!direction], "Paid in", [Log!date], ">=" & DATE(YEAR(TODAY()), MONTH(TODAY()), 1))
Paid out this yearSUMIFS([Log!amount], [Log!direction], "Paid out", [Log!date], ">=" & DATE(YEAR(TODAY()), 1, 1))