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
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.
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.
| Customer | Staff emails | From Clara at Propflow | From the customer's mailbox |
|---|---|---|---|
| Western Slope | 70 | 69 | 1 |
| Situs Group | 50 | 50 | 0 |
| Camellia / JP&Co | 32 | 32 | 0 |
| Total | 152 | 151 | 1 |
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
| Channel | Decision points | Know the reader's role | Can put staff on a customer identity |
|---|---|---|---|
| 24 | 6, and only one uses it to pick the sender | 16 | |
| Text | 13 | 1 (declared by the caller) + sign-in codes by purpose | 1 conditional (the AppFolio text door, when the caller forgets to declare staff) |
| Voice | 7 | 1 | 0 |
| Calendar | 3 | 0 | 0 today; latent if anyone is added to an event by hand |
| Scripts and skills | 5 | 0 | 2 (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_chosenline 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/_*.tsare 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
--sendis 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:line | What it decides (plain words) | Inputs | Role? | Staff on customer identity? |
|---|---|---|---|---|---|
| E1 | src/lib/integrations/email/send-mailbox-selector.ts:148 chooseMailbox | Which mailbox a property email leaves from: the building's own, else the company's (Microsoft or Gmail), else SendGrid | building mailbox exists, company mailbox exists, attachments | No (never reads the flag it is passed) | YES |
| E2 | send-mailbox-selector.ts:114-127 selectSendMailbox | Reply from a sister building's mailbox when that mailbox holds the thread | sibling root, has parent, attachments | No | YES |
| E3 | send-mailbox-selector.ts:130-146 selectWithoutSibling | After a mailbox send fails: hold it, or resend from SendGrid | internalRecipient (per-call flag), building SendGrid identity | Only the flag | N/A (changes the fallback, never the first door) |
| E4 | src/lib/integrations/email/company-mailbox.ts:41 resolveCompanyMailboxToken | Whether the company mailbox is usable for a building with none | building mailbox, organizationId, stored token | No | YES (feeds E1, E10, E13, E20) |
| E5 | src/lib/integrations/email/sibling-root-mailbox.ts:25 resolveSiblingRootMailbox | Which sister building's mailbox holds the thread root | property, thread root mailbox, parent id | No | YES (feeds E2) |
| E6 | src/lib/integrations/email/property-graph-sender.ts:762-833 sendPropertyEmail | Runs E4/E5/E1, refuses to pass over a building's own mailbox (:812), picks the token and leg | property, forwarded flags; audience is not passed to the selector | Flags only; no staff caller sets them | YES |
| E7 | property-graph-sender.ts:1064-1110 (SendGrid leg) | From-address when the router falls back to SendGrid: the building's sendGridSenderIdentity, else clara@ | property field | No | YES (a building with its own SendGrid identity, e.g. Yale, sends staff mail as itself) |
| E8 | src/lib/integrations/email/client.ts:1176 runEmailSend | From = caller's fromEmail, else clara@ | per-call fromEmail | No | NO. The only production caller that sets fromEmail is E7 (:1109). tellStaff, sendOrHoldTeamNotice, the team-notification engine and sendRecapEmail (:2135) never do |
| E9 | client.ts:2003 resendDeadLetteredEmail | Re-sends a failed email from the address stored on it | stored payload | No | Inherits the original choice |
| E10 | src/lib/integrations/email/reply-mailbox.ts:81 resolveReplyMailbox | Which mailbox the shared-inbox Lambda answers from: building, else company | building mailbox, org | No | YES |
| E11 | lambda/inbound-processor/handler.ts:716-720 | Answer from the building the mail arrived on (umbrella-building case) | mailboxPropertyId on the queue message | No | YES |
| E12 | handler.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 mailbox | recipient address, mailbox address, org | Yes (role lookup + a domain proxy) | YES: the answer picks the plain template and skips the contact limit, never the sender (W1) |
| E13 | handler.ts:1178-1196, 1238 | Building token vs company token; /me vs /users/<address> | E10's verdict | No | YES (pass-through of E10) |
| E14 | src/lib/domain/messaging/send-clara-prospect-email.ts:563 sendClaraProspectEmail | Hands Clara's reply to the router without the staff fact it holds | recipient.isStaff (template only) | Partly (caller-supplied) | YES (W5) |
| E15 | send-clara-prospect-email.ts:602-610 ...ViaAdapter | The lane brings its own wire, so the lane decides: Lambda = customer mailbox, staff email turn = clara@ | lane's deliver | Template only | Depends on lane (YES for the Lambda) |
| E16 | agents/clara/lib/email/process-inbound-email.ts:1292 vs 1945/2040 | Mail 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 E14 | auth result, staff lookup, lead-router claim | Yes for the staff turn; no in sesDeliver | YES (W2) |
| E17 | agents/clara/lib/email/staff-email-turn.ts:416-437 | Staff email turn reply: hard-wired to sendEmail from clara@, audience: 'staff' | staff lookup upstream (resolveInboundStaffMembershipByEmail) | Yes | NO (the one place that does it right) |
| E18 | src/lib/domain/escalation/bake-gate.ts:945 / 1005 / 1063 vs 1575 | Approved 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 :1575 | No | YES (W3) |
| E19 | src/lib/domain/escalation/held-reply-draft-row.ts:265-269 | Marks a held reply as staff from turn.audience, for the template only; the hold is released by E18 | turn audience | Yes | YES (W4) |
| E20 | src/lib/domain/leasing/send-prospect-email-touch.ts:374-418 | Second copy of the mailbox rule for lead follow-ups (building Microsoft, else company), straight to the inbox client | building mailbox, company token | No | N/A (prospect cadence only). Bypasses E1 |
| E21 | src/lib/integrations/email/send-turnover-vendor-dispatch.ts:251-273, 818-820, ~903 | Turnover job to a vendor: building mailbox only, else SendGrid clara@ | building mailbox | No | N/A for staff; wrong for vendors at company-mailbox customers (W6). Bypasses E1 |
| E22 | agents/clara/lib/email/gmail-inbox-client.ts:495 → src/lib/integrations/email/gmail-company-sender.ts:127 / 332 | Gmail From line = the mailbox's own address | token's profile | No | Pass-through |
| E23 | src/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 lane | mail's To address | No | YES: this is upstream of every reply decision |
| E24 | src/app/(standalone)/onboarding/(wizard)/(dialog)/channels/email-preview.ts:194 claraFromName | The onboarding preview shows the from-name "Clara at <their domain>" | company name, domain | No | N/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:line | What it decides | Inputs | Role? | Staff on customer identity? |
|---|---|---|---|---|---|
| T1 | src/lib/domain/properties/resolve-outbound-address.ts:120 | Core line rule: the line they texted, else the building's line, else the company's; refuses when there is none | reply-to line, propertyId | No | NO (Clara line). About 55 send sites call it with only a propertyId |
| T2 | src/lib/domain/properties/clara-line-for-building.ts:35 | Second copy of the building-then-company lookup (collections texts, vendor dial) | propertyId | No | NO. Bypasses T1 |
| T3 | src/lib/domain/escalation/staff-line-thread.ts:40 | Line plus thread for every staff text | propertyId, org (wraps T1) | Implied by its callers, not used | NO (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 |
| T4 | src/lib/domain/messaging/manual-send-from-number.ts:147, 228 | Line for manual sends and approved drafts | propertyId (wraps T1) | No | NO |
| T5 | resolve-life-safety-sender.ts:49, 108 | Emergency text/call line: the building's own, else the line they called in on (same company) | property, org, arrival line | No | NO |
| T6 | agents/clara/lib/messaging/process-envelope.ts:1507 | Reply on the line they texted | inbound To | No | NO |
| T7 | agents/clara/lib/messaging/dispatcher.ts:531-560 + src/lib/domain/pms-doors/text-door-recipient.ts:57 textDoorLaneOf | Clara's line vs the customer's AppFolio text door | per-call recipientType, module, media | Yes, but declared by the caller | NO when declared. YES if a staff text omits recipientType and carries module none or a resident module |
| T8 | twilio/client.ts:2152 vs 163 | Picture messages that pass an MG… value go out through a Twilio pool | format of the from value | No | N/A |
| T9 | held-text.ts:594, 687; walk-recap-send.ts:120-141; renewal-reply-review.ts:91-135 | Line saved on a held text, reused on approval | stored smsFrom | No | NO (inherits T1) |
| T10 | temporal/activities/renewal.ts:838 | Renewal text/call line | propertyId | No | N/A |
| T11 | tour-video-room-notify.ts:84; relay-scope.ts:82/90 | Company line when there is no building; line for relaying a team answer | org, propertyId | No | N/A |
| T12 | src/lib/integrations/sms/mfa-sms-sender.ts:63 | Staff sign-in codes leave from MFA_SMS_FROM_NUMBER, a separate PropFlow line; throws if unset | env var | Staff by purpose | NO. The only separate staff line found |
| T13 | scripts/send-clara-sms.ts:156 (clara-takeover skill) | Manual text uses T4 | conversation, property | No | NO. The skill's notes still name the removed PROPERTY_TO_PHONE_MAP |
Voice decision points
| # | File:line | What it decides | Inputs | Role? | Staff on customer identity? |
|---|---|---|---|---|---|
| V1 | initiate-outbound-call.ts:792 | Turns the chosen number into the voice platform's phone-number id | caller-id number | No | Follows its input (T1/T5/T10) |
| V2 | hunt-chain.ts:298, 786 | Ring-list dial shows the caller; on-call calls show the ticket's line | From/To, ticket line | No | NO |
| V3 | emergency-alert-chain.ts:1020, 1216, 1240 | On-call / call-center emergency calls: company line, else T1 | company line, propertyId | No | NO |
| V4 | handoff-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 number | destination, stored call center | Yes (team vs outside service) | NO |
| V5 | emergency-relay-call.ts:397; vendors/dial-approved-session.ts:237 | Relay and vendor call caller id | property, arrival line (T2 for vendors) | No | N/A |
| V6 | ~/.claude/skills/clara-callback/SKILL.md step 2 | Operator picks the number that matches the original call's dialed number | original call | No | NO |
| V7 | Bypasses: 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:173 | Fixed or overridden caller ids | static config / CLI flag | No | NO |
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:line | What it decides | Inputs | Role? | Staff on customer identity? |
|---|---|---|---|---|---|
| C1 | src/lib/domain/calendar/sync-tour.ts:382 resolveTourCalendarNode (then :312), written by engine/apply-calendar-event.ts:740/836 | Which 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 engine | tour, property, saved calendar pin | N/A | NO (no attendees) |
| C2 | src/lib/domain/calendar/outlook-client.ts:636/715; provider/google.ts:288/318 | Adapters would invite attendees from the calendar owner if given any; Google PATCH always uses sendUpdates=all | params | No | NO today. Latent YES: anyone added by hand gets updates and cancellations from the owner mailbox |
| C3 | src/lib/domain/leasing/tour-calendar.ts:242-258 → tour-email-actions.ts:278 | The .ics on the prospect's confirmation (PUBLISH, no organizer), sent through E6 | prospect | No | NO (prospect only) |
Tooling and one-offs that pick a sender
| # | File:line | What it decides | Role? | Staff on customer identity? |
|---|---|---|---|---|
| X1 | scripts/_miriam-situs-phone-and-reply.ts:48-66 | Situs PM (miriam@thesitusgroup.com) emailed through E6 with internalRecipient: true. The preview prints the Situs company mailbox as the sender | Comment only | YES. 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:122 | Email recipe: "write a one-off on sendPropertyEmail". No word about staff recipients | No | YES (X1 followed this recipe) |
| X3 | scripts/_send-clara-email-jordan-cosigner.ts:37-58 | Prospect, through E6 from the Camellia mailbox | No | NO (outside person, correct) |
| X4 | scripts/_send-erika-jonas-dispute.ts:138-154 | Raw SendGrid call, hard-coded clara@ | No | NO (right sender, but skips sendEmail's gates) |
| X5 | scripts/canary/e2e-mixed-pm-and-ai.ts:94/403, e2e-pm-reply-ingest.ts:70/276 | Graph sendMail from whatever building E2E_TEST_PROPERTY_ID names, with no test-property check | No | NO (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
| Channel | Decision points | Know the recipient's role | Can put staff on a customer identity |
|---|---|---|---|
| 24 (E1-E24) | 6 (E12, E14, E15, E16's staff turn, E17, E19); only E17 uses it to pick the sender | 16 today | |
| Text | 13 (T1-T13) | 1 (T7, declared by the caller) + T12 by purpose | 1 conditional (T7 when undeclared); every other staff text uses the same PropFlow line prospects see |
| Voice | 7 (V1-V7) | 1 (V4) | 0 |
| Calendar | 3 (C1-C3) | 0 | 0 today, 1 latent (C2) |
| Tooling | 5 (X1-X5) | 0 | 2 (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_MAPis 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,audienceandrecipient.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 today | 5 (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
internalRecipientchanges 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. InsendPropertyEmailit also skips the per-person contact ceiling.audience: 'staff'only affects the company-live hold. Neither flag picks clara@. - And no caller of
sendPropertyEmailpasses either flag today (checked all 16 direct callers plus wrappers).sendClaraProspectEmailtakesrecipient.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.tsalready 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:line | Message (plain words) | Who receives | How recipient type is decided | Door today | Verdict |
|---|---|---|---|---|---|---|
| W1 | lambda/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 directly | isInternalReplyRecipient 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/sendNewMessage | WRONG when staff |
| W2 | agents/clara/lib/email/process-inbound-email.ts:2040 (sesDeliver, line 1945) → send-clara-prospect-email.ts:563 | Clara'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 staff | Never resolved: recipient passed without isStaff, comment says so | CustMbx via sendPropertyEmail | WRONG when staff |
| W3 | src/lib/domain/escalation/bake-gate.ts:1575 | An 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 passed | CustMbx via sendPropertyEmail (the live staff-turn reply went from clara@, but its approved copy goes from leasing@) | WRONG when staff |
| W4 | src/lib/domain/escalation/held-reply-draft-row.ts:265 | A Clara reply a safety check held. Creates the review hold; released by W3 | Thread's person; turn.audience === 'staff' marks staff | isStaff: true set, used for the template only | Hold now; on approval, CustMbx (W3) | WRONG for staff turns |
| W5 | src/lib/domain/messaging/send-clara-prospect-email.ts:563 | The shared "Clara replies by email" router used by W2/W4 and the callers in the OK section | Mixed | recipient.isStaff selects the template only; never sent to the router | CustMbx | WRONG (root: drops the staff fact) |
WRONG: outside person, sent from clara@ (1)
| # | File:line | Message | Who | How decided | Door today | Verdict |
|---|---|---|---|---|---|---|
| W6 | src/lib/integrations/email/send-turnover-vendor-dispatch.ts:273 / 820 / ~903 | Turnover work order emailed to a vendor (paint, clean, etc.) | Vendor | Vendor contact on the work item | Building'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:line | Message | Who | How decided | Door today | Verdict |
|---|---|---|---|---|---|---|
| U1 | src/lib/domain/leasing/reporting-digest/run-digest.ts:707 | Weekly owner/staff report digest | Property owners (investors) and/or staff | Report subscriber list | clara@ | UNCLEAR: is an owner "internal"? Staff: fine |
| U2 | src/lib/domain/escalation/bake-gate.ts:1005 | Approved owner report (held, then approved) | Owners/staff | Same as U1 | clara@ | UNCLEAR, same question |
| U3 | src/lib/integrations/email/send-vendor-dispatch.ts:501 | Vendor work-order dispatch email | Vendor, but hard-redirected to a local test sink (vendor-poc@mailpit.local) | POC constant | clara@ (never delivered) | UNCLEAR: becomes "vendor from clara@" the day the redirect is removed |
| U4 | src/lib/integrations/email/send-vendor-quote.ts:157 | Ask a vendor for a quote | Vendor (same POC redirect) | POC constant | clara@ (never delivered) | UNCLEAR, same |
| U5 | src/lib/temporal/activities/vendor-chase.ts:511 | Chase a vendor who hasn't answered | Vendor (same POC redirect) | POC constant | clara@ (never delivered) | UNCLEAR, same |
| U6 | src/lib/integrations/email/property-graph-sender.ts:1093 | The SendGrid fallback inside the router: any prospect/renter/vendor email when no mailbox is connected, Gmail + attachment, or no token | Outside people | n/a | SendGrid from the building's sendGridSenderIdentity (e.g. Yale), else clara@ | UNCLEAR: by-design fallback, but it is "outside person from clara@" |
| U7 | agents/clara/lib/messaging/adapters/ses-email.ts:346 | Conversational email adapter's outbound | n/a | n/a | clara@ | 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:line | Message | Who |
|---|---|---|
| agents/clara/lib/email/tour-email-actions.ts:246 | Tour confirmation with calendar invite | Prospect |
| src/lib/temporal/activities/tour.ts:614 | Tour reminder | Prospect |
| src/lib/domain/leasing/staff-booking-confirm-prospect.ts:244 | Tour confirmation after staff booked it | Prospect |
| 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 asked | Renter/prospect on the thread |
| src/lib/domain/leasing/clara-guest-card-first-email-send.ts:839 | Clara's first email to a new lead | Prospect |
src/lib/domain/leasing/send-prospect-email-touch.ts:422 (direct client.sendReply on CustMbx) | Follow-up emails when a lead goes quiet | Prospect |
| src/lib/domain/leasing/send-application-link.ts:1323 | Apply-now link | Applicant |
| src/lib/domain/leasing/send-application-link.ts:1508 | Apply-now link (second variant) | Applicant |
| src/lib/domain/leasing/send-application-link.ts:2111 | Apply-now link (after staff/flow trigger) | Applicant |
| src/app/api/new-lease-package-reviews/[id]/decision/route.ts:656 | "You're approved" congratulations | Applicant |
| src/lib/domain/leasing/renewal-orchestration/send-renewal-email.ts:315 | Renewal offer | Tenant |
| src/lib/domain/escalation/self-guided-leave.ts:490 | "Did you leave the home?" after a self-guided tour | Prospect |
| src/lib/domain/escalation/self-guided-lockbox-code-delivery.ts:387 | Lockbox code for a self-guided tour | Prospect |
| 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:820 | Turnover job to a vendor (Graph leg, building mailbox) | Vendor |
| src/lib/domain/compliance/hold-approval-email-delivery.ts:99 | A person's answer to a held reply, delivered by email | Thread's person (renter/prospect) |
| src/lib/domain/conversations/staff-draft-send.ts:87 | Staff edits and sends Clara's draft from the Draft responses panel | Thread's person |
| src/lib/domain/escalation/team-answer-supervised-hold.ts:164 | Clara's reply in her own words after the team answered | Renter/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:line | Message | Who |
|---|---|---|
| agents/clara/lib/agent/tools/renewal/handlers.ts:81 | Renewal template email to the PM | PM |
| agents/clara/lib/email/staff-email-turn.ts:432 | Clara'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 question | Escalation owner (+cc) |
| src/lib/domain/escalation/reply-release.ts:1216 | One-line thanks to the staff member who answered | Staff |
| src/lib/domain/promises/send-autonomous-team-note.ts:1094 | Daily note about one caller, for buildings that answer their own phones | Team inbox |
| src/lib/tools/handlers/handle-forward-to-property-manager.ts:2052 | Forward a tenant escalation to the PM | PM |
| src/lib/team-notify/live-deps.ts:57 | Team-notification engine: call summaries, asks, hand-offs, FYIs | Office inbox chain (resolveStaffPageEmail) |
| src/lib/domain/escalation/emergency-alert-notices.ts:582 | Emergency alert email | Emergency contacts |
| src/lib/domain/escalation/emergency-alert-notices.ts:763 | Emergency alert email (second leg) | Emergency contacts |
| src/lib/domain/escalation/emergency-alert-notices.ts:829 | Emergency 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:76 | Answer to a reviewer who replied to a held-message email | Reviewer |
| src/lib/domain/escalation/bake-gate.ts:945 | Approved held escalation email | Staff |
| src/lib/domain/escalation/bake-gate.ts:1063 | Approved held team notice | Staff |
| src/lib/domain/escalation/team-notice-send.ts:341/349 | The team-notice door (all 29 callers below) | Staff |
| src/lib/domain/leasing/collections/owner-escalation.ts:327 | Collections: eviction-stage alert to the escalation owner | Escalation owner |
| src/lib/integrations/email/delegate-setup-template.ts:99 | Mailbox-delegate setup instructions | Company admin |
| src/lib/domain/escalation/held-propflow-staff-email.ts:91 | Held draft for PropFlow review | PropFlow staff |
| src/lib/domain/modules/live-send-digest.ts:164 | Daily digest of Live sends | PropFlow staff |
| src/app/api/admin/dev/metrics/alert-digest/route.ts:128 | Metrics alert digest | PropFlow ops |
| src/lib/platform/observability/bake-alert.ts:1525 | Bake alert | PropFlow ops |
| src/lib/domain/leasing/rent-roll/sync-digest.ts:133 | Rent-roll sync digest | PropFlow fixed recipient |
| src/lib/domain/knowledge-intake/submitted-notice.ts:75 | "Customer submitted knowledge intake" | PropFlow |
| src/app/api/feedback/route.ts:117 | In-app feedback | hello@ |
| src/app/api/onboarding/review/[slug]/submit/route.ts:157 | Knowledge review submitted | hello@ |
| src/app/api/public/demo-request/route.ts:206 | New demo request | hello@ |
tellStaff → SendGrid (14). Door: clara@. Verdict: OK. All files are under src/lib/.
| File:line | Message | Who | How decided |
|---|---|---|---|
| domain/escalation/emergency-alert-notices.ts:521 | Emergency alert email | Emergency contacts / PM | resolvePersonContactsByIds, resolvePmContactEmail |
| domain/escalation/gated-inbound-team-notice.ts:546 | "A renter wrote on a thread the team took over" | PM | resolvePmContactEmail |
| domain/leasing/renewal-notify.ts:362 | Renewal needs manual review | PM | resolvePmContactEmail |
| domain/leasing/send-pm-tour-cancellation.ts:338 | Tour cancelled | Leasing team | resolveTeamNotificationEmail |
| domain/leasing/send-pm-tour-confirmation.ts:778 | Tour booked | Leasing team | resolveTeamNotificationEmail |
| domain/leasing/staff-tour-alert-fanout.ts:556 | Tour alert to each subscribed staff member | Subscribed staff | resolveStaffTourAlertRecipients |
| domain/maintenance/page-property-manager.ts:876 | Life-safety maintenance page (email leg) | PM / escalation owner | Caller-supplied address, test-scope check |
| domain/maintenance/page-property-manager.ts:1093 | Same page, second variant | Same | Same |
| domain/maintenance/page-property-manager.ts:1243 | Same page, third variant | Same | Same |
| domain/promises/pm-delivery.ts:1102 | Clara's promised follow-up delivered to the office | PM / office inbox | resolvePmContactEmail, resolveStaffPageEmail |
| domain/vendors/notify-pm-outcome.ts:985 | How a vendor call went | PM | resolvePmContactEmail |
| domain/vendors/notify-pm-po-required.ts:230 | "Create the purchase order first" | PM | resolvePmContactEmail |
| domain/vendors/notify-pm-stale-dial.ts:281 | "The job changed after you approved the call" | PM | resolvePmContactEmail |
| tools/handlers/handle-capture-unknown-caller-note.ts:755 | Message from an unverified caller (call note) | Office inbox / company PM | resolveStaffPageEmail, 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:line | Message | Who | How decided |
|---|---|---|---|
| domain/escalation/gated-inbound-team-notice.ts:480 | Same team note, held/sent by mode | PM | resolvePmContactEmail |
| domain/escalation/tour-checkin-email.ts:77 | After-tour check-in by email (host has no phone) | Tour host | Host's email |
| domain/leasing/collections/owner-escalation.ts:288 | Collections owner escalation (held path) | Escalation owner | escalationOwnerViaChain |
| domain/leasing/new-lease/new-lease-draft-notify.ts:175 | New-lease draft ready | Office | resolveOfficeNoticeRecipients |
| domain/leasing/new-lease/new-lease-parked-notice.ts:161 | "Clara parked the new lease" | Leasing team | resolveTeamNotificationEmail |
| domain/leasing/pm-action-reminders/send-pm-action-reminder-digest.ts:100 | Digest of things waiting on the PM | PM | resolvePmContactEmail |
| domain/leasing/renewal-counter-office-notice.ts:162 | Tenant countered the renewal | Office | resolveYesNoticeRecipient |
| domain/leasing/renewal-declined-office-notice.ts:153 | Tenant declined the renewal | Office | resolveYesNoticeRecipient |
| domain/leasing/renewal-execution-notify.ts:350 | Renewal signed / executed | Office | resolveOfficeNoticeRecipients |
| domain/leasing/renewal-holdover-notify.ts:180 | Lease going to holdover | Office | resolveOfficeNoticeRecipients |
| domain/leasing/renewal-not-filled-office-notice.ts:141 | Renewal not filled in | Leasing team | resolveTeamNotificationEmail |
| domain/leasing/renewal-yes-office-notice.ts:220 | Tenant said yes to the renewal | Office / PM | resolveYesNoticeRecipient |
| domain/leasing/send-leasing-team-tour-update.ts:382 | Tour update (moved, late, outcome) | Leasing inbox / tour host | resolveTeamNotificationEmail, resolveLeasingInbox, tourHostEmail |
| domain/leasing/stale-lead-digest/run-digest.ts:527 | Weekly stale-lead list | Leasing team | resolveStaleLeadDigestRecipients |
| domain/leasing/stale-lead-digest/run-person-call-list.ts:257 | Leasing call list | Leasing team | resolveStaleLeadDigestRecipients |
| domain/leasing/tour/awaiting-team-notice.ts:97 | "Prospect said yes to a time you haven't confirmed" | Leasing team | resolveTeamNotificationEmail |
| domain/leasing/tour/tour-no-host.ts:285 | Tour has no host | Leasing team / company PM | resolveTeamNotificationEmail, resolveOrgPmContactEmail |
| domain/leasing/tour/tour-no-host.ts:360 | Same, second leg | Same | Same |
| domain/leasing/tour/tour-room-made-notices.ts:218 | Video-tour room made on retry (host copy) | Tour host | resolvePersonContactsByIds |
| domain/leasing/tour/tour-room-waiting-notice.ts:167 | "Someone is waiting in your Zoom" | Tour host | Host email / resolvePersonContactsByIds |
| domain/maintenance/resident-questions-digest/send-resident-questions-digest.ts:118 | Digest of resident questions | Office inbox | resolveStaffPageEmail |
| domain/modules/preview-client-digest.ts:120 | Morning list of Preview drafts | Customer's reviewers | Caller-supplied list |
| domain/move-in/send-pm-key-pickup-confirmation.ts:130 | Key pickup booked | Leasing team | resolveTeamNotificationEmail |
| domain/move-in/send-pm-key-pickup-confirmation.ts:285 | Key pickup changed | Leasing team | Same |
| domain/promises/pm-delivery.ts:1076 | Promised follow-up (held path) | PM / office | resolvePmContactEmail, resolveStaffPageEmail |
| domain/turnover/move-out-date-mismatch-notify.ts:119 | Move-out date doesn't match | Office | resolveOfficeNoticeRecipients |
| domain/turnover/move-out-draft-notify.ts:159 | Move-out paperwork draft ready | Office | resolveOfficeNoticeRecipients |
| domain/vendors/maintenance-pm-notice.ts:65 | Vendor-call notice to the PM | PM | Caller-supplied |
| temporal/activities/pm-action-reminder.ts:596 | Reminder that a PM action is overdue | PM | resolvePmContactEmail |
Sign-in and invites via sendRecapEmail (5). Door: clara@. Verdict: OK. The recipient is the person signing in.
| File:line | Message | Who |
|---|---|---|
| src/app/api/admin/users/invite-email/route.ts:236 | Staff invite | Invited user |
| src/lib/integrations/email/email-otp.ts:31 | Login code | User signing in |
| agents/clara/lib/messaging/transports/magic-link.ts:50 | Waitlist approved, sign in | Approved user |
| agents/clara/lib/messaging/transports/magic-link.ts:87 | Sign-in link | User signing in |
| src/app/api/dev/send-test-email/route.ts:172 | Dev test email | Developer |
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:line | Text | Line it leaves on |
|---|---|---|
| src/lib/domain/escalation/open-matter.ts:903 | Staff ask by text | Building/company Clara line |
| src/lib/team-notify/sms-sender.ts:70 | Team-notification engine ask by text | Same |
| src/lib/domain/leasing/staff-tour-alert-fanout.ts:492 | Tour alert text to subscribers | Same |
| src/lib/domain/leasing/renewal-notify.ts:505 | Renewal review notice text | Same |
| src/lib/domain/staff/send-staff-welcome.ts:178 | Welcome text to new staff | Same |
| src/lib/domain/leasing/send-leasing-team-tour-update.ts:145 | "Prospect running late" text to host | Same |
| src/lib/domain/escalation/tour-checkin-ask.ts:315 / 624 | After-tour check-in text to host | Same |
| src/lib/domain/escalation/self-guided-lockbox-ask.ts:228, self-guided-lockbox-reask.ts:124 | "Send us the lockbox code" to staff | Same |
| src/lib/domain/escalation/team-answer-supervised-hold.ts:192 | Held/approved texts on a staff thread | Same |
| src/lib/domain/escalation/held-text.ts:255 | Approved held text to staff | Line stored on the hold |
| src/lib/domain/turnover/walk-recap-send.ts:159 | Walk-through recap to PM | hold.resume.smsFrom (the building line) |
| src/lib/domain/vendors/notify-pm-stale-dial.ts:345 | Stale-dial page by text | Building line |
| agents/clara/lib/messaging/process-envelope.ts:1479 | Clara's reply to a staff member's text | The 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.
| Customer | Staff emails | From clara@propflowai.co | From customer mailbox |
|---|---|---|---|
| Western Slope | 70 | 69 | 1 |
| Situs Group | 50 | 50 | 0 |
| Camellia / JP&Co | 32 | 32 | 0 |
| Total | 152 | 151 | 1 |
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
| Kind | Count | First / last (UTC) | Recipients | Sender | Verdict |
|---|---|---|---|---|---|
| Tour booked notice | 18 | 2026-10-20 / 2026-11-03 | leasing@westernslopepm.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Call / message summary (handoff) | 14 | 2026-10-20 / 2026-11-03 | leasing@westernslopepm.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Callback request from a call | 13 | 2026-10-22 / 2026-10-28 | leasing@westernslopepm.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Question Clara could not answer | 8 | 2026-10-20 / 2026-11-03 | leasing@westernslopepm.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Sign-in code | 4 | 2026-10-22 / 2026-11-03 | Beverly Villar <assistantpm@westernslopepm.com>; Cheryl Burnett <cheryl@westernslopepm.com>; Kat Barker <kat@westernslopepm.com> | clara@propflowai.co (SendGrid) | OK |
| Weekly call list | 4 | 2026-10-23 / 2026-11-02 | leasing@westernslopepm.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Tour could not be booked notice | 3 | 2026-10-20 / 2026-11-01 | leasing@westernslopepm.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Tour cancelled notice | 3 | 2026-11-03 / 2026-11-03 | leasing@westernslopepm.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Tour rescheduled notice | 1 | 2026-10-20 / 2026-10-20 | leasing@westernslopepm.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Renewal action needed | 1 | 2026-10-30 / 2026-10-30 | Jay Taylor <jay@westernslopepm.com>; Kat Barker <kat@westernslopepm.com> | clara@propflowai.co (SendGrid) | OK |
| Virtual-tour Zoom link to tour host | 1 | 2026-11-03 / 2026-11-03 | Kat Barker <kat@westernslopepm.com> | leasing@westernslopepm.com (Graph) | WRONG |
Situs Group: by kind
| Kind | Count | First / last (UTC) | Recipients | Sender | Verdict |
|---|---|---|---|---|---|
| Call / message summary (handoff) | 15 | 2026-10-20 / 2026-11-02 | Deiby Magana <deiby@thesitusgroup.com>; leasing@thesitusgroup.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Emergency page / update | 8 | 2026-10-28 / 2026-10-30 | John Galloway <johng@thesitusgroup.com>; leasing@thesitusgroup.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Clara reply in a staff thread | 5 | 2026-10-20 / 2026-11-02 | Eileen 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 code | 5 | 2026-10-21 / 2026-11-02 | Beryl Jimenez <pmassistant@thesitusgroup.com>; Eileen O'Malley <eileen@thesitusgroup.com>; Lovely Salvador <assistant@thesitusgroup.com> | clara@propflowai.co (SendGrid) | OK |
| Tour booked notice | 4 | 2026-10-28 / 2026-11-03 | leasing@thesitusgroup.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Clara reply on virtual tours thread | 4 | 2026-11-02 / 2026-11-02 | Eileen O'Malley <eileen@thesitusgroup.com>; Lee McKibbins <lee@thesitusgroup.com>; miriam <miriam@thesitusgroup.com> | clara@propflowai.co (SendGrid) | OK |
| Invite to PropFlow | 3 | 2026-10-20 / 2026-10-21 | Lee McKibbins <lee@thesitusgroup.com>; Lovely Salvador <assistant@thesitusgroup.com>; miriam <miriam@thesitusgroup.com> | clara@propflowai.co (SendGrid) | OK |
| Pre-tour briefing to tour host | 3 | 2026-11-02 / 2026-11-03 | Deiby Magana <deiby@thesitusgroup.com>; miriam <miriam@thesitusgroup.com> | clara@propflowai.co (SendGrid) | OK |
| Tour cancelled notice | 1 | 2026-10-28 / 2026-10-28 | leasing@thesitusgroup.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Intro email ("Meet Clara") | 1 | 2026-11-02 / 2026-11-02 | Eileen 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 answer | 1 | 2026-11-03 / 2026-11-03 | leasing@thesitusgroup.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
Camellia / JP&Co: by kind
| Kind | Count | First / last (UTC) | Recipients | Sender | Verdict |
|---|---|---|---|---|---|
| Call / message summary (handoff) | 7 | 2026-10-22 / 2026-11-03 | camelliaapts@jp-co.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Question Clara could not answer | 5 | 2026-10-20 / 2026-10-30 | camelliaapts@jp-co.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Tour booked notice | 4 | 2026-10-20 / 2026-11-02 | camelliaapts@jp-co.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Weekly call list | 4 | 2026-10-23 / 2026-11-02 | camelliaapts@jp-co.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Lease notice | 4 | 2026-10-24 / 2026-10-31 | camelliaapts@jp-co.com (their shared mailbox); spollock@jp-co.com | clara@propflowai.co (SendGrid) | OK |
| Renewal action needed | 3 | 2026-11-02 / 2026-11-02 | camelliaapts@jp-co.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| New application to review | 1 | 2026-10-24 / 2026-10-24 | camelliaapts@jp-co.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Website demo-request thank-you | 1 | 2026-10-26 / 2026-10-26 | Sean <sjperlmutter@jp-co.com> | clara@propflowai.co (SendGrid) | OK |
| Weekly owner report | 1 | 2026-10-26 / 2026-10-26 | camelliaapts@jp-co.com (their shared mailbox); Kenya Jenkins <kjenkins@jp-co.com>; jsperlmutter@jp-co.com | clara@propflowai.co (SendGrid) | OK |
| Key pickup notice | 1 | 2026-10-26 / 2026-10-26 | camelliaapts@jp-co.com (their shared mailbox) | clara@propflowai.co (SendGrid) | OK |
| Sign-in code | 1 | 2026-11-02 / 2026-11-02 | Kenya Jenkins <kjenkins@jp-co.com> | clara@propflowai.co (SendGrid) | OK |
Appendix: every staff email
Western Slope (70)
| Date (UTC) | Recipient | Kind | Subject | Sender | Verdict |
|---|---|---|---|---|---|
| 2026-10-20 00:30 | leasing@westernslopepm.com (their shared mailbox) | Question Clara could not answer | Jaleigh Monsen — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 00:51 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Jaleigh Monsen — 2841 Morningside Court · Wed, Oct 21 at 11:00 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 03:45 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Spencer Shumate — 2841 Morningside Court · Tue, Oct 20 at 9:00 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 13:44 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Cylus Bradford — Pomona Park Townhomes · Tue, Oct 20 at 5:00 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 14:58 | leasing@westernslopepm.com (their shared mailbox) | Tour could not be booked notice | Tour update — Spencer Shumate couldn't be booked automatically · 2841 Morningside Court... | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 14:59 | leasing@westernslopepm.com (their shared mailbox) | Tour rescheduled notice | Tour rescheduled: Spencer Shumate — 2841 Morningside Court · Tue, Oct 20 at 9:15 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 15:00 | leasing@westernslopepm.com (their shared mailbox) | Tour could not be booked notice | Tour update — Spencer Shumate couldn't be booked automatically · 2841 Morningside Court... | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 20:12 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Alexis T. — Courtyard Apartments | clara@propflowai.co (SendGrid) | OK |
| 2026-10-21 18:07 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Jaleigh Monsen — 2980 Emerald Circle · Wed, Oct 21 at 1:00 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-22 11:52 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Tanya Christians — 2841 Morningside Court · Fri, Oct 23 at 10:30 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-22 16:40 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Kiara — callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-22 19:45 | Beverly Villar <assistantpm@westernslopepm.com> | Sign-in code | PropFlow sign-in code: 059876 | clara@propflowai.co (SendGrid) | OK |
| 2026-10-22 19:46 | Beverly Villar <assistantpm@westernslopepm.com> | Sign-in code | PropFlow sign-in code: 556314 | clara@propflowai.co (SendGrid) | OK |
| 2026-10-22 22:25 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Taylor C. — callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 03:57 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Heather Wolff — 2841 Morningside Court · Sat, Oct 24 at 1:30 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 14:59 | leasing@westernslopepm.com (their shared mailbox) | Question Clara could not answer | Taylor M. DiPilato — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 15:00 | leasing@westernslopepm.com (their shared mailbox) | Weekly call list | Friday call list: 4 leads, 2 toured | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 15:18 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Desaray Hutto — 2841 Morningside Court · Sat, Oct 24 at 10:00 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 16:02 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Mia — callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 16:54 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | (970) 985-1466 — callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 18:32 | Kat Barker <kat@westernslopepm.com> | Sign-in code | PropFlow sign-in code: 859111 | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 22:42 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Lauren A. Jayne — callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 22:47 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Lauren A. Jayne — callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-24 20:18 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Lori Ruiz — Pomona Park Townhomes · Mon, Oct 26 at 4:30 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-25 20:18 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Anthony M. — reply needed at 2841 Morningside Court | clara@propflowai.co (SendGrid) | OK |
| 2026-10-26 15:00 | leasing@westernslopepm.com (their shared mailbox) | Weekly call list | Monday call list: 7 leads, 4 toured | clara@propflowai.co (SendGrid) | OK |
| 2026-10-26 17:01 | leasing@westernslopepm.com (their shared mailbox) | Question Clara could not answer | Austin J. Boen — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-26 23:49 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Trang Quang — Ember Estates · Wed, Oct 28 at 12:45 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-27 01:03 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Michaela — general callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-27 16:24 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Alicia Jensen — 2841 Morningside Court · Tue, Oct 27 at 5:45 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-27 19:24 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Brenda — general callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-27 19:29 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Braden — leasing callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 02:04 | leasing@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:09 | leasing@westernslopepm.com (their shared mailbox) | Question Clara could not answer | Micheal Macias — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 14:26 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Micheal Macias — Ember Estates · Wed, Oct 28 at 12:30 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 17:48 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Sidney J. Caro — general callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 18:29 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Micheal M. — here for a tour at Ember Estates | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 20:18 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Marcus — general callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 21:18 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | (970) 210-3061 — general callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 21:50 | leasing@westernslopepm.com (their shared mailbox) | Callback request from a call | Matthew — general callback | clara@propflowai.co (SendGrid) | OK |
| 2026-10-29 15:50 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Anthony Mccleary — Ember Estates · Thu, Oct 29 at 2:30 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-29 19:59 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Prince from AC Ports — Portable AC venting | clara@propflowai.co (SendGrid) | OK |
| 2026-10-29 20:55 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Nina Anderson — Parking lot permission request | clara@propflowai.co (SendGrid) | OK |
| 2026-10-29 21:19 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Amy Reid — Ember Estates · Thu, Nov 5 at 4:30 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 02:56 | leasing@westernslopepm.com (their shared mailbox) | Question Clara could not answer | Larissa K. Jones — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 13:00 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Amy Reid — Pomona Park Townhomes · Thu, Nov 5 at 5:30 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 14:30 | Jay Taylor <jay@westernslopepm.com>, Kat Barker <kat@westernslopepm.com> | Renewal action needed | 10 renewals to approve at Western Slope Property Management for October 2026 | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 14:50 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Virtual tour: Tour confirmed: Sam Kavajecz — Pomona Park Townhomes · Fri, Oct 30 at 10:... | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 15:00 | leasing@westernslopepm.com (their shared mailbox) | Weekly call list | Friday call list: 8 leads, 2 toured | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 15:14 | leasing@westernslopepm.com (their shared mailbox) | Question Clara could not answer | Kellie Chase — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-31 02:37 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Jay from Ransom's Reliable Property Maintenance — Test call, no request | clara@propflowai.co (SendGrid) | OK |
| 2026-10-31 21:11 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Jonathan Pritchard from A Handyman — Upcoming contracts to bid | clara@propflowai.co (SendGrid) | OK |
| 2026-11-01 09:52 | leasing@westernslopepm.com (their shared mailbox) | Question Clara could not answer | Amy Reid — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-11-01 14:06 | leasing@westernslopepm.com (their shared mailbox) | Tour could not be booked notice | Tour update — Amy Reid couldn't be booked automatically · Ember Estates · Thu, Nov 5 4:... | clara@propflowai.co (SendGrid) | OK |
| 2026-11-01 14:15 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Amy Reid — 2841 Morningside Court · Thu, Nov 5 at 9:00 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 14:50 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Virtual tour: Tour confirmed: Bre Martin — 2841 Morningside Court · Tue, Nov 3 at 4:30 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 16:00 | leasing@westernslopepm.com (their shared mailbox) | Weekly call list | Monday call list: 9 leads, 3 toured | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 18:08 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Luz D. — Retrieve misdelivered package | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 21:09 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Luz D. — Misdelivered package pickup | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 07:36 | leasing@westernslopepm.com (their shared mailbox) | Tour cancelled notice | Tour cancelled: Amy Reid — Ember Estates · Thu, Nov 5 at 4:30 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 07:38 | leasing@westernslopepm.com (their shared mailbox) | Question Clara could not answer | Amy Reid — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 12:53 | leasing@westernslopepm.com (their shared mailbox) | Tour cancelled notice | Tour cancelled: Amy Reid — 2841 Morningside Court · Thu, Nov 5 at 3:30 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 12:53 | leasing@westernslopepm.com (their shared mailbox) | Tour cancelled notice | Tour cancelled: Amy Reid — Pomona Park Townhomes · Thu, Nov 5 at 5:30 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 16:06 | Kat Barker <kat@westernslopepm.com> | Virtual-tour Zoom link to tour host | Bre Martin's virtual tour today at 4:30 PM is on Zoom | leasing@westernslopepm.com (Graph) | WRONG |
| 2026-11-03 18:58 | leasing@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:15 | leasing@westernslopepm.com (their shared mailbox) | Tour booked notice | Tour confirmed: Sierra Snow — 2841 Morningside Court · Wed, Nov 4 at 9:00 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 19:48 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Missed call — Left a voice message… | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 20:14 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Deborah F. — November rent total | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 23:03 | leasing@westernslopepm.com (their shared mailbox) | Call / message summary (handoff) | Layla D. — Security deposit return | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 23:59 | Cheryl Burnett <cheryl@westernslopepm.com> | Sign-in code | PropFlow sign-in code: 321581 | clara@propflowai.co (SendGrid) | OK |
Situs Group (50)
| Date (UTC) | Recipient | Kind | Subject | Sender | Verdict |
|---|---|---|---|---|---|
| 2026-10-20 03:36 | leasing@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:54 | leasing@thesitusgroup.com (their shared mailbox) | Clara reply in a staff thread | Re: Tessa — called about the two-bedroom at 1320 Zephyr Street in Lakewood… | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 17:02 | miriam <miriam@thesitusgroup.com> | Invite to PropFlow | Situs Group on PropFlow | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 17:12 | Lee McKibbins <lee@thesitusgroup.com> | Invite to PropFlow | Situs Group on PropFlow | clara@propflowai.co (SendGrid) | OK |
| 2026-10-21 15:05 | Lovely Salvador <assistant@thesitusgroup.com> | Invite to PropFlow | Situs Group on PropFlow | clara@propflowai.co (SendGrid) | OK |
| 2026-10-21 15:09 | Lovely Salvador <assistant@thesitusgroup.com> | Sign-in code | PropFlow sign-in code: 165265 | clara@propflowai.co (SendGrid) | OK |
| 2026-10-27 17:25 | leasing@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:28 | Lee McKibbins <lee@thesitusgroup.com> | Clara reply in a staff thread | Re: Can someone review the attached RFTA packet Nicole just emailed in? | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 20:30 | Beryl Jimenez <pmassistant@thesitusgroup.com> | Sign-in code | PropFlow sign-in code: 662959 | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 20:30 | Beryl Jimenez <pmassistant@thesitusgroup.com> | Sign-in code | PropFlow sign-in code: 673587 | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 20:31 | Beryl Jimenez <pmassistant@thesitusgroup.com> | Sign-in code | PropFlow sign-in code: 860123 | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 23:20 | leasing@thesitusgroup.com (their shared mailbox) | Tour booked notice | Tour confirmed: Michael Jordan — Dahlia Apartments · Thu, Oct 29 at 4:45 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 23:22 | leasing@thesitusgroup.com (their shared mailbox) | Tour cancelled notice | Tour cancelled: Michael Jordan — Dahlia Apartments · Thu, Oct 29 at 4:45 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 23:49 | John Galloway <johng@thesitusgroup.com> | Emergency page / update | Emergency — Michael Jordan | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 23:50 | leasing@thesitusgroup.com (their shared mailbox) | Emergency page / update | EMERGENCY — Michael Jordan on +17207404240, nobody answered | clara@propflowai.co (SendGrid) | OK |
| 2026-10-29 02:12 | John Galloway <johng@thesitusgroup.com> | Emergency page / update | Emergency — Hugo Weinberger | clara@propflowai.co (SendGrid) | OK |
| 2026-10-29 02:12 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | Hugo Weinberger — Test call, disregard leak report | clara@propflowai.co (SendGrid) | OK |
| 2026-10-29 02:13 | leasing@thesitusgroup.com (their shared mailbox) | Emergency page / update | Emergency handled — Hugo Weinberger | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 00:08 | John Galloway <johng@thesitusgroup.com> | Emergency page / update | Emergency — Situs Group | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 00:08 | John Galloway <johng@thesitusgroup.com> | Emergency page / update | Emergency update — Situs Group | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 00:09 | leasing@thesitusgroup.com (their shared mailbox) | Emergency page / update | EMERGENCY — +17206371205 on +17207404240, nobody answered | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 00:09 | John Galloway <johng@thesitusgroup.com> | Emergency page / update | Disregard — Situs Group | clara@propflowai.co (SendGrid) | OK |
| 2026-10-31 02:56 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | Michael J. — Leasing options, dog limit | clara@propflowai.co (SendGrid) | OK |
| 2026-10-31 18:52 | leasing@thesitusgroup.com (their shared mailbox) | Tour booked notice | Virtual tour: Tour confirmed: Patricia Reed — Barcelona Apartments · Mon, Nov 2 at 11:0... | clara@propflowai.co (SendGrid) | OK |
| 2026-10-31 19:55 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | Britney M. — Deposit and move-in dates | clara@propflowai.co (SendGrid) | OK |
| 2026-10-31 20:31 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | Violeta M. — Portal access, rent payment | clara@propflowai.co (SendGrid) | OK |
| 2026-10-31 20:39 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | Karla A. — Renewal credit on rent | clara@propflowai.co (SendGrid) | OK |
| 2026-11-01 15:53 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | Britney M. — Security deposit payment | clara@propflowai.co (SendGrid) | OK |
| 2026-11-01 23:04 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | David — Apology for back garbage | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 02:32 | Deiby Magana <deiby@thesitusgroup.com> | Call / message summary (handoff) | Your virtual tour today at 11 | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 02:32 | miriam <miriam@thesitusgroup.com> | Clara reply on virtual tours thread | Virtual tours | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 02:32 | Lee McKibbins <lee@thesitusgroup.com> | Clara reply on virtual tours thread | Virtual tours | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 02:32 | Eileen O'Malley <eileen@thesitusgroup.com> | Clara reply on virtual tours thread | Virtual tours | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 03:10 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | Ignacio Z. — Car removal from spot | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 14:44 | Hugo Weinberger <hugow@thesitusgroup.com> | Clara reply in a staff thread | Re: David — Apology for back garbage | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 15:09 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | Melissa M. — Locked out of office | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 15:34 | leasing@thesitusgroup.com (their shared mailbox) | Tour booked notice | Tour confirmed: Stephany Mandonado — Lampliter · Mon, Nov 2 at 2:00 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 15:42 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | Rashida from City of Aurora Code Enforcement and Housing — Systematic housing inspection | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 15:42 | leasing@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:54 | leasing@thesitusgroup.com (their shared mailbox) | Call / message summary (handoff) | Jenny — Application approval status | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 16:23 | Eileen O'Malley <eileen@thesitusgroup.com> | Sign-in code | PropFlow sign-in code: 824228 | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 17:14 | leasing@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 Group | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 17:40 | Eileen O'Malley <eileen@thesitusgroup.com> | Clara reply on virtual tours thread | Re: Virtual tours | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 17:46 | Eileen O'Malley <eileen@thesitusgroup.com>, Lee McKibbins <lee@thesitusgroup.com>, leasing@thesitusgroup.com (their shared mailbox) | Clara reply in a staff thread | Re: Michael J. — Leasing options, dog limit | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 18:26 | Hugo 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 thread | Re: Michael J. — Leasing options, dog limit | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 18:45 | Deiby Magana <deiby@thesitusgroup.com> | Pre-tour briefing to tour host | Patricia R.'s 11:00 AM tour at Barcelona Apartments | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 22:45 | Deiby Magana <deiby@thesitusgroup.com> | Pre-tour briefing to tour host | Stephany M.'s 3:00 PM tour at Lampliter | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 00:26 | leasing@thesitusgroup.com (their shared mailbox) | Tour booked notice | Tour confirmed: Adia Reynolds — Lampliter · Tue, Nov 3 at 9:45 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 17:30 | miriam <miriam@thesitusgroup.com> | Pre-tour briefing to tour host | Adia R.'s 9:45 AM tour at Lampliter | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 18:18 | leasing@thesitusgroup.com (their shared mailbox) | Question Clara could not answer | Somvang Keomanee — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
Camellia / JP&Co (32)
| Date (UTC) | Recipient | Kind | Subject | Sender | Verdict |
|---|---|---|---|---|---|
| 2026-10-20 17:10 | camelliaapts@jp-co.com (their shared mailbox) | Question Clara could not answer | Victoria Alexandra — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 17:10 | camelliaapts@jp-co.com (their shared mailbox) | Question Clara could not answer | Victoria Alexandra — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 17:11 | camelliaapts@jp-co.com (their shared mailbox) | Question Clara could not answer | Victoria Alexandra — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-20 17:37 | camelliaapts@jp-co.com (their shared mailbox) | Tour booked notice | Tour confirmed: Ella Rydwell — Camellia Apartments · Wed, Oct 21 at 9:15 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-22 18:50 | camelliaapts@jp-co.com (their shared mailbox) | Call / message summary (handoff) | Victoria A. — Camellia Apartments | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 15:00 | camelliaapts@jp-co.com (their shared mailbox) | Weekly call list | Friday call list: 5 leads, 2 toured | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 17:39 | camelliaapts@jp-co.com (their shared mailbox) | Call / message summary (handoff) | Eli — Camellia Apartments | clara@propflowai.co (SendGrid) | OK |
| 2026-10-23 20:00 | camelliaapts@jp-co.com (their shared mailbox) | Call / message summary (handoff) | Dexter — Camellia Apartments | clara@propflowai.co (SendGrid) | OK |
| 2026-10-24 01:38 | camelliaapts@jp-co.com (their shared mailbox) | Lease notice | Lease prepared for Guadalupe L. Yanez Mejia, unit 124 | clara@propflowai.co (SendGrid) | OK |
| 2026-10-24 03:45 | camelliaapts@jp-co.com (their shared mailbox) | Tour booked notice | Tour confirmed: Yoira Estrada — Camellia Apartments · Mon, Oct 26 at 11:00 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-24 05:24 | camelliaapts@jp-co.com (their shared mailbox) | New application to review | New application to review — Yoira E. Estrada (Unit 106) | clara@propflowai.co (SendGrid) | OK |
| 2026-10-24 14:51 | camelliaapts@jp-co.com (their shared mailbox) | Question Clara could not answer | Genesis Diaz — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-24 21:54 | camelliaapts@jp-co.com (their shared mailbox) | Call / message summary (handoff) | Claire — Camellia Apartments | clara@propflowai.co (SendGrid) | OK |
| 2026-10-26 04:31 | Sean <sjperlmutter@jp-co.com> | Website demo-request thank-you | Thanks for your interest in Propflow | clara@propflowai.co (SendGrid) | OK |
| 2026-10-26 15:00 | camelliaapts@jp-co.com (their shared mailbox) | Weekly call list | Monday call list: 3 leads, 1 toured | clara@propflowai.co (SendGrid) | OK |
| 2026-10-26 15:46 | Kenya Jenkins <kjenkins@jp-co.com>, jsperlmutter@jp-co.com, camelliaapts@jp-co.com (their shared mailbox) | Weekly owner report | Camellia Apartments weekly report — 87.5% occupied (week ending Oct 26) | clara@propflowai.co (SendGrid) | OK |
| 2026-10-26 18:29 | camelliaapts@jp-co.com (their shared mailbox) | Key pickup notice | Key pickup: Cyan A. Olivas-Rivera — Unit 515 · Fri, Oct 30 at 2:00 PM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 18:21 | camelliaapts@jp-co.com (their shared mailbox) | Lease notice | A lease is ready for your signature — Maxwell J. Vierling (Unit 606) | clara@propflowai.co (SendGrid) | OK |
| 2026-10-28 21:54 | camelliaapts@jp-co.com (their shared mailbox) | Call / message summary (handoff) | Anna from Miracle Method — tub touch-up in 403, scheduling | clara@propflowai.co (SendGrid) | OK |
| 2026-10-29 16:35 | camelliaapts@jp-co.com (their shared mailbox) | Call / message summary (handoff) | Eric from Con Aqua — Boiler room access | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 00:04 | camelliaapts@jp-co.com (their shared mailbox) | Tour booked notice | Tour confirmed: Emlyn Ellerby — Camellia Apartments · Fri, Oct 30 at 10:00 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 15:00 | camelliaapts@jp-co.com (their shared mailbox) | Weekly call list | Friday call list: 2 leads | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 17:26 | camelliaapts@jp-co.com (their shared mailbox) | Question Clara could not answer | Brian Wieser — asked us something we could not answer | clara@propflowai.co (SendGrid) | OK |
| 2026-10-30 17:45 | spollock@jp-co.com, camelliaapts@jp-co.com (their shared mailbox) | Lease notice | New lease signed — Maxwell J. Vierling (Unit 606) — Camellia Apartments | clara@propflowai.co (SendGrid) | OK |
| 2026-10-31 14:31 | spollock@jp-co.com, camelliaapts@jp-co.com (their shared mailbox) | Lease notice | Lease rolled to month-to-month — David Fifield (Unit 105) — Camellia Apartments | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 15:34 | camelliaapts@jp-co.com (their shared mailbox) | Renewal action needed | Action needed: review Daniel Rosell's renewal (Unit 508) | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 16:00 | camelliaapts@jp-co.com (their shared mailbox) | Renewal action needed | Action needed: review Daniel Rosell's renewal (Unit 508) | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 16:00 | camelliaapts@jp-co.com (their shared mailbox) | Weekly call list | Monday call list: 2 leads | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 19:00 | camelliaapts@jp-co.com (their shared mailbox) | Renewal action needed | Action needed: add an email for Daniel Rosell (Unit 508) | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 21:47 | camelliaapts@jp-co.com (their shared mailbox) | Tour booked notice | Tour confirmed: Marisol Reyes — Camellia Apartments · Tue, Nov 3 at 11:00 AM | clara@propflowai.co (SendGrid) | OK |
| 2026-11-02 21:58 | Kenya Jenkins <kjenkins@jp-co.com> | Sign-in code | PropFlow sign-in code: 358310 | clara@propflowai.co (SendGrid) | OK |
| 2026-11-03 00:03 | camelliaapts@jp-co.com (their shared mailbox) | Call / message summary (handoff) | Christopher — Housing for Daniel Brim | clara@propflowai.co (SendGrid) | OK |