Guide

Tech Stack for a Real Estate Platform: Database, Search, Backend and Frontend Choices

How to choose the database, search engine, cache, backend language, frontend rendering, media storage and hosting for a real estate platform, with sources.

Illustration: stacked layers labelled frontend, backend, search, cache and system of record.

The short answer

Several stacks work for a real estate platform, and the one your team already runs well is a legitimate choice. Three decisions carry most of the weight: where map and filter search runs (in the database or in a separate search engine), how public listing pages are rendered (as HTML on the server), and how many systems your team can operate. Each layer below ends with a “choose this when” table, and the worksheet at the end collects the questions that decide them.

This guide covers the choice of technology only. For budgets see what it costs to build a real estate platform; for how listings get from the MLS into the database see the MLS data pipeline architecture.

Seven stack layers with their options: system of record, search, cache, backend, frontend rendering, media and hosting.
The seven layers this guide covers, with the options compared at each.

What listing data asks of a stack

1. System of record: PostgreSQL with PostGIS, MongoDB or MySQL

For listing dataPostgreSQL with PostGISMongoDBMySQL 8.4
Integrity between recordsForeign keys maintain referential integrity between two related tablesSupports ACID transactions across documents and collections, with a warning that they are not a replacement for effective schema designForeign key constraints help keep related data consistent; InnoDB tables check them
Fields that differ per MLSA jsonb column, which supports indexing; GIN indexes search for keys or key/value pairs inside itNative: documents in a collection are not required to have the same set of fields; schema validation can lock down the fields you depend onA native JSON data type, but JSON columns are not indexed directly; you index a generated column
Geospatial indexGiST, BRIN and SP-GiST; GiST is an R-tree2dsphere indexes for queries on an earth-like sphereSPATIAL INDEX creates an R-tree index on InnoDB and MyISAM tables
Radius and polygon queriesST_DWithin in meters on the geography type, ST_Contains for shapes, and index-assisted nearest-neighbor ordering$geoWithin, $geoIntersects, $near and $nearSphere on GeoJSONSpatial relation functions exist; Django's documentation says they are not as rich as other backends like PostGIS
ChooseWhen
PostgreSQL with PostGISListings sit among relational data (agents, tenants, saved searches, leads, billing), you want spatial joins such as “listings inside this school boundary”, or search will run in the database at first.
MongoDBThe listing document is the center of the product, feeds differ widely in shape, and a separate search engine will handle complex queries anyway.
MySQLThe team and application are already on MySQL and geospatial needs are modest. Check the spatial functions you need first.

One PostGIS detail to settle early: its geography type takes longitude and latitude directly, but fewer functions are defined on it and they take more CPU time; PostGIS suggests it for data that covers a continental region, which a US and Canada platform does. A sound default is a geography point column per listing with a GiST index, which gives radius queries in meters without choosing a projection; reach for geometry only if you need a function that geography lacks. Also check support windows: PostgreSQL supports a major version for 5 years after its initial release.

2. Search: a search engine, the database or a hosted service

Listing search is filters, geography (map bounds, radius, drawn polygon), free text and autocomplete. Each option handles the first two. They differ on the rest and on what you must run.

ChooseWhen
Search in PostgreSQLA few markets, filters plus map bounds and radius, and a small team. Moving search out later does not change the system of record.
Elasticsearch or OpenSearchAutocomplete across addresses and neighborhoods, clustered map pins, relevance tuning, or a system of record that is slow at ad hoc queries. You accept a second copy of the data and a reindex job.
A hosted search serviceYou want those features without running a cluster, its metering fits your record count and query volume, and your MLS agreements allow the data to be held there.

Whichever you choose, the index is a derived copy: it must be rebuildable from the system of record at any time, and a record your license no longer lets you display has to leave it as well as the database. The pipeline guide covers which records may enter the index and how deletions reach it.

3. Cache: what to store in Redis and when to drop it

A cache is optional. Add one when the same expensive answers are requested repeatedly: popular search results, autocomplete responses, map cluster counts, per-tenant configuration. Do not cache anything whose staleness would break a display rule, such as a listing's status.

Redis has the tools the job needs. A key can carry a timeout after which it is deleted automatically. A memory limit with an eviction policy caps the memory used for cache data. And UNLINK removes keys without blocking, reclaiming memory in a different thread.

The design question is invalidation, and for listing data the answer is the sync. Either set the timeout to the sync interval, or have the sync job delete the keys for the markets it just changed. Our real estate SaaS case study describes the first approach: Redis as a read-through cache with a 2-hour TTL matched to a 2-hour sync, and property detail pages read straight from the database so that status, price and photo changes are never served from cache.

