Skip to content

Case study

Property Pages That Build Themselves

The site-wide SEO scan fell from 3,266 flagged items to roughly 900, about 72%, and more than 150 property pages in two languages now come from CRM records.

Project
Bilingual real estate site
Industry
Real estate / HubSpot CMS
Role
Developer: CMS, edge pipeline, SEO, analytics
  • HubL
  • CRM custom objects
  • Memberships
  • Cloudflare Workers
  • JavaScript
  • GTM / GA4
  • JSON-LD

The context

A boutique luxury real estate agency's site on HubSpot CMS, in Italian and English. Two pipelines run on one site: listing objects become pages through one template pair, and photography is resized and cached at the edge before the browser sees it.

The problem

The agency needed a bilingual site whose listings were managed in the CRM, not maintained as static pages, plus a members' area, a clean bill of SEO health, and tracking it could trust.

My responsibility

  • Built the dynamic property system: 150+ property pages across Italian and English, generated from HubSpot Listing custom objects through one template pair
  • Built the edge image pipeline: a Cloudflare Worker in front of the CMS that resizes and caches listing photography, ported from an earlier serverless version to remove a CPU bottleneck
  • Built membership and gated content: registration-based access, saved favourites, and prices and virtual tours visible only to logged-in members
  • Set up GTM and GA4 with custom events for phone clicks, forms, property views and favourites, Google Ads conversion and remarketing, Search Console and Consent Mode v2
  • Rebuilt the property templates and video-led location pages, added a design and projects section, expanded membership tiers, and added an AI concierge that queries the listing data

Architecture

  1. Visitor, in Italian or English
  2. HubSpot CMS
  • Template pairHubL · index + detail150+ property pages
  • Cloudflare WorkerResize + cache at the edge~8 KB thumbnails
  • MembershipsRegistration-based accessPrices and tours for members

HubSpot CRM: Listing custom objects

Listing objects become pages through one template pair; photography is resized and cached at the edge before the browser sees it.

Key decisions

  • Listings as a CRM custom object

    Every property is a HubSpot custom object, so adding a property is a CRM task, not a web task.

  • One template pair for every listing

    A single index-and-detail template pair renders every listing in both languages.

  • Fix problems where they start

    SEO problems were fixed in the templates. One template fix corrects every page built from it, which is how the SEO scan came down so far.

  • Sign off on real metrics

    Performance was built into the new templates and signed off against Core Web Vitals and structured-data validation, not raw scan counts.

Technical challenges

  1. 1.Caching disabled site-wide

    Site-wide caching was traced to per-visitor server rendering in the global header, and the image-loading and page-weight issues were documented.

  2. 2.Heavy listing photography

    A Cloudflare Worker in front of the CMS resizes and caches photos on the fly. It was ported from an earlier serverless version to remove a CPU bottleneck.

  3. 3.SEO faults repeated on every page

    Duplicate Open Graph and Twitter tags, a meta-description encoding fault, broken hreflang and retired-URL redirects were fixed at the template level, and JSON-LD organisation and product schema added.

Results

  • Site-wide SEO scan down from 3,266 flagged items to roughly 900, about 72%
  • Gallery thumbnails down from ~170 KB to ~8 KB
  • More than 150 property pages in two languages come from CRM records, so the site grows when the listings do

Need a HubSpot site or migration done properly?

From CMS themes and portal merges to AEO audits, I fix problems where they start and measure what changes.