Mercado

What competing builders advertise, and how their inventory moves, across OR, WA, ID, and MT. Built from public builder listings, fused with Hayden's own data. One input among many.

Why we have it

Hayden already buys MLS and Construction Monitor data, so competitor list prices are not the gap. Mercado fills what those miss. Builder-advertised incentives and rate buydowns, which often are not in MLS. The timing of price changes and how fast inventory sells, which a one-time data pull cannot show. Both are derived by comparing the same listings week over week. It is a supplement, not a replacement for paid data.

How it works

flowchart TB classDef src fill:#e7eef2,stroke:#2e5a6e,color:#1a2530; classDef proc fill:#f6ecd9,stroke:#b5731f,color:#1a2530; classDef store fill:#efe7f2,stroke:#7a5a8e,color:#1a2530; classDef int fill:#eaf2ec,stroke:#1f7a4d,color:#1a2530; classDef app fill:#e7f0ea,stroke:#1f7a4d,color:#1a2530; classDef val fill:#eef5f0,stroke:#1f7a4d,color:#11402a,font-weight:600; subgraph SCRAPE["1 . Weekly scrape (19 enabled: Hayden + 18 competitors)"] direction LR t1["Tier 1: JSON or hidden API (9)"]:::src t2["Tier 2: server HTML + selectors (9)"]:::src t3["Tier 3: stealth fetch (1)"]:::src end norm["2 . Normalize to one Home record
(price, $/sqft, status, incentives, provenance)"]:::proc snap[("3 . Dated append-only snapshots (JSONL, weekly)")]:::store diff["4 . Diff consecutive snapshots
price cuts + absorption compounding weekly"]:::proc int["Internal data (Snowflake)
KOVA closed pricing . COMBINED_PERMITS supply"]:::int fuse["5 . Fuse: competitor listings + KOVA baseline + permit supply"]:::proc dash["6 . Dashboard (HTML + ECharts + Leaflet)
Board . Brief . Deep Dive, by band and submarket"]:::app val["Incentive depth, who is discounting,
gap vs Hayden by band and submarket,
and a pressure score to rank where to look."]:::val t1 --> norm t2 --> norm t3 --> norm norm --> snap --> diff --> fuse int --> fuse fuse --> dash --> val

Scope today: 19 of 21 registered sources enabled (2 held back: out of footprint, and one with no clean access). Weekly snapshots accumulating since Jun 7 — price cuts, absorption, and week-over-week market movement are all live. The pipeline runs automatically via Windows Task Scheduler every Tuesday.

Business value

Compounding time series. A single snapshot shows where prices are today. Weekly snapshots show where they're going — absorption accelerating or stalling, price cuts spreading or stopping, inventory building or clearing. Each Tuesday run is one more data point in that trend, added automatically with no manual work.

Zero ongoing maintenance. The pipeline runs on Windows Task Scheduler every Tuesday: scrape → normalize → diff → dashboard update. If something breaks, a health check flags it and the dashboard shows a banner. Otherwise, you open it and the data is fresh.

Head-to-head, not generic market data. Competitor prices are joined directly to Hayden's KOVA closed-home pricing by submarket and band. No paid feed does this — it requires internal cost data that only Hayden has.

What it does today

Collection

Signals it adds

Why it helps, and why it beats a one-time pull

How it connects to the rest of the stack

Feeds the executive Market Report. Mercado is the competitor-pricing and incentive layer behind the Market Report, which otherwise has no per-competitor price gaps or incentives.
Uses the same internal data as the analytics stack (KOVA closed pricing, permits), which is also why it runs locally: it joins internal margins that do not leave the machine.

How it can expand

Self-contained file. To edit, change the content or flowchart block, keep the CDN script tag, then re-run the inline-mermaid helper. Source: mercado/docs/architecture.html.