The zero-vendor screen stopped advertising an import that refuses every row, and now names the one action that works.
12 Sept 2026 · branch fix/vendor-empty-state-next-action · captured against propflow-stage · at 47062841dc
Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.
The first screen a brand-new organization sees. It used to read “No vendors on file.” / “Import your vendor list to get started.” with a + Import Vendors button under it — and #7930 had just made that import refuse every row for every organization. Four of seven production organizations had no AppFolio-connected property at the time, so this was the majority first-run experience.
What to look at: the title, then one sentence of next action, then one button. The copy names where vendors actually come from (AppFolio), the fact that adding one here creates it there, and the prerequisite an organization with nothing connected is missing. There is no import affordance anywhere in this card.
How the zero-vendor state was produced: the branch's own dev server on the local JSON backend with no vendor rows — a genuinely empty organization, not a filtered or broken-join empty list. The onboarding “Setup guide” card in the corner is not part of this change; its Connect PMS line is a separate, pre-existing acronym in customer-facing copy, noted on the pull request rather than fixed here.
Asserted in the captured DOM — No vendors yet. · Once your AppFolio is connected, add your first vendor here and we'll create it in AppFolio for you. · + Add Vendor. The title, the full next-action sentence and the surviving button are asserted in the captured DOM, not just shown. The absence of the import button is what the picture is for.
The next-action sentence is longer than the one it replaced, so the narrow width is the one that decides whether it reads as copy or as a wall. Same assertions, 430px wide.
Two lines at 430px. The card, the title, the sentence and the single button all hold; nothing scrolls sideways.
Asserted in the captured DOM — No vendors yet. · Once your AppFolio is connected. Re-asserted at phone width so a line-wrap regression cannot pass as a pass.
The honest empty state would say one thing to an organization with AppFolio connected and another to one without. It deliberately does not. The workspace property list every client surface reads carries an id, a name, a ticker and a timezone — no AppFolio linkage — and the organization-level “connected” flag on the settings page is a different fact from “some property carries an AppFolio id”, which is what creating a vendor actually requires. Branching on the signal within reach would state the wrong one to a real property manager. One sentence, true in both states, was the smaller lie-free option.
Read after two critique rounds against brand-and-design.md § Screen rules (wide, then phone): title then next action, one primary action, arsenal components only (Card + ClaraEmptyState + Button), no enum, acronym, internal field name or AI jargon. Review round 1 caught a real defect in the first draft, which read “connect AppFolio in Settings first”: connecting AppFolio is platform-staff-only, and a customer’s administrator who followed that instruction would reach a credentials form for values they do not hold and be refused with the disconnect message. The invitation would have pointed at a second closed door — the very defect this change exists to remove. The prerequisite is now stated, never commanded.