sheetsmith

Templates › Home and property

Home Renovation Budget

Made for anyone doing up a house.

Plan a budget for every job room by room, record what you actually pay and to whom, and see at a glance what is left and which rooms have run over. The summary carries a chart that redraws itself as you type.

Tabs
4
Columns
31
Fill themselves in
23

£7one 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 940 rows.

Rooms

One row per room being renovated. The budget and spend figures fill in automatically from the Jobs and Payments tabs. Room for 40 rows.

ColumnTypeWorked out as
Roomtext
Floorchoice (list)
Prioritychoice (list)
Target Finishdate
BudgetedcurrencyIF(ISBLANK([room_name]), "", SUMIF([Jobs!room], [room_name], [Jobs!budget]))
SpentcurrencyIF(ISBLANK([room_name]), "", SUMIF([Payments!room], [room_name], [Payments!amount]))
LeftcurrencyIF(ISBLANK([room_name]), "", SUMIF([Jobs!room], [room_name], [Jobs!budget]) - SUMIF([Payments!room], [room_name], [Payments!amount]))
Budget UsedpercentIF(ISBLANK([room_name]), "", IFERROR(SUMIF([Payments!room], [room_name], [Payments!amount]) / SUMIF([Jobs!room], [room_name], [Jobs!budget]), 0))
Over BycurrencyIF(ISBLANK([room_name]), "", MAX(0, SUMIF([Payments!room], [room_name], [Payments!amount]) - SUMIF([Jobs!room], [room_name], [Jobs!budget])))
StatustextIF(ISBLANK([room_name]), "", IF(SUMIF([Payments!room], [room_name], [Payments!amount]) > SUMIF([Jobs!room], [room_name], [Jobs!budget]), "Over budget", "Within budget"))

Jobs

Every piece of work you plan to have done, with the figure you budgeted for it. Room for 300 rows.

ColumnTypeWorked out as
Jobtext
Roomchoice (from Rooms › room_name)
Categorychoice (list)
Contractortext
Budgetedcurrency
Stagechoice (list)
Duedate
SpentcurrencyIF(ISBLANK([job_name]), "", SUMIF([Payments!job], [job_name], [Payments!amount]))
LeftcurrencyIF(OR(ISBLANK([job_name]), ISBLANK([budget])), "", [budget] - SUMIF([Payments!job], [job_name], [Payments!amount]))
Budget UsedpercentIF(OR(ISBLANK([job_name]), ISBLANK([budget])), "", IFERROR(SUMIF([Payments!job], [job_name], [Payments!amount]) / [budget], 0))
Budget StatustextIF(OR(ISBLANK([job_name]), ISBLANK([budget])), "", IF(SUMIF([Payments!job], [job_name], [Payments!amount]) > [budget], "Over", IF(SUMIF([Payments!job], [job_name], [Payments!amount]) = [budget], "On budget", "Within")))

Payments

Every amount you have actually paid out, and who it went to. Room for 600 rows.

ColumnType
Date Paiddate
Paid Totext
Roomchoice (from Rooms › room_name)
Jobchoice (from Jobs › job_name)
Categorychoice (list)
Amountcurrency
Methodchoice (list)
Invoice Reftext
Depositbool
Notestext

Budget Summary

The headline answers: what you planned to spend, what has gone out, what is left and where it is slipping.

MeasureWorked out as
Total budgetSUM([Jobs!budget])
Total spent so farSUM([Payments!amount])
Budget leftSUM([Jobs!budget]) - SUM([Payments!amount])
Share of budget spentIFERROR(SUM([Payments!amount]) / SUM([Jobs!budget]), 0)
Rooms over budgetCOUNTIF([Rooms!status], "Over budget")
Jobs over budgetCOUNTIF([Jobs!budget_status], "Over")
Total overspend across roomsSUM([Rooms!over_by])
Worst room for overspendIF(MAX([Rooms!over_by]) = 0, "None yet", IFERROR(INDEX([Rooms!room_name], MATCH(MAX([Rooms!over_by]), [Rooms!over_by], 0)), "None yet"))
Spent in the last 30 daysSUMIFS([Payments!amount], [Payments!paid_on], ">=" & (TODAY() - 30))
Payments recordedCOUNT([Payments!amount])
Largest single paymentIFERROR(MAX([Payments!amount]), 0)
Spending not matched to a jobSUM([Payments!amount]) - SUMIF([Payments!job], "<>", [Payments!amount])
Jobs still to startCOUNTIF([Jobs!stage], "Not started")