Self-guided tours and reaching the renter
A renter stood at the door on Saturday. The lockbox code had been on file for two days.
Shipped — proven at Willows 2026-10-212026-10-20 · Western Slope · read-only production pulls · from the Western Slope inspection
The answer. A phone is required to book. But no phone never means no send: every reminder, follow-up and the lockbox code goes out on every channel we have, text first, email backup. Any send that still fails raises an engineering alert. Nothing is swallowed.
| Fede's rule (Oct 20) | Status |
|---|---|
| 1. Phone required to book. | Live phone chain #21270, #21273, #21298 |
| 2. Fallback always. "Just because we don't have a phone number doesn't mean we fail." | Shipped reminders (#21438), code and check-in (#21589, #21591, #21595) |
| 3. Never silent. "I cannot swallow it." | Shipped tour-start alert proven; see proof |
Decided and shipped: the code goes out one hour before; the fixes are live. See the Willows proof.
Saturday, before → after
Sat Oct 17, 10:00. Email only, staff-booked. Her replies at 10:02 and 10:11 went to AppFolio's thread.
| Step | What happened | With the fallback rule |
|---|---|---|
| Booking | No phone on file | Phone asked first (live); else email carries everything |
| Thu confirmation | "Text me here" with no number, wrong address | "Reply to this email when you get there", right address |
| Fri 24-hour reminder | Skipped: no phone | Emailed (live since #21438) |
| Sat 9:00 reminder | Skipped: no phone | Emailed, with the code |
| Sat 9:30 alert | Skipped: code on file | Replaced by a tour-start alert: code not delivered |
| Code sender | Waited for "I'm here" that never reached Clara | Code sent one hour before, no wait |
| Any skip | Silent | Engineering alert in #alerts |
| Outcome | Staff emailed the code by hand at 10:30, 30 min late | Code in her inbox at 9:00 |
The fallback rule
| "No phone = skip" rule today | Becomes |
|---|---|
| Reminder sender skips with no phone | Email (already live, #21438) |
| Lockbox code waits for a texted or emailed "I'm here" | Code sent on schedule to every channel |
| "Code missing" alert skips when a code is on file | Tour-start alert when the code was not delivered |
| Leave check-in skips email-only renters (#16824) | Check-in by email |
Failures raise an alert
| When | Where | Carries |
|---|---|---|
| A send due for a tour delivered on no channel | #alerts, as an engineering incident; never a DM (Fede, Oct 6) | Tour id, channel tried, reason (no phone, bounced, failed, skipped), time |
| Code on file, not delivered at tour start | Same, plus the staff tour-start alert (fix 3) | Same, plus unit |
Once per tour per failure.
When the code goes out
Goal: staff never has to hand-type the code. "Hold it until I'm here" is dropped: too strict for how staff work.
| Option | For | Against |
|---|---|---|
| (c) One hour before Recommended | Arrives while she drives over; short window for forwarding; the original Sept 28 design (#12879) | A no-show still got the code. Staff once preferred arrival-only (Oct 5) |
| (a) At booking | Simplest; she has it from day one | Code sits for days, easy to forward. #16811 removed a sender that mailed one 6 hours early |
| (b) With the day-of reminder | Rides a message already sent | Hours of exposure; buried in an inbox by tour time |
Why (c): the latest point that needs no reply from her; nothing in the history argues against it.
Fixes, ready on Fede's word
- Wording per channel (email: "reply to this email when you get there").
- The right address in the confirmation (Sept 27 audit saw the same).
- Tour-start staff alert when the code was not delivered, replacing the 9:30 "code missing" alert.
- Trace the worker mismatch: an Oct 15 check-in step failed as "not registered".
Fixes ship with no switch.
Decisions Decided
| # | Question | Recommendation |
|---|---|---|
| 1 | When does the lockbox code go out: (a) at booking, (b) day-of reminder, (c) one hour before? | (c) |
| 2 | Ship the four fixes? | Yes |
Replies on AppFolio's own showing thread, and AppFolio's showing reminder, moved to the PMS conversations page.
Proof: Willows live run, 2026-10-21
Production, Willows test property only, 20:28–21:59 UTC. Web and worker both ended on commit 14f8458a487d; every build during the run carried all three PRs.
| Renter | Before (Sat 10-17, Western Slope) | After (Willows, 10-21) |
|---|---|---|
| Email only | Never got the code staff typed it 30 min late | Code by email at one hour before |
| Has a phone | Code only after a texted "I'm here" | Text + email at one hour before; re-sent 21 s after "what's the code?" |
| No code on file | Alert 30 min before, nothing at the start | Tour-start alert + text to the host |
| Case | Claim | Result | Evidence |
|---|---|---|---|
| A | Email-only renter gets the code by email one hour before; no alert | Pass | tour ed64114b-5b95-46f3-88e8-0fbd9a7fd242 · email msg_a5749d41-0965-413d-bed2-780ca849a76a 20:45:09Z · delivery [email: sent] · start leg "code-delivered" |
| B | Renter with a phone gets text and email one hour before | Pass | tour edb025cf-45f2-4f83-bff1-c5159125aeb8 · text SM39d11fc96a03222b83fac67ada901824 20:55:03Z · email msg_ba4f7f12-689e-4520-ae6f-b2694c950bcf 20:55:04Z |
| B | "what's the code?" re-sends on both channels | Pass | in SM6e20b27d9064ef9c68092e2ead2c19ff → text SM9c41013ebf372fb8ea6387d46d14b1d9 21:51:31Z · email msg_39d7e841-3f0b-4414-8cee-311a3115eea4 21:51:33Z |
| B | "I'm here" sends no second code; host told she has it | Pass | in SMa214876f905e160f5b62eb7bdcaeeb4d · host SMc27dd92bfbe2ee82c2bf6fb1b9b1b312 21:52:49Z |
| C | No code: tour-start alert and host text; old 30-min alert gone | Pass | tour 4335a624-f0b3-4dd1-87f6-75cf8e7185bd · Sentry JAVASCRIPT-NEXTJS-1KA event 819fe1e079e24da4b50918f640efdef2 21:15:02Z · host SM776bbe2939df87ff8c4d0cf90df286b9 21:15:08Z · lockbox_code_missing_30m = 0 |
| D | A send that reaches no channel raises an alert | Code path only | self-guided-lockbox-code-delivery.ts:471, :505 |
| E | Renter messages name the home's street | Defect | A's email: "Willows Test - 102, Denver, CO 80202" (not 1601 Blake Street) |
| F | Email check-in after an email-only tour | Scheduled, not sent | A ev 194 wait → 22:45:00Z; workflow ended at teardown 21:58Z |
What this run does not prove
- D live: only the code path; no tour with an unreachable renter was booked.
- F sending: the check-in was scheduled, then the run ended.
- C's #alerts post: the test property turns it into a warning, so only Sentry saw it.
Defects found
- Address shows the AppFolio unit label instead of the street. Fix: #21643, #21645.
- No AppFolio showing for a unit with no AppFolio unit id on our side (unit 105). Should alert, not stay silent.
- The one-hour reminder email was skipped by the test-property guard while the code email went.
- The 30-minute note says "door code"; every other message says "lockbox code".
PRs: #21589, #21591, #21595 merged; #21643, #21645 armed.
History and root cause (for engineers)
| When | What we did | What it left open |
|---|---|---|
| Sep 28–30 | Code in the 1-hour reminder text (#12879); staff asked by hand (#12871, #12892). | No phone required; email-only never considered. |
| Sep 28–Oct 2 | Switch churn: six PRs, ~115 PR-hours. | Time went to the switch. |
| Oct 2 | Code emailed to email-only renters (#15555); alert if no code 30 min before (#15623). | No alert for "code on file, undelivered". |
| Oct 5 | Code only on "I'm here" (#16786, #16811); the email send undone. | Named and never fixed: nothing tells an email-only renter to send "I'm here" (#16786, #16824). |
| Oct 7–17 | Wording fix #17619 was text-only. Oct 17: every gap at once. | Email copy untouched. |
Root cause: each fix patched one channel, and every gap ended in a silent skip. In the 30 days before, 7 of 33 Western Slope tours had no phone, and none got reminders.
| Tour | f99af294-a8c3-43fa-b37b-a4ce9ac64f2b · unit 585-201 · Sat 2026-10-17 10:00 MT |
| Skips | T-24h no-phone · T-1h no-phone · 9:30 alert has-code · code sender awaiting-arrival |