Exterior Remodelers of America
A lead-focused contractor site, rebuilt on the Payload CMS platform
Problem
The company's current site is WordPress with a heavy slider plugin. They needed a faster site built around getting leads, one their staff can edit themselves.
Approach
The homepage hero is built around one tap-to-call button, three proof points and a scrolling services ticker that respects reduced-motion settings, sized so the lead form clears the fold at 1280x720. I cut warranty, performance and resale claims nobody could back up. The v2 port has 13 block renderers, server-action forms with a honeypot and a minimum fill time, legal pages, a sitemap and robots file, and revalidate and preview handlers. An importer rebuilt the live content from the git history of the old seed scripts without connecting to any database. Then I replaced the AI-generated house used in every hero with real job photos, metadata stripped and house numbers cropped. On a branch not yet merged, the logo is a vector exported from the original Illustrator file.
Process
5 dated steps, from the project’s history
-
Client fork
Set up the client preset, the Vercel deploy config and the migration helpers on the platform template.
-
Hero redesign
A service-forward eyebrow, a one-line headline, three proof points, a single tap-to-call button and an auto-scrolling services ticker, rendered on the server.
-
Launch hardening
Closed the admin escalation and data-wipe paths found in the platform audit, accepted anonymous leads with a honeypot, served robots and sitemap from the app, and removed template branding. Three days later the fork launch was cancelled in favor of v2.
-
Headless port and content import
The site moved to apps/era on the SDK, and an importer turned the old seed scripts into CMS pages. Images got much lighter once PNG files saved with a .jpg name were re-encoded as real JPEGs.
Before: one AI-generated house, reused in every hero and feature section. -
Real photos and the real logo
Job photos of siding, soffit and fascia, patio covers, stucco and kitchens replaced the AI and stock images, and 11 stock files were deleted, including one that showed another company's van. On a branch not yet merged, the logo is a vector in its original teal and orange, and the admin uses those colors. See Fig. 1, above.
Results
Runs locally against the CMS with 23 pages imported. It moves straight to the new platform at cutover; the fork launch was cancelled.
Lesson
Next 16 throws if headers() is called inside unstable_cache, so the tenant has to be resolved without request headers. And client content belongs in tenant data, not in environment variables or shared code.