ChooseWhen
No cache yetSearch answers fast enough from the index or database, or you cannot yet say what invalidates each key.
Timeout equal to the sync intervalSync runs on a fixed schedule. A cached result can then lag the database by up to one interval, on top of the sync's own lag behind the MLS; both together must fit your license's refresh rule.
Deletion by the sync jobSync is frequent or event-driven and you can key the cache by market or feed.

4. Backend language and framework

All five options below can replicate an MLS feed, serve an API and run background jobs. In our view, language benchmark rankings are a weak basis for this choice: in a listing platform the waiting is mostly in the database, the search index and the feed's rate limits. We would judge on the ecosystem for this work, whom you can hire, and how long each version is supported:

OptionRelevant to this work (from its own documentation)Published support policy
Node.js with TypeScriptSame language as a React or Next.js frontend; Next.js itself deploys to any provider that supports Node.jsLTS releases get critical fixes for a total of 30 months; production should use Active LTS or Maintenance LTS releases
Python with DjangoGeoDjango ships spatial database backends for PostGIS, MySQL, Oracle and SpatiaLitePython: support ends five years after a release. Django 5.2 LTS has extended support until April 2028
PHP with LaravelLaravel Scout keeps search indexes in sync with Eloquent records, with engines including Algolia, Meilisearch, Typesense and database full-text indexesPHP: two years of active support, then two years of critical security fixes. Laravel: bug fixes for 18 months and security fixes for 2 years
.NETEF Core maps spatial data types using the NetTopologySuite libraryLTS releases are supported for three years and STS releases for two; .NET 10 (LTS) until November 14, 2028
GoGo 1 programs are intended to continue to compile and run correctly, unchanged; we read that as low upgrade effort for long-lived sync workersEach major release is supported until there are two newer major releases
ChooseWhen
Node.js with TypeScriptThe frontend is React or Next.js and you want one language and shared types across the stack.
PythonValuation models, natural-language search or heavy data work are part of the product, or the team is a Python team.
PHP with LaravelThe existing application or team is Laravel and the platform is mostly forms, accounts, CRM screens and jobs.
.NETThe company already runs Microsoft infrastructure and employs .NET developers.
GoYou have Go engineers and the workload is ingestion services and APIs more than screens.

Two languages in one platform is common and reasonable: the W3|re case study lists both Node.js and Python in its stack, next to a valuation model and natural-language search. On hiring, look at the candidates and agencies available to you at your budget; a global popularity survey says little about that.

5. Frontend rendering: listing pages must arrive as HTML

Listing, neighborhood and search landing pages exist to be found. Google processes JavaScript pages in three phases: crawling, rendering and indexing, and a page waiting to be rendered may stay on the queue for a few seconds, but it can take longer. Google's own advice is that server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript. It calls serving bots a separate pre-rendered version a workaround and not a long-term solution.

So pages that must rank are rendered on the server or generated ahead of time, and screens behind a login can be client-rendered. Next.js defines a strict single-page app as served by one HTML file, with every route and data fetch handled by JavaScript in the browser. The alternatives for public pages:

ChooseWhen
ISR or server renderingPublic listing detail, city, neighborhood and saved-search landing pages: anything that should appear in search results.
Static generationMarketing pages, guides and a small, slow-changing inventory.
Client-only SPAAgent dashboards, CRM screens, admin tools and investor portals behind a login, where indexing is not wanted.

Next.js is one way to get all three in one codebase; any server-side framework that returns complete HTML meets the requirement. A Next.js major version stays in Maintenance LTS for two years following its initial release, so budget for framework upgrades.

6. Media storage and delivery

Where the feed requires you to hold your own copies of listing photos, as MLS Grid does, the usual design is object storage for the originals, a CDN in front, and resized variants made on upload or on first request. Amazon S3, as one example, is designed to provide 99.999999999% durability, and a CDN such as CloudFront delivers content through a worldwide network of edge locations. If the frontend is Next.js, its image optimization works self-hosted with zero configuration under next start, but images are optimized at runtime, not during the build, so at MLS photo volumes that work competes with page rendering unless you move it to a separate service.

ChooseWhen
Resize on first request, cache at the CDNA large inventory in which most photos are rarely viewed; you resize only what is looked at.
Resize on ingestionA smaller inventory, a fixed set of sizes, and a media worker that already touches each photo.
A separate image servicePhoto traffic is heavy enough to slow the application servers.

7. Hosting

