One property, three separate breakdowns that all show up as the same thing: a resident's rent stops getting charged and nobody notices. Plus a phone handoff that actually worked but got logged as a failure.
Findings — 2026-09-01, read-only investigation; no fixes applied yet. Property: Camellia Apartments. Dollar totals marked "estimate" below are estimates, not verified accounting figures.
Resident Paul Wilkins (unit 111) called Clara (the AI phone/text assistant) on Sept 1 at 1:03 PM Mountain time to ask his balance before paying rent. Clara told him he owed $40 and it wasn't overdue. He asked about a "free month" he thought he had. Clara guessed at an explanation (a utility charge, or a credit applied when he moved in) — that guess was wrong; no such credit exists on his account. Clara then admitted she only had a balance snapshot, not the full story, and tried to connect him to the office. The app logged this as "transfer attempted — no one picked up" and closed the conversation as resolved.
Phone-carrier records (Twilio, the service that carries the calls) show the office line answered 10 seconds into the transfer, at 1:04:29 PM, stayed connected for 21 seconds, and the resident hung up at 1:04:50 PM. We can't tell from the records alone whether a person or voicemail answered — the system wasn't set up to detect the difference, and there's no audio to check.
Three separate bugs stacked up to turn a real, connected call into a false "nobody answered":
A separate overnight quality check did flag this conversation as needing a human look — but nothing acts on that flag automatically. Detailed system logs only go back about 6 minutes, which limited how far we could dig into exactly what happened server-side.
Paul has paid $1,190/month by check, on time, every month since September 2025 ($1,150 rent + $40 utilities). Staff put an end date on his rent charge back in October 2025 — meaning the system stopped billing him rent as of August 31, 2026. This month it only charged him the $40 utility line, which has no end date. There is no free-month credit anywhere on his account; Clara's guess on the phone call was wrong.
A renewal offer at $1,150/month was sent to him back on June 8, with reminders — it's still sitting unsigned. A new lease is also open for signature and hasn't been signed. He's never activated his online resident portal. Our system's copy of his account matched AppFolio (the property-management software of record) exactly as of an 11:01 AM sync that morning — though our copy doesn't currently track his utility charge, only rent, which is a gap worth closing.
Camellia has an automated system meant to convert residents to month-to-month billing if their lease expires without a signed renewal, so rent keeps getting charged. All the switches for this were on, and it ran its daily check on Sept 1. But it has a bug: it treats any renewal offer that was sent — even one nobody has signed — as if the resident already renewed, and skips them.
That means once an offer is sent, a resident who never responds becomes permanently invisible to the auto-renewal safety net. Paul had a valid 31-day advance warning already sent on August 1, so the system was on track to catch his case correctly — until this bug intervened. Five Camellia residents were skipped this way on Sept 1 for the same reason.
Where this lives in the code, for engineers following up: the check that decides "already renewed" (getLeaseProvenance in src/lib/integrations/appfolio/pms-adapter.ts) treats any renewal-offer row from AppFolio as proof of a signed renewal, which then makes convertLeaseToHoldover (src/lib/domain/leasing/renewal-holdover.ts:130) skip the resident with reason already_renewed.
We checked every occupied unit whose lease has already ended. Seven of eight have stopped being billed rent; together that's about $8,650 in unbilled September rent (estimate).
| Unit | Resident | Lease ended | Sept rent billed? | Balance owed | Renewal status | What went wrong |
|---|---|---|---|---|---|---|
| 118 | Ignacia Cruz | Jun 30 | Yes — $1,750 | $3,750 past due | An earlier attempt to convert this account closed itself out on July 16 | Billing is fine, but no lease is on file — a paperwork gap, not a billing gap |
| 111 | Paul Wilkins | Aug 31 | No — just $40 utilities | $40 | Offer sent, unsigned | Fell through — the trigger for this whole review |
| 415 | Christopher Avery | Aug 31 | No | $4,224.96 | No renewal ever started | Fell through — worst case in the batch |
| 420 | Bernardo Molina | Aug 31 | No | $0 | Offer sent Jul 10, no response | Fell through |
| 504 | Mia Grimaldi | Aug 31 | No | $0 | Second offer sent Aug 5, response due Sept 4, still unsigned | Fell through |
| 522 | Leonel Gongora | Aug 31 | No | $0 | Offer sent Jul 10, no response | Fell through |
| 603 | Simone Koning | Aug 31 | No | $0 | Our system closed this out as a move-out notice on Jun 24, but AppFolio has no notice or move-out on file — she still shows as a current resident | Fell through — two systems disagree |
| 607 | Paula Delgado | Aug 31 | No | $0 | Resident agreed to renew, but the property manager never countersigned within the 14-day window | Fell through — most avoidable of the eight |
Unit 311, Avery Belafsky: moved in Aug 24 on a lease running Sept 1, 2026 to Feb 28, 2027 at $1,000/month. Portal activated, lease signed, everything else about the account looks healthy — application fee, deposit, and the prorated August rent are all paid, balance is $0. But the recurring rent charge's own tracker says it's "paid through Sept 30" and the next charge isn't due until Oct 1 — meaning September itself was silently skipped, most likely because the move-in paperwork consumed what should have been the first regular billing cycle. About $1,000 unbilled.
These six residents have never had a recurring rent charge created in AppFolio — the rent-management software shows $0.00 rent for each of them. Five moved in via internal transfers on Aug 1 (the deposit carried over from their old unit, but nobody set up a new rent line — this looks like a gap in how transfers are processed). One moved in fresh on Sept 1.
| Unit | Resident | Moved in | Months missed | Currently prepaying into an unapplied credit? |
|---|---|---|---|---|
| 101 | Jhon Hernandez | Aug 1 (transfer) | Aug & Sept | Yes — $1,000 |
| 117 | Onel Cruz Fernandez | Aug 1 (transfer) | Aug & Sept | Yes — $1,000 |
| 224 | Pedro Franco | Aug 1 (transfer) | Aug & Sept | Yes — $1,245 |
| 422 | Rodolfo Salazar N. | Aug 1 (transfer) | Aug & Sept | Yes — $940 |
| 611 | Yudi Cruz | Aug 1 (transfer) | Aug & Sept | No |
| 315 | Armando I. Montano Meza | Sept 1 | Sept | No |
Parking, deposits, and utility charges are all posting normally for these residents — it's specifically the rent line that was never created. Total exposure is roughly $11,800 (estimate, using market rent as a stand-in since no rent charge exists to read from).
Put together, roughly $21,000 in Camellia rent is currently not being billed this month across these 14 residents (estimate — sum of the three sections above).
Separately, on the morning of Sept 1 (8:33 AM MT) the system emailed the shared Camellia office inbox about three renewals it couldn't send because it has no email address on file for the resident: units 220 (Mario Santos Quinteros), 317 (Cesar Hernandez), and 409 (Brian Stuckey) — all leases ending Nov 30. Camellia doesn't have individual staff mailboxes, so this goes to one shared inbox. As of 7:23 PM the same day, the email had been opened 2–4 times each with no reply and none of the three fixed.
There's no task or reminder created when this happens — it's a one-time email with no follow-up. It also only exists for one specific reason (missing email address); there's no equivalent for a missing phone number, and no broader sweep for other blockers. Across the whole property, 20 of 139 residents have no email on file and 4 have no phone number. (Two other alerts in the same batch were unrelated delinquency/renewal-decision emails, not part of this issue.)
These are options, not decisions — nothing below has been approved or built yet.
A one-time email to the office explaining his real balance and correcting the "free month" confusion. Drafted, waiting on approval to send.
Stop treating an unsigned renewal offer as proof of a signed renewal; make the call-outcome checker trust the carrier's "connected" signal the same way it trusts "no pickup"; fix the recording so it actually starts when a transfer call connects.
Get September (and August, where relevant) rent charges created in AppFolio for the 14 affected residents. Needs a decision on whether this is office-driven or something PropFlow does directly.
A first-of-the-month sentinel, for every property, that flags any occupied unit with no rent charge — so this class of problem gets caught automatically going forward.
It currently only runs at the one test property. Turning it on here is a separate decision from fixing the underlying bugs.
Turn the one-time "missing email" email into a tracked task that keeps nagging until someone actually fixes the resident's contact info, instead of firing once and going silent.