Proper Spreadsheets

Templates › 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.

Of the 31 columns, you fill in 21 and the other 10 work themselves out, and all 13 figures on the summary do too. There is room for 940 rows of your own.

£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.

Already have a spreadsheet of your own? Check it for mistakes, free.

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. What the film shows, in order:
  1. A new row is typed into the Payments tab, one cell at a time, in the white cells a person fills in.
  2. The figures on the Budget Summary tab change to include the new row.
  3. The chart, Where the money has gone by category, redraws with it.
The chart, drawn from the totals in the table beside it. See it full size
Where you type, and the shaded columns that work themselves out. See it full size

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. Open any tab to see its columns.

Rooms

10 columns

One row per room being renovated. The budget and spend figures fill in automatically from the Jobs and Payments tabs. Ready for 40 rows, every one with its formulas in place.

ColumnWhat goes in itWorked out as
RoomUse the same name here every time so the dropdowns on the other tabs stay tidy.Type any text.
FloorPick one: Ground floor, First floor, Second floor, Loft, Basement or Outside.
PriorityPick one: Must do, Nice to have or Later phase.
Target FinishType a date.
BudgetedFills itself in.

The total of Budgeted on Jobs where Room matches this row's Room.

The formulaIF(ISBLANK([room_name]), "", SUMIF([Jobs!room], [room_name], [Jobs!budget]))
SpentFills itself in.

The total of Amount on Payments where Room matches this row's Room.

The formulaIF(ISBLANK([room_name]), "", SUMIF([Payments!room], [room_name], [Payments!amount]))
LeftFills itself in.

Worked out from this row's Room, using Room and Budgeted on Jobs and Room and Amount on Payments.

The formulaIF(ISBLANK([room_name]), "", SUMIF([Jobs!room], [room_name], [Jobs!budget]) - SUMIF([Payments!room], [room_name], [Payments!amount]))
Budget UsedFills itself in.

Worked out from this row's Room, using Room and Amount on Payments and Room and Budgeted on Jobs.

The formulaIF(ISBLANK([room_name]), "", IFERROR(SUMIF([Payments!room], [room_name], [Payments!amount]) / SUMIF([Jobs!room], [room_name], [Jobs!budget]), 0))
Over ByFills itself in.

Worked out from this row's Room, using Room and Amount on Payments and Room and Budgeted on Jobs.

The formulaIF(ISBLANK([room_name]), "", MAX(0, SUMIF([Payments!room], [room_name], [Payments!amount]) - SUMIF([Jobs!room], [room_name], [Jobs!budget])))
StatusFills itself in.

Worked out from this row's Room, using Room and Amount on Payments and Room and Budgeted on Jobs.

The formulaIF(ISBLANK([room_name]), "", IF(SUMIF([Payments!room], [room_name], [Payments!amount]) > SUMIF([Jobs!room], [room_name], [Jobs!budget]), "Over budget", "Within budget"))

Jobs

11 columns

Every piece of work you plan to have done, with the figure you budgeted for it. Ready for 300 rows, every one with its formulas in place.

ColumnWhat goes in itWorked out as
JobGive each job a name you will recognise on the Payments tab, for example Kitchen units fitted.Type any text.
RoomPick one of the Room entries on Rooms.
CategoryPick one: Labour, Materials, Fittings, Appliances, Professional fees, Permits or Other.
ContractorWho you expect to do the work. The actual payee is recorded on each payment.Type any text.
BudgetedType an amount in £.
StagePick one: Not started, Booked, In progress, Complete or Cancelled.
DueType a date.
SpentFills itself in.

The total of Amount on Payments where Job matches this row's Job.

The formulaIF(ISBLANK([job_name]), "", SUMIF([Payments!job], [job_name], [Payments!amount]))
LeftFills itself in.

Worked out from this row's Job and Budgeted, using Job and Amount on Payments.

The formulaIF(OR(ISBLANK([job_name]), ISBLANK([budget])), "", [budget] - SUMIF([Payments!job], [job_name], [Payments!amount]))
Budget UsedFills itself in.

Worked out from this row's Job and Budgeted, using Job and Amount on Payments.

The formulaIF(OR(ISBLANK([job_name]), ISBLANK([budget])), "", IFERROR(SUMIF([Payments!job], [job_name], [Payments!amount]) / [budget], 0))
Budget StatusFills itself in.

Worked out from this row's Job and Budgeted, using Job and Amount on Payments.

The formulaIF(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

10 columns

Every amount you have actually paid out, and who it went to. Ready for 600 rows, every one with its formulas in place.

ColumnWhat goes in it
Date PaidType a date.
Paid ToType any text.
RoomPick one of the Room entries on Rooms.
JobMatch this to a job so the budget comparison works. Leave it blank only for spending you never budgeted for.Pick one of the Job entries on Jobs.
CategoryPick one: Labour, Materials, Fittings, Appliances, Professional fees, Permits or Other.
AmountType an amount in £.
MethodPick one: Bank transfer, Card, Cash, Direct debit or Cheque.
Invoice RefType any text.
DepositTick if this was an up front payment rather than a final bill.Tick it when it applies.
NotesType any text.

Budget Summary

13 figures

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

FigureWorked out as
Total budget

The total of Budgeted on Jobs.

The formulaSUM([Jobs!budget])
Total spent so far

The total of Amount on Payments.

The formulaSUM([Payments!amount])
Budget leftA negative figure means the project as a whole has gone over.

Worked out from Budgeted on Jobs and Amount on Payments.

The formulaSUM([Jobs!budget]) - SUM([Payments!amount])
Share of budget spent

Worked out from Amount on Payments and Budgeted on Jobs.

The formulaIFERROR(SUM([Payments!amount]) / SUM([Jobs!budget]), 0)
Rooms over budget

The number of rows on Rooms where Status is “Over budget”.

The formulaCOUNTIF([Rooms!status], "Over budget")
Jobs over budget

The number of rows on Jobs where Budget Status is “Over”.

The formulaCOUNTIF([Jobs!budget_status], "Over")
Total overspend across rooms

The total of Over By on Rooms.

The formulaSUM([Rooms!over_by])
Worst room for overspend

Worked out from Over By and Room on Rooms.

The formulaIF(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 days

Worked out from Amount and Date Paid on Payments.

The formulaSUMIFS([Payments!amount], [Payments!paid_on], ">=" & (TODAY() - 30))
Payments recorded

The number of rows on Payments with Amount filled in.

The formulaCOUNT([Payments!amount])
Largest single payment

The largest Amount on Payments.

The formulaIFERROR(MAX([Payments!amount]), 0)
Spending not matched to a jobPayments with the Job column left empty, so they sit outside every budget line.

Worked out from Amount and Job on Payments.

The formulaSUM([Payments!amount]) - SUMIF([Payments!job], "<>", [Payments!amount])
Jobs still to start

The number of rows on Jobs where Stage is “Not started”.

The formulaCOUNTIF([Jobs!stage], "Not started")