Who Clara's messages come from: the sender audit

Fede's rule (2026-11-03): a message to the customer's own team comes from Clara at Propflow. The customer's mailbox is for outside people only. This page is the full audit of every place that picks a sender, what production actually did, and the one-seam fix.

Audit 2026-11-03 (agents-011) · read-only, repo at main a23571aa · owner of the fix: the Clara coworker lane · status: findings final · fixes PR #25042 and #25061 armed for the merge queue (Clara coworker session)

TL;DR · The rule · The two cases · What production did (14 days) · Every place that picks a sender · The fix: one seam · Follow-ups · Appendix: full reports

TL;DR

52
places that pick a sender
email 24 · text 13 · voice 7 · calendar 3 · scripts 5
16
email points that can send staff mail as the customer
none inside the router reads the reader's role
151 / 152
staff emails in 14 days from Clara at Propflow
notices are already right
2
wrong sends found
Kat's Zoom link (WS), Miriam's reply (Situs)

The shape of the problem: staff notices use a sender that defaults to Clara at Propflow, so they are right. Staff replies go through the property email router, which picks the mailbox by what exists, never by who is reading. Three "this is staff" flags exist and none of them reaches the mailbox choice. Texts, voice and calendar cannot do this today.

TODAY: THE DOOR IS PICKED BY WHICH MAILBOX EXISTS, NOT BY WHO READS IT Staff notice call summary, tour alert, digest Reply to someone who wrote in prospect, renter, vendor OR staff Staff writes to clara@ the one path that checks the role Property email router building mailbox → company mailbox → SendGrid Clara at Propflow clara@propflowai.co Customer's mailbox leasing@… / camelliaapts@… a staff reader goes this way too: 16 of 24 email decision points can do it Fix: one check at the top of the router, "does this address hold a staff role at the company?", and staff always take the green door.
Who picks the sender. Staff notices default to Clara at Propflow and are right. Replies go through the property router, which only asks which mailboxes exist. The one path that looks up the reader's role is the staff-writes-to-clara@ turn.
The rule

The rule

"It should be from Clara at Propflow for internal team notifications. And it should be leasing outside to prospects, not internally." · "Seems like we have too many places that decide what email to send it from."

Fede, 2026-11-03
  • Customer's own team (org admin, PM, leasing agent, maintenance, ring list, tour host, escalation owner): from clara@propflowai.co.
  • Outside people (prospects, applicants, renters, vendors): from the customer's connected mailbox, so the thread lives in their shared inbox.
  • Who someone is comes from their roles at the company, looked up by the sender seam itself. Never a per-call flag, never "same email domain as the mailbox".
The two cases

The two cases

Western Slope, Nov 3, 16:06Z

The Zoom link for a virtual tour went to the tour host, Kat (a leasing agent), from leasing@westernslopepm.com. The only wrong send in 14 days of production. No code on main writes that subject; the host email the code owns goes from Clara. Needs a trace of that message.

Situs Group, Nov 4, 00:28Z

Miriam (a PM) asked Clara for an app. A hand-run reply inviting her to text or call Clara's Situs line went out from leasing@thesitusgroup.com, through the router, with the "internal recipient" flag set. The flag changed nothing. The takeover recipe never mentions staff readers. Clara's own automatic replies to Hugo, Lee, Miriam and Eileen on other threads went from Clara at Propflow.

What production did, last 14 days

What production did, last 14 days

Every email to a customer-domain address (Western Slope, Situs Group, Camellia / JP&Co), with the sender inferred from the message id each door stores. Calendar invites are not in this log.

CustomerStaff emailsFrom Clara at PropflowFrom the customer's mailbox
Western Slope70691
Situs Group50500
Camellia / JP&Co32320
Total1521511

The Miriam send happened after the window closed and is counted under the cases above. Checked separately: the Situs mailbox's Sent folder holds exactly one email to Miriam since Nov 2, the hand-run one; Clara's own automatic reply to her at 22:22Z did not go from that mailbox. Per-row evidence is in the appendix.

Every place that picks a sender

Every place that picks a sender

ChannelDecision pointsKnow the reader's roleCan put staff on a customer identity
Email246, and only one uses it to pick the sender16
Text131 (declared by the caller) + sign-in codes by purpose1 conditional (the AppFolio text door, when the caller forgets to declare staff)
Voice710
Calendar300 today; latent if anyone is added to an event by hand
Scripts and skills502 (the Miriam script and the takeover recipe it followed)

Email, in plain words

  • Notices (call summaries, tour alerts, lead notices, digests, approvals, emergencies): one sender with Clara at Propflow as the default. Every staff notice is right today. (79 staff send sites in all; the 5 wrong ones are the reply paths below.)
  • Replies through the property router: building mailbox, else company mailbox, else SendGrid. Every input is about mailboxes. Five reply paths put staff through it: the shared-inbox reply, the clara@-lane fallback, an approved held reply, the held reply's draft row, and the shared reply router behind them (the root).
  • "Role known, then ignored": the shared-inbox reply looks the reader up as staff, uses the answer only to pick a plainer template, and still sends from leasing@. It also counts "same domain as the mailbox" as staff, which is a stand-in, not a role.
  • The one right path: a staff member writing to clara@ gets a reply hard-wired to Clara at Propflow. It sits outside the router.
  • Second copies of the mailbox rule: lead follow-ups and turnover vendor emails each carry their own. Turnover vendor mail at Western Slope and Situs goes out from Clara at Propflow today, the reverse mistake.

The full per-point table (file and line, inputs, role awareness, verdict), the texts, voice and calendar tables, and every search pattern used are in the appendix.

The fix: one seam

The fix: one seam

  • Becomes pass-through: the three staff flags (internalRecipient, audience, recipient.isStaff) stop deciding anything about the sender.
  • Covered with no change of their own: approved held replies, the clara@-lane fallback, and every hand-run script that uses the router.
  • The shared-inbox Lambda keeps its own wire for threading; it drops the domain shortcut and branches on the same lookup, sending staff the way the staff turn already does. One decision function, two callers, until the Lambda moves onto the router.
  • Ships as a behavior fix to live Clara: no switch. Proof: replay of the Miriam thread and the five reply paths, then a real staff email at Willows, then the Kat case re-run.

Before → after

Before

  • 24 email decision points, 16 can send staff as the customer
  • 3 staff flags, none reaching the mailbox choice
  • sender chosen by which mailbox exists

After

  • one role lookup decides, in the router
  • flags removed or inert
  • a staff address cannot leave on a customer identity, from any caller or script
Follow-ups

Follow-ups

  • Fix in flight, PR #25042: one role lookup at the top of the router; replay of 196 delivered emails (Nov 2 to 4) moves only Kat's Zoom link and the Miriam thread to Clara at Propflow, every outside send unchanged; Willows live run done (staff email from clara@propflowai.co, prospect email from the Willows leasing mailbox).
  • Ruled by Fede (Nov 3 night, "Clara at Propflow. Propflow."): shared-inbox replies to a teammate also come from Clara at Propflow. PR #25061 removes the Aug 9 restriction and branches that reply step on the same role lookup; armed for the merge queue. Replay of 123 shared-inbox sends over 14 days found none to a staff role (staff mail into that inbox has been skipped as coworker mail since Aug 20), so this is the guardrail. First production proof: a sender_door_chosen line in that step's log after deploy. Fede: staff don't write there; if they do, an earlier send from leasing@ was wrong.
  • Sender display name: other staff emails still show "Clara", not "Clara at Propflow". Same-domain-counts-as-staff shortcuts remain in two escalation and team-notify files; both are on the staff-reply refactor design's deletion list (clara-coworker-loop-v3-2026-10).
  • Superseded: the shared-inbox reply step (the Lambda) is NOT in the PR. A permanent test from Aug 9 forbids any send from Clara at Propflow in that file, which clashes with the Nov 3 rule. Until he rules, a staff member who writes to the customer's shared inbox still gets Clara's reply from that inbox.
  • Trace Kat's Zoom link (Western Slope, Nov 3 16:06Z): which path wrote it, since no code on main writes that subject.
  • Issue #25035: Clara's staff replies should name the company's Clara line (Miriam's "is there an app" question).
  • Takeover skill: the email recipe must route staff readers through the staff door; one-off scripts under scripts/_*.ts are gitignored and never meet CI.
  • Turnover vendor emails go out from Clara at Propflow today, the opposite mistake (vendors are outside people). Own fix, with the lead follow-up bypass, both onto the router.
  • The delivery log does not store the sender address. Add it, so the next audit reads it instead of inferring from message-id shapes.
  • Two canary scripts can send from a real customer mailbox with no test-property check.
  • Texts: the AppFolio text door trusts a caller flag the same way; if texts ever follow the rule, same lookup. Open for Fede only if it matters: do staff texts need a separate line, or is the shared Clara line fine?
  • Owner reports (2 sites): are owners "internal"? Unclear until Fede says.

Appendix: the full reports

A. Every decision point, all channels (read-only audit, 2026-11-03)

Where Clara decides who a message comes FROM (decision-point audit, 2026-11-03)

Read-only. Repo ~/.claude/propflowai at e1d7fe14 (origin/main a23571aa differs only in CI-cost and fallback-call files, none on a sender path). Nothing edited. Companion to notification-inventory.md (the 109 send sites, ids W1-W6 / U1-U7 used below).

Rule checked: the customer's own staff hear from clara@propflowai.co (SendGrid). The customer's mailbox is for outside people only.

The answer in brief

  • Email has 24 places that touch the from-identity. Nothing inside the property router reads the recipient's role. The one path that picks clara@ because the recipient is staff (the staff email turn, E16 → E17) sits outside the router.
  • Three "this is staff" signals exist (internalRecipient, audience: 'staff', recipient.isStaff). None reaches the rule that picks the mailbox. They steer the template, the contact limit and the not-live hold.
  • Two places do a real role lookup (the shared-inbox Lambda, the staff email turn). Only the staff email turn acts on it for the sender. The Lambda looks it up and then sends from leasing@ anyway.
  • A likely source of today's Situs email: a one-off script dated today (X1) that emails a Situs PM through the router from the Situs mailbox, following the clara-takeover email recipe. Whether it was run with --send is not verified. The other candidates are W2/W3 from the inventory.
  • Staff only get clara@ today because staff *notices* use a different function (sendEmail) that defaults to clara@. Any staff mail that enters the property router instead comes out from the customer mailbox.

Email decision points

"Role?" = does this point know whether the recipient is the customer's staff. "Staff on customer identity?" = can a staff recipient come out of it sent as the customer (leasing@, camelliaapts@, or a building's own SendGrid identity).

