Acquisitions Intelligence
Data Sources & Lineage

Every source behind the map and the reports — what it is, where it lands, how it flows to a score.

How the data flows

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
Live Legacy / out of focus Probed, not wired Supabase view / transform Output

Sources

SourceWhat it providesLands inRefreshStatus
CoStar (property/owner)Building universe — owners, last sale, for-sale, % leased, year built, stories, type. The backbone of every score.public.costar_propertiesManual re-pullcore
CoStar Lease Activity50–200k SF office/flex leases signed 2010–2020 (the single-story-office seed).prospects.src_ss_office_leases · 532One-time pulllive
CA EDD WARNWeekly layoff/closure filings with street address → impending-vacancy signal (Bay Area).prospects.src_warn (CA) · 1,442Weekly (ingest_ca_warn.py)live
TX WARN (Socrata)Layoff filings, no address → owner-name match only.prospects.src_tx_warn · 2,352Manualout of focus
US Census geocoderFree batch geocoding of addresses → lat/lng for the map.prospects.geocode_cacheOn every buildlive
Propwire distressForeclosure / auction / loan signals — but only 26 rows, Denver/DFW only.src_propwire_distress · v_distress_costarlegacy
HubSpot CRMCompany name / domain / industry / revenue / employees. No address, zip, or lead status synced.public.hubspot_companies · v_companies · 68,181Mirrornot wired
Rent ManagerWareSpace tenants (Current/Future/Past) at 21 facilities; no tenant business address.public.v_rm_tenants · 2,871Mirrornot wired
WareSpace facilitiesFacility locations (Denver + Plano) — context / catchment.prospects.warespace_facilitiescontext

Transforms & scored views (Supabase)

ObjectRole
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_addrMaterialized normalized-address index over CoStar (136,648) — fast address joins for WARN + single-story matching.
v_acq_seller_intentCoStar-derived seller-intent signals (disposition-mode, bought-at-peak, obsolete, low-occupancy, short-hold).
v_acq_warnWARN sites address-joined to CoStar buildings → warn_layoff signal.
v_acq_targets → mv_acq_targetsScored acquisition targets for the 4 metros (seller-intent + asset + owner + WARN). Materialized for the map.
v_acq_mapWhat the map reads — targets joined to geocoded coords.
v_ss_office_targets / _discovered / _for_sale / _costar_gapsSingle-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_cronNightly refresh of both materialized views; also called by the deploy workflow.

Signals → score

Each building's acquisition_score is the sum of the signals it fires (seller-intent capped at +40, mid weight). Source shown per signal.

SignalFamilyFromWeight
warn_layoffExternal distressCA EDD WARN → v_acq_warn+25
disposition_modeSeller-intentCoStar — owner sold another building ≤24mo+25
bought_at_peakSeller-intentCoStar — last sale 2021–22 (refi gap)+15
obsolete_officeSeller-intentCoStar — office/flex built pre-1990+12
low_occupancySeller-intentCoStar — ≤60% leased+10
for_saleAssetCoStar — listed for sale+12
absentee_ownerOwnerCoStar — owner mailing out of state+12
owner_occupierOwnerowner_acq_strategy() — operating company+14
long_tenure / deep_tenureOwnerCoStar — held 10–20yr / 20yr++14 / +20
portfolio_ownerOwnerCoStar — private owner, 3+ buildings+8
short_holdSuppressorCoStar — bought ≤24mo (won't sell)−20
WareSpace · Acquisitions Intelligence · Confidential Data lineage — live diagram next to the tool