Proper Spreadsheets

Templates › Property

Short Let & Holiday Rental Tracker

Made for hosts running short lets.

A booking log with monthly occupancy, income and net after platform fees and cleaning. The summary carries a chart that redraws itself as you type.

Of the 26 columns, you fill in 11 and the other 15 work themselves out, and all 17 figures on the summary do too. There is room for 348 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 Bookings 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 What I Really Make tab change to include the new row.
  4. The chart, Income by platform, 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 348 rows. Open any tab to see its columns.

Bookings

14 columns

One row per stay. Fill in the guest, the dates and the money, and the rest works itself out. Ready for 300 rows, every one with its formulas in place.

ColumnWhat goes in itWorked out as
Booking RefType any text.
GuestType any text.
PlatformPick one: Airbnb, Booking.com, Vrbo, Direct, Returning Guest or Other.
Check InType a date.
Check OutType a date.
NightsFills itself in.

The Check Out minus the Check In.

The formulaIF(OR(ISBLANK([check_in]),ISBLANK([check_out])),"",[check_out]-[check_in])
Guest PaidThe full amount the guest paid for the stay, before any fee is taken off.Type an amount in £.
Platform FeeType an amount in £.
Cleaning CostType an amount in £.
Other CostsLaundry, consumables, welcome basket, anything else tied to this stay.Type an amount in £.
Net To MeFills itself in.

Worked out from this row's Guest Paid, Platform Fee, Cleaning Cost and Other Costs.

The formulaIF(ISBLANK([gross_paid]),"",[gross_paid]-IF(ISBLANK([platform_fee]),0,[platform_fee])-IF(ISBLANK([cleaning_cost]),0,[cleaning_cost])-IF(ISBLANK([other_costs]),0,[other_costs]))
Net Per NightFills itself in.

Worked out from this row's Guest Paid, Check In, Check Out, Net To Me and Nights.

The formulaIF(OR(ISBLANK([gross_paid]),ISBLANK([check_in]),ISBLANK([check_out])),"",IFERROR([net]/[nights],0))
MonthTaken from the check in date, so a stay that crosses a month counts in the month it started.Fills itself in.

Worked out from this row's Check In.

The formulaIF(ISBLANK([check_in]),"",TEXT([check_in],"YYYY-MM"))
YearFills itself in.

Worked out from this row's Check In.

The formulaIF(ISBLANK([check_in]),"",YEAR([check_in]))

By Month

12 columns

One row per month. Enter the month and how many nights the place was available, and the income, costs and occupancy are pulled from the bookings. Ready for 48 rows, every one with its formulas in place.

ColumnWhat goes in itWorked out as
Month StartingUse the first day of the month, for example 01/09/2026.Type a date.
Nights AvailableNights the place was actually open to let. Drop the days you blocked off for yourself.Type a number.
Month KeyUsed to match bookings to this month.Fills itself in.

Worked out from this row's Month Starting.

The formulaIF(ISBLANK([month_start]),"",TEXT([month_start],"YYYY-MM"))
BookingsFills itself in.

Worked out from this row's Month Starting and Month Key, using Month on Bookings.

The formulaIF(ISBLANK([month_start]),"",COUNTIF([Bookings!stay_month],[month_key]))
Nights BookedFills itself in.

Worked out from this row's Month Starting and Month Key, using Month and Nights on Bookings.

The formulaIF(ISBLANK([month_start]),"",SUMIF([Bookings!stay_month],[month_key],[Bookings!nights]))
OccupancyFills itself in.

Worked out from this row's Month Starting, Nights Booked and Nights Available.

The formulaIF(ISBLANK([month_start]),"",IFERROR([nights_booked]/[nights_available],0))
Guests PaidFills itself in.

Worked out from this row's Month Starting and Month Key, using Month and Guest Paid on Bookings.

The formulaIF(ISBLANK([month_start]),"",SUMIF([Bookings!stay_month],[month_key],[Bookings!gross_paid]))
Platform FeesFills itself in.

Worked out from this row's Month Starting and Month Key, using Month and Platform Fee on Bookings.

The formulaIF(ISBLANK([month_start]),"",SUMIF([Bookings!stay_month],[month_key],[Bookings!platform_fee]))
CleaningFills itself in.

Worked out from this row's Month Starting and Month Key, using Month and Cleaning Cost on Bookings.

