1. The map: three actors, two invites, one switch
Like a new hire's first week: HR sets up the desk before they arrive, the manager walks them through day one, and IT turns on the badge last.
Screen by screen, per person
Solid amber = required. Dashed = skippable, lands in Settings afterwards. Green = an ending. Red outline = changed or new in wave 3 (2026-09-18).
PropFlow staff · the customer page, before any invite
The first admin · the wizard (five screens for a leasing company, four for maintenance-only)
demoA teammate · one screen at most
A second admin, or someone already on the team · shipped in wave 3
+tags and dots are the same mailbox@propflowai.co sign-in is staffWhere everyone lands
| Who signs in | Lands on | Since |
|---|---|---|
| First admin, new company | Wizard, screen 1 | wave 1 |
| First admin, part-way | The first unfinished screen | wave 1 |
| First admin, finished | Dashboard + "Before Clara goes live" card | wave 2 (#9320) |
| Second admin, company already set up | Dashboard | wave 3 (#9368) |
| Second admin, nobody has started | Wizard, screen 1 | wave 3 (#9368) |
| Someone already on the team, invited again | Refused: "already on your team" | wave 3 (#9366) |
| Leasing agent, property manager, assistants | Connect your calendar (tours) → dashboard | wave 2 (#9308, #9315) |
| Maintenance | Connect your calendar (work orders) → dashboard | wave 2 |
| View-only | Dashboard | wave 2 |
| Anyone at a building-run company | No personal-calendar ask; the building's calendar is connected from its settings | wave 2, deliberate |
| PropFlow staff | Admin, never the wizard | always |
| Anyone arriving by a deep link while signed out | Login, then the link they came for | wave 3 (#9350, #9356) — a scope selection in the link used to fail with "Invalid callbackURL" |
- Staff decide everything the admin should never be asked.
- The admin's wizard has one required phase and two skippable ones. The admin is never asked for a calendar; teammates are; an admin who also gives tours adds one from Settings.
- Teammates inherit every decision; they see one step at most.
- Finish stamps the company onboarded. It does not make Clara live.
Proves: founders' standup 2026-09-16 (admin first, agents get one step, destructive actions stay with staff) and the live-switch PRs #8889 and #8893 merged the same day.
2. Path A: staff set the customer up before any invite
Like a restaurant setting the table before the guest sits down: the guest should never be asked which fork they need.
- PMS and operating model already live on the company row.
- Module flags exist today; only the admin customer page reads them.
- The PropFlow address must exist before the invite goes out.
- Phones are an engineering step, never a wizard step.
Proves: Fede in the standup: "we would need to create it before we invite them, and set it on the backend"; the company row's operating model and module flags in the data layer.
3. Path B, phase 1: connect the source of truth
Like plugging in the fridge before stocking it: nothing else in the kitchen matters until this is on.
- AppFolio is the only step that never offers "not now".
- A big portfolio must not park the admin on a spinner.
- Review gets one new line: the admin is every building's escalation owner.
- Today an empty contact means an escalation has no recipient at all.
Proves: the escalation chain resolves renewal contact, then property email, and nothing in the wizard sets either; Fede: "AppFolio stays required, that unblocks a lot of things".
4. Path B, phase 2: the inbox Clara works from
Like giving a new assistant the keys to the front-desk mailbox: they open the mail that arrives there and answer on the company's letterhead — unless you'd rather they answer on their own.
Ruled 2026-09-18 (Gera, after walking it): the step is about the Gmail experience — connecting where Clara reads and writes from. One screen, one job, no calendar. A quiet option lets a customer keep Clara reading their inbox while writing from a PropFlow address. Yesterday's "skip the screen when PropFlow owns the address" is superseded: the screen shows for every leasing company; the PropFlow-owned case is one of its states.
All three states shipped on 2026-09-18, and the screen now matches these mocks. It took four PRs and the middle two are the interesting ones: #9367 redesigned the screen but had to remove the Google button, because until that day it connected a calendar; #9373 rewrote the Google company consent to ask for the inbox; #9443 put the button back and shipped the quiet "write from a PropFlow address" line with it; #9377 made every leasing company walk the step. For a few hours in between, where "Continue with Google" is drawn here the screen carried a plain line reading "Google inbox: coming" — a button that lies about what it does is worse than no button. See the whole-flow evidence page for the screens as they stand.
Connect the inbox Clara works from
Clara reads new leads here and replies from this address. Connect your shared leasing inbox — not your personal email.
Hi Sam, Saturday at 11 works. — Clara
Connect the inbox Clara works from
Clara reads new leads in your inbox and replies from a PropFlow address. Connect your shared leasing inbox so she can read it.
Hi Sam, Saturday at 11 works. — Clara
Leasing inbox connected
Clara reads new leads here and replies from this address.
Nothing else on this screen. Continue → Your team.
- Never a picker between "yours / PropFlow / your PMS": staff set the default; the customer sees one connect and one quiet alternative.
- Google must connect the inbox (Gmail read + send). Until 2026-09-18 the Google button here connected a calendar — the screen then said "Calendar connected" under an email heading. That is what Gera hit. Rewired: the company connect route asks Google for
['mailbox'](#9373), Clara writes from that inbox (#9376), and the button is back on this screen (#9443). - No calendar anywhere on the admin's flow. Teammates get theirs at first sign-in; an admin who gives tours adds one in Settings › My calendar.
- The screen is skippable; the go-live card in Settings and the staff checklist both nag until an inbox is connected or staff choose PropFlow-only.
- Building-run companies keep their per-building rows; this screen is the centralized shape.
Proves: Gera 2026-09-18 01:15 CDT ("make it more obvious that it's about the Gmail experience, connecting where Clara reads and writes from… a hidden but available option of use PropFlow outbound: we still read it but we write through PropFlow… we don't need the calendar there"); founders' standup 2026-09-17 (Fede: "you need to give permission to read and write Gmail"; "connect the email you want Clara to reply from, not your personal"); the Google company connect route's kinds: ['calendar'] on main that night — it reads ['mailbox'] for Google now.
Deeper → Chapter 10: lane M, the four slices that build this
5. Path B, phase 3: bring in the team
Like handing out keys: you say who and what door, and the person's name gets engraved when they show up to collect.
- No name field. No Google API returns a stranger's name from an email.
- Sign-in must write the profile name into the spine; today it does not (PR A4 closes that).
- Role descriptions already exist in one catalog; every screen reads them.
- The role word is read in eight places today, not just the sidebar.
- Buildings are the missing axis for per-building companies.
- The company admin is the default admin. A per-building admin is optional — that is a property manager given their buildings, never a required role.
- Each card says whether we will ask that person for a calendar: yes for leasing, managers and maintenance; no for view-only.
Proves: the auth config's "override user info on sign-in" flag; the role catalog and its five offered roles (Fede's decisions 1 and 2, 2026-09-10/11); PR #8884 shipped the email-only form.
6. Path C: each teammate does one thing
Like a guest at a hotel the host already checked into: the key is waiting, and the only question is whether they want a wake-up call.
- Shipped (#9308, #9315): the ask fires by role — leasing agent, property manager, the two assistant labels (tours), maintenance (work orders); never the admin, staff or view-only — regardless of which modules were bought.
- Still centralized companies only: at a building-run company the calendar is the building's, so no teammate is asked for a personal one. Deliberate; revisit if a customer asks.
- Nobody types a name; the identity provider supplies it.
- A second organization admin gets only the personal tail, never the company steps.
- Which agent gets which tour when two are free is not an onboarding question; it is the slot-assignment item Fede holds.
Proves: founders' standup 2026-09-17: "everyone can connect their calendars" (Fede), "maintenance… connected for work orders" (Sean); "a maintenance worker goes straight to the dashboard, view only" was the opening position and was overturned in the same conversation; the first-sign-in calendar screen and PR #8897.
Deeper → Appendix: the five roles
7. Path D: go-live is two switches, one ours, one theirs
Like opening a shop: the owner unlocks the front door, and the phone company connects the line. Until both happen, customers can knock but nobody answers.
- Finish in the wizard never makes Clara live. The switch does.
- Reading starts at connect; sending waits for the flip.
- Team notices are never held, so staff see activity before go-live.
- Staff see the checklist (#8963). The customer's copy (#9320) and the billing row on both (#9333) shipped 2026-09-18; the customer's billing row carries the action itself (Checkout, or update payment).
- Billing lives here, not in the wizard: the funnel would lose them at the paywall.
Proves: PRs #8889 (the switch), #8893 (the gate at every send seam), #8888 (the reader); Fede's rule in the Clara onboarding playbook §16, same day.
Deeper → Appendix: sources
8. Path E: where every skip lands afterwards
Like "you can change this later" on a form: it is only honest if there is a later, and the person can find it.
- A step may be skippable only if this figure gives it a home.
- Switching the sending address also changes which inbox we read.
- Calendar disconnect is safe to expose; mailbox and PMS are not.
- The PMS connection has a home but is never skippable.
Proves: Fede in the standup: "anything that breaks integrations makes me nervous", calendar "is fine, it's not a destructive action"; Gera owns the Settings consolidation that gives these rows their homes.
9. The ledger: what the founders ruled, and when
Like the minutes of a board meeting: not the discussion, only what was decided, by whom, and what it replaced.
Founders' standup, 2026-09-17 (Fede, Gera, Sean) — the wave 2 rulings
| # | Ruling | Replaces | Who | Builds as |
|---|---|---|---|---|
| 1 | The company admin connects the shared leasing inbox and nothing else. No calendar is asked of the admin. If PropFlow owns the address the step is skipped: PMS → Team. | "Who books tours? me / a shared calendar / my team" on the same screen (C2, #8947) | Fede, Gera; Sean asked and accepted "no shared calendar" | G1 #9312 · G2 #9321 · merged |
| 2 | Every invited teammate except view-only is asked for their calendar at first sign-in, worded for tours (leasing, managers) or for work orders (maintenance). The ask is by role, not by which modules were bought. | Every role asked, and only at companies with leasing switched on | Sean ("still collect the maintenance guy's"), Fede ("everyone can connect") | H1 #9308 · H2 #9315 · merged |
| 3 | The inbox screen says "Connect the email you want Clara to reply from — not your personal one." | "Connect your shared leasing email" | Fede (Jay's accident) | G1 #9312 · merged |
| 4 | Billing is a required pre-launch checklist row, never a wizard step. The system feeds the unit count into Stripe. Part 1: the row. Part 2: the Stripe quantity. | No billing anywhere in the flow; a manual Stripe subscription per customer | Gera (checklist), Sean (system feeds Stripe); Fede's "optional last step" was the dissent | I2 #9333 merged · I3 = write-up, needs a Stripe test key |
| 5 | The customer sees their own copy of the pre-launch checklist in Settings: connect your inbox, connect a calendar, set up billing. Skipping in the wizard is fine because this is where it lands. | Checklist visible to staff only (#8963) | Gera | I1 #9320 · merged |
| 6 | Everything off by default; staff opt customers in. No notification or module toggles in the wizard. | Application reminders fired for imported history (fixed by Fede) | Fede | A rule on this page; nothing to build in the wizard |
| 7 | The company admin is the default admin; a per-building admin is optional (a property manager given buildings). Role cards say so, and say whether we will ask for a calendar. | Cards silent on both | Gera, in session | J1 #9304 · merged |
| 8 | Which free agent gets the next tour is slot assignment, held by Fede. Not onboarding. | — | Gera, in session | Follow-up, not this wave |
Gera's walk-through, 2026-09-18 01:15 CDT — the wave 3 rulings
| # | Ruling | Replaces | Builds as |
|---|---|---|---|
| 9 | The inbox step is "connect the inbox Clara reads and writes from" — the Gmail experience, one connect, no calendar — with a quiet option to write from a PropFlow address while still reading theirs. Shown for every leasing company. | Ruling 1's "skip when PropFlow owns the address" (#9321); the calendar-only Google company connect | Lane M: M1 screen · M1b run shape · M2 Google inbox connect · M3 write via Gmail · M4 read via Gmail |
| 10 | A second admin at a company that is already set up lands on the dashboard; an invite to someone already on the team is refused. Gmail +tags are the same mailbox — inviting your own alias is inviting yourself. | Every invited admin hard-routed into the wizard at the company's first unfinished step, with a Back button into screens they never walked | Lane L |
| 11 | Deep links must survive the login bounce, Back from Google must not leave the button stuck, and the passkey page prompts on load. | "Invalid callbackURL" on any dashboard link with a property selection; a bfcache-restored "Redirecting…"; a click before Touch ID | Lane K |
| 12 | The invite email's logo renders. | An <img> Gmail stripped the source from | Lane N |
Earlier rulings, still standing
| Ruling | When | Where it lives |
|---|---|---|
| Staff choose whose address Clara writes from (customer or PropFlow) and its scope (company or per building) on the customer page; the wizard only shows the result. Never a picker in the wizard. | 2026-09-16, confirmed 2026-09-17 ("that should be set up by us, in the back office") | Organization.emailSetup, locked after go-live |
| The operating model is binary: centralized, or on-site per building. Hybrid is an architecture allowance, not a product option. | 2026-09-17 | Organization.operatingModel |
| Staff only may disconnect a mailbox or the PMS; an admin or the person may disconnect a calendar. | 2026-09-16, adopted | D1 #8940, D2 #8951, D4 #8972 |
| "Reply inside AppFolio" is not offered. The recommended model is Clara writing from the customer's own shared leasing inbox; PropFlow's address is the fallback when their IT says no. | 2026-09-17 | Sales rule + the email setup above |
| Do not raise the email-mode question with a prospect; set them up our way and discuss only if they ask. | 2026-09-17 (Sean) | Sales rule; nothing in the product |
- A shared company calendar is no longer offered anywhere in the wizard. On a per-building company the calendar is the building's and is connected from that building's settings, as before.
- The Google company connect route no longer asks for a calendar at all — it asks for the mailbox (#9373) — and the button is back on the step (#9443). The calendar-only company connect is gone from the Google path entirely.
- The admin-who-gives-tours case is handled by Settings › My calendar (#9326 re-opened it for admins; Fede's 2026-09-14 "admins never connect their own" is superseded) and the checklist, on purpose, until it proves to be a hot path.
- Also ruled 2026-09-18 (Gera): billing is never in the wizard — a Settings to-do and a staff checklist row only. Confirmed in build.
Proves: founders' standup recap and transcript, 2026-09-17, in #transcripts; Gera in session the same evening ("you don't have to have a per-building admin… the default admin would just be the org admin", "we're not going to ask for their calendar on the original admin flow").
10. Build order: wave 1 shipped; wave 2 is four lanes, eight small PRs
Like four crews on one house: each takes a room, each finishes it fully, nobody waits on another crew to start, and the plumber is told which day the wall is open.
Wave 2 — from the 2026-09-17 standup, four lanes in parallel
| Lane | PR | What it does | Proof |
|---|---|---|---|
| G · the admin's inbox step | G1 · #9312 · merged | Remove "Who books tours?" from the channels step. The company admin sees the email card and the connect buttons only. Retitle the screen and the heading: "Connect the email you want Clara to reply from — not your personal one." The offer stamp that screen writes stays, so nobody is re-asked later. | Stage capture: centralized company, own-inbox setup |
| G2 · #9321 · merged | Skip the step entirely when PropFlow owns the address (nothing to connect). The wizard reads emailSetup.owner, not only the module flags. PMS → Team, step counter says four. | Stage capture: PropFlow-owned setup; the run is four screens | |
| H · the teammate's calendar | H1 · #9308 · merged | The first-sign-in calendar screen fires by role: leasing agent, property manager, maintenance yes; view-only no. Drop the "only if leasing is switched on" gate so a maintenance-only company still collects calendars. | Unit tests per role × model; stage capture for a maintenance hire |
| H2 · #9315 · merged | The screen's words follow the role: "Clara books tours on your calendar" for leasing and managers, "work orders land on your calendar" for maintenance. | Stage capture, both wordings | |
| I · the pre-launch checklist | I1 · #9320 · merged | The customer's own copy of the checklist in Settings: connect your shared inbox, connect a calendar, set up billing — read from the same checklist source staff see, showing only the rows a customer can act on, each linking to where it is done. | Stage capture as the test admin |
| I2 · #9333 · merged | A billing row on both copies: green when a Stripe customer with an active subscription exists for the company, otherwise "not set up" with a link to checkout. Required: the staff switch warns when it is red. | Unit test on the row; stage capture | |
| I3 · write-up | The unit count feeds Stripe. Sized, not built: the price really is per-unit, but nothing updates a quantity after checkout, nothing links a company to its Stripe customer, and every environment's Stripe key is LIVE — no test key exists. Building it blind would edit real subscriptions. The write-up names the one unblock (a test-mode key + test price) and one question for Sean. | — | |
| J · the role card | J1 · #9304 · merged | Each role card gains one line on the calendar ask ("We'll ask them to connect their calendar" / "No calendar needed") and the admin card says it is the default admin, with a property manager as the optional per-building admin. | Stage capture of all five cards |
- Every branch off
origin/main; up to three open per lane; each part works alone. - G and H both touch the calendar offer stamp; G rebases before merging if H lands first.
- I3 came back as "needs a Stripe test key"; I1 and I2 did not depend on it.
- Two extra PRs landed with the eight: H3 #9326 (Settings › My calendar re-opened for admins — the reviewer found wave 2 would otherwise leave an admin with no way to add a calendar at all) and H4 #9340 (two comments).
- Typecheck stays serialized across lanes.
Wave 3 — from Gera's walk-through, shipped 2026-09-18, four lanes in parallel
| Lane | PR | What it does | Proof |
|---|---|---|---|
| K · login | K1 · #9356 · merged | A deep link with a property selection survives the login bounce (percent-encode the return path before Better Auth sees it; its rule refuses * and ,). #9350 from another lane shipped most of it the same day off a Sentry report; #9356 kept the path-side backstop and pinned the /login wiring. | Repro link → Google consent, not "Invalid callbackURL" |
| K2 · #9358 · merged | Back from Google resets the login page (bfcache restore leaves "Redirecting…" otherwise). | Unit test on the restore event | |
| K3 · #9361 · merged | The passkey page prompts for Touch ID on load; the button stays as the fallback where the browser insists on a click. | Unit tests; browsers verified named in the PR | |
| K3b · #9365 · merged | …and does not auto-prompt on a domain-blocked host, where the prompt could only ever fail; a ceremony the server rejects stays visible in Sentry instead of being swallowed as noise. | Unit tests on both branches | |
| L · invites and second admins | L1 · #9366 · merged | An invite to someone already on the team is refused ("already on your team"); Gmail alias folding is the positive control. | Unit tests |
| L2 · #9368 · merged | An invited admin lands on the dashboard unless nobody has set the company up; the wizard layout agrees. | Stage: accept a second-admin invite at an onboarded company → dashboard | |
| L3 · not opened | No Back into screens this person never walked. This was conditional on a case surviving L2; none did, so no PR was opened. | — | |
| M · the inbox Clara works from | M1 · #9367 · merged | The screen, redesigned: "Connect the inbox Clara works from", the read-and-write sentence, the sample card, no calendar state anywhere. Continue with Microsoft and, where the Google button used to connect a calendar, the plain line "Google inbox: coming". The quiet "write from a PropFlow address" option slipped to M1b-2, which landed the same day. | Stage capture · evidence |
| M1b-1 · #9377 · merged | The step shows for every leasing company; the address owner no longer shapes the run (supersedes #9321's skip). A PropFlow-owned company connects its inbox too, because Clara still reads it. | Run-shape tests · evidence | |
| M1b-2 · #9443 · merged | The quiet "write from a PropFlow address" option and the API behind it, and Continue with Google back on the step — deleting the stand-in line in the same hunk, no flag. | evidence (state 1) · evidence (state 2) | |
| M2 · #9373 · merged | The Google company consent connects the INBOX, not a calendar: gmail.send + gmail.readonly, stored like the Microsoft shared mailbox. | Stage: the test Gmail connects; needs it as a Google test user | |
| M3 · #9376 · merged | Clara writes from the connected Gmail when the customer owns the address. | One stage send | |
| M4 · in progress (lane P) | Clara reads new leads from the connected Gmail (polling, same pipeline as Microsoft). Dark behind the live switch. Did not land with the rest of wave 3; carried on as its own lane. | One real message to the stage inbox | |
| N · the invite email | N1 · #9362 · merged | The logo survives Gmail withholding the image: it degrades to text in a fixed box instead of collapsing. | Rendered HTML in the PR |
| N1b · #9371 · merged | …for every wordmark emitter, not just the letterhead #9362 fixed — including the dark-mode twin. | Rendered HTML in the PR |
- M4 was the largest slice this map has ever carried and did not land the same night, exactly as the lane was told to report rather than half-ship. It is now its own lane (P).
- For M2 to work while Google still lists the app as unverified,
propflow.test@gmail.commust be a test user on the OAuth project — client395050585594. Nothing proves the live inbox until it is. - All thirteen of wave 3's PRs merged on 2026-09-18, the last at 18:08Z. L3 and M4 were never opened as wave-3 PRs: no case survived L2, and M4 became lane P.
- Decisions taken today: disconnect lean adopted; Fairhaven Residential (TEST) is the proof bench.
- The email card is one card whose context follows the staff's setup choice.
- Lanes B and C both touch the channels step; each rebases before merging.
- Typecheck is serialized across lanes: two at once exhaust the machine.
Proves: Gera's answers in session on 2026-09-16 (adopt the lean, Fairhaven, one switching card, lanes A B C now) and his walk-through of 2026-09-18 01:15 CDT; every number above was read back from gh pr view on 2026-09-18, and the full list with merge states is the appendix table.
Deeper → Appendix: the PR table
11. How to test it: eight scenarios
Eight scenarios, each written as a story rather than a feature. Every one of them describes behaviour that is shipped — wave 3 merged on 2026-09-18, so there are no "until lane X lands" caveats left. Click one open and follow it top to bottom; every one stands alone, so there is no jumping between them.
1 · A new customer signs up and books tours themselvesThe everyday case. Five screens, about four minutes.
Ask me first: a reset of the test admin — without it you land on the dashboard, because a finished admin is never sent back into the wizard.
- Go to
propflowai.coin a private window and sign in with Google aspropflow.test@gmail.com.Not a PropFlow address — ours are treated as staff and skip the wizard entirely. - On the AppFolio screen type Database subdomain
demo, Client IDdemoClientId0000000000000000, Client SecretdemoClientSecret0000000000000000, then press Connect.demois a real reserved word: it invents a portfolio without ever calling AppFolio. The two long values just need 16+ characters. - Wait for "Here's what we found", leave every building ticked, press Continue.
- On "Imported properties", read the line about escalations, then press Continue.
- On "Connect the inbox Clara works from": read the sample card, then press Continue with Google and allow it for the same Gmail.The button is back and it connects the INBOX now, not a calendar (#9373, #9443). Google warns the app is unverified — click Advanced, then continue. This only works if
propflow.test@gmail.comis an OAuth test user on client395050585594first; if it is not, the consent refuses and there is nothing wrong with the screen. Microsoft and Skip for now both still work. Under the buttons, the quiet line offers to have Clara write from a PropFlow address while still reading this inbox — worth pressing once to see state 2. - On "Add your team" type
propflow.client@gmail.com, set the role to Leasing agent, press Send invites.A genuinely separate mailbox. Do NOT use a+aliasof the admin — Gmail and the app both treatpropflow.test+agent@as the same person aspropflow.test@, so inviting it now answers "already on your team" (#9366). Keep this invite — scenario 5 uses it. - Read the ending and press Go to your dashboard.
It passes if: five screens the whole way, Back works on each one, the inbox screen never mentions a calendar, the role you picked showed you what that person can and cannot do and whether we will ask them for a calendar, and the ending says PropFlow still has to switch Clara on.
2 · A customer who wants Clara writing from their own inboxThe higher-trust setup. Stop after the email screen.
Ask me first: a reset, and "put the email setup on the customer's own inbox" (it is already set this way today, so you may only need the reset).
- Go to
propflowai.coin a private window and sign in with Google aspropflow.test@gmail.com.Not a PropFlow address — ours are treated as staff and skip the wizard entirely. - On the AppFolio screen type Database subdomain
demo, Client IDdemoClientId0000000000000000, Client SecretdemoClientSecret0000000000000000, then press Connect.demois a real reserved word: it invents a portfolio without ever calling AppFolio. The two long values just need 16+ characters. - Wait for "Here's what we found", leave every building ticked, press Continue.
- On "Imported properties", read the line about escalations, then press Continue.
- Stop on "Connect the inbox Clara works from" and study the card, then click the quiet line under the buttons: "Prefer Clara to write from a PropFlow address?"
It passes if: the sentence says Clara reads leads here and replies from this address, the From line is their own leasing address, two connect buttons sit under the card, and clicking the quiet line flips the From to a PropFlow address, says Clara still reads their inbox, and keeps both connect buttons. Until lane M lands you will see the wave-2 screen instead: an email heading, the card, two buttons, no quiet line.
3 · A company run building by buildingEach property has its own team and its own calendar.
Ask me first: a reset, and "make the test company per-building".
- Go to
propflowai.coin a private window and sign in with Google aspropflow.test@gmail.com.Not a PropFlow address — ours are treated as staff and skip the wizard entirely. - On the AppFolio screen type Database subdomain
demo, Client IDdemoClientId0000000000000000, Client SecretdemoClientSecret0000000000000000, then press Connect.demois a real reserved word: it invents a portfolio without ever calling AppFolio. The two long values just need 16+ characters. - Wait for "Here's what we found", leave every building ticked, press Continue.
- On "Imported properties", read the line about escalations, then press Continue.
- Continue past the inbox screen (or notice it is skipped) to "Add your team" and look closely at a teammate row.
It passes if: nothing anywhere offers a shared company calendar, and every teammate row has a Buildings picker. A normal centralized company must never show that picker.
4 · A customer who bought maintenance but not leasingThe short run. Four screens, no email or tours questions.
Ask me first: a reset, and "turn the leasing modules off for the test company".
- Go to
propflowai.coin a private window and sign in with Google aspropflow.test@gmail.com.Not a PropFlow address — ours are treated as staff and skip the wizard entirely. - On the AppFolio screen type Database subdomain
demo, Client IDdemoClientId0000000000000000, Client SecretdemoClientSecret0000000000000000, then press Connect.demois a real reserved word: it invents a portfolio without ever calling AppFolio. The two long values just need 16+ characters. - Wait for "Here's what we found", leave every building ticked, press Continue.
- On "Imported properties", read the line about escalations, then press Continue.
- You should now be on "Add your team" already.
It passes if: four screens, not five. No email card, and the step counter says four. Then invite propflow.client@gmail.com as Maintenance and keep it for scenario 7.
5 · A leasing agent gets invited and connects their calendarThe teammate's side. Needs the invite from scenario 1.
- Open
propflow.client@gmail.comand find the invite (subject: Test Client Co on PropFlow). - Open its link in a second private window.The link signs you in by itself — no Google account needed for the alias. Use a separate window or it replaces your admin session.
- Read the page naming the company and your role, accept the terms, and continue.
- You land on one screen: connect your calendar. Connect it, or skip it.
It passes if: exactly one screen, it talks about tours, and your name reads properly rather than the front half of the email address. A property manager gets the same screen. A view-only teammate goes straight to the dashboard.
6 · We check a customer before switching Clara onOur side, not the customer's. Touches nothing.
- Sign in with your own PropFlow address.
- Open
propflowai.co/admin/companies/org_8573c23a-d7b9-4e23-ae87-d46dcf759135. - Read the seven checklist rows beside the live switch; the newest is Billing.
- Find the connections card and press Disconnect on something connected — read the warning, then cancel.
It passes if: every checklist row shows a real value or a dash and never a guess, a dead sync says so rather than "nothing synced yet", the Billing row is red for the test company (no Stripe customer) and the switch warns about it, Disconnect only appears for something actually connected, and its warning says what stops and that the record is kept.
7 · A maintenance hire gets invited and is asked for a calendarNeeds the invite from scenario 4.
- Open
propflow.client@gmail.comand find the maintenance invite. - Open its link in a second private window.
- Read the page naming the company and your role, accept the terms, and continue.
- You land on one screen: connect your calendar, worded for work orders. Connect it, or skip it.
- Skip it, then open Settings on the dashboard you land on.
It passes if: the screen appears even though the company bought no leasing, it says work orders rather than tours, and Settings shows the customer's pre-launch checklist with "connect a calendar" still open and a link that takes you to the same connect.
8 · A second admin joins a company that is already set upShipped 2026-09-18. Needs a third mailbox.
- As the test admin, open Settings › Team and invite a mailbox that is not already on the team as Company admin — if
propflow.client@gmail.comis already in from scenario 1 or 4, remove it from Team first, or use another address you can read. - Open that invite in a second private window, accept the terms, continue.
It passes if: you land on the dashboard, never on a wizard screen, and Settings shows the "Before Clara goes live" card with whatever the first admin skipped. Then, still as the first admin, try inviting propflow.test+anything@gmail.com: it must be refused inline with "already on your team" (both shipped 2026-09-18, #9368 and #9366).
Worth trying inside any scenario
- Skip everything. Press Continue without connecting anything, and Finish with no teammates. Nothing should block you, and "Skip" should never sit beside "Finish".
- Leave and come back. Close the tab halfway through and sign in again. You should land on the first thing still outstanding, not back at the start.
- On your phone. Every screen at phone width: nothing clipped, no sideways scrolling.
- Keyboard only. Tab to the back arrow and the connect buttons and use the spacebar. Both should show a visible focus ring.
Before writing anything up, check the known gaps in the appendix — they are things we already know about, not new bugs.
A1 · Appendix — full record
The tables behind the chapters, for whoever builds this next.
The five roles offered, and what the word does today
| Role | Catalog description (the card's first line) | First-sign-in step | Can invite | Sees which buildings |
|---|---|---|---|---|
| Organization admin | Runs the account. Sets up the company and manages the whole team. The default admin. | The full wizard if first; otherwise only the teammates tail. Never asked for a calendar. | Any role | All |
| Property manager | Runs the day-to-day for a property: leasing, maintenance, and tenants. The optional per-building admin. | Connect your calendar (tours) | At or below | Assigned list |
| Leasing agent | Shows units and signs up new tenants. | Connect your calendar (tours) | No | Assigned list |
| Maintenance | Handles repairs and work orders. | Connect your calendar (work orders) | No | Assigned list |
| View only | Can look around but can't make changes. | Dashboard ("Nothing to connect.") | No | Assigned list, read tools only |
The role word is read in eight places: sidebar, page access, every save, invite ladder, building scope, whether Clara treats you as staff, and which tools Clara gives you. The card's "can / can't" lines must describe these, not planned ones. Source: the roles-foundation page, 2026-09-10/11.
Skip → home → who changes it
| Skipped in the wizard | Default while skipped | Home in Settings | Who can change it |
|---|---|---|---|
| Which address Clara writes from | PropFlow's address | Integrations › Leasing email | Staff only once live |
| Which inbox Clara reads leads from | PropFlow's address | Integrations › Leasing email | Staff only once live |
| A calendar (never asked of the admin in the wizard) | Nobody until a teammate connects one | Profile › My calendar · the customer's pre-launch checklist | The person, or an admin |
| Billing (never a wizard step) | Not set up · the switch warns | Settings › Billing · the pre-launch checklist | Admin |
| Escalation owner per building | The admin | Property › Contacts | Admin |
| Vendors and handyman | Empty roster | Maintenance › Vendors | Admin, property manager |
| Teammates | Just the admin | Team | Admin |
| The PMS connection | Cannot be skipped | Integrations › AppFolio | Staff only |
| Clara live or not | Off | Admin › Customer page (staff) | Staff only |
The wizard after wave 2, versus wave 1
| Today | In this map | Change |
|---|---|---|
| 1 AppFolio · 2 Sync · 3 Review | Phase 1, one gate | Review adds the escalation-owner line; Sync lets a long import continue |
| 4 "How Clara reaches people": email card + "who books tours?" | Phase 2, "Connect the email you want Clara to reply from" — card and connect buttons only; skipped when PropFlow owns the address | The tours question is removed; the admin is never asked for a calendar |
| Teammate first sign-in: calendar for every role, only if leasing is on | Calendar for leasing, managers and maintenance, by role; view-only goes to the dashboard | Role-shaped ask; maintenance wording |
| Staff-only checklist, six rows | Seven rows incl. billing; the customer has their own copy in Settings | Two new surfaces |
| 6 Teammates (email, role, one ending) | Phase 3 + role card + buildings for per-building | Card from the catalog; buildings axis added |
| Finish → dashboard | Finish → "we'll confirm and turn Clara on" → dashboard | Copy only; the switch already exists |
Known gaps — check here before reporting a bug
- Clara can now WRITE from a customer's Gmail; READING it is in progress. The Google company consent asks for the inbox (#9373), the button that starts it is on the step (#9443) and Clara sends from it (#9376), all merged 2026-09-18. The polling read — M4 — did not land with wave 3 and is being built as lane P. For production customers it still needs Google's review or the customer's own Google admin to allow us.
- The live-inbox proof is blocked on one Google setting. While the app is unverified,
propflow.test@gmail.commust be listed as an OAuth test user on client395050585594. Until it is, nothing connects a real Gmail on stage and the read path can only be proved by test. - "Reply inside AppFolio" is shown but not selectable. Deliberate. Nothing writes back to AppFolio yet.
- No shared company calendar is offered anywhere. By ruling (2026-09-17). An admin who also gives tours connects their own from Settings; the checklist nags until somebody has.
- On a phone, the staff checklist's last rows sit under two floating buttons. Seen, not fixed.
- Per-building step four still has the old title and no email card. A product gap, not a wording fix.
- The Review screen's escalation line names no Settings page, because no screen reads or writes that contact yet.
- CLOSED 2026-09-18 — the admin's Settings screens are photographed now. The gap was real: the capture tool had no identity that was both a company admin and already onboarded, because a freshly minted
org_adminis sent straight back into the wizard. Seeding one at a company that is already set up is the trick (scripts/seed-evidence-identity.ts --role=org_admin), and both screens are now on their own evidence page — the customer's pre-launch checklist and the My calendar door #9326 reopened. They are a separate page becauseui-evidencesigns in once per run, and the whole-flow page needs the staff session for its four staff frames. - A teammate at a building-run company is never asked for a personal calendar. Deliberate: the calendar is the building's. The role card says so. Revisit if a customer asks.
- A centralized company wired per building with no company channel is gated on the address owner like any centralized company. Narrow; named in code beside the rule.
- Stripe: every environment holds a live key and no test key, so nothing writes subscription quantities. The billing row reads live Stripe (reads only).
Build order: every PR (wave 1 merged 2026-09-17; waves 2 and 3 merged 2026-09-18)
| Lane | PR | What it does | Depends on | Proof |
|---|---|---|---|---|
| A | A1 · #8941 · merged | Teammates: drop the name field; email + role only; name arrives at sign-in | — | Stage capture, published evidence page |
| A | A2 · #8942 · merged | Role card under the select: can / can't lines from the role catalog, today's grants only | — | Stage capture, published evidence page |
| A | A3 · #8953 · merged | Buildings picker per row for per-building companies; invite sends the list | — | Stage capture, published evidence page |
| A | A4 · #8967 · merged | First sign-in writes the identity provider's name into the spine when the display name is still the placeholder | A1 | Regression test + stage capture |
| B | B1 · #8944 · merged | Escalation owner defaults to the admin for every imported property without one; Review says so | — | Company row on Fairhaven, all three chains resolve |
| B | B2 · #8945 + #8974 · merged | Finish copy ("we'll confirm and turn Clara on") and the one email context card on the channels step | — | Stage capture, published evidence page |
| C | C1 · #8943 · merged | Wizard branches on modules bought; maintenance-only companies skip the leasing steps | — | Stage capture, maintenance-only company |
| C | C2 · #8947 · merged | "Who books tours?" intent screen routing to the two existing calendar screens; additive | — | Stage capture, published evidence page |
| C | C3 · #8971 · merged | Retire "Your calendar" as a numbered step; offer stamp preserved | C2 merged | Stage capture, published evidence page |
| D | D1 · #8940 · merged | One policy: staff only for mailbox and PMS disconnects; admin or owner for calendars | — | Unit tests, every role × kind |
| D | D2 · #8951 · merged | All six disconnect routes read the policy; the inverted scope check is gone | D1 | Regression tests that fail on the old code |
| D | D3 · #8963 · merged | Staff go-live checklist beside the live switch, read-only, real data or "—" | — | Stage capture, published evidence page |
| — | #8957 · merged | Unplanned: main stopped compiling when a rename and a new caller landed 11 minutes apart | — | CI green on main |
| E | E1 · #8993 · merged | The role card redesigned so each role reads in one glance | A2 | Evidence page |
| F | F1 · #9002 · merged | The capture tool can photograph a screen with nobody signed in | — | Used by every page below |
| F | F2 · #9004 · merged | The teammates row lines up with the steps before it | — | Whole-flow page |
| F | F3 · #9005 · merged | The teammate calendar screen's title says connected when it is | — | Whole-flow page |
| F | F4 · #9007 · merged | A dropdown's focus ring takes its colour from the theme | — | Whole-flow page |
| F | F5 · #9009 · merged | The go-live checklist and connections rows wrap instead of overflowing | — | Whole-flow page |
| F | F6 · #9010 · merged | The back arrow and the tour options answer to the keyboard | — | Whole-flow page |
| F | F7 · #9018 · merged | The layout fixture survives the wizard's new shape | — | Whole-flow page |
| D | D4 · #8972 · merged | Staff-only disconnect for a company's mailbox or PMS, named by company, from the customer page; needed because D2 makes those disconnects staff-only and staff carry no company | D2 | Regression tests + stage capture |
| G | G1 · #9312 · merged | Wave 2: "Who books tours?" removed from the admin's step; heading "Connect the email you want Clara to reply from — not your personal one" | — | Stage capture |
| G | G2 · #9321 · merged | Wave 2: the inbox step is skipped when PropFlow owns the address — centralized companies only; a building-run company keeps its per-building screen (the reviewer caught the first cut dropping it) | — | Stage capture, four-screen run |
| H | H1 · #9308 · merged | Wave 2: the teammate calendar ask fires by role (not view-only), regardless of modules bought | — | Unit tests + stage capture |
| H | H2 · #9315 · merged | Wave 2: the calendar screen's words follow the role (tours / work orders) | H1 | Stage capture |
| I | I1 · #9320 · merged | Wave 2: the customer's own pre-launch checklist in Settings | — | Stage capture |
| I | I2 · #9333 · merged | Wave 2: the billing row on both checklists; the switch warns when red | I1 | Unit test + stage capture |
| I | I3 · write-up | Wave 2: unit count feeds the Stripe subscription quantity — sized, blocked on a Stripe test key | I2 | Sizing page |
| H | H3 · #9326 · merged | Settings › My calendar re-opened for an org admin (supersedes 2026-09-14); staff stay excluded | H1 | Evidence page (2026-09-18) |
| H | H4 · #9340 · merged | Two comments catch up with the calendar door | H3 | Comment-only |
| J | J1 · #9304 · merged | Wave 2: role cards say whether we ask for a calendar; admin card says it is the default admin | — | Stage capture, five cards |
| K | K1 · #9356 · merged | Wave 3: a deep link carrying a scope selection survives the login bounce — Better Auth's origin check refuses * and , in a relative callbackURL, so the return path is encoded before it is handed over. #9350 shipped most of this from a Sentry report the same day; #9356 is the path-side backstop and the /login wiring tests | — | Evidence page |
| K | K2 · #9358 · merged | Wave 3: Back from Google no longer leaves the button stuck on "Redirecting…" — the bfcache restore resets the page | — | Evidence page |
| K | K3 · #9361 · merged | Wave 3: the MFA page prompts for the passkey on load instead of waiting for a click; the button stays as the fallback | — | Evidence page |
| K | K3b · #9365 · merged | Wave 3: no auto-prompt on a domain-blocked host, where it could only fail; a server-rejected ceremony stays visible in Sentry rather than being swallowed | K3 | Evidence page |
| L | L1 · #9366 · merged | Wave 3: an invite to an address already on the team is refused inline — "already on your team" — with Gmail dots and +tags folded to the same mailbox | — | Evidence page |
| L | L2 · #9368 · merged | Wave 3: a second admin at a company that has already started lands on the dashboard, never the wizard; the one exception is a company nobody has set up | — | Evidence page |
| N | N1 · #9362 · merged | Wave 3: the invite email's logo degrades to text in a fixed box when Gmail withholds the image, instead of collapsing | — | Evidence page |
| N | N1b · #9371 · merged | Wave 3: the same fixed box for every wordmark emitter in every shell, including the dark-mode twin — #9362 had reached the letterhead only | N1 | Evidence page |
| M | M1 · #9367 · merged | Wave 3: the inbox step redesigned — "Connect the inbox Clara works from", the read-and-write sentence, no calendar anywhere on it, and — for the few hours until #9443 — a plain "Google inbox: coming" line where the button that connected a calendar used to be | — | Evidence page |
| M | M2 · #9373 · merged | Wave 3: the Google company consent connects the INBOX — gmail.send + gmail.readonly — and stores a mailbox hook like the Microsoft shared mailbox | M1 | Evidence page |
| M | M3 · #9376 · merged | Wave 3: Clara writes from the company's connected Gmail when the customer owns the address | M2 | Evidence page |
| M | M1b-1 · #9377 · merged | Wave 3: every leasing company walks the inbox step — the address owner no longer removes it or its buttons (supersedes #9321). A PropFlow-owned company connects its inbox too, for the reading half | M1 | Evidence page |
| M | M1b-2 · #9443 · merged | Wave 3: the quiet "write from a PropFlow address" option and its API, plus "Continue with Google" back on the step — connecting the inbox this time. Merged 18:08Z, the last of the wave; it deleted the stand-in "coming" line rather than leaving a flag behind | M1b-1, M2 | Evidence page · state 2 |
| M | M4 · in progress | Wave 3: Clara reads new leads from the connected Gmail. Did not land with the wave; carried on as lane P | M2 | — |
See it: every change, with pictures
Each page carries the screenshots AND the assertions that ran against them, captured on staging from the branch itself — so it shows what was checked, not just what it looked like.
| What to look at | Page |
|---|---|
| The whole flow, every screen and state — the wizard, the teammate's side and the staff side, re-captured 2026-09-18 after waves 2 and 3. | onboarding-flow-evidence |
| What the admin sees after Finish — their own pre-launch checklist and the My calendar door. First captured 2026-09-18. | onboarding-admin-settings-evidence |
| The role card — what each of the five roles can and cannot do. Start here. | pr-8993-evidence |
| Teammates row: the name field is gone | pr-8941-evidence |
| The role card's first version, before the design pass | pr-8942-evidence |
| Buildings picker, per teammate, per-building companies only | pr-8953-evidence |
| The email preview card in each of its states | pr-8945-evidence |
| "Who books tours?" on the channels step | pr-8947-evidence |
| The standalone calendar step retired; the leasing run is five screens | pr-8971-evidence |
| Staff go-live checklist beside the live switch | pr-8963-evidence |
| Staff-only disconnect, with the warning that says what stops | pr-8972-evidence |
| The whole flow end to end — 53 screens, 171 assertions, desktop and phone, light and dark. Captured before wave 2; the inbox screen and role cards have since changed. | onboarding-flow-evidence |
| Wave 2 (2026-09-18) | |
| The admin's inbox step with no calendar question (G1) | pr-9312-evidence |
| The inbox step skipped for a PropFlow-owned address — the four-screen run (G2) | pr-9321-evidence |
| The customer's "Before Clara goes live" card (I1) | pr-9320-evidence |
| The billing row — customer card, and the staff card with the turn-on warning (I2) | pr-9333-evidence · pr-9333-staff-evidence |
| The five role cards with the calendar line (J1) | pr-9304-evidence |
| Why the unit count cannot feed Stripe yet (I3) | lane-i-part-3-stripe-quantity-sizing |
Companion pages
- The "how Clara reaches people" screen — the interactive spec both builders worked from: flip the chips to see every state the screen can be in.
- Calendar & Onboarding handoff — what the calendar integration is and how a connection works.
Your turn
- Sign in as the test admin (a Gmail, not a PropFlow address — every PropFlow address is treated as staff and skips the wizard). It was reset on 2026-09-17, so it starts on the first screen.
- That company is set to "their own inbox", so you get the inbox screen. Ask for it to be flipped to the PropFlow default and the screen disappears.
- From Add your team, invite a different mailbox (not a
+aliasof the admin) as Leasing agent, Property manager or Maintenance — all three get the connect-your-calendar screen at first sign-in; only view-only does not. No spare mailbox? Ask me for the invite link. - Ask for another reset any time you want to walk it again.
Sources
- Founders' standup, 2026-09-16, Agent Smith recap and transcript in #transcripts.
- Founders' standup, 2026-09-17 (Western Slope go-live, onboarding flow redesign, billing model), Agent Smith recap and transcript in #transcripts — the wave 2 source.
- Gera in session, 2026-09-17/18: per-building admin optional, org admin the default; admins may give tours but are not asked in the wizard; rotation is slot assignment; billing never in the wizard.
- Gera's walk-through, 2026-09-18 01:15 CDT: the inbox step is the Gmail experience (read and write) with a quiet PropFlow-outbound option; no calendar on the admin flow; a second admin never re-enters the wizard; the three login papercuts; the invite logo.
- Calendar & Onboarding — Handoff (2026-09-16): the wizard's six steps, the three calendar rungs, what shipped.
- Clara onboarding playbook §16: the two-switch go-live rule, PRs #8888, #8889, #8893, #8896.
- Roles foundation: the catalog, Fede's decisions 1 and 2, the eight places the role word is read.
- New customer onboarding experience: the earlier design this map revises.
- Code facts cited in chapters: the sign-in profile override, the role catalog's descriptions, the read-only guest-card sync, the per-building inbound address, the escalation owner chain, the calendar disconnect scope check, the company module flags.