Places and names

How Clara works out which property a caller means, when people use the property name, the legal entity, the street, a nearby street or a building nickname interchangeably.

Verdict. One standard way to handle every name a place goes by, not a one-off fix per client and not a new entity layer. Each name is a small record with a kind and the place(s) it points to. Clara looks names up through the search tool she already has, which either finds one place, asks a smart follow-up, or hands off. It keeps the team's decision (aliases plus prompts, no new entity class), uses names that fit the code we already have, and builds on the existing listings and nearby-streets work, so a client's unusual setup becomes data to enter, not code to rewrite.

Status (2026-10-01): storing names (#13966), the matcher and its follow-up question (#14044, #14114), the strict mode email uses (#14661) and the whole-word fix (#14608) are live. In review: the name editor (#14193), Clara's search (#14677), guest-card emails (#14676), and the spreadsheet and map-street loaders (#14667, #14685).

How it connects

Property system

Legal entities and owners (the LLC a resident pays rent to).

Map data

The street each address is on, plus nearby and cross streets. Reuses the listings geo work, lifted to the property.

Onboarding and the admin page

The client fills an onboarding spreadsheet that a script loads (run by us). After that, people add, edit and remove a property's also-known-as names themselves on its admin page.

Missed calls

Phrases Clara couldn't match become suggested names. Never used until a person confirms them in that editor.

↓write

PropertyAlias records, per company

Text · kind · target(s) · source · status. Kinds: official, everyday, legal entity, street, nearby street, master tenant, region. A target is a whole property or a set of units in it (one building). One name may point at several places, and that's how "an entity with two properties" works.

↓loaded and cached per company

Caller

"I'm calling about Holdings 22."

→

Clara

Handles the conversation only.

→

search_properties tool

The tool Clara already has. Its insides are replaced; no new tool.

→

resolvePropertyByName

Tested code, and the one function behind today's resolveProperty: normalize, exact, close, then house number + street. Uses caller context first. Properties we don't handle are invisible to it.

↓returns one / several / none, plus what it matched by

One match

Confirm it back ("the one on Willow, right?"), then book the tour or open the work order.

Several matches

pickDistinguishingName chooses what tells them apart: "Is that the one on Pine or the one on Elm?"

No match

Hand off honestly, and record the phrase as a suggested name for review.

The pieces
PieceNameWhat it is
A name for a placePropertyAliasOne record per name, stored in the company's own partition under PROPALIAS#<name>#<id>. Needs no new database index.
Its kindPropertyAliasKindofficial · everyday · legalEntity · street · nearbyStreet · masterTenant · region
What it points toPropertyAliasTargetA property, or a set of units inside one (a building or a master-tenant block).
Where it came fromsourcepms · geo · audit · learned · manual (typed in on the admin page). Status: active · suggested · retired.
The matcherresolvePropertyByNameDeterministic and unit-tested; the one function behind today's resolveProperty. Returns the existing one / several / none result, plus a "matched by" label saying which name did the matching.
The follow-uppickDistinguishingNamePicks the detail that splits the candidates, usually street, building or bedroom count.
Clara's doorsearch_propertiesClara's existing tool, with its insides replaced. The prompt never carries the whole name list, so it scales to thousands of properties.
The name editorproperty admin pageWhere people add, edit and remove a property's also-known-as names themselves, and confirm suggested ones. The onboarding spreadsheet stays for loading many at once.
Properties we don't handlethe In Propflow switchThe per-building on/off switch that already exists on the company's Buildings page (absent means on), not a new field. "If we don't handle it, Clara shouldn't know about it." A building switched off is never matched, never listed, never named, and kept off dashboards.
No switchon for everyoneThere is no on/off setting for names (Gera, 2026-10-01: "there shouldn't be a switch entirely, it should just be on by default"). A company with no names entered still resolves on official name and address through the same matcher.
Messy setups it has to absorb
What people sayHow it's recordedWhat Clara does
The legal entity on the rent checklegalEntity name → two propertiesAsks which of the two.
A master tenant's namemasterTenant name → the units of one building onlyGoes straight to that building.
One of several streets around a blockstreet / nearbyStreet names → one propertyMatches the block, however the city numbered it.
A street parallel to the main onenearbyStreet from map dataMatches instead of failing (the real miss that started this).
A property's everyday nicknameeveryday name from the spreadsheet or the admin pageMatches, even though it's on no sign.
A bank-hold "unit" or a do-not-use portfoliobuilding switched off on the In Propflow switchClara doesn't know it exists: never matched, never listed, never named, never counted in occupancy.
Email uses the same matcher
What we deliberately don't build
How we prove it and roll it out

Also in the same audit: per-property and per-company module switches (a self-run property can feed the dashboard with leasing and maintenance off), and dashboard truth (placeholder units out of occupancy, single-family vs multifamily split). They're tracked as rows in the same board phase.

Source: the onboarding call with the client's operations lead and the Gera + Fede standup, both 2026-09-29. Board: portfolio-architecture-phases, phase "Places and names" (rows pn-place-name-records … pn-region-filter). Names updated 2026-09-29 to fit existing code, per Gera's design decisions that day.

PropFlow Docs