Two-sided platform

A real-estate marketplace where search outruns the map

Listings, map search, and escrow-grade workflows for a two-sided property market, with verified-agent onboarding and saved searches that alert instantly.

  • TypeTwo-sided marketplace
  • SurfacesBuyer web app + agent portal
  • Core stackTypeScript, Go
  • EngagementFixed price, weekly demos

The brief

A property marketplace has two customers with opposite needs. Buyers want to wander a map and trust what they see; agents want qualified leads and workflows that do not leak deals. The platform had to serve both sides while staying fast enough that browsing feels like exploring, not querying.

Trust was the second brief hiding inside the first. Property transactions carry real money and real fraud incentives, so agent verification and transaction workflows needed the kind of rigor usually reserved for fintech.

What we built

Search is the product, so search got the engineering budget. Listing queries run against OpenSearch with geo-indexes tuned so results come back before the map finishes panning. Saved searches invert the same machinery: new listings are matched against stored queries as they arrive, and alerts go out within moments of a listing going live, which in a hot market is the feature buyers pay attention to.

The agent side runs on a verified-onboarding flow: identity and licensing checks before a listing can go live, and an audit trail on every change afterward. Transaction workflows walk both parties through offer, acceptance, and the escrow-grade document handling in between, with state modeled explicitly in Go services so a deal can never be in two states at once.

PostgreSQL remains the source of truth, with OpenSearch fed by change streams, so the search index can be rebuilt from scratch without a maintenance window. Boring where boring wins.

Why it worked

Two-sided platforms usually fail by favoring one side. Weekly demos alternated focus between buyer flows and agent flows, which kept both constituencies visible in every scoping conversation. And the decision to treat search latency as a product feature, with its own budget and its own tests, is why the map experience still feels effortless as the listing count grows.

  • TypeScript
  • Go
  • PostgreSQL
  • OpenSearch

Building something like this?

Yours won't match this build exactly, which is what the free scope call is for. Quote in writing 48 hours after it.