A market analyst at a mid-market brokerage spends 60–70% of their week pulling comps, building trend charts, and writing risk memos that, by the time they hit the broker’s desk, are already a week behind the market. The work is necessary. The cadence is broken. The fix is not a faster analyst — it is a Supabase view, an agent, and a renderer.
The Market Intelligence Bottleneck
Every CRE listing needs intelligence: comps, submarket trends, risk profile, recommended ask. Every brokerage produces it the same way — an analyst pulls CoStar, exports to Excel, joins to property tax data, calls a colleague to ask about a rumored lease, opens five tabs, builds a memo. Three days later the broker has a one-page summary that is already stale.
The bottleneck is not the analyst. It is the lack of a single source view. Every input — comp data, submarket trends, tax records, vacancy reports — lives in a different system. The analyst’s job is reduced to a glorified ETL. The Market Analyst Agent collapses that ETL into one Supabase view (market_intelligence_view) and lets the agent read it.
The bottleneck is not the analyst. It is the lack of a single source view. Everything else is an artifact of that one structural failure.
The Market Analyst Agent — Architecture
The agent is one process with three reads and three writes. It reads listings, comps_v, and submarket_trends_v. It writes to listing_intelligence, risk_scores, and pricing_recommendations. Every read is a Supabase materialized view; every write is an idempotent upsert keyed by listing ID. The agent is stateless. The data layer is the state.
Stateless agents are auditable. A broker can ask “why did this listing get a 72 risk score?” and the agent can re-render the brief from the data — same view, same weights, same number. If the data has changed since the original render, the new number explains itself. There is no oracle. There is a view, a formula, and an output.
Because the comp table and the trend table are already in Postgres. Building a separate intelligence database means two write-paths, two backup strategies, and two opportunities for the views to disagree with the source. A materialized view in the same schema is one write-path, one backup, one source of truth.
Comparable Property Analysis
The comp module is the agent’s first read. It queries comps_v for transactions matching the listing’s submarket within a configurable radius and time window, then ranks the results by similarity score — a weighted composite of asset class, square footage band, year-built bracket, and use-type match. The top five are surfaced. Everything else is filed but not rendered.
| Address | Class | SF | PPSF | Cap | Date | Similarity |
|---|---|---|---|---|---|---|
| 2140 Linden Ridge | Office · B | 42,500 | $184 | 6.8% | Mar 26 | 94 |
| 880 Sutter Park | Office · B | 38,200 | $178 | 7.1% | Feb 26 | 91 |
| 4400 Greer Tower | Office · B+ | 45,800 | $192 | 6.4% | Jan 26 | 88 |
| 112 Marlowe Court | Office · B | 36,900 | $171 | 7.4% | Dec 25 | 79 |
| 2900 Halsey Pointe | Office · B- | 41,200 | $162 | 7.8% | Nov 25 | 72 |
Surfacing five rather than thirty is the entire point. A broker reading a comp memo wants signal, not exhaust. The agent’s job is to do the filtering at query time so the broker’s job is recognition, not extraction.
Submarket Trend Bars
Trends are the second read. The agent queries submarket_trends_v for the listing’s submarket and pulls three rolling-window series: vacancy rate (8-quarter), rent growth (8-quarter), and absorption (8-quarter). Each series is rendered as a sparkline-style bar block with a delta call-out so the broker sees the direction in two seconds.
Three deltas — vacancy down 42%, rent up 18%, absorption up 34% — tell the broker the submarket is tightening. The agent does not editorialize. It surfaces the numbers and leaves the read to the human. That is the discipline of a useful intelligence brief: the agent does the join, the broker does the judgment.
Risk and Opportunity Scoring
The risk score is the agent’s headline number. It is a weighted composite of five sub-scores: submarket vacancy trend (25%), rent-growth delta (20%), tenant credit profile (20%), asset age (15%), and capital-needs forecast (20%). Each sub-score is normalized to 0–100. The composite is presented as one number with the five inputs exposed so an analyst can audit which dimension drove it.
The score is a recommendation, not a verdict. The broker still asks “is asset age dragging the headline number because the building is older or because the cap-needs forecast is conservative?” The agent surfaces the answer because both sub-scores are exposed.
Pricing Recommendations
After the comp analysis and the risk score are computed, the agent reads the asset’s target return, the comp PPSF distribution, and the risk-adjusted cap rate, and produces a recommended ask, a recommended floor, and a confidence band. The output is a one-line recommendation with a sentence of context — never a multi-page memo. The broker makes the decision; the agent provides the math.
Recommended ask of $188/SF sits one standard deviation above the comp median, justified by the submarket’s 18% rent-growth tailwind. Recommended floor of $174/SF sits at the comp median, the price below which the deal stops working at the target IRR. The confidence band is narrow because the comp set is deep — five high-similarity transactions in the last 18 months. When the comp set is thin, the band widens automatically.
What used to be a three-day analyst memo is now a 30-second brief, refreshed every time the underlying view updates. The broker no longer chases stale numbers. The analyst no longer wastes a week per listing. The intelligence sits on the listing record, current to the last write of the materialized view, ready for the next conversation.