Skip to main content
Back to Projects
Web Platform & SEOWordPressPHPRedisZoho CRM APIOpenAI APIWP Rocket

Metro Manhattan: Rescuing a 900-Page WordPress Site

Full-Stack Engineer & Technical SEO Consultant
10 min read
metro-manhattan.com (opens in new tab)

Metro-Manhattan.com is one of New York City's established commercial real estate listing platforms, with over 900 pages covering office space, lofts, medical facilities, and retail across every Manhattan neighborhood. When I joined the project, the site had significant performance problems that had gone unresolved, and no system for tracking how visitors interacted with listings.

Over two contracts spanning 1,196 hours, I rebuilt the site's performance foundation, built a custom visitor intelligence pipeline feeding Zoho CRM, developed AI-powered SEO tools using OpenAI embeddings, and migrated the infrastructure from AWS Lightsail to a dedicated NYC server.

PageSpeed 71 to 96921 pages passing CWV8 custom plugins1,196 hours across 2 contracts

Context

Metro Manhattan serves commercial tenants searching for office space in NYC. The site has over 900 pages: individual listings with floor plans and pricing, building profiles, neighborhood guides, market reports, and editorial content. It runs on WordPress with a custom theme, and SEO is critical to the business since most traffic comes from organic search.

When I started, the site had a PageSpeed score of 71 on mobile. Core Web Vitals were not passing. Previous optimization attempts hadn't resolved the issues. Beyond performance, there was no analytics beyond basic Google Analytics, no CRM integration, and no way to understand how visitors navigated between listings.

