Home / Property Management / Rent reminder ladder: friendly before the due date, factual after it, and nothing to tenants who paid

Property Management problem 3: Chasing rent by hand every month: the same friendly reminder, then the 'did you forget?' email, then guessing who already paid

Rent reminder ladder

Friendly before the due date, factual after it, and nothing to tenants who paid

Verified with mocksLast tested 2026-10-31 · pricing checked October 2026
Download the workflowpm-rent-reminder-ladder.zip

13/13 test scenarios passed against mock APIs. Includes the n8n workflow, mock data and the test runner.

  • n8n
  • Twilio
  • Resend
  • Stripe
  • Google Sheets

Every morning the workflow reads the rent roll and the payment ledger. Units with rent still open get one friendly email (and a text, with consent) a few days before the due day, then factual reminders on the days you choose after it, each with your Stripe Payment Link pre-filled with the unit and month. Paid units and bank payments still processing get nothing; partial payments are told what's left and what was received. A due day of 31 moves to the month's last day. Late-fee wording appears only if you wrote your own sentence on the rent roll, word for word, and only after the due date; a sentence that mentions eviction or court is held and the office is told. STOP ends texts; replies are forwarded to the office with one 'got it' text.

How the workflow runs

Trigger · On a schedule

Daily 10 am

Steps

  1. Balances + reminder steps

Outcome

  • Send reminders

Also runs on: Twilio inbound SMS → STOP/START or forward reply → Send ack + office email

Drawn from the node names in the workflow file inside the download (workflow.json).

The problem

One vendor industry survey; no reminder-to-payment figures are quoted because we found none we could verify.

Background reading: Rent reminder email and text templates (and when to send each one)

Who it's for

Small property managers and landlords who collect rent online (or want to) and still send reminders by hand.

Tools and monthly cost

ToolOfficial 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
n8nCommunity 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
Stripe (Payment Links; the tenant pays, you receive)Domestic cards 2.9% + 30c per successful transaction. ACH Direct Debit 0.8% per transaction with a $5.00 cap (standard settlement), $4.00 per failed ACH payment, $15.00 per dispute. No setup or monthly fee; Payment Links are included pricing page

Example month: Illustrative arithmetic, not a measured result. One local number sending 100 single-segment texts and receiving 100 a month, at the highest listed carrier fee ($0.005): 100 x ($0.0083 + $0.005) + 100 x $0.0083 + $1.15 number = $3.31 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. Stripe fees on a $1,250 rent payment: by card 2.9% + $0.30 = $36.55; by ACH Direct Debit 0.8% would be $10.00, so the $5.00 cap applies. Who pays the fee is your policy and your state's rules; check before adding a surcharge.

Setup

  1. 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).
  2. 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.
  3. 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.
  4. Company details: PM_COMPANY_NAME, PM_COMPANY_PHONE, PM_COMPANY_ADDRESS, COMPANY_TZ (your time zone; texting hours follow it).
  5. 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.
  6. 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.
  7. PM_REMIND_BEFORE_DAYS (default 3) and PM_REMIND_AFTER_DAYS (default 1,5). These are reminders, not legal notices; pick days that fit your lease and state law.
  8. PM_PAY_URL: your Stripe Payment Link. The workflow adds client_reference_id=UNIT_yyyy-MM so the receipts recipe can match the payment.
  9. late_fee_note on the rent roll (optional): your own sentence, e.g. what your lease says about late fees. It's sent word for word after the due date and never written by the workflow.

Download

Downloadpm-rent-reminder-ladder.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.

13/13 scenarios passed (run 2026-10-31)

PASSPM3-013 days before the 1st: every unpaid unit gets one friendly email; Rosa (consent) also a text; Payment Link carries client_reference_id unit_period; no late-fee wording before the due date
PASSPM3-02Same day again: nothing sent twice
PASSPM3-03Day after the due date: paid (Rosa) and bank-payment-processing (Ben) get nothing; partial (Ella) is told the remaining $700.00 and what was received
PASSPM3-04Dev's late_fee_note threatens eviction/court: his reminder is held, the office is told why and to send it by hand; the 'not lawyers' line is in the summary
PASSPM3-05Ben's bank payment failed (latest status for that session): 5 days after, he gets the balance with the owner's own late-fee sentence, word for word
PASSPM3-06Due day 31 in April: due date becomes Friday, April 30; 3-day reminder on the 27th
PASSPM3-07Due Feb 28, checked Mar 5: the 5-day-late step still finds February's balance across the month end
PASSPM3-08Rosa texts STOP: recorded in sms_optouts, no reply from us; next reminder is email only
PASSPM3-09Tenant reply: forwarded to the office with unit and the 'your call under the lease' note; one 'got it' text, not one per message
PASSPM3-10Unknown number at 11:30 pm: forwarded, no ack at night
PASSPM3-11Forged X-Twilio-Signature: ignored (no opt-out row added)
PASSPM3-12Tenant with no email and no text consent: nothing automatic; the office is told to contact them
PASSPM3-13Email API 429 once during the run: retried; each tenant still gets exactly one email

Actual output from the test run

Scenario PM3-01: the friendly reminder 3 days before rent is due (invented tenant). Names and numbers are invented.

Hi Rosa, a friendly reminder from Elm Street Property Management: March rent for 12-4B ($1,250.00) is due Monday, March 1. Pay online: https://buy.stripe.com/test_mockpmrent?client_reference_id=12-4B_2027-03 Already paid? Thank you, and please ignore this.

Elm Street Property Management
(555) 555-0160
410 Elm St, Omaha, NE

Verified with mocks

  • 3 days before the 1st: every unpaid unit gets one friendly email; Rosa (consent) also a text; Payment Link carries client_reference_id unit_period; no late-fee wording before the due date
  • Same day again: nothing sent twice
  • Day after the due date: paid (Rosa) and bank-payment-processing (Ben) get nothing; partial (Ella) is told the remaining $700.00 and what was received
  • Dev's late_fee_note threatens eviction/court: his reminder is held, the office is told why and to send it by hand; the 'not lawyers' line is in the summary
  • Ben's bank payment failed (latest status for that session): 5 days after, he gets the balance with the owner's own late-fee sentence, word for word
  • Due day 31 in April: due date becomes Friday, April 30; 3-day reminder on the 27th
  • Due Feb 28, checked Mar 5: the 5-day-late step still finds February's balance across the month end
  • Rosa texts STOP: recorded in sms_optouts, no reply from us; next reminder is email only
  • Tenant reply: forwarded to the office with unit and the 'your call under the lease' note; one 'got it' text, not one per message
  • Unknown number at 11:30 pm: forwarded, no ack at night
  • Forged X-Twilio-Signature: ignored (no opt-out row added)
  • Tenant with no email and no text consent: nothing automatic; the office is told to contact them
  • Email API 429 once during the run: retried; each tenant still gets exactly one email
  • 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

  • Balances come from the rent_payments ledger (filled by the Stripe receipts recipe or by hand). Cash and checks must be entered there or the tenant still gets reminders.
  • A tenant with no email and no text consent gets nothing automatic; the office is told to reach them.
  • 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.
  • 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.