Home / Blog / A maintenance request system for small landlords, built from a form and a spreadsheet

A maintenance request system for small landlords, built from a form and a spreadsheet

A step-by-step build of a maintenance request process for small property managers: one form, emergency routing by keyword, status updates from a vendor link and an aging digest, with what our mock test produced.

A tenant mentions a dripping pipe in the hallway. Another texts your cell at 11 p.m. A third emails the office. By Friday nobody remembers which unit the drip was in. If you manage a few dozen doors without Buildium or AppFolio, this post is a step-by-step build of a request system that fixes that, using the two recipes on our property management hub: maintenance request intake and work-order status and aging.

Why bother: what the surveys say

Maintenance is not a side issue. Buildium's 2025 Property Management Industry Report (a vendor survey of 1,796 property managers and 1,507 renters) found maintenance was the second-greatest challenge for property management companies and the number one source of stress for rental owners (Buildium report, PDF). The same report found email is renters' preferred way to hear from their property manager, which is why every message below goes by email first.

Speed matters too. Property Meld, which sells maintenance software, reported an average repair speed of 7.0 days in its June 2025 benchmark and wrote that "once timelines exceed 6.8 days, churn increases" (Property Meld, June 2025, PDF). Its 2025 annual report put the average at 6.81 days, up from 6.32 in 2024 (Property Meld annual 2025, PDF). Both are vendor numbers; read them as direction, not gospel.

Step 1: one form, one sheet

Put a single request form on your site and in every lease packet. Ours asks for:

Field Why
Unit Matched against your rent roll sheet so the office sees the tenant and address
Category (plumbing/leak, electrical, heating or cooling, appliance, doors/locks/windows, pests, something else) Picks the suggested vendor from your vendors sheet
What's wrong Free text; also scanned for emergency words
Permission to enter So the vendor knows whether to wait for the tenant
Text me updates (optional box) Consent recorded with time and wording; unchecked means email only

The first line on the form, above every field, says to call 911 or the gas company if anyone is in danger. A form is not an emergency line, and it should say so.

Two cheap guards keep junk out: a hidden "company" field that bots fill in and people don't, and a signed form key that expires after a day, so an old copy of the form stops working. Both are in the intake recipe.

Step 2: number it and say "we got it"

Every request gets a work-order number (WO-date-sequence) and a row in a work_orders sheet. The tenant gets an email at once and, only if they ticked the box, a text. This is the text from our test run, scenario PM1-02 (invented tenant):

Hi Rosa, we got your maintenance request WO-270309-001 for unit 12-4B (Plumbing / leak). We'll let you know when it's scheduled. Reply STOP to opt out.

If the same unit reports the same problem again a few minutes later, the page says "we already have this request" instead of opening a duplicate (PM1-03).

Step 3: route emergencies by keyword, then let a person decide

The recipe flags a request as an emergency if the text contains words from a list you control (gas, smoke, fire, flood, sparks and so on). It matches whole words, so "gasket" is not "gas" (PM1-08). An emergency texts your on-call person right away, at any hour, and suggests the vendor marked for emergencies. In our 2:10 a.m. flooding test (PM1-05), the on-call text went out at once while the tenant's own confirmation text waited until 8 a.m.; their email arrived immediately.

This is a keyword match, not a judgment. Your on-call person decides what happens next.

Step 4: let the vendor update the tenant

The office email for each order includes a signed status link. The vendor taps Scheduled, Waiting on parts, Couldn't get in or Completed, and the status recipe tells the tenant in a standard line. From scenario PM2-02:

Hi Rosa, your maintenance request WO-270309-001 is scheduled: Tue Mar 10, 1-3 pm. You said we may enter if you are not home. Reply STOP to opt out.

Vendor notes go to the office only; the tenant gets the standard "waiting on a part" line (PM2-06). A forged or edited link gets a 403 and changes nothing (PM2-05).

Step 5: catch what's stuck

Every hour the recipe checks for orders with no update: emergencies after 2 hours, routine ones after 24, each nudged once to a manager. At 8 a.m. a digest lists open orders 7 or more days old, oldest first. Change any of those numbers in the settings.

What we tested, and what we didn't

Both recipes ran end to end in n8n against a local mock of Twilio, the email API and Google Sheets: 15 of 15 scenarios passed for intake and 15 of 15 for status (run October 31, 2026). Nothing was sent to a real person. The full list is on each recipe page and our how we test page explains the setup.

Rules worth reading before you switch it on

Texts need recorded consent and wait for 8 a.m.; see our texting consent page and the FCC rule, 47 CFR 64.1200. Entry-notice rules vary by state, so the permission field records the tenant's answer and nothing more. We're not lawyers; check your state's landlord-tenant law.

Found an error or a better source? Corrections policy. More articles on the blog.