The client, Alan Rosinsky (opens in new tab) (Metro Manhattan's principal broker), needed three things: a site that loads fast and passes Core Web Vitals across every page, a system that tracks visitor behavior and feeds it into his Zoho CRM, and ongoing technical SEO improvements to protect organic rankings.


My Role

Full-Stack Engineer & Technical SEO Consultant

I owned all technical decisions: performance diagnosis and optimization, custom WordPress theme modifications, plugin development, Zoho CRM API integration, server migration, and ongoing technical SEO. I worked directly with the client throughout, explaining technical decisions in plain language to a non-technical business owner.


Performance Optimization

The Starting Point

The site's performance issues were systemic, not caused by any single problem. Render-blocking JavaScript loaded on every page. Images were served as full-size JPEGs without WebP alternatives. No critical CSS strategy existed, so the browser had to download the entire stylesheet before rendering anything. jQuery was loaded even though the custom theme didn't need it. WordPress default assets (emoji scripts, block library CSS) were included on every page.

PageSpeed report from September 3, 2024 showing Performance score of 71, with FCP 2.5s, LCP 3.8s, TBT 500ms, and Speed Index 3.7s

What I Changed

Per-page critical CSS. Instead of one monolithic stylesheet, I extracted and inlined the critical CSS for each page type: homepage, individual listings, building profiles, listing index pages, about page, and blog. The rest loads asynchronously. This eliminated the render-blocking CSS problem across all 900+ pages without a generic "above the fold" hack.

Image pipeline. I implemented automatic WebP replacement: when a .webp version of an image exists, the theme serves it instead of the JPEG/PNG original, including updating srcset attributes. Imagify handles the conversion. Lazy loading is applied to all images except the first visible one on each page, which gets loading="eager".

Script cleanup. jQuery was deregistered in production. WordPress emoji scripts and block library CSS were removed. Contact Form 7 assets are only loaded on pages that actually contain a form. All remaining scripts are deferred on the homepage.

Font optimization. Two custom fonts (Lato and Merriweather) are preloaded to avoid layout shifts from font swaps.

WP Rocket tuning. Beyond the default caching, I built a small plugin to exclude specific elements from WP Rocket's Automatic Lazy Rendering where it caused layout issues, and added cache invalidation hooks that clear relevant caches when listings or buildings are updated.

The Result

Three days after implementing these changes, the site scored 96 on mobile with all Core Web Vitals passing.

PageSpeed report from September 6, 2024 showing Performance score of 96, Core Web Vitals Assessment Passed, with LCP 2.3s, INP 78ms, CLS 0.01, FCP 1.9s

This wasn't a single-page fix. All 921 indexed pages passed Core Web Vitals on both mobile and desktop, confirmed in Google Search Console.

Google Search Console showing 921 pages passing Core Web Vitals on both mobile and desktop with zero issues


Visitor Intelligence System

The client wanted to understand how visitors interact with the site beyond what Google Analytics provides. Specifically: which listings do registered users view, how long do they spend on each page, which searches do they run, and did they start filling out a contact form but abandon it?

Session Tracking Architecture

For logged-in users, the system tracks every page visit with start time, end time, and duration. Sessions are stored in Redis during the active visit (keyed by user_session:{user_id}), then synced to MySQL via a WP-CLI command that runs on cron. A separate WP-CLI command batches unprocessed sessions to Zoho CRM via REST API with OAuth2 authentication.

The JavaScript layer uses the pagehide event with navigator.sendBeacon to reliably capture page departures, even when users close the tab.

Search Behavior Tracking

A separate system captures every listing search with the filters used: location, size, price range, property type. This data is stored in a search_stats table with the user's identity (logged-in user ID, email cookie, or session cookie for anonymous visitors) and Cloudflare geolocation headers.

Zoho CRM Integration

All tracked data flows into Zoho CRM through a REST API integration with OAuth2 refresh token authentication:

EventData Sent to Zoho
User registrationuser ID, name, email, geo info, registration time
User loginlast login timestamp, session info
Page visitssession start/end, time spent, full page visit history
Form submissionsname, email, phone, message, form name, page URL
Email verificationverification status updates

Form submissions from Contact Form 7 are captured separately and batch-synced to Zoho as leads, including partial submissions from users who started filling out a form but didn't complete it.


AI-Powered SEO Tools

With 900+ pages, manual internal linking and content recommendations don't scale. I built three plugins using OpenAI embeddings to automate these tasks.

Internal Linking Recommender

This plugin generates and stores vector embeddings for every post, page, listing, and building on the site. When editing content, it uses semantic similarity to suggest the most relevant internal links and uses GPT-4 to generate natural anchor text that fits the surrounding context. Recommendations appear in a meta box in the WordPress editor and can be applied with one click.

Related Content Recommender

Listings and articles need "related content" sections. Rather than relying on category matching alone, this plugin scores content similarity using embeddings, applies category bonuses for same-type matches, and penalizes stale content. It also balances how frequently each piece of content appears as a recommendation (capped at 1-10 appearances) to avoid always surfacing the same popular pages.

Cornerstone Posts Dashboard

For Yoast SEO's cornerstone content strategy, this plugin provides a dashboard listing all cornerstone posts, identifies posts that don't link to any cornerstone content, and uses Gemini AI to suggest specific paragraphs where a cornerstone link would fit naturally.


Server Migration

The site was originally hosted on AWS Lightsail. I recommended and executed a migration to a dedicated server in NYC from InterServer (opens in new tab). The reasoning:

  • Latency: A NYC server serving a NYC-focused real estate site reduces time-to-first-byte for the primary audience.
  • Resource control: Dedicated hardware eliminates noisy-neighbor issues common on shared cloud instances.
  • Cost predictability: Fixed monthly cost vs. variable cloud billing.

The migration included server configuration, SSL setup, DNS cutover, cache warming, and validation of all 900+ pages.


Custom Plugins Summary

PluginPurpose
Visitor session trackingRedis-backed page visit tracking with MySQL sync and Zoho CRM export
Zoho CRM integrationOAuth2 REST API pipeline for user events, visits, and form submissions
AI internal linkingOpenAI embeddings + GPT-4 for contextual link suggestions
AI related contentEmbedding-based content recommendations with category and recency scoring
Cornerstone posts dashboardAI-assisted cornerstone linking with Gemini
External link fixerAutomated nofollow/noopener management with trusted domain allowlist
OpenAI site chatAdmin AI assistant for answering questions about site content via semantic search
WP Rocket tuningCustom lazy rendering excludes for layout-sensitive elements

Outcomes

  • Performance: PageSpeed 71 to 96 on mobile. All 921 indexed pages passing Core Web Vitals on both mobile and desktop.
  • Visitor intelligence: Full session tracking pipeline from page visits through Redis to Zoho CRM, giving the client visibility into how prospects navigate listings.
  • SEO tooling: AI-powered internal linking, related content, and cornerstone recommendations across 900+ pages.
  • Infrastructure: Migrated from AWS Lightsail to a dedicated NYC server with lower latency for the target audience.
  • Client relationship: Two Upwork contracts totaling 1,196 hours over 14 months, both rated 5.0 stars. The client described the engagement as working with "one of the best developers I've ever collaborated with."

Reflections

Performance is never one thing. The site didn't score 71 because of one bad image or one heavy script. It was death by a thousand cuts: render-blocking CSS, unoptimized images, unnecessary scripts, missing font preloads, no critical CSS strategy. Fixing it required a systematic audit, not a single silver bullet.

Per-page critical CSS is worth the effort. A homepage with a hero image has completely different above-the-fold content than a listing page with a data table. Generic critical CSS tools produce mediocre results. Extracting and maintaining per-page-type critical CSS is more work but produces consistently good scores across diverse page types.

Track what the business needs, not what's easy to measure. Google Analytics tells you page views. The client needed to know which registered users viewed which listings, how long they stayed, and whether they started filling out a contact form. That required a custom tracking system, but the business value was immediate.

AI tools need guardrails. The internal linking recommender doesn't blindly insert links. It suggests them in the editor with context, and a human applies them. The related content recommender caps how many times any single page can appear as a recommendation. These constraints prevent the tools from degrading content quality.


Metro Manhattan is live at metro-manhattan.com (opens in new tab), serving commercial tenants searching for office space across New York City.