- Today a virtual tour runs on PropFlow's Zoom. The call's notes reach Clara only if the agent texts them back.
- Scope now, three steps: Zoom tells us when a tour's transcript is ready and we store it (step 1, live). Clara reads it and writes the recap on the guest card (step 2, live). Every virtual tour gets its own Zoom room (step 3, in build).
- Parked until the steps have run on real tours: better post-tour texts, promises, digest, a Zoom user per customer. Listed under "Later, not now" so the ideas are not lost.
- Zoom side is set up (Fede, Oct 30 afternoon): account-level app, scopes, audio-only transcript recording. One step left: pointing Zoom at our receiver once it is deployed.
What changed since the morning
- The tour link is our Zoom (Fede's user), not the customer's. Zoom emailed Fede the recording and summary. The "customer connects their Zoom" option is dropped.
- Kat did answer Clara's check-in at 11:20 AM: "They liked it, they're going to be starting grad school Jan." It is on Sam's guest card. Today's path worked; the note was just thin.
- A richer recap is on the card: Clara's note from the Zoom transcript was queued onto the same card at 12:38 PM. The transcript was pulled by hand from Zoom's share link.
- The recording ran 1 h 23 min: 23 minutes of tour, then Kat left it running on her phone and it caught an hour of office radio and coworker chatter. A privacy problem, not a storage one.
- Our own Zoom recap pipeline (the one that posts our standups) did not see this meeting. We asked Smith why. The product gets its own receiver anyway: production automation never runs on a Mac mini.
The pipeline
Zoom configuration, read Nov 2 2026
Risk: one host user, one live meeting at a time. Every tour room is created on one Zoom user, fedechagu@gmail.com (Fede's personal account, Owner, Licensed), and that user's feature list shows no concurrent-meeting add-on. Two virtual tours that overlap would share one host and the second room could not run. Count today, Nov 2 2026, read-only from production: 30 tours booked in the next 14 days, 2 of them virtual (Barcelona Apartments today 11:00 AM with a Zoom room; 2841 Morningside Court Nov 3 4:30 PM as a phone call), 0 overlapping. The account is Zoom Workplace Pro (Fede, Nov 2 2026): one live meeting per host. Fede is adding clara@propflowai.co as the licensed host user for tour rooms (in progress Nov 2 2026); the concurrency question is open, options below.
| Option | What it means | Cost | What we build |
|---|---|---|---|
| 1 Zoom Business | 2 concurrent meetings per host; Clara host user stays the only host | plan upgrade (Fede) | nothing new |
| 2 One Clara Zoom seat per leasing-agent host | each agent who gives virtual tours gets a Clara-owned licensed Zoom user; rooms created under the agent's seat | one Pro seat per host (Fede) | host user picked per tour from the assigned agent |
| 3 Rooms on the agent's own calendar video | Teams for Outlook hosts, Microsoft Meet/Google Meet for Google hosts; the agent is the host; no Zoom seats | none | recordings, transcripts and the auto-end/host-notice rules rebuilt on those platforms |
| Item | Value |
|---|---|
| Host user | fedechagu@gmail.com today (Owner, Licensed, account cj2wCpQmRbas6myeCiLjOg); clara@propflowai.co being added as the host user Nov 2 2026 (user id 5Ixdl-f2TH6YYfys5E4VpA, pending activation at the time of writing). |
| Room creation | POST /users/me/meetings (PR #24158), no alternative hosts, agent joins as a plain participant |
| Room settings | join before host on (0 min), waiting room off, passcode in link, cloud recording on, auto-delete 7 days |
| App scopes | user read/settings, meeting write/read/update-status/summary, cloud recording read; missing: list meetings, list users (participant events were missing until 21:00Z). Nov 2 21:00Z: meeting:read:participant:admin added by Fede; participant_joined / participant_left / participant_jbh_joined subscribed. |
| Events subscribed | recording and summary events known to the code; participant events not subscribed (issue #24557) |
| Phone join test (Nov 2 2026, Willows room 89767286424) | Works with the Zoom app (Fede tapped the link on his phone: room name and slot time shown, joined; the room stayed "waiting", so nothing started 14 h early). Browser without the app: works now, no login, no app. Before (Nov 2 2026, 21:25Z): both phones got an app wall because Zoom's "On mobile browser" sub-setting (API in_meeting.join_from_mobile) read off on both Zoom users even though the account toggle was on. After Fede's go ("we should not require login or apps, fix it"), the sub-setting was turned on for clara@propflowai.co and fedechagu@gmail.com (21:32Z, ledgered, read back on). Re-run headless: iPhone shows "Join from browser", then a name box and a Join button, no sign-in; Android shows the same link (the emulator's app-intent overlay kept the click from navigating, so only the link is proven there). Rooms require no sign-in: authentication off, no registration, no waiting room, join before host on, cloud recording on (room 89767286424 read back). Participant-joined events were not captured because #24604 was not live yet. Join-before-host at 0 min stays as is (Fede: understand why first before any window).![]() ![]() ![]() ![]() |
| Real rooms checked | 83828436184 (Barcelona, Nov 2) and 88373748730 (Morningside, Nov 3), both host fedechagu@gmail.com, both still "waiting" (never started) |
Zoom account changes
| Setting | Change to | Why | Status |
|---|---|---|---|
| AI Companion meeting summary | On, starts by itself in every meeting the user hosts, shared with the host only | It is the signal our pipeline reacts to | verify name on screen |
| Cloud recording | Audio only plus audio transcript, video off, recording starts by itself | Backup transcript, tiny files, no video of someone's home | verify names |
| Recording retention | Delete after 7 days | Privacy (today's hour of office radio) | verify it exists on our plan |
| Join before host | On (already) | Kat ran today's call alone | confirmed today |
| Zoom app for our account | A server-to-server app with meeting, recording and summary access; it calls our production route | Lets Clara make rooms and receive transcripts | Fede, once our route exists we hand over the exact settings |
- Cost: Zoom bills recording by storage, not minutes (10 GB per licensed user on Pro and Business, extra from about $10 a month, per Zoom's storage page). An hour of audio is a few MB. With audio only and the 7-day delete, a non-issue.
- Overlapping calls (to confirm on an official page): Zoom staff on their forum say 1 meeting at a time per Pro license, 2 per Business. Plan: one Zoom user per customer; a customer with overlapping tours needs a second user or Business.
Steps
| Step | Ships | Proof |
|---|---|---|
| 1. Receive | Merged and live (Oct 30). Our route checks Zoom's signature and stores the raw transcript on the tour. Matched by the company's Zoom meeting id plus the tour slot; one tour in the slot or no match, never a guess. | Proven twice on real calls (below). |
| 2. Note | Merged and live (Oct 30), no switch. Clara writes the recap from the raw transcript onto the guest card and the prospect's conversation, through the existing note door. The conversation shows it as a titled card with the topics on the left (merged Oct 30 night, two PRs). | Proven end to end on Oct 31 with nobody in the loop (below). Lane done. |
One step at a time: step 2 starts only after step 1 has caught a real tour. Anything beyond these three needs Fede's go.
Step 3 — One Zoom room per tour (shipped Oct 31)
- Ruling (Fede, Oct 31, 2026): every virtual tour gets its own link, created when the tour is booked. No fixed company link, no setting, no switch. It fixes live behavior, so it goes live everywhere on merge.
- Why now: a Situs Group virtual tour booked by phone on Oct 31 (Barcelona, Mon Nov 2, 11:00 AM) went out with no link on the prospect's text, the email, the team notice or the calendar event, because Situs never had a company link. Western Slope's tours carry one fixed link, so two tours at once would share a room.
- How it works: at booking, Clara creates a Zoom meeting on PropFlow's Zoom account (one host user) and stores its id and link on the tour. The link goes on the confirmation text and email, the team notice and staff text, the calendar event and the reminders. Rescheduling makes a new room. If Zoom fails, the booking still completes and the message keeps today's wording ("our team will call you at that time").
- Recap matching now uses the tour's own meeting id, so overlapping tours no longer confuse it.
- Shipped, three PRs, all merged Oct 31 (US time): (1) #24158 creates the room at booking; confirmation text, email and team notice carry it; recaps match by the tour's meeting id (live 21:24Z). (2) #24175 every surface reads the tour's own room: day-before and hour-before reminders, Clara's text and email wording, her phone wording ("I'm texting you the video tour link now"), the calendar invite location and body, confirm and reschedule make the room before the invite (live 23:08Z). (3) #24186 deletes the company-level link setting everywhere: field, settings row, registry key, every fallback read. Ending the room at slot end is issue #24171.
- Proof so far: production read-only count before part 3: 0 upcoming virtual tours at the two companies that held a link, so nothing lost a link. The Situs tour above got its room (83828436184) and its calendar invite now shows the link in location and body (rewritten through Clara's own path, read back). A real test call on Saturday afternoon could not reach the booking step (weekend cutoff, office closed); Clara never said anyone would call and explained the link comes by text. Owed Monday, office hours: a real virtual tour booked at Willows by email and by phone, checking room, confirmation link, invite location and the hour-before reminder (issue #24177). The Willows email run also needs the test company's leftover fake link ignored, which part 3 does.
- Numbers (production, Oct 31): 8 virtual tours since Oct 1 across all companies, 0 overlapping. Upcoming virtual tours: 1 (the Situs tour above). Western Slope has none upcoming, so the old field can go right after step 2.
- Known limit: one host user. Zoom allows one live meeting at a time per host on Pro, two on Business. Today overlaps land in one shared room anyway; we measure before designing around it.
The note
The raw transcript is the source and is stored whole on the tour (Fede, Oct 27 and Oct 30). Zoom's own summary is not used: on today's call it had the rent as "$23.95" and said utilities were included, a line from a coworker reading another listing after the tour. The note is six lines at most, only what changes what the team does next, each line "Topic: what was said":
- The topics come from the call, not from a list: Move-in, Household, Pets, Parking, Price, Repairs they want first, Application, Lease length, whatever was actually discussed. A topic nobody raised gets no line.
- About the home: if they said whether they want it, in their own words.
- Said they would: who said they would do what, written down only. Nobody acts on it yet.
- Never a rating. No hot, warm, cold, score or verdict (Fede, Oct 30: "too speculative"). The team draws its own conclusion from the words.
Example from the Willows test call, written by Clara from the stored transcript with these rules:
About the home: "I like this" — said he'd be ready to sign. Household: Two roommates and one dog. Move-in: Moving from Vail, Colorado; asked if the home could be ready in 2 weeks. Repairs they want first: Stains on the carpet cleaned and the fence fixed before signing. Application: Asked for the application link; his dad will be the cosigner. Said they would: Prospect said he'd be ready to sign once the carpet and fence are taken care of.
It lands on the tour record, on the guest card through the existing note door (the one Kat's texted notes use), and in the prospect's conversation as an internal note. A transcript that does not match a tour, or matches a cancelled one, is stored and flagged; no note is written. A call under two minutes gets no note. Today's texts to the agent and the prospect keep going out unchanged.
Later, not now
Ideas raised on Oct 30, each parked until the steps above have run on real tours and Fede says go. Kept here so they are not lost.
| Idea | What it would do |
|---|---|
| Skip "how was the tour?" (built, #24546, Nov 2) | Built as: a virtual tour's check-in reads the Zoom call first. Clara's recap already on the card, or a call that never connected (no call, under 2 minutes or 20 words, host never on), and the agent gets no "how was the tour?". A real call with no recap still gets the ask. The prospect's follow-up is unchanged. |
| Plan decided once at booking; a later room never changes renter copy (built, #24555, Nov 2) | Built as: a virtual tour stores what its confirmation told the renter, phone call or video room. Every reminder, calendar invite and host notice reads that. A room added afterwards stays for the host only; the renter keeps hearing "our team will call you". Origin: Patricia Reed (Situs) was told a call, then her reminders sent a Zoom link (#24549). |
| Rooms end themselves (built, #24567, Nov 2) | Built as: every tour room is closed by Clara at slot end + 15 min, whoever is in it. Origin: a prospect's phone sat in a Situs tour room from 10:59 to 12:20 MT with no host. Second half parked (#24557): "no second participant by start + 15 min → ended, never-connected" needs Zoom participant events, which is a Zoom app change and Fede's call. |
| Never connected: tell the host, offer the renter a new time (design, Fede yes/hold) | When a virtual tour never connected, Clara tells the host what the call showed and offers the renter a new time. Nothing is sent today; this is a new outbound, so it waits on Fede. |
| "Someone is waiting in your Zoom": host notice on join (decided, not built) | Decided by Fede, Nov 2 2026 ("I think that's also a good notification to add when someone joined"). When a participant joins a tour's Zoom room and the host is not in it, Clara texts the host at once, e.g. "Patricia just joined your 11:00 Zoom for 8195 and is waiting; join here: <link>". Text to the host; email instead when the host is not opted in to texts; exactly one notification, never both. Nothing goes to the prospect. Needs the same Zoom participant events as the rooms rule (issue #24557: subscribe meeting.participant_joined / participant_left, scope meeting:read:participant:admin, Fede's Zoom app change); ships right after it as a small PR. A new staff-facing message, so it rides the existing virtual-tour setting (no new switch). Proof: Willows with a real phone; Fede turns it on at Situs. |
| Attendance from the call | Both people on the call marks the tour attended, so the application link goes out at call end instead of two hours later. |
| Promises | "Kat will send the bedroom dimensions" and "Sam will get back next week" become things Clara does, asks for, or schedules; unkept ones in a daily digest. |
| A Zoom user per customer | One meeting at a time per Zoom license; a user per customer on our account lets tours overlap. An onboarding checklist line. |
Why: Patricia Reed, Situs, Nov 2 2026. 11:00 AM MT virtual tour, host Deiby. Her Oct 31 confirmation promised a phone call; a Zoom room was attached 2.5 h later and the reminders sent the Zoom link. She joined the room four times (10:54-10:57, 10:59-11:40, 11:40-12:00, 12:00-12:20 MT), alone, 81 minutes in total. The host never joined; he was working the call plan (called 10:35, voicemail 10:46). Nobody was told she was waiting. With this notice Deiby would have had a text at 10:54.
Proof path
| Rung | Result, Oct 30 evening |
|---|---|
| Step 1, real call | Passed. Fede joined a fresh Zoom room pointed at the Willows test company and talked for 40 seconds. Zoom's end-of-meeting event reached production in 2 seconds and matched the booked 4:00 PM virtual tour by link and slot. The recording and transcript events followed and the raw transcript was stored on the tour (1,041 characters, 11 cues). |
| Step 2, replay of that call | Passed after one fix. First run wrote nothing: the prospect on file was not the name Fede joined under, and the model took that as "no tour happened". A real prospect often joins as a device name or on a partner's account, so the rule now reserves "nothing" for calls where nobody mentions the home, moving in, renting or the application. Second run: recap written, guest card note sent to the PMS (card 362 at the Willows, confirmed by the robot), thread entry on the prospect's conversation (production screenshot taken). |
| Step 1, second real call (hands-off) | Passed for receiving, no note by design. Fede called the test room again after the note step was live. All three Zoom events arrived within two minutes and the transcript was stored. The matcher refused to pick a tour because two test tours overlapped the slot (our test setup), and the call itself was "testing 1, 2, 3", so no note was due either way. The refusal is the designed behavior: one tour in the slot or nothing. |
| Step 2, automatic | Passed (Oct 31, 10:07 AM MT). Nobody touched anything. A scripted phone caller dialed into the Willows test Zoom room and talked for three minutes about the home (move-in, household and a dog, parking, price, repairs, laundry, promises). Zoom's three events arrived, the transcript was stored on the one booked tour, and 14 seconds after the transcript event Clara's recap was on the tour record, in the prospect's conversation and queued to the guest card. Three earlier scripted calls that morning were correctly skipped: two spoke for under two minutes (the recap floor), one was a phone-side error. Quality note: the recap kept three topics and dropped the "About the home" and "Said they would" lines the prompt asks for; filed as a follow-up. |
| Next real Western Slope virtual tour | Pending; the note is read by a person on the card. |
The first recap written for the test call used the four fixed labels and a "hot" rating. Fede's review of the card the same night: the plain run of sentences was "sloppy", the rating "too speculative", and the categories must follow the topic. Both fixed and merged that night: a titled card with the labels on the left, and the rules above. Every line is in the transcript; nothing was added.
Fixed the same night: the conversation page labelled the entry "Team to Clara"; it now reads as Clara's card.
Open items
- Zoom event subscription: done by Fede, Oct 30 evening; validated against production.
- Leftover for Fede (one click): delete the test Zoom room "Willows virtual tour test" (89964195279) in the Zoom app. Our server app lacks the meeting-delete scope; the room is harmless, nothing points at it anymore.
- Later: an eval for the recap rules (issue #23948); rotate the Zoom client secret, since it passed through chat during setup.
Answered Oct 30: the hosting Zoom account is PropFlow's (same account as Smith's standup pipeline, different app type). Smith's receiver never saw the meeting because his app is bound to one Zoom user. Zoom bills recording by storage, not minutes; one meeting at a time per license.
Today's tour
One virtual tour today across all customers: Sam Kavajecz, Pomona Park Townhomes unit 301, Western Slope, 10:00 AM Mountain, Kat hosting on the company Zoom link (PropFlow's Zoom). Booked by email at 8:50 AM.
| Step | Happened | Notes captured |
|---|---|---|
| Confirmation, Zoom link, reminder to Sam | yes text and email, 8:50 and 9:00 AM | n/a |
| Booking text to Kat with the link | yes 8:50 AM | n/a |
| The Zoom call | yes recording ran 1 h 23 min: 23 min of tour, then an hour of office sound | full transcript in Zoom |
| Clara asks Kat "How was the tour?" | yes 11:00 AM; Kat answered 11:20 AM | on the card "They liked it…" |
| Zoom summary | landed in Fede's inbox (account owner), pulled by hand | recap queued 12:38 PM |
| "How was your tour?" text to Sam | set for 12:30 PM (slot end + 2 h), before the recap landed | not checked for this page |
Rules this follows
- Fix or new: steps 1 and 2 improve live behavior and ship with no switch. Step 3 ships like steps 1 and 2: a fix to live behavior, no switch, live everywhere on merge (Fede, Oct 31).
- Raw transcript is the source (Fede, Oct 27).
- Cut by proof: the four steps above, then the three promise pieces.
- No manual step: no "approve this note" or "confirm this promise" card.
- No PMS in the engine: the card write goes through the PMS adapter.
Sources
- Production records read today: the tour, Sam's conversation and AppFolio guest card #3060 (Kat's 11:20 note; recap queued 12:38 PM through the staff-desk note door, outcome "turn"), Kat's staff thread, Western Slope's company settings (Zoom link).
- Our standup pipeline: agent-smith zoomhook on Smith's Mac mini, user-level OAuth, event
meeting.summary_completed, readGET /meetings/{id}/assets(summary + transcript). Nothing posted to #transcripts for this meeting. Bridge questionzoom-tour-webhook-2026-10-30. - Step 1 storage: new Tour fields or a TourRecording record; signature check = Zoom's CRC challenge + HMAC.
- Digest: no daily team digest found in the product (grep of
src/on main, 2026-10-30). Nearest: the weekly leasing call-list email,src/lib/domain/leasing/stale-lead-digest/; internal daily sync report,src/lib/domain/leasing/rent-roll/sync-digest.ts. - Zoom: storage-based recording pricing (Zoom's cloud storage page); concurrency figures from Zoom staff on the Zoom community forum, unconfirmed; meeting events.
- Tours need a phone: the Oct 19 virtual-tour fixes.