#File:lineWhat it decides (plain words)InputsRole?Staff on customer identity?
E1src/lib/integrations/email/send-mailbox-selector.ts:148 chooseMailboxWhich mailbox a property email leaves from: the building's own, else the company's (Microsoft or Gmail), else SendGridbuilding mailbox exists, company mailbox exists, attachmentsNo (never reads the flag it is passed)YES
E2send-mailbox-selector.ts:114-127 selectSendMailboxReply from a sister building's mailbox when that mailbox holds the threadsibling root, has parent, attachmentsNoYES
E3send-mailbox-selector.ts:130-146 selectWithoutSiblingAfter a mailbox send fails: hold it, or resend from SendGridinternalRecipient (per-call flag), building SendGrid identityOnly the flagN/A (changes the fallback, never the first door)
E4src/lib/integrations/email/company-mailbox.ts:41 resolveCompanyMailboxTokenWhether the company mailbox is usable for a building with nonebuilding mailbox, organizationId, stored tokenNoYES (feeds E1, E10, E13, E20)
E5src/lib/integrations/email/sibling-root-mailbox.ts:25 resolveSiblingRootMailboxWhich sister building's mailbox holds the thread rootproperty, thread root mailbox, parent idNoYES (feeds E2)
E6src/lib/integrations/email/property-graph-sender.ts:762-833 sendPropertyEmailRuns E4/E5/E1, refuses to pass over a building's own mailbox (:812), picks the token and legproperty, forwarded flags; audience is not passed to the selectorFlags only; no staff caller sets themYES
E7property-graph-sender.ts:1064-1110 (SendGrid leg)From-address when the router falls back to SendGrid: the building's sendGridSenderIdentity, else clara@property fieldNoYES (a building with its own SendGrid identity, e.g. Yale, sends staff mail as itself)
E8src/lib/integrations/email/client.ts:1176 runEmailSendFrom = caller's fromEmail, else clara@per-call fromEmailNoNO. The only production caller that sets fromEmail is E7 (:1109). tellStaff, sendOrHoldTeamNotice, the team-notification engine and sendRecapEmail (:2135) never do
E9client.ts:2003 resendDeadLetteredEmailRe-sends a failed email from the address stored on itstored payloadNoInherits the original choice
E10src/lib/integrations/email/reply-mailbox.ts:81 resolveReplyMailboxWhich mailbox the shared-inbox Lambda answers from: building, else companybuilding mailbox, orgNoYES
E11lambda/inbound-processor/handler.ts:716-720Answer from the building the mail arrived on (umbrella-building case)mailboxPropertyId on the queue messageNoYES
E12handler.ts:978 isInternalReplyRecipient"Is the person we are replying to staff?": an active staff role at the org, or the same email domain as the mailboxrecipient address, mailbox address, orgYes (role lookup + a domain proxy)YES: the answer picks the plain template and skips the contact limit, never the sender (W1)
E13handler.ts:1178-1196, 1238Building token vs company token; /me vs /users/<address>E10's verdictNoYES (pass-through of E10)
E14src/lib/domain/messaging/send-clara-prospect-email.ts:563 sendClaraProspectEmailHands Clara's reply to the router without the staff fact it holdsrecipient.isStaff (template only)Partly (caller-supplied)YES (W5)
E15send-clara-prospect-email.ts:602-610 ...ViaAdapterThe lane brings its own wire, so the lane decides: Lambda = customer mailbox, staff email turn = clara@lane's deliverTemplate onlyDepends on lane (YES for the Lambda)
E16agents/clara/lib/email/process-inbound-email.ts:1292 vs 1945/2040Mail to clara@: staff turn (clara@) only if the sender passes the mail check, holds a staff role, wrote to Clara, and the lead router did not claim it first; otherwise sesDeliver into E14auth result, staff lookup, lead-router claimYes for the staff turn; no in sesDeliverYES (W2)
E17agents/clara/lib/email/staff-email-turn.ts:416-437Staff email turn reply: hard-wired to sendEmail from clara@, audience: 'staff'staff lookup upstream (resolveInboundStaffMembershipByEmail)YesNO (the one place that does it right)
E18src/lib/domain/escalation/bake-gate.ts:945 / 1005 / 1063 vs 1575Approved hold goes out by the hold's KIND: notices via sendEmail (clara@), replies via sendPropertyEmail (customer mailbox)hold kind; hold.audience exists on the row but is not passed at :1575NoYES (W3)
E19src/lib/domain/escalation/held-reply-draft-row.ts:265-269Marks a held reply as staff from turn.audience, for the template only; the hold is released by E18turn audienceYesYES (W4)
E20src/lib/domain/leasing/send-prospect-email-touch.ts:374-418Second copy of the mailbox rule for lead follow-ups (building Microsoft, else company), straight to the inbox clientbuilding mailbox, company tokenNoN/A (prospect cadence only). Bypasses E1
E21src/lib/integrations/email/send-turnover-vendor-dispatch.ts:251-273, 818-820, ~903Turnover job to a vendor: building mailbox only, else SendGrid clara@building mailboxNoN/A for staff; wrong for vendors at company-mailbox customers (W6). Bypasses E1
E22agents/clara/lib/email/gmail-inbox-client.ts:495 → src/lib/integrations/email/gmail-company-sender.ts:127 / 332Gmail From line = the mailbox's own addresstoken's profileNoPass-through
E23src/lib/integrations/email/webhook-processors.ts:2593 (and the SES receipt rule)The address someone wrote to picks the lane, and the lane picks the reply door: shared inbox → Lambda (customer mailbox), clara@ → SES lanemail's To addressNoYES: this is upstream of every reply decision
E24src/app/(standalone)/onboarding/(wizard)/(dialog)/channels/email-preview.ts:194 claraFromNameThe onboarding preview shows the from-name "Clara at <their domain>"company name, domainNoN/A (preview only; it does not distinguish staff mail)

