Site Audit · 10 September 2026
rivieraalexandria.com — performance, SEO & tracking
The site is served fast and indexed cleanly. What holds it back is weight — 41 MB of unoptimised photography — and a handful of signal errors that quietly undercut the SEO work already invested in it.
01 · What is already working
Worth stating plainly, because it narrows where the effort should go: the hosting and crawl layers are in good shape.
All 35 pages return 200. Time to first byte 106–224 ms, total transfer 130–265 ms, served from Cloudflare with cf-cache-status: HIT. HTTP/2 and HTTP/3 both offered, HSTS set with includeSubDomains, and 103 Early Hints preconnect the CDN and font hosts before the HTML lands.
Traditional crawlers allowed, AI assistants explicitly admitted (GPTBot, Meta, Amazonbot, DuckAssistBot, MistralAI, YouBot, Applebot-Extended), Bytespider blocked, and utility pages kept out of the index. Sitemap declared, 35 URLs, all resolving.
LocalBusiness on the homepage, FAQPage on /il-faqs, NewsArticle on events, plus entity markup linking to Wikidata, Wikipedia and Crunchbase.
02 · Page weight
Server response is not the bottleneck; photography is. Full-size images each page requests by default, measured from actual content-length.
| Page | MB | Images |
|---|---|---|
| /gallery | 24.6 | 22 |
| /services-amenities | 4.6 | 16 |
| /why-the-riviera | 4.1 | 13 |
| /independent-living | 3.5 | 15 |
| /dining | 3.1 | 20 |
| /wellness | 2.0 | 11 |
| /lifestyle | 1.3 | 16 |
| / (home) | 0.6 | 14 |
| /il-floor-plans | 0.6 | 19 |
79 unique full-size images: 8 exceed 1 MB, 22 exceed 500 KB. Heaviest is riviera-terrace-outdoor-garden.jpg at 3.8 MB, then riviera-alexandria-hero.png at 3.6 MB — a photograph saved as PNG, a format that cannot compress photographic detail.
Fix — re-export the 22 images over 500 KB at 75–82% JPEG quality and let Webflow generate WebP. Expect 85–95% off each.
Sitewide: 620 JPEG, 447 PNG, 172 SVG — zero modern formats. Webflow converts on upload and serves WebP to browsers that accept it, so this is a setting and a re-upload. The 447 PNGs are the expensive half.
Fix — enable WebP in Webflow site settings, then re-upload heavy PNGs as JPEG originals.
All 23 homepage images carry loading="lazy". For the first visible image that is harmful: the browser defers the very request that determines Largest Contentful Paint, and no <link rel="preload"> compensates.
Fix — set the first in-view image on each template to eager loading, and preload it.
On the homepage 1 of 23 images declares width and height, and 5 of 23 have a srcset. Missing dimensions cause layout shift as photographs arrive; missing srcset means phones download desktop-sized files.
jQuery 3.7.1 from code.jquery.com and jQuery 3.5.1 from Webflow's CDN — 61 KB compressed for a library needed once. Two versions on one page is a real source of intermittent script bugs.
Fix — remove the manually added code.jquery.com tag.
webfont.js requests Merriweather (8 cuts), Mulish (5) and Prompt (5). The loader is an extra blocking round trip before any font request begins.
03 · Signals that contradict each other
Each tells Google something the rest of the site denies. Cheap to fix; they undercut work already paid for.
The site serves at the apex and www 301-redirects to it. The sitemap uses the apex. But every page declares the www version canonical — naming as authoritative a URL that immediately bounces. The JSON-LD carries the same www URLs.
served 200 https://rivieraalexandria.com/about
canonical https://www.rivieraalexandria.com/about -> 301 -> apex
sitemap https://rivieraalexandria.com/about
Fix — point canonical and JSON-LD at the apex, or make www the served host. Either is fine; they must agree.
Two JSON objects concatenated inside one application/ld+json block — the parser fails at line 385 with Extra data. Google discards the whole block, so every entity claim on that page is silently ignored.
Fix — split into two script tags, or wrap both objects in a single array.
Only the homepage, /community and one news post define a share image. Everything else — including /contact, /book-an-appointment and every event page — renders as a bare text link when shared.
Fix — set a site-wide default share image, then override per page where it matters.
og:image points at TRIL_HomeHERO_1920x930.png, hosted in a different Webflow site's asset bucket — the file name suggests Trillium. At 3.6 MB it is roughly thirty times a sensible share image, and slower scrapers give up before fetching it.
Fix — export a 1200×630 JPEG of this property under 200 KB, hosted on this site.
04 · On-page SEO
| Check | Pages | Detail |
|---|---|---|
| Missing meta description | 2 | /search, /why-the-riviera |
| Description under 70 chars | 11 | Mostly event pages — one is 31 chars |
| Description over 160 chars | 6 | Truncated in results |
| Title over 60 chars | 8 | One news title runs to 81 |
| More than one H1 | 15 | Splits topical focus |
| No H1 at all | 1 | /community |
| Under 300 words | 18 | Thin for competitive local terms |
| Images missing alt text | 271 | of 550 — 49% |
The pages deserving attention are /why-the-riviera — no description at all, despite being a primary conversion page — and the 18 thin pages. /gallery at 123 words is a page of photographs with almost nothing for a crawler to read, and half its images have no alt text either. For a community selling a physical place, image search is a real acquisition channel.
05 · Tracking and paid media
Twelve third-party scripts run on the homepage. Two things need attention before spend is scaled.
GTM-KDTVMHFJ and GTM-N53TL3JL both load, alongside GA4 G-BKB6PKLLYX. Two containers routinely means one event firing twice — inflated conversion counts, inflated bidding signals, and a cost-per-lead that reads better than reality.
Fix — establish which container is authoritative, migrate unique tags into it, remove the other.
No AW- conversion ID and no fbq appear in the HTML. They may be injected through GTM at runtime, which this survey could not execute — so treat this as a question rather than a finding. Worth answering: unverified conversion tracking is the most common cause of paid budget optimised against nothing.
Fix — confirm in Google Ads that conversions recorded in the last 7 days, and run Tag Assistant on /contact.
The date picker comes from fengyuanchen.github.io/datepicker/js/datepicker.js — an individual developer's demo hosting, not a CDN with an uptime commitment. If that repository is renamed, deleted or taken over, the booking form's date field breaks or executes someone else's JavaScript on a page collecting names and phone numbers.
Fix — serve it from jsDelivr with a pinned version, or upload the file to Webflow assets.
The full stack on the homepage
- Analytics — GA4, two GTM containers, Microsoft Clarity
- Attribution — TracedMethod SDK, capturing first-touch campaign and referrer into form submissions
- Call tracking — CallRail number swap
- Lead capture — four Roobrik quiz widgets (senior living, downsize, memory care, affordability)
- SEO tooling — SearchAtlas dynamic optimisation, injected via a base64
data:URI - Unidentified —
data.staticfiles.io/accounts/14108164-…/load.js - Functional — reCAPTCHA, Vimeo player, js-cookie, jQuery ×2, date picker
SearchAtlas deserves a specific look: a tool that rewrites the page at runtime can quietly be the thing setting a canonical or a title, which makes it a prime suspect for the www mismatch above.
06 · What to do, in order
Ordered by return on effort. The first three are an afternoon between them and account for most of the available gain.
| # | Action | Effort | Why it matters |
|---|---|---|---|
| 1 | Re-export the 22 images over 500 KB; enable WebP | 2–3 h | Removes ~35 MB. Biggest single win. |
| 2 | Point canonicals and JSON-LD at the apex host | 15 min | Stops 35 pages contradicting the server. |
| 3 | Remove the duplicate jQuery tag | 5 min | 61 KB and a class of intermittent bugs. |
| 4 | Fix the /about JSON-LD syntax error | 10 min | Restores discarded structured data. |
| 5 | Resolve the two GTM containers to one | 1–2 h | Trustworthy conversions before scaling spend. |
| 6 | Eager-load and preload the first image per template | 30 min | Directly improves LCP. |
| 7 | Self-host the date picker | 20 min | Removes supply-chain risk on a lead form. |
| 8 | Default share image + per-page overrides | 1 h | 25 pages share as bare links. |
| 9 | Alt text for /gallery, /il-floor-plans, /dining | 2 h | Accessibility plus image search. |
| 10 | Descriptions and H1s on the 18 thin pages | 4–6 h | Ongoing content work. |
Method and limits. Measured 10 September 2026 by fetching all 35 sitemap URLs and their assets directly, reading real HTTP responses and content-length values. Timings are server-side — time to first byte and transfer — from a single location. No browser was run, so there are no field Core Web Vitals here, and anything injected by JavaScript at runtime (notably GTM tags and SearchAtlas rewrites) was not observed. Image weights count what each page requests by default and exclude lightbox assets that load only on click.