Proposed — pending review

Staff notices: send, hold, and what each must carry

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

  1. Latest (9/22, 3:10 PM MT): every team-facing email and text, audited
  2. Latest: what we already knew about each caller
  3. Camellia: names and guest cards on leasing calls, last 14 days
  4. What the last two weeks look like
  5. When we send today, and when we don't
  6. What the clients and the team said (verbatim)
  7. Real examples: what we sent, what was wrong, what it should have been
  8. What a leasing call is for
  9. Proposed rules
  10. Delivery problems found on the way (need their own fix, not a design)
  11. Decisions for Fede (pick one per line)
  12. What happens after the pick

Latest (9/22, 3:10 PM MT): every team-facing email and text, audited

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.

QuestionAnswer
Distinct hand-written notice templatesAbout 20
Share the property-name helper3
Share phone formatting or sign-off0
Written to the delivery log Fede pointed at0 (that log only covers the Microsoft-mailbox path)

Found, ordered by impact

  1. The tenant-identity confirmation text Clara sends a PM (“can you confirm this caller is who they say they are”) never names the property, so a PM on more than one property can't tell which building it's about.
  2. The “call this prospect in an hour” nudge before a virtual tour names no property, prints a raw unformatted phone number, has no sign-off, and no link back to the record.
  3. Three different “Clara” sign-offs coexist, each from a separate, correctly-dated owner ruling that never reached the other two: bare “Clara” (ruling 9/1), “Clara” plus the property on two lines (ruling 8/14), and “Clara — Property” on one line (ruling 8/31).
  4. The whole decision-request email family (matters, replies, nags) never makes a phone number clickable, and prints the property name twice in every send.
  5. Recipients are resolved by one shared helper across the lease/renewal family, which is good — but the message bodies themselves are hand-rolled separately in about 14 files, and none of them sign off as “Clara.”
  6. Only 3 of roughly 17 email call sites mark themselves as staff mail. The rest may be getting held by the same “company not live yet” gate that's meant only for prospect email — which would contradict Fede's 9/17 ruling that staff notices shouldn't be coupled to that gate. This needs a trace to confirm.
  7. The label used to categorize each email (routine notice vs. marketing outreach) is inconsistent — many staff notices fall into the “outreach” bucket, which is meant for marketing.
  8. If a property lookup fails, a raw internal property id can leak into the subject line of a vendor notice instead of the real property name.
  9. The “guest card not created” notice (sent when Clara couldn't log a caller as a lead in AppFolio) has no sign-off, a raw unformatted phone number, and no link.
  10. Weekly digest emails never sign off as “Clara,” and one of them has its own separate copy of the phone-number formatter instead of reusing the one other notices use.
  11. None of these sends write to the delivery log Fede pointed at.
  12. One digest has a hardcoded recipient: an internal-only summary that always goes to fede@, not a client.

Recommendation

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.

Call sites that move onto it
Full table, one row per send path

1a. Voice cluster (call, transfer, voicemail, emergency)

File:lineTriggerChannelBuilderProperty namePhoneSign-offLinkRecipients sourceDelivery-logVerdict
agents/clara/lib/voice/post-transfer.ts:3760 (voicemail_left) → src/lib/domain/promises/pm-delivery.ts:838 → missed-call-note.tsTransfer landed in voicemail, nobody spokeEmailmissed-call-note.ts (shared)Real property or “not identified yet”, injected centrally — the #10677 bug is fixed herecallbackNumber()+telHref(), once, tap-to-callBare “Clara”personConversationUrlProperty.escalationOwnerEmail chain (property/org setting)Not written to email-delivery-log.tsCONSISTENT — reference implementation
post-transfer.ts:2534 (message_unheard/no_words/transfer_failed) → same pipelineTransfer rang out / silent / failedEmailmissed-call-note.ts (shared)Same as aboveSameSameSameSameSameCONSISTENT
src/lib/domain/maintenance/page-property-manager.ts:376-389Maintenance escalation to PM, incl. gas-emergency tierEmailproperty-manager-escalation-template.tsReal value or “not identified yet”, never org, via shared property-line helperlinkifyPhones()“Clara” or “Clara — Property” (3rd distinct shape)Yes when setpmEmail, via resolver chainNot written to logCONSISTENT on property/phone/link; sign-off shape diverges
src/lib/domain/leasing/notify-staff-virtual-tour-call.ts:72-95T-1h before a virtual tour, “you're calling this prospect soon”EmailInline, hand-builtOmitted entirely, even though property is in scopeRaw, no formatting, no link, appears onceNone — not a closing sign-offNoneresolveTeamNotificationEmail (property/org setting)No explicit category, defaults 'outreach'; not loggedDIVERGENT — same defect class as #10677
src/lib/domain/voice/emergency-no-answer-ladder.ts:115-121 (leg 1)Confirmed after-hours emergency, relay unansweredSMSInline stringReal property name passed by callerN/A (SMS)None (SMS)None (SMS)emergencyPhoneE164, resolved by callerNo delivery-log write of any kindDIVERGENT-but-low-risk — life-safety SMS exempt from most rules
emergency-no-answer-ladder.ts:164-188 (leg 2)Same emergency, still unreachedEmail + Slack #alertsbake-alert.tsReal property name passed throughn/an/an/aInternal PropFlow ops channeln/aOUT OF SCOPE — internal ops alert
src/lib/domain/escalation/text-on-ring.ts:287-301Hunt chain starts ringing a staff personSMStextOnRingBody (shared, pure)By design, never includedBy design, never included — the line itself, not the caller's digitsInline, not a closing sign-offN/A (SMS)Ring-list person from hunt configNo 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:3444PM's own turnover walk call just endedSMS to the PM on the callInlineN/A — replies to the PM about their own callN/ANoneN/APM's own live-call numberNot verifiedNot comparable — different notice class

1b. Escalation-matter and PM-forward cluster

File:lineTriggerChannelBuilderProperty namePhoneSign-offRecipientsDelivery-logVerdict
src/lib/domain/escalation/open-matter.ts:486Clara opens a decision-request matter needing a human callEmaildecision-request.tsReal 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 chainNo explicit category, defaults 'outreach'DIVERGENT — no clickable phone, property duplicated, non-standard sign-off
src/lib/domain/escalation/reply-release.ts:1548,1742,2207Staff reply-thread continuationEmaildecision-request.ts buildersReal propertySame raw-phone gapSame shapeReply-to thread senderSame gapDIVERGENT — same family as open-matter.ts
src/lib/domain/escalation/nag-pass.ts:668Escalation nag/reminder to ownerEmaildecision-request.tsReal propertySame raw-phone gapSame shapeEscalation ownerSameDIVERGENT — same family
src/lib/domain/escalation/teaching-capture.ts:759Memory-confirmation ask to staffEmaildecision-request.tsReal propertyn/a (no phone in this note type)Same shapeEscalation ownerSameDIVERGENT on sign-off shape only
src/lib/domain/escalation/gated-inbound-team-notice.ts:414Inbound message held while a matter is open, PM toldEmailproperty-manager-escalation-template.tsReal property, never orglinkifyPhones()“Clara — Property” (3rd shape)pmEmailNot verifiedCONSISTENT on property/phone/link; sign-off is the 3rd variant
src/lib/tools/handlers/handle-forward-to-property-manager.ts:1065Clara forwards an unanswerable question to PMEmailproperty-manager-escalation-template.tsReal propertylinkifyPhones()Same shapePM escalation-owner chainNot verifiedCONSISTENT with the escalation-template family
src/lib/tools/handlers/handle-capture-unknown-caller-note.ts:611Unknown caller left a note for staffEmailproperty-manager-escalation-template.tsReal propertylinkifyPhones()Same shapePM chainNot verifiedCONSISTENT
src/lib/domain/pms/guest-card-outbox-drain-runner.ts:170-185Clara couldn't create an AppFolio guest card from a callEmailIn-file builderReal property, in the subjectRaw, unformatted, no tel: linkNo sign-off at allresolveTeamNotificationEmailNot written to log; no explicit categoryDIVERGENT — no sign-off, no clickable phone, no link
src/lib/domain/escalation/bake-gate.ts:212A composed staff email is held pending reviewSlack, internalrenderHeldSlackBodyInlinen/an/aInternal review channeln/aOUT OF SCOPE — internal review tool
src/lib/domain/escalation/stuck-matter-surface.tsA matter nagged N times with no owner answerSlack, internalbuildStuckMatterBodyInlinen/an/aHardcoded internal channeln/aOUT OF SCOPE — internal PropFlow ops Slack

1c. Digest/rollup cluster

File:lineTriggerChannelBuilderProperty namePhoneSign-offRecipientsDelivery-logVerdict
src/lib/domain/leasing/renewal-lapse-digest.ts:280Weekly “leases ending, no answer yet” rollupEmailIn-file, emailCardLayoutReal property, in subject+bodyn/a — unit-level rowsNone — ends on a plain tail lineNot fully tracedNot verifiedDIVERGENT by omission — legitimate rollup genre, but zero sign-off consistency
src/lib/domain/leasing/stale-lead-digest/run-digest.ts + digest-email.tsWeekly “leads to call” listEmailOwn builderReal propertyformatPhone() + tel: link — correct, but its own re-implementation, not the shared helper“Clara recommends” used only as inline copy voice, not a sign-offNot verifiedNot verifiedDIVERGENT by omission (no sign-off); phone handling fine but duplicated logic
src/lib/domain/leasing/reporting-digest/run-digest.ts:645Portfolio reporting digestEmailOwn builderReal propertyNot checkedNot checkedNot tracedNot verifiedNot fully verified — likely same no-sign-off genre
src/lib/domain/leasing/pm-action-reminders/send-pm-action-reminder-digest.ts:93Reminder digest of pending PM actionsEmailOwn builderNot verifiedNot verifiedNot verifiedNot tracedNot verifiedNot fully verified
src/lib/domain/leasing/rent-roll/sync-digest.ts:138Daily AppFolio sync summaryEmailOwn builderInlinen/aNoneHardcoded fede@propflowai.coNot loggedOUT OF SCOPE / internal — sent to PropFlow, not a client

1d. Lease / renewal / tour / vendor / turnover / move-in cluster

File:lineTriggerChannelBuilderProperty nameCategoryaudience:'staff'Recipients sourceVerdict
src/lib/domain/leasing/renewal-holdover-notify.ts:165Lease rolled to month-to-monthEmailIn-file renderEmailReal valueNot set, defaults 'outreach'Not setresolveOfficeNoticeRecipients (shared)DIVERGENT — transactional notice miscategorized as marketing
src/lib/domain/leasing/renewal-notify.ts:217 (email) / :320 (SMS)Renewal pending PM reviewEmail + SMSIn-file renderEmail / inline SMSReal valueNot set (email leg), defaults 'outreach'Not setresolvePmContactEmail / property settingDIVERGENT (category); SMS phone-format not confirmed
src/lib/domain/leasing/renewal-execution-notify.ts:277Lease executed/countersignedEmailrenderExecutionNotice — the one real shared “pending notice” builderReal value, always explicit'transactional' explicit — correctNot setresolveOfficeNoticeRecipients chain, never hardcodedDIVERGENT — missing sign-off, misses audience:'staff'; otherwise the best-structured builder in the audit
src/lib/domain/leasing/send-pm-tour-cancellation.ts:180Tour cancelledEmailInlineRealNot checkedPresentProperty-scopedCONSISTENT on the audience flag — one of only 3 files that set it
src/lib/domain/leasing/send-pm-tour-confirmation.ts:361Tour bookedEmailInlineRealNot checkedPresentProperty-scopedCONSISTENT
src/lib/domain/leasing/send-leasing-team-tour-update.ts:152Tour rescheduled/updatedEmailInlineRealNot checkedPresentProperty-scopedCONSISTENT
src/lib/domain/leasing/new-lease/new-lease-draft-notify.ts:164Lease drafted / not draftedEmailIn-file subject builderReal'transactional' explicit — correctNot setresolveOfficeNoticeRecipientsDIVERGENT — missing audience:'staff' only
src/lib/domain/leasing/collections/owner-escalation.ts:271Collections owner alertEmailInlineRealNot set, defaults 'outreach'Not setEscalation-owner resolutionDIVERGENT (category + audience)
src/lib/domain/vendors/notify-pm-stale-dial.ts:235Vendor call went stale (no answer)Email + SMSIn-file builderReal value or raw property id fallback if lookup fails'transactional' explicit on both legsNot setProperty lookupDIVERGENT (audience only); category correctly handled
src/lib/domain/vendors/notify-pm-outcome.ts:955Vendor call outcome resolvedEmailIn-file builderReal value or raw property id fallback'transactional' explicitNot setProperty lookupDIVERGENT (audience)
src/lib/domain/vendors/notify-pm-po-required.ts:210Vendor job needs a POEmailIn-file builderReal value or raw property id fallbackNot set, defaults 'outreach'Not setProperty lookupDIVERGENT (category + audience)
src/lib/domain/move-in/send-pm-key-pickup-confirmation.ts:121Key pickup confirmedEmailInlineRealNot set, defaults 'outreach'Not setContext-scopedDIVERGENT (category + audience)
src/lib/domain/turnover/move-out-date-mismatch-notify.ts:115Move-out date discrepancy foundEmailIn-file renderEmailRealNot set, defaults 'outreach'Not setresolveOfficeNoticeRecipientsDIVERGENT (category + audience)
src/lib/domain/turnover/move-out-draft-notify.ts:154Move-out draft ready to finishEmailIn-file renderEmailRealNot set, defaults 'outreach'Not setresolveOfficeNoticeRecipientsDIVERGENT (category + audience)
src/lib/temporal/activities/tenant-confirmation-review.ts:114PM asked to confirm a caller's claimed unit/identitySMSbuildConfirmationReviewSmsOmitted entirely, even though the property is in scope at the call site'transactional' explicit — correct—resolveConfirmationReviewRecipient, property-scopedDIVERGENT — 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.

Latest: what we already knew about each caller (9/22, 2:00 PM MT)

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:

  1. Their lease or move-in status from AppFolio — whether they're an active resident, a lease that starts soon, or a prospect already assigned to someone on staff.
  2. That it was a repeat call — how many times this same person had already called about the same thing.
  3. The unit or property — even when it was sitting right in our own records, the notice only showed it if the caller happened to say it out loud themselves.
When (MT)CallerWhat we already knewWhat the email saidLine it should have opened with
9/11, 1:47 PMJordan MillerActive 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 AMJordan MillerSame 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 AMJordan MillerSame 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 AMEloisa ArellanoActive 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 AMGregory BoydProspect 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 PMEthan LindenschmidtProspect 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 AMDylan LewisFuture 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."

Example — Jordan Miller, 4th call, 9/16

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."

Example — Ethan Lindenschmidt, 9/21

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."

Example — Dylan Lewis, 9/22 (the good one, confirmed)

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.

Camellia: names and guest cards on leasing calls, last 14 days (9/22, 2:45 PM MT)

Leasing callsClara asked for a nameFull name capturedTour bookedGuest card written
205430

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).