Hosting follows from the layers above and from who will be on call. Next.js can be deployed as a Node.js server, a Docker container, a static export, or adapted to run on different platforms; if you run several instances yourself, note that each Kubernetes pod keeps its own copy of the cache unless you configure a shared one. Managed databases remove backups and patching from your list; Amazon RDS for PostgreSQL, for one, supports the PostGIS extension; confirm the extensions you need before you sign up.

ChooseWhen
A platform plus managed database and searchA small team without operations staff, and no component that needs a long-running process the platform does not offer. Check where sync and media workers would run before you commit.
Containers on a cloud with managed data servicesSeveral services (API, sync and media workers) and someone who owns deployment.
Your own virtual serversCost control matters most and you have the skills to patch, back up and monitor.

Two published stacks, as worked examples

These are what two of our case-study pages state, not a house standard.

  • White-label agent websites for a brokerage. Next.js with ISR, Node.js, MongoDB, Elasticsearch, Redis, AWS (S3 and SES) and Linode / VPS hosting. The page gives the reason for the split: property search queried MongoDB directly and took 3 to 5 seconds under load, so MongoDB stayed the source of truth, Elasticsearch took over search, filters, geo-queries and auto-suggestions, and Redis cached repeated queries.
  • W3|re, a multi-market brokerage platform. Next.js, React Native, Node.js, Python, PostgreSQL, Redis, Apache Kafka, Mapbox GL and AWS EKS, among others, with a pipeline that ingests from four MLS systems and deduplicates cross-listed properties.

One uses a document database and the other a relational one. Both fit what their pages describe.

The stack worksheet

Answer these on one page before anyone proposes a technology.

QuestionYour answerWhat it decides
1. Listing volumeActive listings, plus sold history you will keepWhether database search is enough; hosted-search pricing; static build feasibility
2. MLS feedsHow many, on which platforms, with how many local fieldsHow much per-MLS data needs a flexible column or document; number of sync workers
3. Search featuresFilters, map bounds, radius, drawn polygon, autocomplete, clustered pins, natural languageDatabase search, a search engine, or a hosted service
4. Data around listingsTenants, agents, leads, saved searches, billing, documentsRelational or document system of record
5. Pages that must rankWhich page types, how many, how often they changeISR, server rendering or static; revalidation hooked to sync
6. FreshnessSync interval and the refresh rule in each licenseCache timeouts, page revalidation, index refresh
7. Team skillsLanguages and databases the team runs in production today; who you can hireBackend language, and often the database
8. ComplianceMLS license terms on third-party processors and AI use; privacy law where your users areHosted versus self-run services; hosting region
9. Operations budgetWho is on call, and monthly spend you accept for managed servicesNumber of separate systems; platform versus cloud versus servers
10. MediaPhotos per listing, sizes needed, retention after a listing closesStorage size, resize strategy, CDN

If answers 1 to 3 are small (one or two feeds, filters and a map), one database, one application and server-rendered pages are enough. Add a search engine, a cache and separate workers when an answer calls for them. Feed and license fees are a separate line: the MLS and IDX cost calculator adds up published fees for the boards you pick.

Frequently Asked Questions

Is PostgreSQL or MongoDB the right database for a real estate platform?

Both work. PostgreSQL with PostGIS suits platforms where listings sit among relational data, with radius queries in meters on the geography type. MongoDB suits products built around the listing document and supports $geoWithin and $near queries on GeoJSON. Team experience is a fair tiebreaker.

Do I need Elasticsearch for property search?

Not always. PostgreSQL with PostGIS handles filters, map bounds and radius, and has built-in full text search. A search engine earns its place when you need autocomplete, clustered map pins or relevance tuning; Elasticsearch, for example, provides a completion suggester for search-as-you-type.

Can a real estate site be a client-only single-page app?

The logged-in parts can. Public listing pages should arrive as HTML: Google says server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript.

Capabilities, pricing models and support windows were read from each technology's own documentation on October 12, 2026, and change with new versions. MySQL's support-lifecycle page could not be read that day, so no MySQL support window is given. No benchmark or popularity survey is cited.

Choosing or reviewing a stack for a listing platform? See our SaaS development service. Every project starts with a 30-minute technical discovery call with an engineer.

Technical consultation

Choosing a Stack for a Listing Platform?

Tell us your listing volume, MLS feeds, search features and what your team runs today. An engineer will walk through which layers you need and which you can leave out.

  • A 30-minute technical discovery call with an engineer, not a salesperson.
  • Fixed-scope projects, monthly retainers, or a combination, agreed after the call.
  • Small, well-defined tasks get a scoped estimate. We reply within 1 business day.

Prefer to pick a time? Book a call on Calendly

Tell us about your project

We'll review your details and reach out within 1 business day.

Book Strategy CallCase Studies