RealEstateView — User Cabinet
Redesign & Native Mobile App
Client’s Challenge
RealEstateView is the third-largest property aggregator in Australia — sitting behind REA Group’s realestate.com.au (DR 91) and Fairfax’s Domain.com.au (DR 88). The business had decent organic search share, but a product that was bleeding users: the personal cabinet UI was untouched since 2011, there was zero native mobile app, and 67% of traffic was already arriving on phones that hit a desktop-built responsive shell.
Our Screaming Frog crawl surfaced 847 critical errors — redirect chains, duplicate meta, broken canonicals, orphan pages. The mortgage repayment calculator silently broke in 23% of browsers (Safari iOS 13 + any IE/Edge pre-Chromium). Zero structured data existed across 100% of listings, so Google’s rich property cards surfaced every competitor except RealEstateView. User research confirmed the pain: power users hit the hard 3-saved-search cap in week one and either churned or emailed listings to themselves.
- User cabinet frozen in 2011 — no mobile layout, no comparison tool, no alerts
- No native iOS/Android app — REA + Domain both had 4.5★+ apps with 1M+ installs
- Saved searches capped at 3 with zero alerting — pro buyers churned in week one
- 847 critical SEO errors from audit — redirect chains, duplicate meta, orphan pages
- Mortgage calculator broken in 23% of browsers — Safari iOS 13 + legacy Edge
- Zero structured data on 100% of listings — invisible in Google Property rich cards
- Core Web Vitals fail — LCP 4.8s, CLS 0.31 on listing pages
- 5-month hard window — launch before FY21 spring selling season, one PM one lead dev
How We Solved It
A 6-phase delivery across 22 sprint weeks — UX research and product discovery feeding a parallel React web refactor and React Native mobile build, with a technical-SEO strike team cleaning 847 errors in lockstep with Core Web Vitals work. Launched end of month 5, ahead of the spring selling-season window.
UX Research & Product Discovery
15 longitudinal user interviews, 120 hours of session recordings, and usability testing against REA + Domain to find every friction point in the existing cabinet.
Ran Hotjar + FullStory across 60 days, tagged 18 distinct rage-click patterns, interviewed 15 daily users across 3 buyer archetypes (first-home, investor, upsizer). Deliverable: 34-page insights doc, new IA, high-fi Figma prototype covering cabinet + mobile. Signed off with product before code shipped.
React Native App — iOS & Android
Native-feeling iOS + Android app built on React Native 0.63 with WebSocket push alerts, offline listing cache, and map-based discovery — shipped to both stores in month 4.
Shared TypeScript alert engine between web + mobile (WebSocket subscription, haversine distance matching, push dispatch). Background sync for saved searches via Firebase Cloud Messaging. Map clustering with Supercluster for 50k+ active listings. CI pipeline: Fastlane → TestFlight nightly → Play Internal Testing. 4.6★ aggregate rating in first 6 months.
Technical Debt & Error Cleanup
Strike-team sprint against the 847 critical errors surfaced by Screaming Frog — redirect chains flattened, duplicate meta killed, orphan pages re-linked, mortgage calc rebuilt cross-browser.
Built a Node.js crawl diff tool that replayed the Screaming Frog XML against each staging push, so any regression triggered a CI fail. Mortgage calculator rewritten from legacy jQuery plugin to a 4kB vanilla ES6 module (works in Safari iOS 12+, IE11 polyfilled). Final audit: 847 → 12 intentional residual warnings. 98.6% of critical errors resolved before launch.
Structured Data & Technical SEO
Property, Place, LocalBusiness, BreadcrumbList, and Review schemas rolled across all 420k+ listings — so Google’s property rich cards finally surfaced RealEstateView alongside REA and Domain.
Python script ingested every listing nightly and emitted JSON-LD into the listing template. XML sitemap rebuild: 6 partitioned sitemaps (suburbs, listings, agents, blogs, tools, static) with priority/lastmod discipline. Internal linking engine used listing-to-suburb-guide contextual links to push 2.6M internal anchors into index. Search Console impressions on listing pages +420% in 90 days.
Performance & Core Web Vitals
LCP 4.8s → 1.9s, CLS 0.31 → 0.03, INP well under 200ms on real-user data — all three CWV buckets in the green on both desktop and mobile.
Critical CSS inlined per template (listing, search, cabinet, agent, suburb guide). AVIF + WebP responsive images with the `srcset` + `sizes` pattern; 96kB hero down from 780kB JPEG. Lazy-loaded map + gallery carousel behind IntersectionObserver. Preconnect to Supabase + Mapbox tile CDN. Brotli + HTTP/2 push on the edge. Result: PageSpeed mobile 94-100 across the five core templates.
Launch, Monitoring & Handover
Soft-launch to 10% of logged-in users, ramp to 100% over 14 days, Sentry + Datadog dashboards handed to the in-house team, and a 40-page Confluence runbook for ongoing ops.
Blue/green deploy behind Cloudflare with instant rollback. Real-user Core Web Vitals streamed to Datadog with p75 alert thresholds. Sentry release tracking tied to Fastlane iOS/Android builds. Final month: pair-programmed with two in-house engineers, recorded 12 Loom walkthroughs, delivered a 40-page runbook (deployment, monitoring, on-call, schema maintenance, app-store release flow).
Our Implementation
usePropertyAlerts.ts
// WebCoreLab — RealEstateView Property Alert Engine
import { useEffect, useCallback } from 'react';
import { useWebSocket } from './useWebSocket';
import { usePushNotifications } from './usePushNotifications';
import { calculateHaversineDistance, getSuburbCoords } from './geo';
import type { Listing, SavedSearch } from './types';
export const usePropertyAlerts = (
userId: string,
savedSearches: SavedSearch[]
) => {
const { subscribe, lastMessage } = useWebSocket(
`wss://api.realestateview.com.au/alerts/${userId}`
);
const { sendPush } = usePushNotifications();
const matchesSearch = useCallback(
(listing: Listing, search: SavedSearch): boolean => {
const distance = calculateHaversineDistance(
listing.coordinates, getSuburbCoords(search.suburb)
);
return (
distance <= search.radius &&
listing.bedrooms >= search.minBedrooms &&
listing.price <= search.maxPrice
);
}, []
);
useEffect(() => {
if (!lastMessage) return;
const listing: Listing = JSON.parse(lastMessage.data);
const matched = savedSearches.filter(s => matchesSearch(listing, s));
if (matched.length > 0) {
sendPush({
title: `New ${listing.bedrooms}BR in ${listing.suburb}`,
body: `$${(listing.price / 1000).toFixed(0)}K — ${listing.propertyType}`,
data: { listingId: listing.id }
});
}
}, [lastMessage, savedSearches, matchesSearch, sendPush]);
};
// 140,000+ active users | Alert→View conversion: 67%
Measurable Impact
Measured 6 months after app launch
“The new user cabinet and mobile app transformed our platform. Power users went from hitting our 3-saved-search cap in week one to creating 12+ alerts on average. The real-time push alerts alone drove a 67% lift in listing inquiries. App Store rating of 4.6★ speaks for itself.”
— N.T., Product Director, PropTech Platform (NDA)