A property portal built around how buyers browse
A property listing and search portal that helps buyers and renters find the right home fast, with a listing manager built for agents behind the scenes.
The brief, in specifics
Residential Brokerage
14 weeks
Fixed price, phased
Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.
What we were brought in to do
Search rarely surfaced relevant homes and listing pages crawled under heavy photo galleries. We rebuilt the portal around how buyers actually browse and compare.
A regional agency network with four thousand active listings and a portal built in 2016 that had been extended for years and never revisited. Traffic was seventy percent mobile against a page that shipped forty full-resolution photographs. The trigger was the network's largest office threatening to list on a competitor portal, on the grounds that their own site was losing them inquiries.
Design & Build
Where the old way broke
Filters returned noisy results, listing pages loaded slowly on mobile devices, and agents had no simple self-serve way to manage their own listings without calling support.
Filters ran on a keyword index, so searching a neighborhood by name returned every listing whose description mentioned it, including ones two districts away. Listing pages sent every gallery image at full size on first paint, which on a mobile connection meant six seconds before anything was readable, and the analytics showed most visitors leaving inside four.
We rebuilt search with practical spatial filtering, optimized listing pages for fast image streaming, and shipped a dedicated agent dashboard for managing listings end to end.
Instant Mapbox Search Engine
Sub-100ms spatial and keyword filtering across thousands of active property listings.
Listings are indexed in Elasticsearch with geo_shape fields, so a hand-drawn polygon on the map is a first-class query rather than a bounding-box approximation of one. Map viewport and filter state resolve as a single debounced query that cancels on the next pan, so fast movement doesn't queue work. Results and pins come from the same response, which is why the list and the map can't disagree.
- geo_shape indexing: freehand map areas query directly
- Viewport and filters as one cancellable query
- List and pins from a single response
The same drawn-area search on a phone: the map updating as it pans, numbered pins, and a results sheet holding the same six homes the map shows.
The agent editing their own listing: photos mid-reorder after a forty-photo upload straight to storage, a price reduction with the note that will go public, a weekend of open-house slots, the required-field check for a single-family home, a condo draft it refuses, and the status history with who and when.
Agent Listing Studio
Self-serve dashboard where agents manage photos, tours, and status end to end.
Agents upload straight to S3 through pre-signed URLs, so a forty-photo shoot never passes through the application server. Photos reorder by drag, tours embed by URL, and every status change is audited with who and when. Drafts autosave, and a listing can't publish until the required fields for its property type are complete. The old system happily pushed half-filled records live.
- Direct-to-S3 uploads via pre-signed URLs
- Status changes audited with author and timestamp
- Type-aware completeness gate before publishing
Lazy-Streamed Media Pipeline
The listing's photos after upload: each already sized into AVIF and WebP at five widths, the original kept for the agent only, and what a buyer's phone asks for first, next, and only as they scroll.
Optimized image loading pipeline delivering sub-second first paint even on high-res gallery listings.
Every upload is derived into AVIF and WebP at five widths on ingest, so the first visitor never pays for the transcode. The gallery ships a blurred placeholder inline in the HTML and swaps the full frame in on decode; anything below the fold isn't requested until it approaches the viewport. Full-resolution originals stay available to the agent and never reach the page.
- AVIF and WebP derivatives on ingest, five widths
- Inline placeholders swapped for full frames on decode
- Originals kept for agents, never served to visitors
What we built together
- 01
Rebuilt search relevance around the filters buyers use most
Search moved to a geo-aware index. A hand-drawn area on the map is now a real query; before, it was a keyword match on whatever the description happened to say.
- 02
Streamed and lazy-loaded listing media for fast first paint
The budget came from measuring what a listing page actually shipped on a mobile connection: forty full-size photographs before a single line of text.
- 03
Designed an agent dashboard for self-serve listing management
Agents upload straight to storage through pre-signed URLs, and a listing cannot publish until the fields its property type requires are complete.
- 04
A/B tested saved-search prompts to lift return visits
The saved-search prompt ran for six weeks against a metric declared up front. The old portal's features had been judged on whether anyone objected.
Operational results after launch
−60%
Listing page load
+2.4x
Saved searches
−50%
Agent listing time
Page load is the change in field Largest Contentful Paint on listing pages, measured from real mobile sessions before and after. Saved searches compares the eight weeks after launch to the eight before. Agent listing time comes from the studio's own timestamps, first draft save to publish, and not from what agents reported.
Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.
Phase by phase
Phase 1: Search & Media Audit
Buyer Search Behavior Analysis
Audited search queries and page load bottlenecks across 50,000 monthly buyer sessions to isolate filter friction.
- Search Friction Report
- Media Loading Benchmark
- PropTech UX Audit
Phase 2: Spatial & Search Architecture
Elasticsearch & Mapbox Rebuild
Rebuilt property search indexing using Elasticsearch combined with custom Mapbox GL cluster rendering for sub-100ms map interactions.
- Elasticsearch Schema
- Mapbox Cluster Component
- Fast Filter Engine
Phase 3: Agent Tooling Design
Self-Serve Listing Studio
Designed a dashboard where agents drag and drop photos, update pricing, and schedule open houses on their own.
- Agent Studio UI
- Listing Upload Pipeline
- Role Permission Matrix
Phase 4: Media Optimization & Launch
Progressive Image Delivery & Release
Implemented progressive WebP image streaming and edge CDN delivery, cutting listing page load time by 60%.
- AWS S3 + CDN Media Pipeline
- A/B Testing Framework
- Production Release
Four saved homes compared across ten criteria, with the two viewings already booked marked in the last row and the saved search they came from.
About our collaboration
A cross-functional team of 5 worked on a fixed price, phased basis over 14 weeks, covering UX research, Search rebuild, Agent tooling. We ran a weekly demo and kept a shared board open to check at any time. An in-house team took over day-to-day operation before the engagement ended, with handover built into the last phase.
Agents from three offices reviewed each increment, and the listing studio was built with two of them sitting with the team rather than from a requirements document. The A/B test on saved-search prompts ran for six weeks with a pre-declared metric, because the previous portal's features had been judged on whether anyone complained.
What we'd carry into the next one
Sub-second listing media streaming cut listing page load time by 60%, and property page bounce fell with it.
Bounce fell because the first paint was readable, not because the gallery was faster: text now arrived before the photographs did.
Self-serve agent listing tools cut agent listing time by 50%, and listing administration tickets largely disappeared.
The listing tickets disappeared because the completeness gate refuses a half-filled record. Most of those tickets had been agents asking why a listing looked wrong.
Behavioral saved-search prompts increased return buyer visits by 2.4x.
Prompting on behavior instead of on arrival made the whole difference: the same prompt shown on landing had tested flat the previous year.
One neighborhood, two searches
A place name matches text. A drawn area matches places.
The same search for Larkfield with the same three filters, run against the old keyword index and against the rebuilt geo_shape index. Switch tabs, or use the arrow keys once one is focused.
The old index matched text. Any description that named Larkfield came back, wherever the house stood, and Larkfield homes whose descriptions never used the name didn't come back at all.
8 results for “Larkfield”
4 outside Larkfield· 2 Larkfield homes missed
3+ beds · Up to $650K · Private yard
- 1208 Tanner StLarkfield…on the quiet end of Tanner St in Larkfield… · $612.5K
- 288 Weir RdHarrow Park · 1 district away…priced below comparable homes in Larkfield… · $605K
- 314 Wren Hollow LnLarkfield…a short walk to Larkfield Common and the library… · $589K
- 417 Crestview Hill RdFenwick Hill · 2 districts away…sunset views back across the river to Larkfield… · $549K
- 59 Millrace CtLarkfield…cul-de-sac in the heart of Larkfield… · $639K
- 63 Kiln YardHarrow Park · 1 district away…ten minutes from the Larkfield farmers market… · $579K
- 756 Ashgrove TerraceLarkfield…original 1950s Larkfield brick, restored… · $624.9K
- 8402 Quarry LnFenwick Hill · 2 districts away…built by the same firm as Larkfield's Millrace homes… · $632K
From an agent’s upload to a buyer’s first paint
Photos and search share one path. Everything expensive happens once, on the way in, so the page a buyer opens and the map they pan only ever read work that is already done.
- 01 · SourceAgent uploadPhotos go straight to S3 through pre-signed URLs, so a forty-photo shoot never passes through the app server.
- 02 · IngestionDerivation queueWork is queued when a photo lands, not when a page asks for it, so no visitor pays for a transcode.
- 03 · EngineDerive and indexAVIF and WebP at five widths per photo; each listing indexed with a geo_shape so a drawn area is a real query.
- 04 · StateS3 + ElasticsearchFull-resolution originals stay with the agent; only the derived copies are ever served.
- 05 · DeliveryEdge CDN + searchOne debounced, cancellable query per pan returns the list and the pins together, in under 100 ms.
What goes public, and when
Listing integrity & media handling
Completeness gate by property type
Each property type carries its own required fields, and a listing can't publish until every one of them is filled. Drafts autosave while the agent works, so nothing half-filled goes live the way it could on the old system.
Audited status changes
Every change to a listing's status is recorded with the person who made it and when, so any listing's path from draft to live can be read back later.
Originals never public
Agents upload straight to S3 through pre-signed URLs, so the photographs never pass through the application server. Full-resolution originals stay available to the agent; visitors are only ever sent the derived AVIF and WebP copies.
Building a property search portal or self-serve tools for your agents? Scope your build in 3 minutes.
Scope your buildNearby engagements
AI & AutomationAn AI agent that qualifies leads the moment they land
A conversational agent that engages new inquiries instantly, qualifies budget and intent, books viewings, and hands warm leads to agents with full context.
Residential Brokerage · 8 weeks
Web PlatformsA dispatch platform that keeps crews moving
A scheduling and dispatch platform with a technician mobile app, instant quoting, and routing that fits more jobs into every day.
Home & Field Services · 16 weeks
Web PlatformsThe ransomware attack that became a four-hour non-event
A ransomware attack encrypted the primary patient records server. Drilled offsite backups and a written runbook turned what could have been a scramble into a full restore inside the recovery time objective.
Healthcare & Dental Practices · Ongoing retainer
Let's talk
Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.














