Metro Manhattan: Rescuing a 900-Page WordPress Site
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 96 | 921 pages passing CWV | 8 custom plugins | 1,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.

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.

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.

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:
| Event | Data Sent to Zoho |
|---|---|
| User registration | user ID, name, email, geo info, registration time |
| User login | last login timestamp, session info |
| Page visits | session start/end, time spent, full page visit history |
| Form submissions | name, email, phone, message, form name, page URL |
| Email verification | verification 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
| Plugin | Purpose |
|---|---|
| Visitor session tracking | Redis-backed page visit tracking with MySQL sync and Zoho CRM export |
| Zoho CRM integration | OAuth2 REST API pipeline for user events, visits, and form submissions |
| AI internal linking | OpenAI embeddings + GPT-4 for contextual link suggestions |
| AI related content | Embedding-based content recommendations with category and recency scoring |
| Cornerstone posts dashboard | AI-assisted cornerstone linking with Gemini |
| External link fixer | Automated nofollow/noopener management with trusted domain allowlist |
| OpenAI site chat | Admin AI assistant for answering questions about site content via semantic search |
| WP Rocket tuning | Custom 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.