1. What the last two weeks look like

CamelliaWestern Slope
Notices sent139
With a name, a topic and a number (good)73
Thin (no usable topic, or no name and not on file)66
Same caller, several notices in one day1 pair1 triple, 1 pair
Most notices to one inbox in one day38 (Mon 9/21)
Sent for a call that reached a person00

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.

1a. When we send today, and when we don't

CallsNotices sentRecipient
2110leasing@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.

2. What the clients and the team said (verbatim)

3. Real examples: what we sent, what was wrong, what it should have been

Example 1 — one caller, three emails, nothing in any of them

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.

What we sent (three separate emails)

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.

Better

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>

Example 2 — an alarm-company robocall, written like a mystery

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.

What we sent

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.

Better

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

Example 3 — we knew her name two hours earlier and forgot it

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.

What we sent for the second call

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.

Better (an update to the morning notice, not a new stranger)

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>

Example 4 — a police officer treated like a routine voicemail

Officer Barrett, Grand Junction Police, Western Slope, Mon 9/21, 1:26 PM, about a search warrant at 1303 North 15th Street, unit 3.

What we sent

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.

Better

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>

Example 5 — two names in one email

Fairhaven test line, Fri 9/18, 11:55 AM.

What we sent

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…"

Example 6 — a fragment that should never have gone out

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.

