Uros Bojovic - Real Estate Agent

A high-performance personal brand and SEO platform for a South Auckland real estate agent, combining suburb-targeted content pages, a live RateMyAgent review system, and an interactive Mapbox map, all driven by Sanity CMS

Uros Bojovic - Real Estate Agent

The Challenge

Individual real estate agents operate in one of the most competitive digital spaces in local search. Every suburb has multiple agents competing for the same buyer and seller queries, and the difference between ranking on page one and being invisible often comes down to how well a personal website is engineered for both performance and organic search. Uros Bojovic, a licensed real estate agent at Ray White Manurewa in South Auckland, needed a digital platform that could do two things simultaneously: present a polished, trustworthy personal brand to potential clients, and rank strongly for high-intent local search queries across multiple South Auckland suburbs - Manurewa, Papakura, and Papatoetoe.

The core challenge was that a single homepage was not enough. Buyers and sellers searching for real estate agents in specific suburbs expect suburb-specific content: local market stats, school information, demographic data, transport links, and evidence of proven results in that area. Building this depth of content for multiple suburbs, while keeping it editable and maintainable without developer intervention, required careful architecture across both the CMS schema and the component layer.

Performance added its own complexity. The site needed to render an interactive Mapbox GL JS map with sold property pins specific to each suburb, live verified reviews from the RateMyAgent API, GSAP-animated hero sections, Swiper carousels, and a full blog system with article pages - all without blocking the initial page load or compromising Core Web Vitals. Engineering a site that was simultaneously rich in content, strong in SEO signals, and fast to load was the central problem the team set out to solve.

Our Solution

The solution was built as a Next.js 15 platform using the App Router, with Sanity v4 as the CMS and a clear division between server-rendered data fetching and client-side interactivity. The architecture was designed around three primary audiences: potential sellers wanting to evaluate Uros as an agent, buyers exploring properties in specific suburbs, and search engines needing clear, authoritative suburb-specific signals.

The SEO strategy was implemented through dedicated suburb pages for Manurewa, Papakura, and Papatoetoe, each powered by the same parameterised `SUBURB_HERO_QUERY` from Sanity and rendered through a reusable `SuburbPageTemplate` server component. Each suburb page delivers 13 distinct content sections: a hero with area stats, an about section with Uros's profile, market insights with median prices and days on market, location connectivity covering motorway and transport access, a sold gallery, census diversity data, lifestyle amenity grids with images, local school lists, buyer guidance notes, cross-links to other suburbs, a blog CTA, a full FAQ section, and a testimonials section backed by live RateMyAgent data. This depth of suburb-specific content was all managed through a single Sanity document per suburb, making updates fast and developer-free.

The home page was engineered using a `ViewportLoader` pattern - a custom Intersection Observer wrapper that defers mounting of heavy client-side sections until they scroll into view. Hero and About sections mount immediately for fast perceived load. The sold gallery, approach section, expertise map tabs, recently sold cards, and testimonials all load independently as the user scrolls, preventing any single heavy component from blocking the initial render. The Mapbox GL JS expertise section dynamically populates each suburb tab with its sold property pins by fetching all three suburb datasets in parallel at page load and matching them to tabs by name.

RateMyAgent integration was built as a server-side microservice call with one-hour revalidation, ensuring reviews stay fresh without hitting the API on every request. If the API returns empty, the testimonials component gracefully falls back to Sanity-stored quote data, guaranteeing the section always renders something meaningful. The blog was structured with static params generation at build time, so all article pages are pre-rendered and served at full speed from the CDN edge.

Structured data was implemented at two levels: a comprehensive `RealEstateAgent` JSON-LD schema injected in the root layout, covering the agent's full profile, three area-served entries, and a service catalogue - all hardcoded for maximum SEO control. Per-page structured data was generated dynamically using `generatePageStructuredData()` with type variants for home, suburb, and article page types. Canonical URLs, trailing slash normalisation, and a dynamic sitemap completed the technical SEO foundation.

Uros Bojovic - Real Estate Agent

Tech Stack

Frontend
Next.jsTailwind CSS
Backend
Node.js
Animation & UX
GSAP 3Lenis (Smooth Scroll)
Integrations
Mapbox GL JSreact-map-glSanity

Team Composition

Project Manager

Responsible for planning, delivery timeline, and ongoing client communication throughout the project.

Tech Lead

Shaped the overall architecture, set technical standards, reviewed code, and guided key engineering decisions.

Backend Developers

Built Sanity schema architecture, RateMyAgent API integration, API routes, and server-side data fetching logic.

Frontend Developers

Implemented all UI components, ViewportLoader system, Mapbox map integration, Swiper carousels, and GSAP animations.

SEO Specialist

Defined the suburb content strategy, structured data schema, keyword targeting, and technical SEO implementation across all pages.

UI/UX Designer

Created the design system, dark-themed visual identity, yellow accent language, and full layout hierarchy aligned to the Ray White brand.

QA Engineer

Conducted testing across devices, browsers, and SEO validators to ensure a stable, performant, and compliant release.

Project Duration

16 Weeks Project Lifecycle

