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.
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
| Column | Type | Worked out as |
|---|---|---|
| Fund | text | |
| Category | choice (list) | |
| Cost | currency | |
| Next Due | date | |
| Balance | currency | IF(ISBLANK([fund]), "", SUMIF([Log!fund], [fund], [Log!change])) |
| Still Needed | currency | IF(OR(ISBLANK([fund]), ISBLANK([target])), "", MAX(0, [target] - SUMIF([Log!fund], [fund], [Log!change]))) |
| Months Left | number | IF(ISBLANK([due_date]), "", MAX(0, (YEAR([due_date]) - YEAR(TODAY())) * 12 + MONTH([due_date]) - MONTH(TODAY()))) |
| Steady Monthly | currency | IF(ISBLANK([target]), "", ROUND([target] / 12, 2)) |
| Needed Each Month Now | currency | IF(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? | text | IF(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
| Column | Type | Worked out as |
|---|---|---|
| Date | date | |
| Fund | choice (from Funds › fund) | |
| In or Out | choice (list) | |
| Amount | currency | |
| Change to Fund | currency | IF(ISBLANK([amount]), "", IF([direction] = "Paid out", -[amount], [amount])) |
| Details | text |
Summary
| Measure | Worked out as |
|---|---|
| Total saved across all funds | SUM([Log!change]) |
| Total of yearly bills | SUM([Funds!target]) |
| Still needed across all funds | SUM([Funds!shortfall]) |
| Steady monthly saving for all bills | SUM([Funds!steady_monthly]) |
| Needed each month from now to be ready | SUM([Funds!needed_monthly]) |
| Funds ready | COUNTIF([Funds!status], "Ready") |
| Funds on track | COUNTIF([Funds!status], "On track") |
| Funds behind or short | COUNTIF([Funds!status], "Behind") + COUNTIF([Funds!status], "Short") |
| Next bill due | IF(COUNT([Funds!due_date]) = 0, "", MIN([Funds!due_date])) |
| Paid in this month | SUMIFS([Log!amount], [Log!direction], "Paid in", [Log!date], ">=" & DATE(YEAR(TODAY()), MONTH(TODAY()), 1)) |
| Paid out this year | SUMIFS([Log!amount], [Log!direction], "Paid out", [Log!date], ">=" & DATE(YEAR(TODAY()), 1, 1)) |






