Case Study · 2025 — 2026
GC Photography
A full migration of a working photographer's site off Showit and onto a custom Next.js 14 + Sanity stack on AWS Amplify — with a modern SEO and AI-search layer, embedded booking flow, and a zero-downtime DNS cutover at the end.
The problem
The existing site lived on Showit — a drag-and-drop builder with limited SEO primitives, no structured data, no programmatic control over image pipelines, and a monthly bill that scales badly as the business grows. For a small photography business that lives or dies by search visibility, that's the wrong stack.
The migration had three non-negotiable goals: full SEO control, AI-search visibility (structured data that tools like ChatGPT and Perplexity actually read), and a lower total cost of ownership — without losing any of the look and feel of the existing brand.
Architecture
- Framework: Next.js 14 (App Router, TypeScript, Tailwind)
- CMS: Sanity.io for blog + service content, so the client can update copy without touching code
- Hosting: AWS Amplify (auto CI/CD from
main) with CloudFront + ACM-issued SSL - DNS: Route 53 (domain transferred from GoDaddy at cutover)
- Images:
next/imagewith S3 + Sanity image pipeline (WebP, responsive srcsets) - Booking: HoneyBook embed for contact + scheduling + deposit in a single lead flow
- CI gate: Lighthouse CI action that fails the build if performance regresses
SEO & AI-search layer
This is where a custom build earns its keep.
- Structured data — JSON-LD schema per page:
LocalBusiness,Photographer,Service,Review, andFAQPage. Search engines and LLMs can parse the business directly. /llms.txt— a structured, AI-readable business summary at a well-known path, so AI search agents can cite the site accurately.- Sitemap + robots — auto-generated on every build via
next-sitemap. - Redirects — 301s set up for every existing Showit URL so no SEO equity is lost at cutover.
- Per-page metadata —
generateMetadata()for title, description, Open Graph, and Twitter cards, written from Sanity content.
Performance
HoneyBook's embed script is heavy. Loading it eagerly on every page would have tanked the Lighthouse score. Solution:
lazy-load it via IntersectionObserver so the script only fires when the user scrolls to the form. Page stays fast;
the integration still works.
Design fidelity
The goal was to match the existing brand exactly — Crimson Text headings, Nunito body, Poppins labels, a specific blue-and-gold accent palette, and section backgrounds the client already knew. A custom Tailwind theme mirrors the Showit design tokens 1:1, so the migration is invisible to visitors — the site just gets faster.