The Resident Who Was Still a Prospect
Investigation · Camellia Apartments · Aug 15, 2026 · Proposed — pending Fede's review
What happened, in one paragraph. SadieKate Ball moved into unit 405 in early August with her boyfriend Jace Weaver. AppFolio knows she's a current resident. PropFlow still shows her as a prospect with an unapproved application and no move-in date. When her car got towed at 4:30 AM she called Clara four times, got transferred (once to a person, once to voicemail), texted the property long messages through AppFolio's texting feature that nobody on the team saw, and the lease-signing email AppFolio sent her went to a mistyped address that bounced into the void. Every one of those failures has a specific, findable cause — and none of them is unique to her.
Timeline
Aug 2–3
Jace inquires via Apartments.com; SadieKate tours on his behalf. Both get records in PropFlow.
Aug 4, 2:08 AM
AppFolio guest-card sync brings in her contact info — including the email typo sadiekb05@hmail.com (should be hotmail). It becomes her primary email. No validation catches it.
Aug 5
Jace's application is approved. The approval lands on his record only — hers stays "applied" forever. AppFolio creates the unit-405 lease (starts Sep 1). The lease-signing email presumably goes to the dead address. It is never signed — and stays unsigned to this day.
~Aug 7
They move in early (Jace confirmed Aug 7 move-in on a call). PropFlow cannot represent an early move-in: its resident/not-resident rule only compares the lease start date to today.
Aug 9, 8 PM
She calls to get the loading ramp opened for move-in. Clara transfers — nobody picks up.
Aug 15, 4:30 AM
Her car is towed. She calls furious; transfer connects to a human for 35 seconds. Six minutes later she calls back asking for the emergency line; transfer goes to voicemail and she leaves the full complaint. PropFlow's post-call processor writes excellent action items ("investigate tow, call resident back urgently") — into an activity log nobody reads. No alert fires.
Aug 15, morning
She sends long, detailed texts to the property through AppFolio's texting feature (the tow, the registered vehicles, the request for a written report). These never reach PropFlow, and almost certainly never reached the team either — see below.
Aug 15, 4 PM
Someone fixes her email in AppFolio. The corrected address syncs into PropFlow — as a secondary record; the dead typo stayed primary. Update Aug 16: fixed and verified — her real address is now primary (see D2).
Root cause 1 — "Resident" is decided by a calendar date, not by reality
PropFlow marks an occupancy pending whenever the lease start date is in the future, and pending people are invisible to the phone identity lookup, the tenant list, and the resident experience. That's the whole rule — one date comparison. It never reads AppFolio's actual tenant status or move-in date.
- Early move-ins cannot exist in this model. SadieKate has lived in 405 for over a week; PropFlow says she starts Sep 1.
- Nothing flips pending→active on a schedule. The only escape is a later rent-roll sync noticing the person. If it misses, they're stranded indefinitely.
- Six people at Camellia are pending right now, all with Sep 1 leases: SadieKate & Jace (405), Carly Sprague (207), Hayley Bannochie (612), Jacob Warren (403), Salvador Guerra (112). All should self-heal Sep 1 — if the sync catches them. Hayley's record hasn't been re-synced in two weeks, which is exactly the kind of miss that strands someone.
- Her Aug 9 call therefore resolved as a prospect and the towing complaints got written into her leasing record's notes. (A fix shipped Aug 13 now tags such calls "incoming resident, Unit 405" — her Aug 15 calls got that — but routing and the UI still treat her as a prospect.)
Root cause 2 — Approval never crosses a couple's application
Jace applied as primary; SadieKate is the co-applicant. When the application group synced from AppFolio, her application was folded into his card — and the approval was written only to his record. Her page reads "Under review / waiting on a decision" permanently. The move-in field on her page is blank because that page only shows what a prospect said they wanted ("desired move-in") and never looks at the actual lease or occupancy — it has no idea a signed-lease-pending, Sep-1 tenancy exists.
Root cause 3 — The email typo, and why the fix didn't take
hmail.com passed the only check we have (a shape check: "looks like an email"). We already own a proper validator that does real DNS lookups and would have caught it on day one — it's wired to exactly one thing: the investor-deck login form. Nothing in leasing uses it.
When AppFolio corrected the address on Aug 15, the sync path her record takes (she's a "future arrival", not yet a rent-roll tenant) writes every email as non-primary, unconditionally — and our contact lookup reads primaries only. So the correction landed as a dead-letter secondary. Update Aug 16: shipped and verified in production — trusted AppFolio corrections now take over as primary automatically (the old address is kept as a working secondary, never deleted), and her record self-healed on the next sync pass. The full tenant sync has correct promote-and-retire logic; her record just never flows through it until Sep 1.
Mitigating fact: PropFlow provably never emailed her (zero sends across our logs, SendGrid, and the Camellia mailbox — she's routed by SMS as co-applicant). The lease email that went nowhere was AppFolio's, and we have no visibility into AppFolio's sends or bounces. But we did have the signal: the lease has sat unsigned since Aug 5 while comparable units signed within days. Nothing watches that — an alert that would have was deliberately removed on Aug 14 as noise.
Root cause 4 — AppFolio texts are a black hole (and not just for us)
Her texts went to JP's company-wide AppFolio texting number. What happens to an inbound text there, per AppFolio's own docs:
- The email notification goes to whichever single user last texted that number — or, if nobody ever has, to one catch-all address set in company settings. No team notification, no assignment, no escalation, ever.
- The shared inbox defaults to a "My Messages" view showing only threads you last replied to. A resident-initiated thread nobody has answered is invisible in every user's default view.
So Fede's hunch is very likely right: her texts are sitting unread in a view nobody has open. This is an AppFolio design property, not a JP mistake.
No API exists for these texts. Verified against AppFolio's docs and against the live catalog of all 68 reports available to JP's database — none covers texts/communications. No webhooks either. A third-party product (Skywalk) proves the data is scrapeable from a logged-in session. One open door: AppFolio's Max-tier "Database API" — its catalog is behind a login; worth one email to JP's CSM.
Other PMSs: same story almost everywhere. Rent Manager is the only major PMS with confirmed API read access to SMS threads. Buildium, Entrata, Yardi: built-in texting, no read API. RealPage/Knock: write-only. Industry-wide, texts are activity-log entries, not queryable conversations — worth knowing for the multi-PMS roadmap.
What to do — decisions
D1 · Make "resident" reflect reality root cause
A.Recommended: Derive status from AppFolio's own tenant status + move-in date instead of the lease-date comparison, and add a daily re-evaluation so no one can stay "pending" past their lease start. Fixes early move-ins and the stranded-forever hole in one move.
B.Minimal patch: keep the date rule but let "pending" people match on inbound calls and show in the tenant list with an "arriving soon" badge. Cheaper; early move-ins still look wrong on paper.
C.Do nothing until Sep 1 and verify all six self-heal. Zero cost; leaves a live resident misclassified for two more weeks and the class of bug intact.
D2 · Email correctness live bug
A.Recommended, all three: (1) data-fix her record and (2) fix the sync path — both done Aug 16 (shipped, live-verified: her real address is primary; corrections now promote automatically). Remaining: (3) wire the DNS-based email validator we already own into prospect/applicant capture.
B.Just the data fix + sync fix; skip capture validation for now.
D3 · Unsigned-lease watchdog detection gap
A.Recommended: Alert when a lease has been out unsigned for N days as the start date approaches (threshold-based so it isn't the noise that got the old alert deleted). This was the only signal we had for the dead-email failure — six other Camellia leases are unsigned right now.
B.Fold it into an existing daily digest instead of a standalone alert.
D4 · AppFolio texts visibility
A.Do today, free, no code: tell JP to (1) switch the inbox view to "All Messages" and (2) point the texting catch-all notification at the Camellia mailbox we already read. Solves the humans-can't-see-it problem immediately.
B.Recommended build: with the catch-all pointed at the Camellia mailbox, add one parser next to our existing AppFolio-notification-email parsers so inbound texts land in the resident's PropFlow conversation and alert the team. Smallest new surface; reuses proven plumbing. Known hole: replies in threads a staffer already answered notify that staffer, not the mailbox — close it later with a browser-agent sweep of the inbox if needed.
C.Ask JP's CSM whether the Max-tier Database API exposes texts (one email, do it regardless — it would replace scraping with a supported contract).
D.Long-term: publish a Clara/Twilio number instead of AppFolio's for resident texting. Right architecture, but a resident-migration event with real 10DLC/consent implications (STOP state would fork between two senders) — separate, deliberate project, not a side effect of this fix.
D5 · Missed-transfer follow-up operational
A.Recommended: when a transfer ends in no-pickup or voicemail with action items extracted, notify the team (Slack/#alerts) instead of only writing an activity-log row. Her 4:36 AM voicemail produced a perfect to-do list that no human was ever shown.
B.Have Clara auto-text the caller a "we got your message, someone will call you by X" acknowledgment as well. (Needs the consent check for resident SMS.)
Facts vs. inference
Verified against production data and code: her records, all five calls and transfer outcomes, the status-derivation rule, the six pending residents, the email claims and sync paths, zero outbound messages to her, the unsigned lease, the AppFolio report catalog (no comms API), and AppFolio's documented notification behavior. Inferred (labeled): that AppFolio's lease email went to the typo address (we can't see AppFolio's sends); that her texts are sitting unread in the default inbox view; the exact AppFolio inbox URL for any future scrape.