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.
- Tabs
- 3
- Columns
- 21
- Fill themselves in
- 27
£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.
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.
Properties
| Column | Type | Worked out as |
|---|---|---|
| Property Ref | text | |
| Address | text | |
| Type | choice (list) | |
| Status | choice (list) | |
| Monthly Rent | currency | |
| Monthly Mortgage | currency | |
| Monthly Surplus | currency | IF(ISBLANK([monthly_rent]), "", [monthly_rent] - [monthly_mortgage]) |
| Money In To Date | currency | IF(ISBLANK([property_ref]), "", SUMIF([Payments!property], [property_ref], [Payments!money_in])) |
| Money Out To Date | currency | IF(ISBLANK([property_ref]), "", SUMIF([Payments!property], [property_ref], [Payments!money_out])) |
| Position | currency | IF(ISBLANK([property_ref]), "", SUMIF([Payments!property], [property_ref], [Payments!money_in]) - SUMIF([Payments!property], [property_ref], [Payments!money_out])) |
| Payments Logged | number | IF(ISBLANK([property_ref]), "", COUNTIF([Payments!property], [property_ref])) |
Payments
| Column | Type | Worked out as |
|---|---|---|
| Date | date | |
| Property | choice (from Properties › property_ref) | |
| Category | choice (list) | |
| Description | text | |
| Method | choice (list) | |
| Money In | currency | |
| Money Out | currency | |
| Net | currency | IF(AND(ISBLANK([money_in]), ISBLANK([money_out])), "", [money_in] - [money_out]) |
| Year | number | IF(ISBLANK([date]), "", YEAR([date])) |
| Month No | number | IF(ISBLANK([date]), "", MONTH([date])) |
Summary
| Measure | Worked out as |
|---|---|
| Properties on the books | COUNTA([Properties!property_ref]) |
| Properties currently let | COUNTIF([Properties!status], "Let") |
| Total monthly rent expected | SUM([Properties!monthly_rent]) |
| Total monthly mortgage | SUM([Properties!monthly_mortgage]) |
| Monthly surplus before costs | SUM([Properties!monthly_rent]) - SUM([Properties!monthly_mortgage]) |
| Average monthly rent per property | IFERROR(AVERAGE([Properties!monthly_rent]), 0) |
| Total money in, all time | SUM([Payments!money_in]) |
| Total money out, all time | SUM([Payments!money_out]) |
| Overall position, all time | SUM([Payments!money_in]) - SUM([Payments!money_out]) |
| Money in this year | SUMIFS([Payments!money_in], [Payments!txn_year], YEAR(TODAY())) |
| Money out this year | SUMIFS([Payments!money_out], [Payments!txn_year], YEAR(TODAY())) |
| Position this year | SUMIFS([Payments!money_in], [Payments!txn_year], YEAR(TODAY())) - SUMIFS([Payments!money_out], [Payments!txn_year], YEAR(TODAY())) |
| Position this month | SUMIFS([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 | SUMIFS([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 | IFERROR(SUM([Payments!money_out]) / SUM([Payments!money_in]), 0) |
| Strongest property by position | IFERROR(INDEX([Properties!property_ref], MATCH(MAX([Properties!net_position]), [Properties!net_position], 0)), "") |
| Weakest property by position | IFERROR(INDEX([Properties!property_ref], MATCH(MIN([Properties!net_position]), [Properties!net_position], 0)), "") |
| Payments logged with no property | COUNTIFS([Payments!property], "") |
| Payments logged in total | COUNT([Payments!net]) |