Example 7 — a good one, and what it still misses

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.

Example 8 — a good call, a bad record

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.

What was wrong is the record, not the call

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.

Better

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.

4. What a leasing call is for

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.

5. Proposed rules

Send only when both are true:

  1. We know what the call was about, in a sentence a person can act on. A cut-off fragment, an IVR prompt, or "wants a person" with no reason does not count.
  2. We know who called: a name they gave, or a match to a resident, prospect or vendor on file.

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.

PathWhen Clara asks the full name
Caller names a homeRight after they name it
Looking aroundWhen Clara lands on a specific home
Asks for a personBefore 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.

6. Delivery problems found on the way (need their own fix, not a design)

7. Decisions for Fede (pick one per line)

  1. Decided 9/22: thin calls send nothing; their facts carry forward; the first call with enough information sends one notice with the whole picture. Open sub-question: does a concrete ask plus a callback number count as enough when no name was given? Recommendation: yes, and Clara asks for the name before any transfer.
  2. Repeat callers: (A, recommended) update the earlier notice within 24 hours; (B) separate emails, capped at one per caller per day.
  3. Decided 9/22: alarm or utility systems get one short line with no callback ask (Example 2); every other robocall stays silent.
  4. Test the rule before it ships: (A, recommended) replay the 22 notices above plus the next 7 days of live calls in shadow, publish the would-have-sent versus sent table, then turn on; (B) ship the rule now as a bug fix.

8. What happens after the pick

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.

PropFlow Docs