Skip to content
cd ../
April 22, 20263 min readArchitecture

Why Real Estate Tech Needs Better Data Pipelines

DataAWSReal EstateETLPipeline

Real estate is the last industry where critical business decisions rely on PDF attachments in email threads. MLS data lives in proprietary silos, property records are scanned documents, and market comparables are manually compiled in spreadsheets.

This isn't sustainable at scale.

The Fragmentation Problem

A single deal workflow touches data from:

  • MLS feeds (30+ regional providers, each with a different schema)
  • County assessor records (PDFs, scanned images, inconsistent formats)
  • Public records (tax liens, permits, zoning changes)
  • Market data (Redfin, Zillow, CoStar — all behind different APIs and rate limits)
  • Internal CRM (notes, contacts, deal stages)

Each source has its own update cadence, error rate, and access model. The naive approach is nightly batch ETL that dumps everything into a single table. The problem? Data from Tuesday's MLS export is stale by Thursday when you're analyzing a hot market.

Event-Driven Architecture for Real Estate

Instead of batch processing, the right approach is event-driven:

MLS Update → SQS → Lambda Enrich → DynamoDB → API Gateway → Client

Each property change is an event. County record updates trigger re-valuation. New listings trigger comparable analysis. Price changes trigger notification to watching buyers.

The key enabler is CDC (Change Data Capture): instead of polling sources on a schedule, capture what changed and process only the delta.

Schema Design for Fragmented Data

The fatal mistake is designing a single normalized schema that tries to accommodate every MLS provider. Instead:

-- Core entity with stable fields
CREATE TABLE properties (
    id UUID PRIMARY KEY,
    address TEXT NOT NULL,
    parcel_id TEXT,
    created_at TIMESTAMPTZ DEFAULT now()
);

-- Source-specific data as JSONB
CREATE TABLE property_attributes (
    property_id UUID REFERENCES properties(id),
    source TEXT NOT NULL,  -- 'mls_northstar', 'county_records', etc.
    attributes JSONB NOT NULL,
    fetched_at TIMESTAMPTZ DEFAULT now(),
    PRIMARY KEY (property_id, source)
);

This gives you a stable core schema while letting each source express its own data shape. Queries for the common fields (address, parcel ID) hit the normalized table. Source-specific analysis uses JSONB path queries.

Keeping Data Fresh

The biggest operational challenge is staleness detection. A property listing that was active yesterday might be pending today. You need:

  1. Last-seen timestamps on every record
  2. Staleness thresholds per source type (MLS: 24h, County: 7d, Market: 12h)
  3. Alerting when a source hasn't updated past its threshold
  4. Graceful degradation — serve stale data with a warning rather than empty results

The ROI

Investing in this pipeline architecture pays off in three ways:

  • Faster deal cycles — automated comparables, instant market analysis
  • Fewer errors — no manual data re-entry, no spreadsheet typos
  • Better decisions — real-time data instead of last-week's snapshot

Real estate tech that treats data as a first-class engineering problem, not an afterthought, wins the market.