Proper Spreadsheets

Templates › Property

Rental Property Income & Costs

Made for landlords with one to ten properties.

A workbook for a small portfolio: one row per property with its rent and mortgage, one row per payment in or out against a property, and a summary showing income, costs and the position for each property and overall. The summary carries a chart that redraws itself as you type.

Of the 21 columns, you fill in 13 and the other 8 work themselves out, and all 19 figures on the summary do too. There is room for 1,240 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 shaded cells in that row fill themselves in.
  3. The figures on the Summary tab change to include the new row.
  4. The chart, Money out 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 1,240 rows. Open any tab to see its columns.

Properties

11 columns

One row per property you rent out, with the monthly rent coming in and the monthly mortgage going out. The totals on the right fill in from the Payments tab. Ready for 40 rows, every one with its formulas in place.

ColumnWhat goes in itWorked out as
Property RefA short code you will recognise. Payments are matched to a property by this code, so keep each one unique.Type any text.
AddressType any text.
TypePick one: Flat, Maisonette, Terraced house, Semi detached house, Detached house, Bungalow or Room in HMO.
StatusPick one: Let, Vacant, Notice given or Under refurbishment.
Monthly RentType an amount in £.
Monthly MortgageType an amount in £.
Monthly SurplusFills itself in.

The Monthly Rent minus the Monthly Mortgage.

The formulaIF(ISBLANK([monthly_rent]), "", [monthly_rent] - [monthly_mortgage])
Money In To DateFills itself in.

The total of Money In on Payments where Property matches this row's Property Ref.

The formulaIF(ISBLANK([property_ref]), "", SUMIF([Payments!property], [property_ref], [Payments!money_in]))
Money Out To DateFills itself in.

The total of Money Out on Payments where Property matches this row's Property Ref.

The formulaIF(ISBLANK([property_ref]), "", SUMIF([Payments!property], [property_ref], [Payments!money_out]))
PositionFills itself in.

Worked out from this row's Property Ref, using Property, Money In and Money Out on Payments.

The formulaIF(ISBLANK([property_ref]), "", SUMIF([Payments!property], [property_ref], [Payments!money_in]) - SUMIF([Payments!property], [property_ref], [Payments!money_out]))
Payments LoggedFills itself in.

The number of rows on Payments where Property matches this row's Property Ref.

The formulaIF(ISBLANK([property_ref]), "", COUNTIF([Payments!property], [property_ref]))

Payments

10 columns

Every payment in or out, logged against one property and one category. Put rent and deposits in the Money In column and all costs in the Money Out column. Ready for 1,200 rows, every one with its formulas in place.

ColumnWhat goes in itWorked out as
DateType a date.
PropertyPick a property code from the Properties tab. A payment with no property will not count towards any property position.Pick one of the Property Ref entries on Properties.
CategoryPick one: Rent, Other income, Mortgage, Insurance, Repairs, Maintenance, Letting fees, Service charge, Utilities or Other costs.
DescriptionType any text.
MethodPick one: Bank transfer, Standing order, Direct debit, Card, Cash or Cheque.
Money InType an amount in £.
Money OutType an amount in £.
NetFills itself in.

The Money In minus the Money Out.

The formulaIF(AND(ISBLANK([money_in]), ISBLANK([money_out])), "", [money_in] - [money_out])
YearFills itself in.

Worked out from this row's Date.

The formulaIF(ISBLANK([date]), "", YEAR([date]))
Month NoFills itself in.

Worked out from this row's Date.

The formulaIF(ISBLANK([date]), "", MONTH([date]))

Summary

19 figures

The position across the whole portfolio, plus the figures for the current calendar year. Every line reads straight from the Properties and Payments tabs.

FigureWorked out as
Properties on the books

The number of rows on Properties with Property Ref filled in.

The formulaCOUNTA([Properties!property_ref])
Properties currently let

The number of rows on Properties where Status is “Let”.

The formulaCOUNTIF([Properties!status], "Let")
Total monthly rent expectedAdds the rent on every property, including any that are empty at the moment.

The total of Monthly Rent on Properties.

The formulaSUM([Properties!monthly_rent])
Total monthly mortgage

The total of Monthly Mortgage on Properties.

The formulaSUM([Properties!monthly_mortgage])
Monthly surplus before costs

Worked out from Monthly Rent and Monthly Mortgage on Properties.

The formulaSUM([Properties!monthly_rent]) - SUM([Properties!monthly_mortgage])
Average monthly rent per property

The average of Monthly Rent on Properties.

The formulaIFERROR(AVERAGE([Properties!monthly_rent]), 0)
Total money in, all time

The total of Money In on Payments.

The formulaSUM([Payments!money_in])
Total money out, all time

The total of Money Out on Payments.

The formulaSUM([Payments!money_out])
Overall position, all time

Worked out from Money In and Money Out on Payments.

The formulaSUM([Payments!money_in]) - SUM([Payments!money_out])
Money in this year

Worked out from Money In and Year on Payments.

The formulaSUMIFS([Payments!money_in], [Payments!txn_year], YEAR(TODAY()))
Money out this year

Worked out from Money Out and Year on Payments.

The formulaSUMIFS([Payments!money_out], [Payments!txn_year], YEAR(TODAY()))
Position this year

Worked out from Money In, Year and Money Out on Payments.

The formulaSUMIFS([Payments!money_in], [Payments!txn_year], YEAR(TODAY())) - SUMIFS([Payments!money_out], [Payments!txn_year], YEAR(TODAY()))
Position this month

Worked out from Money In, Year, Month No and Money Out on Payments.

The formulaSUMIFS([Payments!money_in], [Payments!txn_year], YEAR(TODAY()), [Payments!txn_month], MONTH(TODAY())) - SUMIFS([Payments!money_out], [Payments!txn_year], YEAR(TODAY()), [Payments!txn_month], MONTH(TODAY()))
Repairs and maintenance this year

Worked out from Money Out, Category and Year on Payments.

The formulaSUMIFS([Payments!money_out], [Payments!category], "Repairs", [Payments!txn_year], YEAR(TODAY())) + SUMIFS([Payments!money_out], [Payments!category], "Maintenance", [Payments!txn_year], YEAR(TODAY()))
Costs as a share of money in

Worked out from Money Out and Money In on Payments.

The formulaIFERROR(SUM([Payments!money_out]) / SUM([Payments!money_in]), 0)
Strongest property by position

Worked out from Property Ref and Position on Properties.

The formulaIFERROR(INDEX([Properties!property_ref], MATCH(MAX([Properties!net_position]), [Properties!net_position], 0)), "")
Weakest property by position

Worked out from Property Ref and Position on Properties.

The formulaIFERROR(INDEX([Properties!property_ref], MATCH(MIN([Properties!net_position]), [Properties!net_position], 0)), "")
Payments logged with no propertyAnything counted here is missing from every property position. Fill in the property column to clear it.

The number of rows on Payments where Property is “” and Date is not blank.

The formulaCOUNTIFS([Payments!property], "", [Payments!date], "<>")
Payments logged in total

The number of rows on Payments with Net filled in.

The formulaCOUNT([Payments!net])