New research reveals that landlords across the private rented sector are spending a growing portion of their rental income on day-to-day property running costs, with those managing Houses in Multiple Occupation (HMOs) hit especially hard.
According to the latest Landlord Trends Q3 2025 report from Pegasus Insight, running costs now absorb between 25% and 45% of gross rental income, depending on the type of property. These costs include maintenance and repairs, servicing, insurance, utilities, professional fees and regulatory compliance.
Maintenance and repairs remain the largest single expense for landlords, accounting for 31% to 39% of total expenditure, regardless of property type.
On average, annual running costs for a standard buy-to-let property total around £19,604, while landlords operating HMOs are spending significantly more — about £35,720 a year. This stark difference is largely driven by higher utility bills in HMOs, which account for roughly 16% of total costs compared with just 4% for non-HMO properties — partly because bills are more often included in the rent for shared homes.
For context, a typical buy-to-let portfolio generates around £79,000 in gross rental income annually, meaning a substantial share of that income is now eaten up by running costs rather than profit.
Pegasus Insight’s founder Mark Long says the sector is seeing a “step-change” in cost pressures. Even though rental yields are at multi-year highs, landlords are finding that a growing portion of rental income is going toward everyday operating costs and compliance obligations.
He warns that for many landlords — especially those with older properties or more complex portfolios — the challenge is protecting profit margins rather than simply generating income. There’s also a risk that persistent increases in upkeep costs could eventually lead landlords to raise rents as they seek ways to cover rising expenses.



168 Goldhawk Road, Shepherds Bush, London, W12 8HJ / 020 8743 5254
© 2019 Daniel Paul Residential. All rights reserved./ Powered by ![]()