When Clara sends an email to a client's team after a call she could not finish herself (message taken, missed call, nobody picked up the transfer), when she stays quiet, and what every notice must carry.
Status: Proposed — pending Fede's review. Nothing here is built. As of 2026-09-22, 2:05 PM MT. Scope: two clients, last 14 days: Camellia (13 notices) and Western Slope (9 notices).
Contents
Fede's ruling that triggered this: “we need to audit every single email and notification, we can't have different implementations in scattered places.” We went through every code path that emails or texts a client's team (property managers, leasing, maintenance) about a call, message, lease event, or digest, and checked it against the same five rules PR #10677 was fixed for: real property name, one clickable phone number, a consistent “Clara” sign-off, a link back to the record, and a write to the delivery log Fede pointed at.
| Question | Answer |
|---|---|
| Distinct hand-written notice templates | About 20 |
| Share the property-name helper | 3 |
| Share phone formatting or sign-off | 0 |
| Written to the delivery log Fede pointed at | 0 (that log only covers the Microsoft-mailbox path) |
Build ONE shared notice builder, seeded from the missed-call note — the only template today that gets the property name, phone number, sign-off, and link all right. Promote its property-line, phone-formatting, and sign-off pieces into a shared module, and move every path listed below onto it. Digests are a different genre (a weekly rollup, not a single-incident note) and should get their own shared digest shell instead of joining the incident-note builder.
src/lib/domain/escalation/open-matter.ts:486src/lib/domain/escalation/reply-release.ts:1196,1293,1548,1742,2207src/lib/domain/escalation/nag-pass.ts:668src/lib/domain/escalation/teaching-capture.ts:759src/lib/domain/escalation/gated-inbound-team-notice.ts:414src/lib/tools/handlers/handle-forward-to-property-manager.ts:1065src/lib/tools/handlers/handle-capture-unknown-caller-note.ts:611src/lib/domain/pms/guest-card-outbox-drain-runner.ts (notifyCardNotCreated)src/lib/domain/leasing/notify-staff-virtual-tour-call.tssrc/lib/domain/leasing/renewal-execution-notify.ts (renderExecutionNotice) — for the sign-off only; its recipient/attachment machinery is already the best pattern in the app and should be the model for idempotent sends, not replacedsrc/lib/domain/leasing/renewal-holdover-notify.ts, renewal-notify.ts, new-lease/new-lease-draft-notify.ts, collections/owner-escalation.ts, vendors/notify-pm-stale-dial.ts, vendors/notify-pm-outcome.ts, vendors/notify-pm-po-required.ts, move-in/send-pm-key-pickup-confirmation.ts, turnover/move-out-date-mismatch-notify.ts, turnover/move-out-draft-notify.ts — for sign-off and phone-formatting consistency; their recipient resolution is already shared and finesrc/lib/temporal/activities/tenant-confirmation-review.ts / confirmation-review-notification.ts — needs the property-name field added regardless of which builder it ends up onrenewal-lapse-digest.ts, stale-lead-digest/digest-email.ts, reporting-digest/run-digest.ts, pm-action-reminders/send-pm-action-reminder-digest.ts) — lower priority; candidate for their own shared digest shell, not this builder| File:line | Trigger | Channel | Builder | Property name | Phone | Sign-off | Link | Recipients source | Delivery-log | Verdict |
|---|---|---|---|---|---|---|---|---|---|---|
agents/clara/lib/voice/post-transfer.ts:3760 (voicemail_left) → src/lib/domain/promises/pm-delivery.ts:838 → missed-call-note.ts | Transfer landed in voicemail, nobody spoke | missed-call-note.ts (shared) | Real property or “not identified yet”, injected centrally — the #10677 bug is fixed here | callbackNumber()+telHref(), once, tap-to-call | Bare “Clara” | personConversationUrl | Property.escalationOwnerEmail chain (property/org setting) | Not written to email-delivery-log.ts | CONSISTENT — reference implementation | |
post-transfer.ts:2534 (message_unheard/no_words/transfer_failed) → same pipeline | Transfer rang out / silent / failed | missed-call-note.ts (shared) | Same as above | Same | Same | Same | Same | Same | CONSISTENT | |
src/lib/domain/maintenance/page-property-manager.ts:376-389 | Maintenance escalation to PM, incl. gas-emergency tier | property-manager-escalation-template.ts | Real value or “not identified yet”, never org, via shared property-line helper | linkifyPhones() | “Clara” or “Clara — Property” (3rd distinct shape) | Yes when set | pmEmail, via resolver chain | Not written to log | CONSISTENT on property/phone/link; sign-off shape diverges | |
src/lib/domain/leasing/notify-staff-virtual-tour-call.ts:72-95 | T-1h before a virtual tour, “you're calling this prospect soon” | Inline, hand-built | Omitted entirely, even though property is in scope | Raw, no formatting, no link, appears once | None — not a closing sign-off | None | resolveTeamNotificationEmail (property/org setting) | No explicit category, defaults 'outreach'; not logged | DIVERGENT — same defect class as #10677 | |
src/lib/domain/voice/emergency-no-answer-ladder.ts:115-121 (leg 1) | Confirmed after-hours emergency, relay unanswered | SMS | Inline string | Real property name passed by caller | N/A (SMS) | None (SMS) | None (SMS) | emergencyPhoneE164, resolved by caller | No delivery-log write of any kind | DIVERGENT-but-low-risk — life-safety SMS exempt from most rules |
emergency-no-answer-ladder.ts:164-188 (leg 2) | Same emergency, still unreached | Email + Slack #alerts | bake-alert.ts | Real property name passed through | n/a | n/a | n/a | Internal PropFlow ops channel | n/a | OUT OF SCOPE — internal ops alert |
src/lib/domain/escalation/text-on-ring.ts:287-301 | Hunt chain starts ringing a staff person | SMS | textOnRingBody (shared, pure) | By design, never included | By design, never included — the line itself, not the caller's digits | Inline, not a closing sign-off | N/A (SMS) | Ring-list person from hunt config | No delivery-log write (SMS, tracked via a separate claim) | N/A / by-design — different rule set for this channel |
src/app/api/voice/call-ended/route.ts:3444 | PM's own turnover walk call just ended | SMS to the PM on the call | Inline | N/A — replies to the PM about their own call | N/A | None | N/A | PM's own live-call number | Not verified | Not comparable — different notice class |
| File:line | Trigger | Channel | Builder | Property name | Phone | Sign-off | Recipients | Delivery-log | Verdict |
|---|---|---|---|---|---|---|---|---|---|
src/lib/domain/escalation/open-matter.ts:486 | Clara opens a decision-request matter needing a human call | decision-request.ts | Real property, via shared property-line helper — but stated twice (property line and again in the sign-off) | Verbatim, raw — no formatting, zero tel: links in this whole file | “Clara” + property on two lines (2nd distinct shape) | Property.escalationOwnerEmail chain | No explicit category, defaults 'outreach' | DIVERGENT — no clickable phone, property duplicated, non-standard sign-off | |
src/lib/domain/escalation/reply-release.ts:1548,1742,2207 | Staff reply-thread continuation | decision-request.ts builders | Real property | Same raw-phone gap | Same shape | Reply-to thread sender | Same gap | DIVERGENT — same family as open-matter.ts | |
src/lib/domain/escalation/nag-pass.ts:668 | Escalation nag/reminder to owner | decision-request.ts | Real property | Same raw-phone gap | Same shape | Escalation owner | Same | DIVERGENT — same family | |
src/lib/domain/escalation/teaching-capture.ts:759 | Memory-confirmation ask to staff | decision-request.ts | Real property | n/a (no phone in this note type) | Same shape | Escalation owner | Same | DIVERGENT on sign-off shape only | |
src/lib/domain/escalation/gated-inbound-team-notice.ts:414 | Inbound message held while a matter is open, PM told | property-manager-escalation-template.ts | Real property, never org | linkifyPhones() | “Clara — Property” (3rd shape) | pmEmail | Not verified | CONSISTENT on property/phone/link; sign-off is the 3rd variant | |
src/lib/tools/handlers/handle-forward-to-property-manager.ts:1065 | Clara forwards an unanswerable question to PM | property-manager-escalation-template.ts | Real property | linkifyPhones() | Same shape | PM escalation-owner chain | Not verified | CONSISTENT with the escalation-template family | |
src/lib/tools/handlers/handle-capture-unknown-caller-note.ts:611 | Unknown caller left a note for staff | property-manager-escalation-template.ts | Real property | linkifyPhones() | Same shape | PM chain | Not verified | CONSISTENT | |
src/lib/domain/pms/guest-card-outbox-drain-runner.ts:170-185 | Clara couldn't create an AppFolio guest card from a call | In-file builder | Real property, in the subject | Raw, unformatted, no tel: link | No sign-off at all | resolveTeamNotificationEmail | Not written to log; no explicit category | DIVERGENT — no sign-off, no clickable phone, no link | |
src/lib/domain/escalation/bake-gate.ts:212 | A composed staff email is held pending review | Slack, internal | renderHeldSlackBody | Inline | n/a | n/a | Internal review channel | n/a | OUT OF SCOPE — internal review tool |
src/lib/domain/escalation/stuck-matter-surface.ts | A matter nagged N times with no owner answer | Slack, internal | buildStuckMatterBody | Inline | n/a | n/a | Hardcoded internal channel | n/a | OUT OF SCOPE — internal PropFlow ops Slack |
| File:line | Trigger | Channel | Builder | Property name | Phone | Sign-off | Recipients | Delivery-log | Verdict |
|---|---|---|---|---|---|---|---|---|---|
src/lib/domain/leasing/renewal-lapse-digest.ts:280 | Weekly “leases ending, no answer yet” rollup | In-file, emailCardLayout | Real property, in subject+body | n/a — unit-level rows | None — ends on a plain tail line | Not fully traced | Not verified | DIVERGENT by omission — legitimate rollup genre, but zero sign-off consistency | |
src/lib/domain/leasing/stale-lead-digest/run-digest.ts + digest-email.ts | Weekly “leads to call” list | Own builder | Real property | formatPhone() + tel: link — correct, but its own re-implementation, not the shared helper | “Clara recommends” used only as inline copy voice, not a sign-off | Not verified | Not verified | DIVERGENT by omission (no sign-off); phone handling fine but duplicated logic | |
src/lib/domain/leasing/reporting-digest/run-digest.ts:645 | Portfolio reporting digest | Own builder | Real property | Not checked | Not checked | Not traced | Not verified | Not fully verified — likely same no-sign-off genre | |
src/lib/domain/leasing/pm-action-reminders/send-pm-action-reminder-digest.ts:93 | Reminder digest of pending PM actions | Own builder | Not verified | Not verified | Not verified | Not traced | Not verified | Not fully verified | |
src/lib/domain/leasing/rent-roll/sync-digest.ts:138 | Daily AppFolio sync summary | Own builder | Inline | n/a | None | Hardcoded fede@propflowai.co | Not logged | OUT OF SCOPE / internal — sent to PropFlow, not a client |
| File:line | Trigger | Channel | Builder | Property name | Category | audience:'staff' | Recipients source | Verdict |
|---|---|---|---|---|---|---|---|---|
src/lib/domain/leasing/renewal-holdover-notify.ts:165 | Lease rolled to month-to-month | In-file renderEmail | Real value | Not set, defaults 'outreach' | Not set | resolveOfficeNoticeRecipients (shared) | DIVERGENT — transactional notice miscategorized as marketing | |
src/lib/domain/leasing/renewal-notify.ts:217 (email) / :320 (SMS) | Renewal pending PM review | Email + SMS | In-file renderEmail / inline SMS | Real value | Not set (email leg), defaults 'outreach' | Not set | resolvePmContactEmail / property setting | DIVERGENT (category); SMS phone-format not confirmed |
src/lib/domain/leasing/renewal-execution-notify.ts:277 | Lease executed/countersigned | renderExecutionNotice — the one real shared “pending notice” builder | Real value, always explicit | 'transactional' explicit — correct | Not set | resolveOfficeNoticeRecipients chain, never hardcoded | DIVERGENT — missing sign-off, misses audience:'staff'; otherwise the best-structured builder in the audit | |
src/lib/domain/leasing/send-pm-tour-cancellation.ts:180 | Tour cancelled | Inline | Real | Not checked | Present | Property-scoped | CONSISTENT on the audience flag — one of only 3 files that set it | |
src/lib/domain/leasing/send-pm-tour-confirmation.ts:361 | Tour booked | Inline | Real | Not checked | Present | Property-scoped | CONSISTENT | |
src/lib/domain/leasing/send-leasing-team-tour-update.ts:152 | Tour rescheduled/updated | Inline | Real | Not checked | Present | Property-scoped | CONSISTENT | |
src/lib/domain/leasing/new-lease/new-lease-draft-notify.ts:164 | Lease drafted / not drafted | In-file subject builder | Real | 'transactional' explicit — correct | Not set | resolveOfficeNoticeRecipients | DIVERGENT — missing audience:'staff' only | |
src/lib/domain/leasing/collections/owner-escalation.ts:271 | Collections owner alert | Inline | Real | Not set, defaults 'outreach' | Not set | Escalation-owner resolution | DIVERGENT (category + audience) | |
src/lib/domain/vendors/notify-pm-stale-dial.ts:235 | Vendor call went stale (no answer) | Email + SMS | In-file builder | Real value or raw property id fallback if lookup fails | 'transactional' explicit on both legs | Not set | Property lookup | DIVERGENT (audience only); category correctly handled |
src/lib/domain/vendors/notify-pm-outcome.ts:955 | Vendor call outcome resolved | In-file builder | Real value or raw property id fallback | 'transactional' explicit | Not set | Property lookup | DIVERGENT (audience) | |
src/lib/domain/vendors/notify-pm-po-required.ts:210 | Vendor job needs a PO | In-file builder | Real value or raw property id fallback | Not set, defaults 'outreach' | Not set | Property lookup | DIVERGENT (category + audience) | |
src/lib/domain/move-in/send-pm-key-pickup-confirmation.ts:121 | Key pickup confirmed | Inline | Real | Not set, defaults 'outreach' | Not set | Context-scoped | DIVERGENT (category + audience) | |
src/lib/domain/turnover/move-out-date-mismatch-notify.ts:115 | Move-out date discrepancy found | In-file renderEmail | Real | Not set, defaults 'outreach' | Not set | resolveOfficeNoticeRecipients | DIVERGENT (category + audience) | |
src/lib/domain/turnover/move-out-draft-notify.ts:154 | Move-out draft ready to finish | In-file renderEmail | Real | Not set, defaults 'outreach' | Not set | resolveOfficeNoticeRecipients | DIVERGENT (category + audience) | |
src/lib/temporal/activities/tenant-confirmation-review.ts:114 | PM asked to confirm a caller's claimed unit/identity | SMS | buildConfirmationReviewSms | Omitted entirely, even though the property is in scope at the call site | 'transactional' explicit — correct | — | resolveConfirmationReviewRecipient, property-scoped | DIVERGENT — same class of bug as #10677 |
Investigation only. No code changed. Building the shared builder is the next lane once Fede lifts “no new builds”; each path moves in its own small PR.
Fede's rule: if a caller is someone we already have a file on — a resident, a future resident, an applicant, or a prospect with a guest card — the staff notice has to say what we know about them, not just repeat their own words back. We checked every notice from the last two weeks against AppFolio and our own records to see how often that happened.
Of the 22 notices, 7 were about people we already had a file on — 5 different people (one of them, Jordan Miller, called three separate times). None of those 7 notices used what we already knew. Every one of them only repeated what the caller said out loud on that one call. The other 15 notices were unknown numbers, vendors, or automated alarm calls with nothing to match — not in scope for this pass.
The three facts we had on file and left out most often:
| When (MT) | Caller | What we already knew | What the email said | Line it should have opened with |
|---|---|---|---|---|
| 9/11, 1:47 PM | Jordan Miller | Active tenant, Camellia unit 617, lease starts 10/1/26. 2nd contact in a week (also called 8/11 and 9/10). | Application status question for unit 617; no mention he's already a signed tenant. | "Jordan Miller, unit 617 (his lease starts October 1), is asking whether his application decision is final." |
| 9/15, 11:36 AM | Jordan Miller | Same tenant record as above. 3rd contact. | Key pickup for move-in, unit 617 given (caller said it himself), no move-in date or tenant status. | "Jordan Miller, unit 617, moving in October 1 — his 3rd call this week — wants to know how to get his keys." |
| 9/16, 9:12 AM | Jordan Miller | Same tenant. 4th contact in less than a week, all about the same move-in. | Subject line: "(720) 808-6335 asked for the office" — his name isn't used anywhere, even though he says it himself in the voicemail we quoted. | "Jordan Miller (unit 617, October 1 move-in) called a 4th time about his keys — voicemail attached." |
| 9/18, 8:34 AM | Eloisa Arellano | Active resident, Camellia unit 114, current lease runs through 11/30/26 — so this call is about her renewal. | Needs a Spanish-speaking staff member to follow up on renewal options; no unit or lease-end date. | "Eloisa Arellano, unit 114 (lease ends November 30) — needs a Spanish-speaking teammate to talk renewal options." |
| 9/19, 7:12 AM | Gregory Boyd | Prospect with a guest card on file, target move-in October 1, applying for a Camellia unit. | Asking whether an application holds the unit while under review; no move-in date or guest-card context. | "Gregory Boyd, applying with an October 1 target move-in, wants to know if his application holds the unit." |
| 9/21, 5:51 PM | Ethan Lindenschmidt | Prospect with a guest card, already assigned to Kat Barker; unit 280, ~$2,000 budget, pet-friendly, wants a tour Sun 9/27 or Mon 9/28. | Lists his questions (utilities, pet fees, move-in cost, lease term, tour days) but not that he's already Kat's prospect or which unit. | "Ethan Lindenschmidt (Kat's prospect, unit 280, budget ~$2,000, wants Sun the 27th or Mon the 28th for a tour) has a few more questions before booking." |
| 9/22, 9:53 AM | Dylan Lewis | Future resident, 566 Placer Street, lease starts 10/1/26 (status: pending). | Already good — named him, gave the unit, gave the topic. Only gap: didn't say he's a signed future resident, just that he "called about his move-in." | Close to right as-is: "Dylan Lewis, future resident at 566 Placer Street (moves in October 1), called about picking up his keys." |
Checked and NOT counted as "on file": Inel González (2 calls, 9/21) — she gave her name and a callback number, but she has no resident, prospect, or application record in our system, so there was nothing more to add. Priya (Western Slope, 9/14) could not be matched to a person record in the time available for this pass — flagged as unresolved, not as "nothing on file."
What we sent: subject "Missed call — (720) 808-6335 asked for the office," body just quotes his voicemail ("Hi, this is Jordan Miller... today's my move-in date for six seventeen...") without ever pulling his name into the subject or the structured fields, even though he is an active tenant on file for that exact unit and had already called three times that week about the same move-in.
What it should have opened with: "Jordan Miller, unit 617, moving in October 1 — his 4th call this week about picking up his keys."
What we sent: a solid list of his questions (utilities, pet fees, total move-in cost, the 6-month lease option, early termination fee, and his Sunday/Monday tour availability) — but nothing about who he already is in our system: a prospect already assigned to Kat Barker, on a guest card for unit 280, budget around $2,000, pet-friendly.
What it should have opened with: "Ethan Lindenschmidt, Kat's prospect for unit 280 (~$2,000 budget, pet-friendly), has more questions before he'll book his Sunday or Monday tour."
Confirmed against AppFolio: Dylan Lewis is a future resident at 566 Placer Street with a lease that starts October 1, 2026 (status: pending). The email Clara sent already named him, gave the unit and property, and the topic — the best of the 7. The one thing it still left out was his status: it said he "called about his move-in" instead of stating outright that he's a signed future resident.
| Leasing calls | Clara asked for a name | Full name captured | Tour booked | Guest card written |
|---|---|---|---|---|
| 20 | 5 | 4 | 3 | 0 |
Investigation only. Nothing changes at Camellia or Yale until Fede says so. Two candidates: turn on guest cards from calls for Camellia (a setting), and the name-before-transfer line (the same rule going into the scattered-homes flow now).
| Camellia | Western Slope | |
|---|---|---|
| Notices sent | 13 | 9 |
| With a name, a topic and a number (good) | 7 | 3 |
| Thin (no usable topic, or no name and not on file) | 6 | 6 |
| Same caller, several notices in one day | 1 pair | 1 triple, 1 pair |
| Most notices to one inbox in one day | 3 | 8 (Mon 9/21) |
| Sent for a call that reached a person | 0 | 0 |
Half of what we send is thin. Western Slope's leasing inbox got 8 emails in one day, 3 of them from one caller in 17 minutes.
| Calls | Notices sent | Recipient |
|---|---|---|
| 21 | 10 | leasing@westernslopepm.com only |
Western Slope, Mon 9/21 through Tue 9/22 11:10 AM.
Every one of the 10 sends was accepted by the email provider, from our own delivery log. So “not consistently receiving” is about which calls produce an email, not delivery.
Also found: the Dylan Lewis notice at 9:52 AM Tuesday first failed with “SendGrid key missing” in one runtime, then was re-sent successfully at 9:53 AM from another. Needs its own fix.
Caller (443) 248-4535, Western Slope, Mon 9/21. This was Western Slope staff testing. Calls 1 and 2 (1:33 and 1:34 PM) said "leasing," then "I wanna talk to a live agent." The recording picked up the ring-list phone in the same room saying "You have a call… press one? The call is disconnected" — the press-1 accept step failed to bridge the call. (The hunt was changed to a plain forward later that day; a 4:33 PM call reached Kat.) Call 3 (1:50 PM) asked what was available at Ember Estates, heard about the 3-bed duplexes and prices, asked for addresses, said "book a showing for 367 Ember Lane," then asked for a live person. Nobody connected.
Subject: Missed call — I'm gonna use this as a third time…
Subject: +14432484535 — I wanna talk to a live agent
Subject: Missed call — On the I'm
Wrong: none of the three emails mentioned Ember Estates or 367 Ember Lane, even though the caller named both, asked for prices and addresses, and asked to book a showing. Three emails for one person, none of them usable.
Each call is judged on its own the moment it ends, using everything known from that caller's earlier calls the same day. Calls 1 and 2 had nothing a person could act on, so they sent nothing — but their facts (the time, the caller, "wants a person") carried forward. Call 3 crossed the line, so the one email goes out right when it ends, with all three calls in it: the times, "leasing" and "wants a person" from calls 1 and 2, and the Ember Estates ask and showing request from call 3.
Subject: Caller wants a showing at 367 Ember Lane, asked for a person 3 times Property: Ember Estates Called at 1:33, 1:34 and 1:50 PM. On the third call, asked about the 3-bed duplexes at Ember Estates and wanted to book a showing at 367 Ember Lane. Asked for a person each time; nobody was connected. Call back: (443) 248-4535 Clara <conversation link>
Holder Security, Camellia, Tue 9/22, 7:45 AM. An automated low-battery alert. Clara could not get anything out of it because it is a recording.
Subject: Holder Security — Automated call from Holder Security reporting a low… Property: Camellia Apartments Holder Security called at 7:45 AM, after hours. Automated call from Holder Security reporting a low system battery alert at Camellia House Apartments. Caller phone: +18009323822. No additional details were provided — the system was unable to process voice responses. Team should follow up with Holder Security directly. Can someone call them and see what they need? (800) 932-3822 Clara
Wrong: the phone number twice, "no additional details," "unable to process voice responses," and a callback ask for a robot.
Subject: Holder Security alarm: low system battery (automated call) Property: Camellia Apartments Holder Security's alarm system left an automated message at 7:45 AM: low system battery at Camellia House. If you want to check it, they are at (800) 932-3822. Clara
Inel González, Western Slope, Mon 9/21. First call 8:38 AM, employment verification, name and callback captured. Second call 10:47 AM, same topic, nobody picked up.
Subject: Missed call — Verify job +18666192521 called at 10:47 AM asking "Verify job"; the transfer went unanswered. Can someone call them and see what they need? (866) 619-2521
Wrong: the caller is Inel, identified on the first call. Second email reads as a stranger. Two emails for one request. Same root cause as the aggregation rule: each call looked only at itself instead of at everything known about this person that day.
Subject: Inel González called again about the employment verification Inel first called at 8:38 AM and again at 10:47 AM. Nobody picked up the second time. She still needs the employment verification. Call back: (866) 619-2521 Clara <conversation link>
Officer Barrett, Grand Junction Police, Western Slope, Mon 9/21, 1:26 PM, about a search warrant at 1303 North 15th Street, unit 3.
Subject: Missed call — I this is Officer brown with the grand… A caller called at 1:28 PM. I this is Officer brown with the grand Junction police Department for call Uh, calling about a property that you… Can someone call them and see what they need? (970) 852-1460
Wrong: the subject is a garbled transcript fragment. An authority caller with a warrant is not a "missed call." The call was forwarded to a maintenance voicemail instead of a person.
An authority caller rings the list immediately (that routing already exists as a scenario, "authority caller ring now"). If nobody picks up:
Subject: Grand Junction Police called about a search warrant, 1303 N 15th St unit 3 Property: 1303 North 15th Street Officer Barrett called at 1:26 PM about a search warrant for unit 3. Nobody on the ring list picked up. He asked for a call back today. Call back: (970) 852-1460 Clara <conversation link>
Fairhaven test line, Fri 9/18, 11:55 AM.
Subject: Jordan — Priya Ramirez has a question about the application… Jordan called at 11:55 AM, after hours. Priya Ramirez has a question about the application process — specifically how long it takes to hear back after applying.… Can someone call Jordan back? (720) 586-4069
Wrong: "Jordan" is the name on the phone record, "Priya" is who spoke. The reader cannot tell who to call. Same root cause as the aggregation rule: each call looked only at itself instead of at everything known about this person that day. The name the caller gives on any call that day becomes the name on the record. Better: the name the caller gave wins, once: "Priya Ramirez called about how long applications take…"
Camellia, 9/15, 3:07 PM. Caller connected, said "Stu- studio, October 1st," went silent, hung up. Sent as "Missed call — Stu- studio, October 1st." Under the rule below: no notice. The caller can call back.
Dylan Lewis, Western Slope, 9/22, 9:53 AM: name, unit, property, phone, topic all present. Still missing: his own words ("Move in," and that he was asking about his October 1 move-in), the conversation link, which the missed-call template has and this one does not, and his status from AppFolio: future resident, moving in October 1, which is what tells the team it's urgent.
Lynn, Western Slope, Tue 9/22, 11:08 AM. Owner of a 2-bed home on 24 acres in Montrose, looking for a property manager. Said "something else"; with no catch-all line configured, Clara rang the leasing list. Kat answered. 3 minutes 40 seconds. Kat took her number; Jay Taylor to call her back Thursday.
The thread was filed as "unrelated." Fede's ruling: this is a leasing call — new-management leads go to the leasing team, which is why ringing the leasing list was right; the thread should file as "leasing," not "unrelated." The caller showed as "Unknown Caller" though she said "My name's Lynn." No one-line outcome ("Connected to Kat, 3:40"). No summary. The page showed only the pre-transfer lines for a couple of minutes until transcription finished.
Topic: leasing Connected to Kat · 3:40 Lynn (Montrose) wants Western Slope to manage her 2-bed home on 24 acres. Kat took her number; Jay Taylor to call her Thursday.
While transcription runs: a "Transcribing the rest of the call…" line instead of a blank stretch.
Fede, 9/22: the goal on every leasing call is to answer the caller’s questions, sell, and book a tour live on a specific home, or match them to one that fits what they want. If that can’t happen yet, the call must at least produce a guest card: full name, a way to reach them (the phone from caller ID, or email when they wrote in), and the property. The guest card is the unit of work: a person or an agent can follow it up, ask them to tour, or get them to apply. Without it there is nothing to act on. The name rule below exists to serve that ladder, never to slow the sale.
Separate investigation, not part of this page: whether Clara knows on a call that a named home is no longer available and offers a match, as she does on email and text.
Proposed for the PropFlow CRM as well: a prospect record needs at least a name, one contact method and a property, like other CRMs require.
Send only when both are true:
If either is missing: no email. The caller can call back. Exception: when a caller asks for a person and nobody picks up, that fact is still worth one line. It rides on the caller's thread if one exists; if nothing else is known about them, it is sent once per caller per day, at the end of the first such call, and later ones append to it.
Context adds up across calls. The "enough to send" check runs at the end of every call, using everything we already know from that caller's earlier calls the same day: name, property, what they need, callback number. A thin call sends nothing, but its facts carry forward. The first call that crosses the line sends one notice with the whole picture (“called three times since 1:33; on the third asked for a showing at 367 Ember Lane”). A call that has enough on its own sends right away; nothing is ever held back.
Full name as soon as we know the property. A guest card needs three things: the phone (free from caller ID), the caller's full name, and the property. Clara asks for the full name the moment a property is known: right after a caller names a home; when she lands on a specific home for someone looking around; and before connecting anyone who asks for a person, whether or not a property came up. Once, then a thank-you by first name and on with the call. If the caller declines or gives a first name only, she continues and asks once more at booking time. A known caller is greeted by name and not asked. Name and phone without a property stay on our own record until a property shows up. Proposed, pending Fede's go.
| Path | When Clara asks the full name |
|---|---|
| Caller names a home | Right after they name it |
| Looking around | When Clara lands on a specific home |
| Asks for a person | Before connecting |
Every notice carries, in this order: the property (the real one, never the company name), who called and their number once, what they said they need (their words when they are clear), what happened (message taken, nobody picked up, after hours), the ask for the team if there is one, "Clara", the conversation link.
Known callers carry what AppFolio knows. Fede, 9/22: when the caller matches a resident, future resident, applicant or prospect on file, the notice adds the record's facts so the team can judge urgency at a glance: property, unit, their status (current resident, moving in, applicant, prospect), the move-in or lease date, and anything already open on the record (a work order, a balance). Dylan Lewis's notice should have read "future resident, 566 Placer Street, moving in October 1" on its first line. The same applies to anyone already in the system, a guest card or a prospect included. The notice is built after the call, offline, so there is time to look the person up: the home they asked about, tours booked or missed, an application in progress, and what they said on earlier calls or texts. The notice tells the team who this is and where they are in the process, not just that a call was missed.
Never: the caller's last words as a subject, the phone number twice, "no additional details," explanations of what Clara could not do, a callback ask for a robocall, the company name where the property goes, and "(line)" or any internal label; when the property is unknown the Property line is simply omitted.
One caller, one email thread per day. The first call with a real ask sends immediately. A later call from the same person within 24 hours is a reply on that same thread ("called again at 10:47, still needs the employment verification"), never a new stranger email. We never hold a notice to wait for more calls.
Safety and authority callers are not notices: police, fire, a lockout, a leak, a person in trouble ring the list now. The email is the record, not the alert.
Robocalls: an alarm company's automated call gets one short line (Example 2). Any other robocall gets nothing.
Every thread opens with one plain line of what happened: connected to <name> · duration, nobody picked up, forwarded to the call center, message taken, or dropped on transfer — plus the caller's stated name and a two-line summary. Forwarded calls get a short record line too. New-management leads (someone asking Western Slope to manage their property) file under "leasing," the same as any other leasing call.
The replay table (section 6, item 4) goes on this page. The template PR already in review handles the property line, the sign-off and the phone format. The send/hold rule, the folding, and the identity carry-forward are one small PR each after Fede's pick. Nothing is built before that.