M1
M2
M3
M4
Discovery & SEO Strategy
Design & CMS Architecture
Core Development
Suburb Pages & Blog
Testing & SEO Validation
Launch

The Journey

We started where the business lives: in the suburbs. Before any design or development began, we mapped the search landscape around South Auckland real estate - what people were searching for, which queries had real commercial intent, and where existing agent websites were falling short. The answer was clear. Buyers and sellers were searching suburb-first: 'real estate agent Manurewa', 'sell house Papakura', 'property agent Papatoetoe'. A homepage alone could not win those queries. The only way to compete was to build genuinely useful, comprehensive, suburb-specific pages that search engines would recognise as authoritative.

With that strategy locked, our design team built the visual identity around the Ray White brand - a dark, confident aesthetic with yellow as the primary accent, communicating trust and expertise without feeling generic. We moved away from the light, breezy look common to real estate websites and toward something more premium: cinematic hero imagery, clean typographic hierarchy using Open Sans and Manrope, and a layout that put Uros's local credibility front and centre through stats, testimonials, and sold results.

Engineering the suburb pages was the most architecturally significant challenge. We designed a single reusable `SuburbPageTemplate` server component that accepted a `HeroComponent` and `AboutComponent` as props, rendering the same set of 13 content sections regardless of which suburb was being viewed. All content was managed through a single Sanity document per suburb. This meant updating census data, market stats, school lists, or buyer guidance notes was a content editor task, not a developer task - a critical requirement for a busy one-person team.

The home page's `ViewportLoader` pattern emerged from a performance problem we hit during testing. Loading Mapbox GL JS, Swiper, and RateMyAgent reviews simultaneously was causing measurable impact on Time to Interactive. Rather than a sequential setTimeout chain, we built a cleaner Intersection Observer wrapper that mounted each section exactly when it became visible, keeping the initial bundle lean and letting heavy components load on demand as the user scrolled.

The final weeks were dedicated to SEO completeness: structured data validation, canonical URL auditing, sitemap generation, and making sure every suburb page had its own metadata, keywords, and OG image pipeline through Sanity. When we launched, the foundation was solid enough that organic ranking improvements were visible within weeks.

Key Impact

Uros Bojovic now has a digital platform built specifically to win local search in South Auckland. The three suburb pages - Manurewa, Papakura, and Papatoetoe - each carry the depth of content that search engines reward for local service queries: area statistics, demographic breakdowns, school lists, transport guides, sold property maps, market insights, FAQs, and verified client reviews. This is the kind of content that no generic agent directory or off-the-shelf website builder can produce at this level of specificity and quality.

For potential sellers visiting the site, the experience is designed to build trust quickly. RateMyAgent reviews appear automatically from verified sources, the sold gallery shows real results in real suburbs, and the Mapbox expertise section makes Uros's local knowledge tangible and visible - not just stated. The contact form and free appraisal journey are clear and fast, reducing friction between a first visit and a real enquiry.

For Uros and his team, the CMS-driven approach means the site stays current without developer involvement. Market stats can be updated for a new quarter, new testimonials can be added, blog articles about local property trends can be published, and new sold properties can be pinned to the map - all through Sanity without touching a line of code. The blog system with static pre-rendering means new articles index quickly and are served from the CDN edge, not a slow server.

The landing page - `uros-landing-website` - operates as a parallel conversion asset, focused entirely on capturing free appraisal bookings via a dedicated `BookingForm`. The two projects work together: the main site builds SEO authority and trust, while the landing page closes leads with a single, frictionless conversion goal.

Why it Stands Out

This project stands out because it was built around a specific, measurable goal: help one person rank and convert across multiple South Auckland suburbs. Every architectural decision traces back to that objective.

The suburb SEO system is the clearest example. Rather than building three separate pages with duplicated code, the team designed a single `SuburbPageTemplate` that renders the same 13 content sections for any suburb, driven entirely by Sanity content. Adding a fourth suburb in future requires creating a Sanity document and one line of code - not a new page template. The template is reusable, the schema is extensible, and the content is fully editable without developer involvement.

The `ViewportLoader` pattern is another engineering decision worth noting. It is a simple idea - only mount a component when it enters the viewport - but implementing it cleanly as a reusable React wrapper that works correctly with Next.js server components, dynamic imports, and GSAP animations required careful thinking. The result is a home page that feels fast on first load without sacrificing the richness of what comes later.

The dual-level structured data strategy - a hardcoded root `RealEstateAgent` JSON-LD covering the agent's full profile, combined with per-page structured data generated dynamically per page type - shows the kind of SEO depth that is rarely implemented this completely on a personal agent site. Most agent websites get a basic organisation schema. This one gets a full `areaServed` coverage of three suburbs, a complete `hasOfferCatalog`, employee and agency relations, and article structured data on every blog post.

Finally, the two-project architecture itself reflects clear thinking about conversion. The main site earns trust and search traffic. The landing page converts it. They are separate because they have different jobs, different performance profiles, and different design priorities. Building them as one site would have compromised both. Keeping them separate gave each the focus it needed to do its job well.