Every source behind the map and the reports — what it is, where it lands, how it flows to a score.
External sources land in raw Supabase tables, get normalized and classified, feed scored views, and surface in the map and reports. Color shows status: green = live, grey = legacy / out-of-focus, amber = probed but not yet wired.
flowchart LR
classDef src fill:#E6F6EF,stroke:#0B8E5F,color:#0C1422;
classDef leg fill:#F0F0F0,stroke:#9AA3AD,color:#555;
classDef probe fill:#FBF3E0,stroke:#B26A00,color:#5b4300;
classDef tbl fill:#ffffff,stroke:#102442,color:#102442;
classDef view fill:#E7ECF5,stroke:#102442,color:#102442;
classDef out fill:#102442,stroke:#102442,color:#ffffff;
subgraph S["1 · External sources"]
direction TB
costar["CoStar
buildings · owners · sales · for-sale · % leased"]:::src
lease["CoStar Lease Activity
50–200k office/flex · 2010–2020"]:::src
cawarn["CA EDD WARN
weekly xlsx · has address"]:::src
txwarn["TX WARN
Socrata · no address"]:::leg
census["US Census
batch geocoder"]:::src
propwire["Propwire distress
Denver / DFW only"]:::leg
hubspot["HubSpot CRM
name/domain/industry only"]:::probe
rm["Rent Manager
tenants · 21 facilities"]:::probe
end
subgraph R["2 · Raw / mirror"]
direction TB
cp["costar_properties"]:::tbl
ssl["src_ss_office_leases"]:::tbl
warn["src_warn"]:::tbl
txw["src_tx_warn"]:::leg
geo["geocode_cache"]:::tbl
pw["src_propwire_distress"]:::leg
hsc["hubspot_companies"]:::probe
rmt["v_rm_tenants"]:::probe
end
subgraph T["3 · Normalize & classify"]
direction TB
fn["norm_office_addr()
owner_acq_strategy()"]:::view
mvc["mv_costar_addr"]:::view
end
subgraph V["4 · Scored views"]
direction TB
si["v_acq_seller_intent"]:::view
vt["v_acq_targets
→ mv_acq_targets"]:::view
vw["v_acq_warn"]:::view
sst["v_ss_office_targets"]:::view
ssd["v_ss_office_discovered"]:::view
ssf["v_ss_office_for_sale"]:::view
end
subgraph O["5 · Outputs"]
direction TB
map["Acquisitions Map
v_acq_map"]:::out
ssrep["Single-Story Office report"]:::out
li["Long Island report"]:::out
gaps["CoStar gap list"]:::out
end
costar --> cp
lease --> ssl
cawarn --> warn
txwarn --> txw
census --> geo
propwire --> pw
hubspot --> hsc
rm --> rmt
cp --> fn
fn --> mvc
cp --> si
cp --> vt
geo --> vt
si --> vt
warn --> vw
mvc --> vw
vw --> vt
ssl --> sst
mvc --> sst
cp --> ssd
mvc --> ssd
cp --> ssf
mvc --> ssf
vt --> map
vt --> li
sst --> ssrep
ssd --> ssrep
ssf --> ssrep
sst --> gaps
| Source | What it provides | Lands in | Refresh | Status |
|---|---|---|---|---|
| CoStar (property/owner) | Building universe — owners, last sale, for-sale, % leased, year built, stories, type. The backbone of every score. | public.costar_properties | Manual re-pull | core |
| CoStar Lease Activity | 50–200k SF office/flex leases signed 2010–2020 (the single-story-office seed). | prospects.src_ss_office_leases · 532 | One-time pull | live |
| CA EDD WARN | Weekly layoff/closure filings with street address → impending-vacancy signal (Bay Area). | prospects.src_warn (CA) · 1,442 | Weekly (ingest_ca_warn.py) | live |
| TX WARN (Socrata) | Layoff filings, no address → owner-name match only. | prospects.src_tx_warn · 2,352 | Manual | out of focus |
| US Census geocoder | Free batch geocoding of addresses → lat/lng for the map. | prospects.geocode_cache | On every build | live |
| Propwire distress | Foreclosure / auction / loan signals — but only 26 rows, Denver/DFW only. | src_propwire_distress · v_distress_costar | — | legacy |
| HubSpot CRM | Company name / domain / industry / revenue / employees. No address, zip, or lead status synced. | public.hubspot_companies · v_companies · 68,181 | Mirror | not wired |
| Rent Manager | WareSpace tenants (Current/Future/Past) at 21 facilities; no tenant business address. | public.v_rm_tenants · 2,871 | Mirror | not wired |
| WareSpace facilities | Facility locations (Denver + Plano) — context / catchment. | prospects.warespace_facilities | — | context |
| Object | Role |
|---|---|
norm_office_addr() | Address normalizer — strips building-name prefixes, collapses to number + street core. Powers every address match. |
owner_acq_strategy() | Owner classifier → net_lease / suburban_office / institutional / operating_company / individual. |
mv_costar_addr | Materialized normalized-address index over CoStar (136,648) — fast address joins for WARN + single-story matching. |
v_acq_seller_intent | CoStar-derived seller-intent signals (disposition-mode, bought-at-peak, obsolete, low-occupancy, short-hold). |
v_acq_warn | WARN sites address-joined to CoStar buildings → warn_layoff signal. |
v_acq_targets → mv_acq_targets | Scored acquisition targets for the 4 metros (seller-intent + asset + owner + WARN). Materialized for the map. |
v_acq_map | What the map reads — targets joined to geocoded coords. |
v_ss_office_targets / _discovered / _for_sale / _costar_gaps | Single-story-office: seed×CoStar matches, CoStar-native net-new discovery, on-market slice, and the CoStar re-pull gap list. |
refresh_mv_costar_addr() + pg_cron | Nightly refresh of both materialized views; also called by the deploy workflow. |
Each building's acquisition_score is the sum of the signals it fires (seller-intent capped at +40, mid weight). Source shown per signal.
| Signal | Family | From | Weight |
|---|---|---|---|
| warn_layoff | External distress | CA EDD WARN → v_acq_warn | +25 |
| disposition_mode | Seller-intent | CoStar — owner sold another building ≤24mo | +25 |
| bought_at_peak | Seller-intent | CoStar — last sale 2021–22 (refi gap) | +15 |
| obsolete_office | Seller-intent | CoStar — office/flex built pre-1990 | +12 |
| low_occupancy | Seller-intent | CoStar — ≤60% leased | +10 |
| for_sale | Asset | CoStar — listed for sale | +12 |
| absentee_owner | Owner | CoStar — owner mailing out of state | +12 |
| owner_occupier | Owner | owner_acq_strategy() — operating company | +14 |
| long_tenure / deep_tenure | Owner | CoStar — held 10–20yr / 20yr+ | +14 / +20 |
| portfolio_owner | Owner | CoStar — private owner, 3+ buildings | +8 |
| short_hold | Suppressor | CoStar — bought ≤24mo (won't sell) | −20 |