Home / Property Management / Rental inquiry auto-reply: the same facts to every prospect, in the order they asked
Property Management problem 5: Rental inquiries pile up in the inbox, and every prospect gets a slightly different answer depending on who replies
Rental inquiry auto-reply
The same facts to every prospect, in the order they asked
A web form (or a listing's link to it) takes name, email, optional phone and text consent, the listing and a message. Every prospect gets one email with the same facts from your listings sheet: rent, deposit, pet policy, availability, and links to your written rental criteria, showing times and the application. The reply template is identical for everyone except the first name; what the prospect wrote never changes it. Leased or unknown listings get every available listing in a fixed order. If your listing text reads as a preference ('no kids', 'perfect for a young couple'), nothing goes out and the manager is told which words to fix, with HUD's page. Questions about accommodations or assistance animals still get the standard reply, and the manager is flagged to answer personally.
How the workflow runs
Trigger · When an event arrives
Inquiry submit (POST)
Steps
- Honeypot + form key + dedupe
- Same reply for everyone + flags
Outcome
- Answer the browser
- Send reply + office
Also runs on: Inquiry form (GET) → Render form → Send form page
Also runs on: Hourly, 8 am-8 pm → Send held texts → Send held
Drawn from the node names in the workflow file inside the download (workflow.json).
The problem
Federal law and HUD guidance, not a cost study; we quote no response-time figures because the ones we found couldn't be verified.
- The Fair Housing Act makes it unlawful to make, print or publish any notice or statement about a dwelling that indicates a preference, limitation or discrimination based on race, color, religion, sex, handicap, familial status or national origin (42 U.S.C. 3604(c)). The same facts to everyone is the simplest way to stay clear of it. Source: 42 U.S.C. 3604 (discriminatory statements in ads, 3604(c); reasonable accommodations, 3604(f)(3)(B)) (Federal statute)
- HUD lists the seven protected classes under the Fair Housing Act: race, color, national origin, religion, sex, familial status and disability. Source: HUD: Fair Housing Act overview (seven protected classes) (Federal agency)
- Refusing reasonable accommodations needed for a person with a disability to use a dwelling is unlawful (42 U.S.C. 3604(f)(3)(B); 24 CFR 100.204), so those questions go to a person. Source: eCFR: 24 CFR 100.204, reasonable accommodations (Federal regulation)
Background reading: Can you auto-reply to rental inquiries without a Fair Housing problem? A checklist
Who it's for
Small property managers and landlords who list rentals on their own site and listing sites and answer inquiries by email.
Tools and monthly cost
| Tool | Official price |
|---|---|
| Twilio US local phone number | $1.15 / month pricing page |
| Twilio US SMS, sent or received | $0.0083 per segment, plus carrier fees on outbound texts of $0.0035-$0.005 per segment pricing page |
| A2P 10DLC registration (required to text US tenants from a local number) | One-time: $4.50 brand registration and $15 campaign vetting. Monthly: $1.50-$10 per campaign by use case pricing page |
| Resend (sends the emails; any email API that accepts an Idempotency-Key works) | Free: 3,000 emails / month, 100 / day. Pro: $20 / month for 50,000 emails pricing page |
| Google Sheets (rent roll, work orders, consent log, opt-out list, payment ledger) | Free with a Google Account pricing page |
| n8n | Community Edition: free if you self-host (you pay for the server). n8n Cloud: Starter EUR 20 / month or Pro EUR 50 / month, billed annually pricing page |
Example month: Illustrative arithmetic, not a measured result. One local number sending 40 single-segment texts and receiving 40 a month, at the highest listed carrier fee ($0.005): 40 x ($0.0083 + $0.005) + 40 x $0.0083 + $1.15 number = $2.01 a month in Twilio usage, plus the A2P 10DLC campaign fee ($1.50-$10 a month) and one-time registration ($4.50 brand + $15 campaign vetting). Emails stay inside Resend's free tier at this volume. n8n comes on top. Your volumes will differ.
Setup
- Google Sheet: a rent_roll tab with columns unit, property, address, tenant_name, email, phone, rent, due_day, late_fee_note, active. Your property management software can export this; nothing here connects to Buildium or AppFolio (Buildium's Open API needs its Premium plan, and AppFolio's API is for approved partners).
- Texts need a Twilio number on an approved A2P 10DLC campaign. Set TWILIO_ACCOUNT_SID, TWILIO_BASIC_AUTH (base64 of SID:auth token) and PM_TWILIO_FROM. Point the number's Messaging webhook at /webhook/mss-pm3-sms so STOP and replies are handled in one place.
- Email: MSS_EMAIL_API (e.g. https://api.resend.com), EMAIL_API_KEY, PM_EMAIL_FROM, PM_OFFICE_EMAIL, PM_MANAGER_EMAIL. Every send carries an Idempotency-Key, so a retried run never emails twice.
- Company details: PM_COMPANY_NAME, PM_COMPANY_PHONE, PM_COMPANY_ADDRESS, COMPANY_TZ (your time zone; texting hours follow it).
- Google Sheet stand-in: MSS_SHEET_URL points at the shared sheets (rent_roll, sms_consent, sms_optouts, inbound_texts and the recipe's own sheets). In production, swap these HTTP calls for n8n's Google Sheets node.
- Remove the test-only mss-pm*-tick webhooks (or put them behind n8n header auth) and make sure MSS_TEST_CLOCK is NOT set in production.
- A listings sheet (listing_id, address, beds, baths, rent, deposit, pets, available, description, status = available or leased; optional per-listing criteria_url, showing_url, apply_url) and defaults LISTINGS_URL, CRITERIA_URL (your written rental criteria, the same for everyone), SHOWING_URL and APPLY_URL.
- Share /webhook/mss-pm5-inquiry (add ?listing=L1 to preselect a listing). PM_FORM_HMAC_SECRET and FORM_MIN_SECONDS as in the intake recipe; ACCOMMODATION_WORDS to change the flag list.
Download
Downloadpm-rental-inquiry-auto-reply.zip
Contains the n8n workflow, the mock data, the test runner with its last results, and the mock server we tested against. All keys in .env.example are fake.
Test result
Every workflow was imported into n8n 2.45.4 on an isolated test instance and run end to end. Twilio (signed inbound webhooks, HTTP 429), the email API (Resend-style), Stripe webhook events (signed with a mock secret, verified on the raw body) and Google Sheets were replaced by a local mock server built from the vendors' public docs. A frozen test clock checks due dates and the 8 a.m.-9 p.m. texting window. These recipes use no AI model; every decision is a written rule. Tenants, prospects, units and listings are invented. Verified with mocks; nothing was sent to a real person or account. How we test.
11/11 scenarios passed (run 2026-10-31)
| PASS | PM5-01 | Form page: available listings only (leased L2 hidden), deep link preselects L3, signed form key, honeypot, text-consent box, Equal Housing Opportunity line |
| PASS | PM5-02 | Inquiry about L1: one email with rent, deposit, pets, the written criteria link, showing and apply links; inquiry logged; office copy with their message; text (consent logged) |
| PASS | PM5-03 | Same person, same listing again within a day: 'already sent', no second email |
| PASS | PM5-04 | Fair Housing parity: two prospects with very different messages (kids; retired/church) get word-for-word the same reply except the first name; their messages never appear in it |
| PASS | PM5-05 | Leased listing: told it's gone, then every available listing in a fixed order (L1 before L3), each with criteria, showing and apply links |
| PASS | PM5-06 | Listing text that reads as a preference ('perfect for a young...', 'no kids'): nothing sent to the prospect; manager told which words and pointed to HUD; logged as not replied |
| PASS | PM5-07 | Accommodation question (emotional support animal): the standard reply still goes out, unchanged; manager flagged to answer personally, citing 42 U.S.C. 3604(f)(3)(B) and HUD |
| PASS | PM5-08 | Honeypot filled: polite page, nothing sent or logged |
| PASS | PM5-09 | Forged form key: 400, nothing sent |
| PASS | PM5-10 | Inquiry at 11:10 pm: email right away, text held until 8 am (not 7 am) |
| PASS | PM5-11 | Email API 429 once: retried, exactly one reply |
Actual output from the test run
Scenario PM5-02: the reply a prospect gets about a listing (invented prospect and listing). Names and numbers are invented.
Hi Jordan, Thanks for asking about 12 Maple Court, Unit 4B, Omaha, NE. Here are the details: 12 Maple Court, Unit 4B, Omaha, NE: 2 bd / 1 ba, $1,250.00/month, deposit $1,250.00, available April 1. Pets: cats and dogs under 40 lb, $300 pet deposit. Second floor, in-unit laundry, off-street parking. Rental criteria (the same for every applicant): https://elmstreet-pm.example/criteria Book a showing: https://elmstreet-pm.example/showings/L1 Apply: https://elmstreet-pm.example/apply/L1 Questions? Reply to this email or call (555) 555-0160. Equal Housing Opportunity. We answer every inquiry with the same information, in the order we get them. Elm Street Property Management Elm Street Property Management (555) 555-0160 410 Elm St, Omaha, NE
Verified with mocks
- Form page: available listings only (leased L2 hidden), deep link preselects L3, signed form key, honeypot, text-consent box, Equal Housing Opportunity line
- Inquiry about L1: one email with rent, deposit, pets, the written criteria link, showing and apply links; inquiry logged; office copy with their message; text (consent logged)
- Same person, same listing again within a day: 'already sent', no second email
- Fair Housing parity: two prospects with very different messages (kids; retired/church) get word-for-word the same reply except the first name; their messages never appear in it
- Leased listing: told it's gone, then every available listing in a fixed order (L1 before L3), each with criteria, showing and apply links
- Listing text that reads as a preference ('perfect for a young...', 'no kids'): nothing sent to the prospect; manager told which words and pointed to HUD; logged as not replied
- Accommodation question (emotional support animal): the standard reply still goes out, unchanged; manager flagged to answer personally, citing 42 U.S.C. 3604(f)(3)(B) and HUD
- Honeypot filled: polite page, nothing sent or logged
- Forged form key: 400, nothing sent
- Inquiry at 11:10 pm: email right away, text held until 8 am (not 7 am)
- Email API 429 once: retried, exactly one reply
- Verified with mocks; invented tenants, prospects, units and listings only.
Documented from official API docs only
Built to the vendor's documentation but not run against a live account. Check these on yours.
- Stripe webhook signing (Stripe-Signature t= / v1=, HMAC-SHA256 of timestamp.raw_body, 5-minute tolerance), Checkout Session fields (client_reference_id, payment_status, amount_total) and the async ACH events come from Stripe's public docs; tests sign events locally with a mock secret, not against a live Stripe account.
- Twilio request signing, the Messages API, 429 behavior and built-in STOP handling come from Twilio's docs. The email API follows Resend's documented request shape.
Limitations
- No screening, scoring or ranking of prospects happens here, on purpose. Applications and decisions belong in your screening process under your written criteria.
- The word check catches common red-flag phrases, not every Fair Housing problem. Have someone who knows the law read your listings.
- Every outgoing message is checked against a word list first (PM_LINT in pmlib.py): eviction, court action, lawsuit, collections, credit reporting, lockouts, shut-offs, 'notice to quit/pay' and police are blocked, and so are Fair Housing red-flag phrases ('no kids', 'adults only', 'perfect for a young couple', 'English only', 'able-bodied'...). A blocked message is held and the office is told why.
- Late fees, grace periods, partial-rent rules and notice periods vary by state and city, so nothing legal is hard-coded: every day, hour and amount is a setting, and late-fee wording is only ever your own sentence from the rent roll, sent word for word. The recipes never write notices to pay or quit, never mention eviction, court or credit reporting, and never act on a lease.
- Generic stack (web form, Google Sheet, Twilio, email API, Stripe Payment Links). Not built for Buildium, AppFolio, Rent Manager or any other property management system; we make no claim these recipes plug into them.
- Not legal advice and not a compliance guarantee. Texts to tenants and prospects go only to numbers with consent recorded on our own forms, only between 8 a.m. and 9 p.m. local time, and plain-English opt-outs (STOP, 'stop texting me', ...) are honored until the person texts START (47 CFR 64.1200 is the federal rule we design around). Some states are stricter; have your attorney review texting consent before going live.
- Fair Housing: the Act covers race, color, national origin, religion, sex, familial status and disability (HUD: https://www.hud.gov/helping-americans/fair-housing-act-overview); many states and cities add more classes. Reasonable accommodation questions: https://www.hud.gov/helping-americans/disabilities.
- We're not lawyers. Nothing here is legal advice. Check HUD's Fair Housing pages (hud.gov/helping-americans/fair-housing-act-overview), the FCC texting rules (47 CFR 64.1200 on ecfr.gov) and your state's landlord-tenant law, or ask a local attorney.