Pre-rendering for Real estate
Pre-rendering for real estate - listing freshness, sold-status control, and crawl discipline
Pre-rendering for real estate portals: active listings, city and neighbourhood pages, sold-status handling, map-search boundaries, and purge policy that keeps crawler-facing HTML aligned with real inventory.
Updated
Before vs after - typical real estate outcomes
Representative ranges from listing-heavy portals that moved only their high-value templates and added event-driven sold-status handling.
Metric | Before pre-rendering | After pre-rendering |
|---|---|---|
| Active listing indexing | 50-65% | 88-95% |
| Sold or withdrawn listing cleanup | 2-7 days stale | Minutes to next crawl |
| City and neighbourhood first HTML quality | Thin shell or partial grid | Inventory visible in first HTML |
| Browse URL sprawl | Viewport and filter duplication | Stable canonical city and neighbourhood set |
What loses visibility first on real-estate sites
The first template to break is usually the individual listing page because it combines the highest intent with the shortest freshness half-life. A property can move from active to pending, sold, or withdrawn in hours, and crawler-facing HTML that lags behind that state change starts sending the wrong quality signal immediately.
The second failure point is the browse layer. City and neighbourhood pages may look complete to users because the map and grid hydrate in the browser, but crawlers often see a thin shell with incomplete inventory. That is why real-estate SEO problems are rarely just about one page type. They are usually a coordination problem between listing freshness and browse-page visibility.
What to pre-render first, and what to leave out
Start with active listing pages, top city pages, and the neighbourhood pages that already have search demand or strong internal links. Those templates carry most of the SEO value and create the clearest path from discovery queries into individual properties.
Do not push map viewports, draw-on-map states, saved searches, user dashboards, lead forms, or agent-only views into the render pool. Real-estate portals get stronger when render scope is narrower and policy-driven. If every searchable state becomes renderable, crawl budget gets burned on noise instead of on inventory that can actually rank.
Freshness model by template type matters more than one global TTL
Listing pages should have the shortest freshness window because price changes, status updates, and inventory removal all affect what users and crawlers expect to see. In practice, active listings often need a 1-4 hour TTL plus immediate purge on sold, withdrawn, pending, or major price-change events.
City and neighbourhood pages can usually tolerate longer TTLs, but only if the invalidation model understands that one listing-state change can affect multiple browse hubs. A useful baseline is listings at 1-4 hours, neighbourhood pages at 6-12 hours, and city pages at 12-24 hours, with event-driven purge for affected hubs. The exact numbers should line up with pre-render cache headers, not a single default carried across every template.
Sold-status handling is the operating model, not a cleanup detail
Teams often treat sold listings as a simple SEO cleanup problem. In reality, sold-status policy defines whether the entire real-estate rendering layer stays trustworthy. If sold or withdrawn inventory lingers in first HTML for days, the site starts teaching crawlers that its inventory is unreliable.
The best approach is explicit and fast: trigger purge on the status-change event, then choose one of two stable outcomes. Either retain the page with clear sold-state messaging and the right indexing policy, or retire it through a redirect to the nearest relevant city or neighbourhood page. The mistake is letting stale cached HTML decide for you.
Canonical control is where map-heavy portals usually win or lose
Real-estate portals generate endless browse states: map bounds, polygon searches, filters, price ranges, beds, baths, and combinations of all of them. Users need that flexibility. Crawlers do not need every variant indexed.
The stable canonical set should usually be individual listing URLs, core city pages, and selected neighbourhood hubs. Map or viewport variants should stay useful for users but canonicalize back to stable browse pages. This is what preserves crawl budget and keeps the page types that matter from being diluted by near-duplicate state URLs.
What most real-estate teams get wrong
They give listings and browse pages the same cache policy. They try to render every map state. They postpone sold-status logic because it feels operational instead of strategic. And they assume an IDX feed alone solves crawler visibility even when the content still lands too late in the DOM.
The pattern is familiar: the portal indexes slowly, stale inventory lingers, and city pages underperform because the first HTML is weaker than the live experience. If the site is already large, combine this page with large sites (100k+ pages) so the rollout follows template priority rather than raw URL volume.
Status-change webhook - purge listing and affected browse hubs
Real-estate purge logic should follow inventory state. When a listing changes, remove stale snapshots from both the listing URL and the browse pages that expose that listing.
import { purgeOstrio } from "@/lib/ostrio";export async function onListingStatusChange( listingId: string, status: "active" | "pending" | "sold" | "withdrawn" | "inactive" | "price-changed",) { const urls = [ `https://yourdomain.com/listing/${listingId}`, `https://yourdomain.com/listing/${listingId}/gallery`, ]; urls.push(`https://yourdomain.com/neighbourhood/${await neighbourhoodOf(listingId)}`); urls.push(`https://yourdomain.com/city/${await cityOf(listingId)}`); if (status === "sold" || status === "withdrawn") { urls.push(`https://yourdomain.com/search?listing=${listingId}`); } await purgeOstrio({ urls });}Real estate pre-rendering — engineer questions
That depends on the product policy, but the key rule is speed and clarity. As soon as the status changes, purge the stale snapshot. Then either retain the page with explicit sold-state messaging and the right indexing treatment, or redirect it to the nearest relevant browse hub if that is the business standard.
No. Start with canonical neighbourhood pages that have real demand, enough inventory depth, or strong internal prominence. Thin areas and temporary search states usually do not deserve dedicated rendering or indexation.
They often solve data access, not crawler visibility. If the feed still hydrates client-side, crawlers can miss the important details unless the rendered HTML is captured and kept fresh. You also need to confirm that feed rules and vendor terms allow the caching pattern you plan to use.
Usually no. Keep those states for users, but canonicalize crawler-facing variants back to stable city or neighbourhood URLs. Otherwise the render pool gets consumed by endless near-duplicate browse combinations.
Active listing pages, because they combine the highest search intent with the fastest state changes. Browse pages can usually live longer as long as listing events still trigger purge on the affected hubs.
Related industry guides and comparisons
All use cases
Return to the vertical hub and compare adjacent inventory-heavy models.
Use case - bookings
Another vertical where availability state changes drive freshness policy.
Guide - crawl frequency signals
Useful for aligning recrawl expectations with inventory churn.
Guide - cache headers
TTL patterns by template type rather than one global default.
Guide - large sites 100k+ pages
Helps prioritize rollout when listing volume is already large.
Compare - vs SEO4Ajax
Useful buyer-stage comparison for listing-heavy deployments.
Technology - how pre-rendering works
Pipeline context for teams implementing event-driven freshness.
Editorial trust
Written by ostr.io engineering team · Engineering Team. We build and run pre-rendering infrastructure for more than 200 engineering teams, which is where the numbers and code samples on this page come from.
Last updated . Editorial scope and review policy: About prerender.info.
Free tier includes 1,000 pages. Works on any framework.
Get pre-rendering for your site