Not decision points (checked): every tellStaff / sendOrHoldTeamNotice / team-notification / sendRecapEmail caller (all inherit E8's clara@); the 17 other sendPropertyEmail callers (all address outside people and inherit E6); the SES conversational adapter agents/clara/lib/messaging/adapters/ses-email.ts:346 (dormant, U7; no SES send command exists anywhere in src/agents/lambda).

How the email points feed each other

  • Notices: caller → tellStaff / sendOrHoldTeamNotice / team engine / sendRecapEmail → E8 → clara@. No choice is made; the default is right.
  • Router: caller → E6 → E4 + E5 → E2 → E1 (+ E3 failure rule) → Graph / Gmail (E22) / SendGrid (E7 → E8). Every input is about mailboxes. The recipient's role never enters.
  • Replies to people who wrote in: E23 picks the lane.

- Shared inbox → Lambda → E11 → E10 (→ E4) → E12 computes "staff" → E15 → E13 → customer mailbox. Role known, ignored for the sender. - clara@ → E16 → staff turn → E17 → clara@ (correct). Or sesDeliver → E14 → E6 → customer mailbox (role never resolved). - A held reply → E19 → hold row → E18 → E6 → customer mailbox.

  • Bypasses that copy E1's rule: E20 (cadence) and E21 (turnover). Neither serves staff today, but each is a second copy of the mailbox rule that a future staff send could inherit.

Text decision points

Clara's Twilio lines are numbers PropFlow owns, one per building or company. Staff texts leave on the same line prospects text, so no staff text comes from a customer mailbox-style identity. The one real customer identity on texts is the company's AppFolio text door (texts sent from the customer's own PMS number). The dispatcher keeps staff off it, but only when the caller *declares* the recipient is staff.

#File:lineWhat it decidesInputsRole?Staff on customer identity?
T1src/lib/domain/properties/resolve-outbound-address.ts:120Core line rule: the line they texted, else the building's line, else the company's; refuses when there is nonereply-to line, propertyIdNoNO (Clara line). About 55 send sites call it with only a propertyId
T2src/lib/domain/properties/clara-line-for-building.ts:35Second copy of the building-then-company lookup (collections texts, vendor dial)propertyIdNoNO. Bypasses T1
T3src/lib/domain/escalation/staff-line-thread.ts:40Line plus thread for every staff textpropertyId, org (wraps T1)Implied by its callers, not usedNO (same line prospects see). Needs a propertyId to work at all (line 47), which breaks the 2026-11-02 "a missing property never changes behavior" rule
T4src/lib/domain/messaging/manual-send-from-number.ts:147, 228Line for manual sends and approved draftspropertyId (wraps T1)NoNO
T5resolve-life-safety-sender.ts:49, 108Emergency text/call line: the building's own, else the line they called in on (same company)property, org, arrival lineNoNO
T6agents/clara/lib/messaging/process-envelope.ts:1507Reply on the line they textedinbound ToNoNO
T7agents/clara/lib/messaging/dispatcher.ts:531-560 + src/lib/domain/pms-doors/text-door-recipient.ts:57 textDoorLaneOfClara's line vs the customer's AppFolio text doorper-call recipientType, module, mediaYes, but declared by the callerNO when declared. YES if a staff text omits recipientType and carries module none or a resident module
T8twilio/client.ts:2152 vs 163Picture messages that pass an MG… value go out through a Twilio poolformat of the from valueNoN/A
T9held-text.ts:594, 687; walk-recap-send.ts:120-141; renewal-reply-review.ts:91-135Line saved on a held text, reused on approvalstored smsFromNoNO (inherits T1)
T10temporal/activities/renewal.ts:838Renewal text/call linepropertyIdNoN/A
T11tour-video-room-notify.ts:84; relay-scope.ts:82/90Company line when there is no building; line for relaying a team answerorg, propertyIdNoN/A
T12src/lib/integrations/sms/mfa-sms-sender.ts:63Staff sign-in codes leave from MFA_SMS_FROM_NUMBER, a separate PropFlow line; throws if unsetenv varStaff by purposeNO. The only separate staff line found
T13scripts/send-clara-sms.ts:156 (clara-takeover skill)Manual text uses T4conversation, propertyNoNO. The skill's notes still name the removed PROPERTY_TO_PHONE_MAP

Voice decision points

#File:lineWhat it decidesInputsRole?Staff on customer identity?
V1initiate-outbound-call.ts:792Turns the chosen number into the voice platform's phone-number idcaller-id numberNoFollows its input (T1/T5/T10)
V2hunt-chain.ts:298, 786Ring-list dial shows the caller; on-call calls show the ticket's lineFrom/To, ticket lineNoNO
V3emergency-alert-chain.ts:1020, 1216, 1240On-call / call-center emergency calls: company line, else T1company line, propertyIdNoNO
V4handoff-caller-id.ts:64 (hunt/route.ts:829, handle-connect-caller.ts:86, clara-fallback-chain.ts:100)On a handoff the team sees the line the caller dialed; only an outside call center sees the tenant's numberdestination, stored call centerYes (team vs outside service)NO
V5emergency-relay-call.ts:397; vendors/dial-approved-session.ts:237Relay and vendor call caller idproperty, arrival line (T2 for vendors)NoN/A
V6~/.claude/skills/clara-callback/SKILL.md step 2Operator picks the number that matches the original call's dialed numberoriginal callNoNO
V7Bypasses: caller-number-passthrough.ts:143 (no live caller), maintenance-menu-digit.ts:190 + scripts/configure-maintenance-menu-bridge.ts:93, western-slope-portfolio-triage.ts:1842 (prototype), robot-call.ts:185, scripts vendor-calling/test-dial.ts:173Fixed or overridden caller idsstatic config / CLI flagNoNO

Calendar decision points

Verified (event-types.ts read directly): no calendar event the app writes has an attendee, so no invite goes from a customer mailbox to anyone. CalendarEventSpec (src/lib/domain/calendar/engine/event-types.ts:75-88) has no attendee field.

#File:lineWhat it decidesInputsRole?Staff on customer identity?
C1src/lib/domain/calendar/sync-tour.ts:382 resolveTourCalendarNode (then :312), written by engine/apply-calendar-event.ts:740/836Which calendar a tour lands on: the agent's own calendar, else the building's, else the company's. Vendor visits, key pickups, inspections and work orders follow the same enginetour, property, saved calendar pinN/ANO (no attendees)
C2src/lib/domain/calendar/outlook-client.ts:636/715; provider/google.ts:288/318Adapters would invite attendees from the calendar owner if given any; Google PATCH always uses sendUpdates=allparamsNoNO today. Latent YES: anyone added by hand gets updates and cancellations from the owner mailbox
C3src/lib/domain/leasing/tour-calendar.ts:242-258 → tour-email-actions.ts:278The .ics on the prospect's confirmation (PUBLISH, no organizer), sent through E6prospectNoNO (prospect only)

Tooling and one-offs that pick a sender

#File:lineWhat it decidesRole?Staff on customer identity?
X1scripts/_miriam-situs-phone-and-reply.ts:48-66Situs PM (miriam@thesitusgroup.com) emailed through E6 with internalRecipient: true. The preview prints the Situs company mailbox as the senderComment onlyYES. Verified: the flag does not change the door. Whether --send ran shows as a manual outbound row on conversation 4abd32d7
X2~/.claude/skills/clara-takeover/SKILL.md:122Email recipe: "write a one-off on sendPropertyEmail". No word about staff recipientsNoYES (X1 followed this recipe)
X3scripts/_send-clara-email-jordan-cosigner.ts:37-58Prospect, through E6 from the Camellia mailboxNoNO (outside person, correct)
X4scripts/_send-erika-jonas-dispute.ts:138-154Raw SendGrid call, hard-coded clara@NoNO (right sender, but skips sendEmail's gates)
X5scripts/canary/e2e-mixed-pm-and-ai.ts:94/403, e2e-pm-reply-ingest.ts:70/276Graph sendMail from whatever building E2E_TEST_PROPERTY_ID names, with no test-property checkNoNO (synthetic recipients), but it can send *from* a real customer mailbox

scripts/_*.ts is gitignored (.gitignore:370), so one-offs never meet CI or the send-door registries.

Slack and other staff channels: Slack posts use PropFlow's own bot identities. None of them poses as the customer. Not enumerated.

Count

ChannelDecision pointsKnow the recipient's roleCan put staff on a customer identity
Email24 (E1-E24)6 (E12, E14, E15, E16's staff turn, E17, E19); only E17 uses it to pick the sender16 today
Text13 (T1-T13)1 (T7, declared by the caller) + T12 by purpose1 conditional (T7 when undeclared); every other staff text uses the same PropFlow line prospects see
Voice7 (V1-V7)1 (V4)0
Calendar3 (C1-C3)00 today, 1 latent (C2)
Tooling5 (X1-X5)02 (X1, X2)

Completeness check

Grep patterns used (ripgrep -M 300; skipping tests, dist, maps, node_modules, json, md; --no-ignore for gitignored scripts):

  • Email: fromEmail\s*:|fromName\s*:, fromAddress\s*[:=], ['"\]From: , CLARA_EMAIL, sendGridSenderIdentity, selectSendMailbox, chooseMailbox, resolveCompanyMailboxToken, resolveReplyMailbox, resolveSiblingRootMailbox, getValidEmailToken\(, createInboxClient\(|new MicrosoftInboxClient\(|new GmailInboxClient\(, \.sendReply\(|\.sendNewMessage\(|\.sendMail\(, /sendMail|/reply|/replyAll|/createReply|messages/send|gmail\.users\.messages\.send, sendFromGmailCompanyInbox\(, sendPropertyEmail\(|sendPropertyReplyEmail\(, sendClaraProspectEmail(ViaAdapter)?\(, SendRawEmailCommand|SendEmailCommand|client-ses, @sendgrid/mail|sgMail|api\.sendgrid\.com/v3/mail, isStaff|internalRecipient|audience`.
  • Text and voice: messagingServiceSid, messages\.create, calls\.create, agent_phone_number_id|agentPhoneNumberId, callerId(E164)?, outbound[-_]call, resolveOutboundAddress, claraNumberForProperty, PROPERTY_TO_PHONE_MAP, TWILIO_PHONE_NUMBER, smsFrom, fromNumber, claraLineForBuilding, resolveStaffLineAndThread, resolveManualSendFromNumber, handoffShows, process\.env\.[A-Z_]*(FROM|_LINE|SENDER).
  • Calendar: /me/events|/calendar/events|calendar/v3|events\.insert|sendUpdates|attendee|METHOD:REQUEST|text/calendar|BEGIN:VCALENDAR.

Findings from the checks:

  • SendGrid has exactly one wire: client.ts:390. The only exception is X4.
  • No SES send exists.
  • Only one production line overrides the From address: property-graph-sender.ts:1109.

Sends that skip the known doors:

  • Email: the Lambda's own Graph/Gmail wire (E13), the cadence follow-ups (E20), turnover vendor emails (E21), X4, X5.
  • Text and voice: T2, V7.
  • PROPERTY_TO_PHONE_MAP is gone from the code. claraNumberForProperty (phone-lookup.ts:656) has no production callers left.

Recommendation

Decide the email sender in one function owned by the router, send-mailbox-selector.ts. Call it once at the top of sendPropertyEmail, before E4. It looks up the recipient itself from the to address and the organization: resolveInboundStaffMembershipByEmail(to, organizationId), or holdsActiveStaffRoleInOrg when a personId is in hand. That is roles at the company, never the building, and never the email-domain shortcut E12 uses. Any active staff role turns chooseMailbox into "SendGrid from clara@", ignoring the building's sendGridSenderIdentity.

The shared-inbox Lambda keeps its own wire for threading and its send lock. So sendClaraProspectEmailViaAdapter should ask the same function and, for staff, deliver the way the staff email turn already does (E17). The Lambda already runs this lookup at :978. The change there is to drop the domain arm and branch the wire on the result, not to add a new lookup. That is one decision function with two callers, until the Lambda moves onto the router.

What goes away or becomes pass-through:

  • Stop deciding anything about the sender: internalRecipient, audience and recipient.isStaff. The staff fact on E3, E14 and E19 would come from the lookup instead.
  • Gone: the "role known, ignored" gap in E12/E15. E17's hard-wired clara@ becomes the default.
  • Need no change: the hold-kind split at E18, sesDeliver (E16), E7's staff case, and every X1-style script.
  • Separate follow-ups: move E20 and E21 onto the router, and update the clara-takeover email recipe.
  • Texts: T7 is the same pattern with a caller flag. If texts ever follow the rule, it should do the same lookup instead of trusting recipientType.
B. Every email send site with a verdict (109 sites)

Who Clara emails, and which address it comes from (inventory, 2026-11-03)

Read-only inspection of origin/main @ f59cf9885a (Nov 4 00:33 UTC). Nothing edited. Rule checked: staff of the customer hear from clara@propflowai.co; the customer's connected mailbox (leasing@…, camelliaapts@…) is only for outside people (prospects, applicants, renters, vendors).

Counts

Email send sites inventoried (src/ + agents/, plus the one Graph inbox Lambda)109
Sites whose recipient is staff/internal (customer staff or PropFlow staff)79 (+2 owner-report sites, unclear)
...of those, sent from a customer mailbox today5 (all the same family: Clara's *reply* to someone who wrote in, when that someone is staff)
Outside-person sites sent from the customer mailbox (correct)19
Outside-person sites sent from clara@ (the reverse mistake)1 confirmed (turnover vendor emails at company-mailbox customers) + fallbacks listed under UNCLEAR
Staff notices sent from clara@ (correct)74

Headline: every *notice* Clara writes to staff (call summaries, tour alerts, lead notices, digests, approvals, staff asks, emergency alerts, renewals, move-outs, vendor outcomes) already goes from clara@ through SendGrid. The leak is narrower: when Clara replies to a person who emailed in, the reply goes from the customer mailbox even when that person is staff. Three doors do this: the shared-inbox reply Lambda, the clara@ (SES) reply lane, and the "approve a held reply" release.

Today's Situs email: the code can't say which message it was. Going by the path you named (sendPropertyEmail → selectSendMailbox), it is W2 (a reply on the clara@ lane) or W3 (an approved held reply). W1 (the Lambda) has the same defect but never goes through the selector. Telling W2 from W3 needs the ingestion-log or hold row for that message.

---

How the sender is chosen today

``` sendPropertyEmail(...) <- every "property-voiced" email | +-- selectSendMailbox() send-mailbox-selector.ts | 1. building has its own mailbox -> Graph from that mailbox (Camellia) | (non-Microsoft own mailbox -> SendGrid) | 2. company mailbox connected -> Graph (Microsoft) or Gmail (Google) | (Gmail + attachments -> SendGrid) | 3. nothing connected -> SendGrid | (sibling rung: reply from a sister building's mailbox that holds the thread) | +-- SendGrid leg: from = property.sendGridSenderIdentity.email, else clara@propflowai.co

sendEmail(...) (client.ts) <- every staff notice from = opts.fromEmail || CLARA_EMAIL ('clara@propflowai.co') Only the SendGrid leg of sendPropertyEmail ever sets fromEmail. Wrappers that all land here: tellStaff, sendOrHoldTeamNotice, sendgridTeamSender (team-notification engine), sendRecapEmail, bake-gate releases of held notices. ```

  • resolveCompanyMailboxToken (company-mailbox.ts) returns the company's Graph/Gmail token only when the building has no mailbox of its own. It never looks at who the recipient is.
  • What internalRecipient changes today: in the selector, only the failure rule. A staff send whose mailbox attempt throws falls back to SendGrid instead of being held. It never changes which door is tried first. In sendPropertyEmail it also skips the per-person contact ceiling. audience: 'staff' only affects the company-live hold. Neither flag picks clara@.
  • And no caller of sendPropertyEmail passes either flag today (checked all 16 direct callers plus wrappers). sendClaraProspectEmail takes recipient.isStaff, but uses it only to pick the plain coworker template. It never passes it to the router.

Where one fix belongs

1. chooseMailbox in send-mailbox-selector.ts: add a first rule, "recipient is staff (internalRecipient or audience: 'staff') → { door: 'sendgrid', why: 'staff_recipient' }", ahead of the building-mailbox rule. Also force SendGrid's fromEmail to clara@ for that reason, not the building's sendGridSenderIdentity. This is pure code with one existing test file, so the rule lives in one place. 2. Thread the flag in: sendClaraProspectEmail passes internalRecipient: recipient.isStaff (and audience: 'staff') to sendPropertyEmail. The SES lane (process-inbound-email.ts sesDeliver) and the held-reply release (bake-gate.ts:1575) need the staff fact too. The SES lane never resolves it today. The hold row would need to store it, e.g. on hold.resume, or the release can read hold.replyModule === 'team.notices' / a staff lookup. 3. Second door the selector never sees: lambda/inbound-processor/handler.ts sends Clara's shared-inbox replies straight through client.sendReply/sendNewMessage on the connected mailbox token. It already computes isInternalRecipient. Its deliver needs a staff branch that calls sendEmail from clara@, the way staff-email-turn.ts already does.

Why the current design used the customer mailbox (for Fede to weigh)

  • Threading in the shared inbox. A Graph reply only threads from the mailbox that holds the parent message. A clara@ reply to a staff member's email in leasing@ will not appear in leasing@'s Sent Items or in that Outlook conversation. The staff member's own mail client still threads it (In-Reply-To/References headers ride on SendGrid; staff-email-turn.ts already does this).
  • Gera's rule (gmail-company-sender.ts header): the company mailbox is "where Clara reads and writes from". The 2026-09-15 "reply-only" ruling has Clara read only replies on threads she started in that mailbox. If staff reply to a clara@ email, the reply lands at clara@ (the SES lane → staff turn), not in the shared inbox. That is already how every staff notice works today.
  • "Never as generic Clara" (#11694): the selector refuses to *re-send* a possibly-delivered prospect email from clara@. It already exempts staff recipients, so the design already accepts staff mail coming from clara@.
  • Building voice: the router exists so prospect mail looks like it comes from the property (Camellia, 2026-07-18). None of that applies to staff.

---

Inventory, WRONG first

Door legend: CustMbx = customer mailbox (building Graph mailbox, else company Graph/Gmail mailbox); clara@ = SendGrid from clara@propflowai.co.

WRONG: staff recipient, sent from the customer mailbox (5)

#File:lineMessage (plain words)Who receivesHow recipient type is decidedDoor todayVerdict
W1lambda/inbound-processor/handler.ts:1124 → 1266/1292 (outside src/agents, but this is THE shared-inbox reply door)Clara's reply to an email someone sent to the customer's shared inbox (leasing@…)Whoever wrote in. Staff when they addressed Clara directlyisInternalReplyRecipient staff lookup (line 978) → only picks the plain coworker template (isStaff) and skips the contact ceiling (internalRecipient, line 1059)CustMbx (building token, else company token), direct client.sendReply/sendNewMessageWRONG when staff
W2agents/clara/lib/email/process-inbound-email.ts:2040 (sesDeliver, line 1945) → send-clara-prospect-email.ts:563Clara's reply to an email sent to clara@ / a property's inbound address that the staff turn did not take (the lead router claimed it first, or the staff turn threw and fell back to the ordinary path; an unverified sender is meant to get silence per staff-email-turn.ts, not checked further)The sender. Mixed, can be staffNever resolved: recipient passed without isStaff, comment says soCustMbx via sendPropertyEmailWRONG when staff
W3src/lib/domain/escalation/bake-gate.ts:1575An approved held Clara reply (someone pressed Approve on the review card)Whoever the held reply was for, including staff: held staff-turn replies (replyModule: 'team.notices'), held check-blocked staff replies (W4), held shared-inbox replies to staff (W1)Nothing on the hold row says "staff"; no flag passedCustMbx via sendPropertyEmail (the live staff-turn reply went from clara@, but its approved copy goes from leasing@)WRONG when staff
W4src/lib/domain/escalation/held-reply-draft-row.ts:265A Clara reply a safety check held. Creates the review hold; released by W3Thread's person; turn.audience === 'staff' marks staffisStaff: true set, used for the template onlyHold now; on approval, CustMbx (W3)WRONG for staff turns
W5src/lib/domain/messaging/send-clara-prospect-email.ts:563The shared "Clara replies by email" router used by W2/W4 and the callers in the OK sectionMixedrecipient.isStaff selects the template only; never sent to the routerCustMbxWRONG (root: drops the staff fact)

WRONG: outside person, sent from clara@ (1)

#File:lineMessageWhoHow decidedDoor todayVerdict
W6src/lib/integrations/email/send-turnover-vendor-dispatch.ts:273 / 820 / ~903Turnover work order emailed to a vendor (paint, clean, etc.)VendorVendor contact on the work itemBuilding's own Graph mailbox only. It never tries the company mailbox, so at company-mailbox customers (Western Slope, Situs) it falls to SendGrid from clara@WRONG at company-mailbox customers

UNCLEAR (7)

#File:lineMessageWhoHow decidedDoor todayVerdict
U1src/lib/domain/leasing/reporting-digest/run-digest.ts:707Weekly owner/staff report digestProperty owners (investors) and/or staffReport subscriber listclara@UNCLEAR: is an owner "internal"? Staff: fine
U2src/lib/domain/escalation/bake-gate.ts:1005Approved owner report (held, then approved)Owners/staffSame as U1clara@UNCLEAR, same question
U3src/lib/integrations/email/send-vendor-dispatch.ts:501Vendor work-order dispatch emailVendor, but hard-redirected to a local test sink (vendor-poc@mailpit.local)POC constantclara@ (never delivered)UNCLEAR: becomes "vendor from clara@" the day the redirect is removed
U4src/lib/integrations/email/send-vendor-quote.ts:157Ask a vendor for a quoteVendor (same POC redirect)POC constantclara@ (never delivered)UNCLEAR, same
U5src/lib/temporal/activities/vendor-chase.ts:511Chase a vendor who hasn't answeredVendor (same POC redirect)POC constantclara@ (never delivered)UNCLEAR, same
U6src/lib/integrations/email/property-graph-sender.ts:1093The SendGrid fallback inside the router: any prospect/renter/vendor email when no mailbox is connected, Gmail + attachment, or no tokenOutside peoplen/aSendGrid from the building's sendGridSenderIdentity (e.g. Yale), else clara@UNCLEAR: by-design fallback, but it is "outside person from clara@"
U7agents/clara/lib/messaging/adapters/ses-email.ts:346Conversational email adapter's outboundn/an/aclara@UNCLEAR: looks dormant; no outbound envelope uses carrier ses

OK: outside person, sent from the customer mailbox (19)

All go through sendPropertyEmail → CustMbx (SendGrid only as fallback).

File:lineMessageWho
agents/clara/lib/email/tour-email-actions.ts:246Tour confirmation with calendar inviteProspect
src/lib/temporal/activities/tour.ts:614Tour reminderProspect
src/lib/domain/leasing/staff-booking-confirm-prospect.ts:244Tour confirmation after staff booked itProspect
src/lib/domain/messaging/send-property-reply-email.ts:60 (callers reply-release.ts:3180, staff-booking-confirm-prospect.ts:395)Clara passes the team's answer on to the person who askedRenter/prospect on the thread
src/lib/domain/leasing/clara-guest-card-first-email-send.ts:839Clara's first email to a new leadProspect
src/lib/domain/leasing/send-prospect-email-touch.ts:422 (direct client.sendReply on CustMbx)Follow-up emails when a lead goes quietProspect
src/lib/domain/leasing/send-application-link.ts:1323Apply-now linkApplicant
src/lib/domain/leasing/send-application-link.ts:1508Apply-now link (second variant)Applicant
src/lib/domain/leasing/send-application-link.ts:2111Apply-now link (after staff/flow trigger)Applicant
src/app/api/new-lease-package-reviews/[id]/decision/route.ts:656"You're approved" congratulationsApplicant
src/lib/domain/leasing/renewal-orchestration/send-renewal-email.ts:315Renewal offerTenant
src/lib/domain/escalation/self-guided-leave.ts:490"Did you leave the home?" after a self-guided tourProspect
src/lib/domain/escalation/self-guided-lockbox-code-delivery.ts:387Lockbox code for a self-guided tourProspect
src/lib/domain/escalation/self-guided-lockbox-missing-alert.ts:300"Your door code is delayed"Prospect
src/lib/domain/vendors/handle-vendor-completion.ts:1901"The vendor finished your repair"Tenant (recipientType: 'tenant')
src/lib/integrations/email/send-turnover-vendor-dispatch.ts:820Turnover job to a vendor (Graph leg, building mailbox)Vendor
src/lib/domain/compliance/hold-approval-email-delivery.ts:99A person's answer to a held reply, delivered by emailThread's person (renter/prospect)
src/lib/domain/conversations/staff-draft-send.ts:87Staff edits and sends Clara's draft from the Draft responses panelThread's person
src/lib/domain/escalation/team-answer-supervised-hold.ts:164Clara's reply in her own words after the team answeredRenter/prospect

(The last three go through sendClaraProspectEmail (W5). They are correct only because the recipient is an outside person.)

OK: staff/internal, sent from clara@ (74)

Direct SendGrid sends (26), all internalRecipient: true, from clara@:

File:lineMessageWho
agents/clara/lib/agent/tools/renewal/handlers.ts:81Renewal template email to the PMPM
agents/clara/lib/email/staff-email-turn.ts:432Clara's reply to a staff member's email to clara@ (live path)Staff sender
src/lib/domain/escalation/open-matter.ts:995"Staff ask": Clara asks the escalation owner a questionEscalation owner (+cc)
src/lib/domain/escalation/reply-release.ts:1216One-line thanks to the staff member who answeredStaff
src/lib/domain/promises/send-autonomous-team-note.ts:1094Daily note about one caller, for buildings that answer their own phonesTeam inbox
src/lib/tools/handlers/handle-forward-to-property-manager.ts:2052Forward a tenant escalation to the PMPM
src/lib/team-notify/live-deps.ts:57Team-notification engine: call summaries, asks, hand-offs, FYIsOffice inbox chain (resolveStaffPageEmail)
src/lib/domain/escalation/emergency-alert-notices.ts:582Emergency alert emailEmergency contacts
src/lib/domain/escalation/emergency-alert-notices.ts:763Emergency alert email (second leg)Emergency contacts
src/lib/domain/escalation/emergency-alert-notices.ts:829Emergency alert email (third leg)Emergency contacts
src/lib/domain/escalation/held-reviewer-email.ts:246"A message is waiting for your approval"Customer's chosen reviewers
src/lib/domain/staff-reply/answer-reviewer.ts:76Answer to a reviewer who replied to a held-message emailReviewer
src/lib/domain/escalation/bake-gate.ts:945Approved held escalation emailStaff
src/lib/domain/escalation/bake-gate.ts:1063Approved held team noticeStaff
src/lib/domain/escalation/team-notice-send.ts:341/349The team-notice door (all 29 callers below)Staff
src/lib/domain/leasing/collections/owner-escalation.ts:327Collections: eviction-stage alert to the escalation ownerEscalation owner
src/lib/integrations/email/delegate-setup-template.ts:99Mailbox-delegate setup instructionsCompany admin
src/lib/domain/escalation/held-propflow-staff-email.ts:91Held draft for PropFlow reviewPropFlow staff
src/lib/domain/modules/live-send-digest.ts:164Daily digest of Live sendsPropFlow staff
src/app/api/admin/dev/metrics/alert-digest/route.ts:128Metrics alert digestPropFlow ops
src/lib/platform/observability/bake-alert.ts:1525Bake alertPropFlow ops
src/lib/domain/leasing/rent-roll/sync-digest.ts:133Rent-roll sync digestPropFlow fixed recipient
src/lib/domain/knowledge-intake/submitted-notice.ts:75"Customer submitted knowledge intake"PropFlow
src/app/api/feedback/route.ts:117In-app feedbackhello@
src/app/api/onboarding/review/[slug]/submit/route.ts:157Knowledge review submittedhello@
src/app/api/public/demo-request/route.ts:206New demo requesthello@

tellStaff → SendGrid (14). Door: clara@. Verdict: OK. All files are under src/lib/.

File:lineMessageWhoHow decided
domain/escalation/emergency-alert-notices.ts:521Emergency alert emailEmergency contacts / PMresolvePersonContactsByIds, resolvePmContactEmail
domain/escalation/gated-inbound-team-notice.ts:546"A renter wrote on a thread the team took over"PMresolvePmContactEmail
domain/leasing/renewal-notify.ts:362Renewal needs manual reviewPMresolvePmContactEmail
domain/leasing/send-pm-tour-cancellation.ts:338Tour cancelledLeasing teamresolveTeamNotificationEmail
domain/leasing/send-pm-tour-confirmation.ts:778Tour bookedLeasing teamresolveTeamNotificationEmail
domain/leasing/staff-tour-alert-fanout.ts:556Tour alert to each subscribed staff memberSubscribed staffresolveStaffTourAlertRecipients
domain/maintenance/page-property-manager.ts:876Life-safety maintenance page (email leg)PM / escalation ownerCaller-supplied address, test-scope check
domain/maintenance/page-property-manager.ts:1093Same page, second variantSameSame
domain/maintenance/page-property-manager.ts:1243Same page, third variantSameSame
domain/promises/pm-delivery.ts:1102Clara's promised follow-up delivered to the officePM / office inboxresolvePmContactEmail, resolveStaffPageEmail
domain/vendors/notify-pm-outcome.ts:985How a vendor call wentPMresolvePmContactEmail
domain/vendors/notify-pm-po-required.ts:230"Create the purchase order first"PMresolvePmContactEmail
domain/vendors/notify-pm-stale-dial.ts:281"The job changed after you approved the call"PMresolvePmContactEmail
tools/handlers/handle-capture-unknown-caller-note.ts:755Message from an unverified caller (call note)Office inbox / company PMresolveStaffPageEmail, resolveOrgPmContactEmail

sendOrHoldTeamNotice → SendGrid (29). Door: clara@. Verdict: OK. The door hard-sets internalRecipient: true and goes through sendEmail. A held one is released by bake-gate.ts:1063, also clara@. All files are under src/lib/.

File:lineMessageWhoHow decided
domain/escalation/gated-inbound-team-notice.ts:480Same team note, held/sent by modePMresolvePmContactEmail
domain/escalation/tour-checkin-email.ts:77After-tour check-in by email (host has no phone)Tour hostHost's email
domain/leasing/collections/owner-escalation.ts:288Collections owner escalation (held path)Escalation ownerescalationOwnerViaChain
domain/leasing/new-lease/new-lease-draft-notify.ts:175New-lease draft readyOfficeresolveOfficeNoticeRecipients
domain/leasing/new-lease/new-lease-parked-notice.ts:161"Clara parked the new lease"Leasing teamresolveTeamNotificationEmail
domain/leasing/pm-action-reminders/send-pm-action-reminder-digest.ts:100Digest of things waiting on the PMPMresolvePmContactEmail
domain/leasing/renewal-counter-office-notice.ts:162Tenant countered the renewalOfficeresolveYesNoticeRecipient
domain/leasing/renewal-declined-office-notice.ts:153Tenant declined the renewalOfficeresolveYesNoticeRecipient
domain/leasing/renewal-execution-notify.ts:350Renewal signed / executedOfficeresolveOfficeNoticeRecipients
domain/leasing/renewal-holdover-notify.ts:180Lease going to holdoverOfficeresolveOfficeNoticeRecipients
domain/leasing/renewal-not-filled-office-notice.ts:141Renewal not filled inLeasing teamresolveTeamNotificationEmail
domain/leasing/renewal-yes-office-notice.ts:220Tenant said yes to the renewalOffice / PMresolveYesNoticeRecipient
domain/leasing/send-leasing-team-tour-update.ts:382Tour update (moved, late, outcome)Leasing inbox / tour hostresolveTeamNotificationEmail, resolveLeasingInbox, tourHostEmail
domain/leasing/stale-lead-digest/run-digest.ts:527Weekly stale-lead listLeasing teamresolveStaleLeadDigestRecipients
domain/leasing/stale-lead-digest/run-person-call-list.ts:257Leasing call listLeasing teamresolveStaleLeadDigestRecipients
domain/leasing/tour/awaiting-team-notice.ts:97"Prospect said yes to a time you haven't confirmed"Leasing teamresolveTeamNotificationEmail
domain/leasing/tour/tour-no-host.ts:285Tour has no hostLeasing team / company PMresolveTeamNotificationEmail, resolveOrgPmContactEmail
domain/leasing/tour/tour-no-host.ts:360Same, second legSameSame
domain/leasing/tour/tour-room-made-notices.ts:218Video-tour room made on retry (host copy)Tour hostresolvePersonContactsByIds
domain/leasing/tour/tour-room-waiting-notice.ts:167"Someone is waiting in your Zoom"Tour hostHost email / resolvePersonContactsByIds
domain/maintenance/resident-questions-digest/send-resident-questions-digest.ts:118Digest of resident questionsOffice inboxresolveStaffPageEmail
domain/modules/preview-client-digest.ts:120Morning list of Preview draftsCustomer's reviewersCaller-supplied list
domain/move-in/send-pm-key-pickup-confirmation.ts:130Key pickup bookedLeasing teamresolveTeamNotificationEmail
domain/move-in/send-pm-key-pickup-confirmation.ts:285Key pickup changedLeasing teamSame
domain/promises/pm-delivery.ts:1076Promised follow-up (held path)PM / officeresolvePmContactEmail, resolveStaffPageEmail
domain/turnover/move-out-date-mismatch-notify.ts:119Move-out date doesn't matchOfficeresolveOfficeNoticeRecipients
domain/turnover/move-out-draft-notify.ts:159Move-out paperwork draft readyOfficeresolveOfficeNoticeRecipients
domain/vendors/maintenance-pm-notice.ts:65Vendor-call notice to the PMPMCaller-supplied
temporal/activities/pm-action-reminder.ts:596Reminder that a PM action is overduePMresolvePmContactEmail

Sign-in and invites via sendRecapEmail (5). Door: clara@. Verdict: OK. The recipient is the person signing in.

File:lineMessageWho
src/app/api/admin/users/invite-email/route.ts:236Staff inviteInvited user
src/lib/integrations/email/email-otp.ts:31Login codeUser signing in
agents/clara/lib/messaging/transports/magic-link.ts:50Waitlist approved, sign inApproved user
agents/clara/lib/messaging/transports/magic-link.ts:87Sign-in linkUser signing in
src/app/api/dev/send-test-email/route.ts:172Dev test emailDeveloper

OK: PropFlow's own outside contacts, from clara@ (3)

public/demo-request/route.ts:235 (thanks to a PropFlow demo lead); marketing/subscribe-thanks.ts:47 (newsletter thanks); canary/suppression-probe/route.ts:216 (never delivered). The customer has no mailbox in these flows, so the rule doesn't apply.

---

Texts to staff (for later)

Every staff text leaves on Clara's Twilio line for that building, else the company's line. That is the same number prospects and renters text. It is resolved by resolveStaffLineAndThread → resolveOutboundAddress (src/lib/domain/escalation/staff-line-thread.ts). There is no separate PropFlow staff number.

File:lineTextLine it leaves on
src/lib/domain/escalation/open-matter.ts:903Staff ask by textBuilding/company Clara line
src/lib/team-notify/sms-sender.ts:70Team-notification engine ask by textSame
src/lib/domain/leasing/staff-tour-alert-fanout.ts:492Tour alert text to subscribersSame
src/lib/domain/leasing/renewal-notify.ts:505Renewal review notice textSame
src/lib/domain/staff/send-staff-welcome.ts:178Welcome text to new staffSame
src/lib/domain/leasing/send-leasing-team-tour-update.ts:145"Prospect running late" text to hostSame
src/lib/domain/escalation/tour-checkin-ask.ts:315 / 624After-tour check-in text to hostSame
src/lib/domain/escalation/self-guided-lockbox-ask.ts:228, self-guided-lockbox-reask.ts:124"Send us the lockbox code" to staffSame
src/lib/domain/escalation/team-answer-supervised-hold.ts:192Held/approved texts on a staff threadSame
src/lib/domain/escalation/held-text.ts:255Approved held text to staffLine stored on the hold
src/lib/domain/turnover/walk-recap-send.ts:159Walk-through recap to PMhold.resume.smsFrom (the building line)
src/lib/domain/vendors/notify-pm-stale-dial.ts:345Stale-dial page by textBuilding line
agents/clara/lib/messaging/process-envelope.ts:1479Clara's reply to a staff member's textThe line they texted

If texts follow the email rule later, the single place to change is resolveStaffLineAndThread, which every staff text already goes through.

C. Production evidence, one row per staff email (14 days)

Clara emails to customer staff, last 14 days (2026-10-20 to 2026-11-03 UTC)

Read-only pull, 2026-11-03. Source: the email delivery log in production (one row per send, every door: SendGrid, Microsoft Graph, Gmail), 15 daily partitions, 1,399 rows, queried by key in about 9 seconds. No scans, no writes.

Answer

  • 152 emails reached customer staff in 14 days (delivered only; blocked/held sends not counted).
  • 151 came from clara@propflowai.co (SendGrid).
  • 1 came from a customer mailbox: Western Slope's leasing@westernslopepm.com, to Kat Barker (leasing agent), 2026-11-03 16:06 UTC, "Bre Martin's virtual tour today at 4:30 PM is on Zoom". WRONG.
  • Kinds that went to staff from a customer mailbox: virtual-tour Zoom link to the tour host (1 email). Nothing else.
CustomerStaff emailsFrom clara@propflowai.coFrom customer mailbox
Western Slope70691
Situs Group50500
Camellia / JP&Co32320
Total1521511

How the sender was decided

The delivery log has no from-address field, so the sender comes from the provider message id each send path stores:

  • SendGrid rows carry a 22-character id (e.g. KGG1Kv5cTyKmHi_aNOtdPQ). SendGrid sends from clara@propflowai.co. None of the 145 Situs, Western Slope or JP&Co properties has its own SendGrid sender address that would override that.
  • Gmail mailbox rows carry a 16-hex id. None of them went to staff.
  • Microsoft Graph mailbox rows carry no id at all. All four Graph send paths in the code write the row that way.
  • The WRONG row has a second confirmation. Western Slope's list of "threads Clara started from the company mailbox" gained an entry 6 ms after the send (16:06:55.934 UTC), carrying an Outlook message id. Only the company-mailbox send path writes that list.

Staff means any address at @westernslopepm.com, @thesitusgroup.com or @jp-co.com, in To or CC. I also checked all 54 outside addresses that got mail from a customer mailbox for a staff role. Only Kat has one. The rest are prospects or our own test aliases.

About the WRONG email

  • It was logged as transactional, marked not an internal recipient (internalRecipient: false), and filed on Kat's staff text thread (c9f809af-2a67-47dc-8731-55dac75ee51a). That mislabel is the likely reason it went out of the mailbox instead of clara@. The thread has no email message for it, only Clara's texts to Kat about the same tour.
  • No code template on main (commit b74879d48e) produces this subject. The code's own "your tour is now a video call" notice to the host goes from Clara by design (src/lib/domain/leasing/tour/tour-room-made-notices.ts). So this email came from some other route: model-written, sent by hand, or code that has changed since. I didn't trace it further.
  • The same kind of email to Situs tour hosts went out correctly from clara@propflowai.co: Patricia R.'s tour briefing to Deiby, and Adia R.'s to Miriam.

Limits

  • Calendar invites the mailbox sends when a tour lands on the property calendar don't go through this log, so they aren't counted.
  • Emails *to* a customer's shared mailbox (e.g. leasing@westernslopepm.com) count as staff emails. All of them came from clara@propflowai.co.
  • If a staff member got email at a personal Gmail, it could be missing from the OK totals. It could not be a missed WRONG: every customer-mailbox recipient was role-checked.

Western Slope: by kind

KindCountFirst / last (UTC)RecipientsSenderVerdict
Tour booked notice182026-10-20 / 2026-11-03leasing@westernslopepm.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Call / message summary (handoff)142026-10-20 / 2026-11-03leasing@westernslopepm.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Callback request from a call132026-10-22 / 2026-10-28leasing@westernslopepm.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Question Clara could not answer82026-10-20 / 2026-11-03leasing@westernslopepm.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Sign-in code42026-10-22 / 2026-11-03Beverly Villar <assistantpm@westernslopepm.com>; Cheryl Burnett <cheryl@westernslopepm.com>; Kat Barker <kat@westernslopepm.com>clara@propflowai.co (SendGrid)OK
Weekly call list42026-10-23 / 2026-11-02leasing@westernslopepm.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Tour could not be booked notice32026-10-20 / 2026-11-01leasing@westernslopepm.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Tour cancelled notice32026-11-03 / 2026-11-03leasing@westernslopepm.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Tour rescheduled notice12026-10-20 / 2026-10-20leasing@westernslopepm.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Renewal action needed12026-10-30 / 2026-10-30Jay Taylor <jay@westernslopepm.com>; Kat Barker <kat@westernslopepm.com>clara@propflowai.co (SendGrid)OK
Virtual-tour Zoom link to tour host12026-11-03 / 2026-11-03Kat Barker <kat@westernslopepm.com>leasing@westernslopepm.com (Graph)WRONG

Situs Group: by kind

KindCountFirst / last (UTC)RecipientsSenderVerdict
Call / message summary (handoff)152026-10-20 / 2026-11-02Deiby Magana <deiby@thesitusgroup.com>; leasing@thesitusgroup.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Emergency page / update82026-10-28 / 2026-10-30John Galloway <johng@thesitusgroup.com>; leasing@thesitusgroup.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Clara reply in a staff thread52026-10-20 / 2026-11-02Eileen O'Malley <eileen@thesitusgroup.com>; Hugo Weinberger <hugow@thesitusgroup.com>; Lee McKibbins <lee@thesitusgroup.com>; leasing@thesitusgroup.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Sign-in code52026-10-21 / 2026-11-02Beryl Jimenez <pmassistant@thesitusgroup.com>; Eileen O'Malley <eileen@thesitusgroup.com>; Lovely Salvador <assistant@thesitusgroup.com>clara@propflowai.co (SendGrid)OK
Tour booked notice42026-10-28 / 2026-11-03leasing@thesitusgroup.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Clara reply on virtual tours thread42026-11-02 / 2026-11-02Eileen O'Malley <eileen@thesitusgroup.com>; Lee McKibbins <lee@thesitusgroup.com>; miriam <miriam@thesitusgroup.com>clara@propflowai.co (SendGrid)OK
Invite to PropFlow32026-10-20 / 2026-10-21Lee McKibbins <lee@thesitusgroup.com>; Lovely Salvador <assistant@thesitusgroup.com>; miriam <miriam@thesitusgroup.com>clara@propflowai.co (SendGrid)OK
Pre-tour briefing to tour host32026-11-02 / 2026-11-03Deiby Magana <deiby@thesitusgroup.com>; miriam <miriam@thesitusgroup.com>clara@propflowai.co (SendGrid)OK
Tour cancelled notice12026-10-28 / 2026-10-28leasing@thesitusgroup.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Intro email ("Meet Clara")12026-11-02 / 2026-11-02Eileen O'Malley <eileen@thesitusgroup.com>; Hugo Weinberger <hugow@thesitusgroup.com>; leasing@thesitusgroup.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Question Clara could not answer12026-11-03 / 2026-11-03leasing@thesitusgroup.com (their shared mailbox)clara@propflowai.co (SendGrid)OK

Camellia / JP&Co: by kind

KindCountFirst / last (UTC)RecipientsSenderVerdict
Call / message summary (handoff)72026-10-22 / 2026-11-03camelliaapts@jp-co.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Question Clara could not answer52026-10-20 / 2026-10-30camelliaapts@jp-co.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Tour booked notice42026-10-20 / 2026-11-02camelliaapts@jp-co.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Weekly call list42026-10-23 / 2026-11-02camelliaapts@jp-co.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Lease notice42026-10-24 / 2026-10-31camelliaapts@jp-co.com (their shared mailbox); spollock@jp-co.comclara@propflowai.co (SendGrid)OK
Renewal action needed32026-11-02 / 2026-11-02camelliaapts@jp-co.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
New application to review12026-10-24 / 2026-10-24camelliaapts@jp-co.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Website demo-request thank-you12026-10-26 / 2026-10-26Sean <sjperlmutter@jp-co.com>clara@propflowai.co (SendGrid)OK
Weekly owner report12026-10-26 / 2026-10-26camelliaapts@jp-co.com (their shared mailbox); Kenya Jenkins <kjenkins@jp-co.com>; jsperlmutter@jp-co.comclara@propflowai.co (SendGrid)OK
Key pickup notice12026-10-26 / 2026-10-26camelliaapts@jp-co.com (their shared mailbox)clara@propflowai.co (SendGrid)OK
Sign-in code12026-11-02 / 2026-11-02Kenya Jenkins <kjenkins@jp-co.com>clara@propflowai.co (SendGrid)OK

Appendix: every staff email

Western Slope (70)

Date (UTC)RecipientKindSubjectSenderVerdict
2026-10-20 00:30leasing@westernslopepm.com (their shared mailbox)Question Clara could not answerJaleigh Monsen — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-20 00:51leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Jaleigh Monsen — 2841 Morningside Court · Wed, Oct 21 at 11:00 AMclara@propflowai.co (SendGrid)OK
2026-10-20 03:45leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Spencer Shumate — 2841 Morningside Court · Tue, Oct 20 at 9:00 AMclara@propflowai.co (SendGrid)OK
2026-10-20 13:44leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Cylus Bradford — Pomona Park Townhomes · Tue, Oct 20 at 5:00 PMclara@propflowai.co (SendGrid)OK
2026-10-20 14:58leasing@westernslopepm.com (their shared mailbox)Tour could not be booked noticeTour update — Spencer Shumate couldn't be booked automatically · 2841 Morningside Court...clara@propflowai.co (SendGrid)OK
2026-10-20 14:59leasing@westernslopepm.com (their shared mailbox)Tour rescheduled noticeTour rescheduled: Spencer Shumate — 2841 Morningside Court · Tue, Oct 20 at 9:15 AMclara@propflowai.co (SendGrid)OK
2026-10-20 15:00leasing@westernslopepm.com (their shared mailbox)Tour could not be booked noticeTour update — Spencer Shumate couldn't be booked automatically · 2841 Morningside Court...clara@propflowai.co (SendGrid)OK
2026-10-20 20:12leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Alexis T. — Courtyard Apartmentsclara@propflowai.co (SendGrid)OK
2026-10-21 18:07leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Jaleigh Monsen — 2980 Emerald Circle · Wed, Oct 21 at 1:00 PMclara@propflowai.co (SendGrid)OK
2026-10-22 11:52leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Tanya Christians — 2841 Morningside Court · Fri, Oct 23 at 10:30 AMclara@propflowai.co (SendGrid)OK
2026-10-22 16:40leasing@westernslopepm.com (their shared mailbox)Callback request from a callKiara — callbackclara@propflowai.co (SendGrid)OK
2026-10-22 19:45Beverly Villar <assistantpm@westernslopepm.com>Sign-in codePropFlow sign-in code: 059876clara@propflowai.co (SendGrid)OK
2026-10-22 19:46Beverly Villar <assistantpm@westernslopepm.com>Sign-in codePropFlow sign-in code: 556314clara@propflowai.co (SendGrid)OK
2026-10-22 22:25leasing@westernslopepm.com (their shared mailbox)Callback request from a callTaylor C. — callbackclara@propflowai.co (SendGrid)OK
2026-10-23 03:57leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Heather Wolff — 2841 Morningside Court · Sat, Oct 24 at 1:30 PMclara@propflowai.co (SendGrid)OK
2026-10-23 14:59leasing@westernslopepm.com (their shared mailbox)Question Clara could not answerTaylor M. DiPilato — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-23 15:00leasing@westernslopepm.com (their shared mailbox)Weekly call listFriday call list: 4 leads, 2 touredclara@propflowai.co (SendGrid)OK
2026-10-23 15:18leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Desaray Hutto — 2841 Morningside Court · Sat, Oct 24 at 10:00 AMclara@propflowai.co (SendGrid)OK
2026-10-23 16:02leasing@westernslopepm.com (their shared mailbox)Callback request from a callMia — callbackclara@propflowai.co (SendGrid)OK
2026-10-23 16:54leasing@westernslopepm.com (their shared mailbox)Callback request from a call(970) 985-1466 — callbackclara@propflowai.co (SendGrid)OK
2026-10-23 18:32Kat Barker <kat@westernslopepm.com>Sign-in codePropFlow sign-in code: 859111clara@propflowai.co (SendGrid)OK
2026-10-23 22:42leasing@westernslopepm.com (their shared mailbox)Callback request from a callLauren A. Jayne — callbackclara@propflowai.co (SendGrid)OK
2026-10-23 22:47leasing@westernslopepm.com (their shared mailbox)Callback request from a callLauren A. Jayne — callbackclara@propflowai.co (SendGrid)OK
2026-10-24 20:18leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Lori Ruiz — Pomona Park Townhomes · Mon, Oct 26 at 4:30 PMclara@propflowai.co (SendGrid)OK
2026-10-25 20:18leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Anthony M. — reply needed at 2841 Morningside Courtclara@propflowai.co (SendGrid)OK
2026-10-26 15:00leasing@westernslopepm.com (their shared mailbox)Weekly call listMonday call list: 7 leads, 4 touredclara@propflowai.co (SendGrid)OK
2026-10-26 17:01leasing@westernslopepm.com (their shared mailbox)Question Clara could not answerAustin J. Boen — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-26 23:49leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Trang Quang — Ember Estates · Wed, Oct 28 at 12:45 PMclara@propflowai.co (SendGrid)OK
2026-10-27 01:03leasing@westernslopepm.com (their shared mailbox)Callback request from a callMichaela — general callbackclara@propflowai.co (SendGrid)OK
2026-10-27 16:24leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Alicia Jensen — 2841 Morningside Court · Tue, Oct 27 at 5:45 PMclara@propflowai.co (SendGrid)OK
2026-10-27 19:24leasing@westernslopepm.com (their shared mailbox)Callback request from a callBrenda — general callbackclara@propflowai.co (SendGrid)OK
2026-10-27 19:29leasing@westernslopepm.com (their shared mailbox)Callback request from a callBraden — leasing callbackclara@propflowai.co (SendGrid)OK
2026-10-28 02:04leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Dora Gomez — Gomez called to ask about qualifying for one of the properties…clara@propflowai.co (SendGrid)OK
2026-10-28 14:09leasing@westernslopepm.com (their shared mailbox)Question Clara could not answerMicheal Macias — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-28 14:26leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Micheal Macias — Ember Estates · Wed, Oct 28 at 12:30 PMclara@propflowai.co (SendGrid)OK
2026-10-28 17:48leasing@westernslopepm.com (their shared mailbox)Callback request from a callSidney J. Caro — general callbackclara@propflowai.co (SendGrid)OK
2026-10-28 18:29leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Micheal M. — here for a tour at Ember Estatesclara@propflowai.co (SendGrid)OK
2026-10-28 20:18leasing@westernslopepm.com (their shared mailbox)Callback request from a callMarcus — general callbackclara@propflowai.co (SendGrid)OK
2026-10-28 21:18leasing@westernslopepm.com (their shared mailbox)Callback request from a call(970) 210-3061 — general callbackclara@propflowai.co (SendGrid)OK
2026-10-28 21:50leasing@westernslopepm.com (their shared mailbox)Callback request from a callMatthew — general callbackclara@propflowai.co (SendGrid)OK
2026-10-29 15:50leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Anthony Mccleary — Ember Estates · Thu, Oct 29 at 2:30 PMclara@propflowai.co (SendGrid)OK
2026-10-29 19:59leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Prince from AC Ports — Portable AC ventingclara@propflowai.co (SendGrid)OK
2026-10-29 20:55leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Nina Anderson — Parking lot permission requestclara@propflowai.co (SendGrid)OK
2026-10-29 21:19leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Amy Reid — Ember Estates · Thu, Nov 5 at 4:30 PMclara@propflowai.co (SendGrid)OK
2026-10-30 02:56leasing@westernslopepm.com (their shared mailbox)Question Clara could not answerLarissa K. Jones — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-30 13:00leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Amy Reid — Pomona Park Townhomes · Thu, Nov 5 at 5:30 PMclara@propflowai.co (SendGrid)OK
2026-10-30 14:30Jay Taylor <jay@westernslopepm.com>, Kat Barker <kat@westernslopepm.com>Renewal action needed10 renewals to approve at Western Slope Property Management for October 2026clara@propflowai.co (SendGrid)OK
2026-10-30 14:50leasing@westernslopepm.com (their shared mailbox)Tour booked noticeVirtual tour: Tour confirmed: Sam Kavajecz — Pomona Park Townhomes · Fri, Oct 30 at 10:...clara@propflowai.co (SendGrid)OK
2026-10-30 15:00leasing@westernslopepm.com (their shared mailbox)Weekly call listFriday call list: 8 leads, 2 touredclara@propflowai.co (SendGrid)OK
2026-10-30 15:14leasing@westernslopepm.com (their shared mailbox)Question Clara could not answerKellie Chase — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-31 02:37leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Jay from Ransom's Reliable Property Maintenance — Test call, no requestclara@propflowai.co (SendGrid)OK
2026-10-31 21:11leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Jonathan Pritchard from A Handyman — Upcoming contracts to bidclara@propflowai.co (SendGrid)OK
2026-11-01 09:52leasing@westernslopepm.com (their shared mailbox)Question Clara could not answerAmy Reid — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-11-01 14:06leasing@westernslopepm.com (their shared mailbox)Tour could not be booked noticeTour update — Amy Reid couldn't be booked automatically · Ember Estates · Thu, Nov 5 4:...clara@propflowai.co (SendGrid)OK
2026-11-01 14:15leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Amy Reid — 2841 Morningside Court · Thu, Nov 5 at 9:00 AMclara@propflowai.co (SendGrid)OK
2026-11-02 14:50leasing@westernslopepm.com (their shared mailbox)Tour booked noticeVirtual tour: Tour confirmed: Bre Martin — 2841 Morningside Court · Tue, Nov 3 at 4:30 PMclara@propflowai.co (SendGrid)OK
2026-11-02 16:00leasing@westernslopepm.com (their shared mailbox)Weekly call listMonday call list: 9 leads, 3 touredclara@propflowai.co (SendGrid)OK
2026-11-02 18:08leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Luz D. — Retrieve misdelivered packageclara@propflowai.co (SendGrid)OK
2026-11-02 21:09leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Luz D. — Misdelivered package pickupclara@propflowai.co (SendGrid)OK
2026-11-03 07:36leasing@westernslopepm.com (their shared mailbox)Tour cancelled noticeTour cancelled: Amy Reid — Ember Estates · Thu, Nov 5 at 4:30 PMclara@propflowai.co (SendGrid)OK
2026-11-03 07:38leasing@westernslopepm.com (their shared mailbox)Question Clara could not answerAmy Reid — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-11-03 12:53leasing@westernslopepm.com (their shared mailbox)Tour cancelled noticeTour cancelled: Amy Reid — 2841 Morningside Court · Thu, Nov 5 at 3:30 PMclara@propflowai.co (SendGrid)OK
2026-11-03 12:53leasing@westernslopepm.com (their shared mailbox)Tour cancelled noticeTour cancelled: Amy Reid — Pomona Park Townhomes · Thu, Nov 5 at 5:30 PMclara@propflowai.co (SendGrid)OK
2026-11-03 16:06Kat Barker <kat@westernslopepm.com>Virtual-tour Zoom link to tour hostBre Martin's virtual tour today at 4:30 PM is on Zoomleasing@westernslopepm.com (Graph)WRONG
2026-11-03 18:58leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Deborah Ferguson — Yeah, this rick ferguson, the partnership mentoring court…clara@propflowai.co (SendGrid)OK
2026-11-03 19:15leasing@westernslopepm.com (their shared mailbox)Tour booked noticeTour confirmed: Sierra Snow — 2841 Morningside Court · Wed, Nov 4 at 9:00 AMclara@propflowai.co (SendGrid)OK
2026-11-03 19:48leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Missed call — Left a voice message…clara@propflowai.co (SendGrid)OK
2026-11-03 20:14leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Deborah F. — November rent totalclara@propflowai.co (SendGrid)OK
2026-11-03 23:03leasing@westernslopepm.com (their shared mailbox)Call / message summary (handoff)Layla D. — Security deposit returnclara@propflowai.co (SendGrid)OK
2026-11-03 23:59Cheryl Burnett <cheryl@westernslopepm.com>Sign-in codePropFlow sign-in code: 321581clara@propflowai.co (SendGrid)OK

Situs Group (50)

Date (UTC)RecipientKindSubjectSenderVerdict
2026-10-20 03:36leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Tessa — called about the two-bedroom at 1320 Zephyr Street in Lakewood…clara@propflowai.co (SendGrid)OK
2026-10-20 03:54leasing@thesitusgroup.com (their shared mailbox)Clara reply in a staff threadRe: Tessa — called about the two-bedroom at 1320 Zephyr Street in Lakewood…clara@propflowai.co (SendGrid)OK
2026-10-20 17:02miriam <miriam@thesitusgroup.com>Invite to PropFlowSitus Group on PropFlowclara@propflowai.co (SendGrid)OK
2026-10-20 17:12Lee McKibbins <lee@thesitusgroup.com>Invite to PropFlowSitus Group on PropFlowclara@propflowai.co (SendGrid)OK
2026-10-21 15:05Lovely Salvador <assistant@thesitusgroup.com>Invite to PropFlowSitus Group on PropFlowclara@propflowai.co (SendGrid)OK
2026-10-21 15:09Lovely Salvador <assistant@thesitusgroup.com>Sign-in codePropFlow sign-in code: 165265clara@propflowai.co (SendGrid)OK
2026-10-27 17:25leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Can someone review the attached RFTA packet Nicole just emailed in?clara@propflowai.co (SendGrid)OK
2026-10-27 17:28Lee McKibbins <lee@thesitusgroup.com>Clara reply in a staff threadRe: Can someone review the attached RFTA packet Nicole just emailed in?clara@propflowai.co (SendGrid)OK
2026-10-28 20:30Beryl Jimenez <pmassistant@thesitusgroup.com>Sign-in codePropFlow sign-in code: 662959clara@propflowai.co (SendGrid)OK
2026-10-28 20:30Beryl Jimenez <pmassistant@thesitusgroup.com>Sign-in codePropFlow sign-in code: 673587clara@propflowai.co (SendGrid)OK
2026-10-28 20:31Beryl Jimenez <pmassistant@thesitusgroup.com>Sign-in codePropFlow sign-in code: 860123clara@propflowai.co (SendGrid)OK
2026-10-28 23:20leasing@thesitusgroup.com (their shared mailbox)Tour booked noticeTour confirmed: Michael Jordan — Dahlia Apartments · Thu, Oct 29 at 4:45 PMclara@propflowai.co (SendGrid)OK
2026-10-28 23:22leasing@thesitusgroup.com (their shared mailbox)Tour cancelled noticeTour cancelled: Michael Jordan — Dahlia Apartments · Thu, Oct 29 at 4:45 PMclara@propflowai.co (SendGrid)OK
2026-10-28 23:49John Galloway <johng@thesitusgroup.com>Emergency page / updateEmergency — Michael Jordanclara@propflowai.co (SendGrid)OK
2026-10-28 23:50leasing@thesitusgroup.com (their shared mailbox)Emergency page / updateEMERGENCY — Michael Jordan on +17207404240, nobody answeredclara@propflowai.co (SendGrid)OK
2026-10-29 02:12John Galloway <johng@thesitusgroup.com>Emergency page / updateEmergency — Hugo Weinbergerclara@propflowai.co (SendGrid)OK
2026-10-29 02:12leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Hugo Weinberger — Test call, disregard leak reportclara@propflowai.co (SendGrid)OK
2026-10-29 02:13leasing@thesitusgroup.com (their shared mailbox)Emergency page / updateEmergency handled — Hugo Weinbergerclara@propflowai.co (SendGrid)OK
2026-10-30 00:08John Galloway <johng@thesitusgroup.com>Emergency page / updateEmergency — Situs Groupclara@propflowai.co (SendGrid)OK
2026-10-30 00:08John Galloway <johng@thesitusgroup.com>Emergency page / updateEmergency update — Situs Groupclara@propflowai.co (SendGrid)OK
2026-10-30 00:09leasing@thesitusgroup.com (their shared mailbox)Emergency page / updateEMERGENCY — +17206371205 on +17207404240, nobody answeredclara@propflowai.co (SendGrid)OK
2026-10-30 00:09John Galloway <johng@thesitusgroup.com>Emergency page / updateDisregard — Situs Groupclara@propflowai.co (SendGrid)OK
2026-10-31 02:56leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Michael J. — Leasing options, dog limitclara@propflowai.co (SendGrid)OK
2026-10-31 18:52leasing@thesitusgroup.com (their shared mailbox)Tour booked noticeVirtual tour: Tour confirmed: Patricia Reed — Barcelona Apartments · Mon, Nov 2 at 11:0...clara@propflowai.co (SendGrid)OK
2026-10-31 19:55leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Britney M. — Deposit and move-in datesclara@propflowai.co (SendGrid)OK
2026-10-31 20:31leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Violeta M. — Portal access, rent paymentclara@propflowai.co (SendGrid)OK
2026-10-31 20:39leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Karla A. — Renewal credit on rentclara@propflowai.co (SendGrid)OK
2026-11-01 15:53leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Britney M. — Security deposit paymentclara@propflowai.co (SendGrid)OK
2026-11-01 23:04leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)David — Apology for back garbageclara@propflowai.co (SendGrid)OK
2026-11-02 02:32Deiby Magana <deiby@thesitusgroup.com>Call / message summary (handoff)Your virtual tour today at 11clara@propflowai.co (SendGrid)OK
2026-11-02 02:32miriam <miriam@thesitusgroup.com>Clara reply on virtual tours threadVirtual toursclara@propflowai.co (SendGrid)OK
2026-11-02 02:32Lee McKibbins <lee@thesitusgroup.com>Clara reply on virtual tours threadVirtual toursclara@propflowai.co (SendGrid)OK
2026-11-02 02:32Eileen O'Malley <eileen@thesitusgroup.com>Clara reply on virtual tours threadVirtual toursclara@propflowai.co (SendGrid)OK
2026-11-02 03:10leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Ignacio Z. — Car removal from spotclara@propflowai.co (SendGrid)OK
2026-11-02 14:44Hugo Weinberger <hugow@thesitusgroup.com>Clara reply in a staff threadRe: David — Apology for back garbageclara@propflowai.co (SendGrid)OK
2026-11-02 15:09leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Melissa M. — Locked out of officeclara@propflowai.co (SendGrid)OK
2026-11-02 15:34leasing@thesitusgroup.com (their shared mailbox)Tour booked noticeTour confirmed: Stephany Mandonado — Lampliter · Mon, Nov 2 at 2:00 PMclara@propflowai.co (SendGrid)OK
2026-11-02 15:42leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Rashida from City of Aurora Code Enforcement and Housing — Systematic housing inspectionclara@propflowai.co (SendGrid)OK
2026-11-02 15:42leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Need to talk to the office — your call?clara@propflowai.co (SendGrid)OK
2026-11-02 15:54leasing@thesitusgroup.com (their shared mailbox)Call / message summary (handoff)Jenny — Application approval statusclara@propflowai.co (SendGrid)OK
2026-11-02 16:23Eileen O'Malley <eileen@thesitusgroup.com>Sign-in codePropFlow sign-in code: 824228clara@propflowai.co (SendGrid)OK
2026-11-02 17:14leasing@thesitusgroup.com (their shared mailbox), Eileen O'Malley <eileen@thesitusgroup.com>, Hugo Weinberger <hugow@thesitusgroup.com>Intro email ("Meet Clara")Meet Clara, your new AI assistant for Situs Groupclara@propflowai.co (SendGrid)OK
2026-11-02 17:40Eileen O'Malley <eileen@thesitusgroup.com>Clara reply on virtual tours threadRe: Virtual toursclara@propflowai.co (SendGrid)OK
2026-11-02 17:46Eileen O'Malley <eileen@thesitusgroup.com>, Lee McKibbins <lee@thesitusgroup.com>, leasing@thesitusgroup.com (their shared mailbox)Clara reply in a staff threadRe: Michael J. — Leasing options, dog limitclara@propflowai.co (SendGrid)OK
2026-11-02 18:26Hugo Weinberger <hugow@thesitusgroup.com>, Eileen O'Malley <eileen@thesitusgroup.com>, Lee McKibbins <lee@thesitusgroup.com>, leasing@thesitusgroup.com (their shared mailbox)Clara reply in a staff threadRe: Michael J. — Leasing options, dog limitclara@propflowai.co (SendGrid)OK
2026-11-02 18:45Deiby Magana <deiby@thesitusgroup.com>Pre-tour briefing to tour hostPatricia R.'s 11:00 AM tour at Barcelona Apartmentsclara@propflowai.co (SendGrid)OK
2026-11-02 22:45Deiby Magana <deiby@thesitusgroup.com>Pre-tour briefing to tour hostStephany M.'s 3:00 PM tour at Lampliterclara@propflowai.co (SendGrid)OK
2026-11-03 00:26leasing@thesitusgroup.com (their shared mailbox)Tour booked noticeTour confirmed: Adia Reynolds — Lampliter · Tue, Nov 3 at 9:45 AMclara@propflowai.co (SendGrid)OK
2026-11-03 17:30miriam <miriam@thesitusgroup.com>Pre-tour briefing to tour hostAdia R.'s 9:45 AM tour at Lampliterclara@propflowai.co (SendGrid)OK
2026-11-03 18:18leasing@thesitusgroup.com (their shared mailbox)Question Clara could not answerSomvang Keomanee — asked us something we could not answerclara@propflowai.co (SendGrid)OK

Camellia / JP&Co (32)

Date (UTC)RecipientKindSubjectSenderVerdict
2026-10-20 17:10camelliaapts@jp-co.com (their shared mailbox)Question Clara could not answerVictoria Alexandra — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-20 17:10camelliaapts@jp-co.com (their shared mailbox)Question Clara could not answerVictoria Alexandra — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-20 17:11camelliaapts@jp-co.com (their shared mailbox)Question Clara could not answerVictoria Alexandra — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-20 17:37camelliaapts@jp-co.com (their shared mailbox)Tour booked noticeTour confirmed: Ella Rydwell — Camellia Apartments · Wed, Oct 21 at 9:15 AMclara@propflowai.co (SendGrid)OK
2026-10-22 18:50camelliaapts@jp-co.com (their shared mailbox)Call / message summary (handoff)Victoria A. — Camellia Apartmentsclara@propflowai.co (SendGrid)OK
2026-10-23 15:00camelliaapts@jp-co.com (their shared mailbox)Weekly call listFriday call list: 5 leads, 2 touredclara@propflowai.co (SendGrid)OK
2026-10-23 17:39camelliaapts@jp-co.com (their shared mailbox)Call / message summary (handoff)Eli — Camellia Apartmentsclara@propflowai.co (SendGrid)OK
2026-10-23 20:00camelliaapts@jp-co.com (their shared mailbox)Call / message summary (handoff)Dexter — Camellia Apartmentsclara@propflowai.co (SendGrid)OK
2026-10-24 01:38camelliaapts@jp-co.com (their shared mailbox)Lease noticeLease prepared for Guadalupe L. Yanez Mejia, unit 124clara@propflowai.co (SendGrid)OK
2026-10-24 03:45camelliaapts@jp-co.com (their shared mailbox)Tour booked noticeTour confirmed: Yoira Estrada — Camellia Apartments · Mon, Oct 26 at 11:00 AMclara@propflowai.co (SendGrid)OK
2026-10-24 05:24camelliaapts@jp-co.com (their shared mailbox)New application to reviewNew application to review — Yoira E. Estrada (Unit 106)clara@propflowai.co (SendGrid)OK
2026-10-24 14:51camelliaapts@jp-co.com (their shared mailbox)Question Clara could not answerGenesis Diaz — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-24 21:54camelliaapts@jp-co.com (their shared mailbox)Call / message summary (handoff)Claire — Camellia Apartmentsclara@propflowai.co (SendGrid)OK
2026-10-26 04:31Sean <sjperlmutter@jp-co.com>Website demo-request thank-youThanks for your interest in Propflowclara@propflowai.co (SendGrid)OK
2026-10-26 15:00camelliaapts@jp-co.com (their shared mailbox)Weekly call listMonday call list: 3 leads, 1 touredclara@propflowai.co (SendGrid)OK
2026-10-26 15:46Kenya Jenkins <kjenkins@jp-co.com>, jsperlmutter@jp-co.com, camelliaapts@jp-co.com (their shared mailbox)Weekly owner reportCamellia Apartments weekly report — 87.5% occupied (week ending Oct 26)clara@propflowai.co (SendGrid)OK
2026-10-26 18:29camelliaapts@jp-co.com (their shared mailbox)Key pickup noticeKey pickup: Cyan A. Olivas-Rivera — Unit 515 · Fri, Oct 30 at 2:00 PMclara@propflowai.co (SendGrid)OK
2026-10-28 18:21camelliaapts@jp-co.com (their shared mailbox)Lease noticeA lease is ready for your signature — Maxwell J. Vierling (Unit 606)clara@propflowai.co (SendGrid)OK
2026-10-28 21:54camelliaapts@jp-co.com (their shared mailbox)Call / message summary (handoff)Anna from Miracle Method — tub touch-up in 403, schedulingclara@propflowai.co (SendGrid)OK
2026-10-29 16:35camelliaapts@jp-co.com (their shared mailbox)Call / message summary (handoff)Eric from Con Aqua — Boiler room accessclara@propflowai.co (SendGrid)OK
2026-10-30 00:04camelliaapts@jp-co.com (their shared mailbox)Tour booked noticeTour confirmed: Emlyn Ellerby — Camellia Apartments · Fri, Oct 30 at 10:00 AMclara@propflowai.co (SendGrid)OK
2026-10-30 15:00camelliaapts@jp-co.com (their shared mailbox)Weekly call listFriday call list: 2 leadsclara@propflowai.co (SendGrid)OK
2026-10-30 17:26camelliaapts@jp-co.com (their shared mailbox)Question Clara could not answerBrian Wieser — asked us something we could not answerclara@propflowai.co (SendGrid)OK
2026-10-30 17:45spollock@jp-co.com, camelliaapts@jp-co.com (their shared mailbox)Lease noticeNew lease signed — Maxwell J. Vierling (Unit 606) — Camellia Apartmentsclara@propflowai.co (SendGrid)OK
2026-10-31 14:31spollock@jp-co.com, camelliaapts@jp-co.com (their shared mailbox)Lease noticeLease rolled to month-to-month — David Fifield (Unit 105) — Camellia Apartmentsclara@propflowai.co (SendGrid)OK
2026-11-02 15:34camelliaapts@jp-co.com (their shared mailbox)Renewal action neededAction needed: review Daniel Rosell's renewal (Unit 508)clara@propflowai.co (SendGrid)OK
2026-11-02 16:00camelliaapts@jp-co.com (their shared mailbox)Renewal action neededAction needed: review Daniel Rosell's renewal (Unit 508)clara@propflowai.co (SendGrid)OK
2026-11-02 16:00camelliaapts@jp-co.com (their shared mailbox)Weekly call listMonday call list: 2 leadsclara@propflowai.co (SendGrid)OK
2026-11-02 19:00camelliaapts@jp-co.com (their shared mailbox)Renewal action neededAction needed: add an email for Daniel Rosell (Unit 508)clara@propflowai.co (SendGrid)OK
2026-11-02 21:47camelliaapts@jp-co.com (their shared mailbox)Tour booked noticeTour confirmed: Marisol Reyes — Camellia Apartments · Tue, Nov 3 at 11:00 AMclara@propflowai.co (SendGrid)OK
2026-11-02 21:58Kenya Jenkins <kjenkins@jp-co.com>Sign-in codePropFlow sign-in code: 358310clara@propflowai.co (SendGrid)OK
2026-11-03 00:03camelliaapts@jp-co.com (their shared mailbox)Call / message summary (handoff)Christopher — Housing for Daniel Brimclara@propflowai.co (SendGrid)OK
PropFlow Docs