The formulaIF(ISBLANK([month_start]),"",SUMIF([Bookings!stay_month],[month_key],[Bookings!cleaning_cost]))
Other CostsFills itself in.

Worked out from this row's Month Starting and Month Key, using Month and Other Costs on Bookings.

The formulaIF(ISBLANK([month_start]),"",SUMIF([Bookings!stay_month],[month_key],[Bookings!other_costs]))
Net IncomeFills itself in.

Worked out from this row's Month Starting, Guests Paid, Platform Fees, Cleaning and Other Costs.

The formulaIF(ISBLANK([month_start]),"",[gross_income]-[fees]-[cleaning]-[other])
Net Per Night LetFills itself in.

Worked out from this row's Month Starting, Net Income and Nights Booked.

The formulaIF(ISBLANK([month_start]),"",IFERROR([net_income]/[nights_booked],0))

What I Really Make

17 figures

The headline figures, taken straight from the bookings and the monthly rows.

FigureWorked out as
Bookings recorded

The number of rows on Bookings with Booking Ref filled in.

The formulaCOUNTA([Bookings!booking_ref])
Nights let

The total of Nights on Bookings.

The formulaSUM([Bookings!nights])
Total guests paid

The total of Guest Paid on Bookings.

The formulaSUM([Bookings!gross_paid])
Platform fees paid

The total of Platform Fee on Bookings.

The formulaSUM([Bookings!platform_fee])
Cleaning paid

The total of Cleaning Cost on Bookings.

The formulaSUM([Bookings!cleaning_cost])
Other costs

The total of Other Costs on Bookings.

The formulaSUM([Bookings!other_costs])
Net after all costs

Worked out from Guest Paid, Platform Fee, Cleaning Cost and Other Costs on Bookings.

The formulaSUM([Bookings!gross_paid])-SUM([Bookings!platform_fee])-SUM([Bookings!cleaning_cost])-SUM([Bookings!other_costs])
Costs as a share of income

Worked out from Platform Fee, Cleaning Cost, Other Costs and Guest Paid on Bookings.

The formulaIFERROR((SUM([Bookings!platform_fee])+SUM([Bookings!cleaning_cost])+SUM([Bookings!other_costs]))/SUM([Bookings!gross_paid]),0)
Average nightly rate

Worked out from Guest Paid and Nights on Bookings.

The formulaIFERROR(SUM([Bookings!gross_paid])/SUM([Bookings!nights]),0)
Average net per night let

Worked out from Guest Paid, Platform Fee, Cleaning Cost, Other Costs and Nights on Bookings.

The formulaIFERROR((SUM([Bookings!gross_paid])-SUM([Bookings!platform_fee])-SUM([Bookings!cleaning_cost])-SUM([Bookings!other_costs]))/SUM([Bookings!nights]),0)
Average nights per booking

Worked out from Nights and Booking Ref on Bookings.

The formulaIFERROR(SUM([Bookings!nights])/COUNTA([Bookings!booking_ref]),0)
Occupancy across the months listedNights let divided by nights available on the By Month tab.

Worked out from Nights Booked and Nights Available on By Month.

The formulaIFERROR(SUM([By Month!nights_booked])/SUM([By Month!nights_available]),0)
Best month for net income

The largest Net Income on By Month.

The formulaMAX([By Month!net_income])
Average net income per month

Worked out from Net Income and Nights Available on By Month.

The formulaIFERROR(SUM([By Month!net_income])/COUNT([By Month!nights_available]),0)
Guests paid this year

Worked out from Year and Guest Paid on Bookings.

The formulaSUMIF([Bookings!stay_year],YEAR(TODAY()),[Bookings!gross_paid])
Net this year

Worked out from Year, Guest Paid, Platform Fee, Cleaning Cost and Other Costs on Bookings.

The formulaSUMIF([Bookings!stay_year],YEAR(TODAY()),[Bookings!gross_paid])-SUMIF([Bookings!stay_year],YEAR(TODAY()),[Bookings!platform_fee])-SUMIF([Bookings!stay_year],YEAR(TODAY()),[Bookings!cleaning_cost])-SUMIF([Bookings!stay_year],YEAR(TODAY()),[Bookings!other_costs])
Nights let this year

Worked out from Year and Nights on Bookings.

The formulaSUMIF([Bookings!stay_year],YEAR(TODAY()),[Bookings!nights])