Legacy CMS to Next.js + Supabase Migration
Your Legacy CMS Bleeds Revenue While You Wait For Developer Replies
Why leave ExpressionEngine / MODX / Custom PHP CMS?
- Stagnant add-on ecosystems leave critical extensions unpatched for years, creating security vulnerabilities your compliance team flags in every audit
- Shrinking talent pools turn routine updates into three-week contractor searches, while your marketing team's campaign launch slips another fortnight
- Accumulated technical debt transforms simple feature requests into £8K custom development projects with two-month lead times
- Mobile Lighthouse scores stuck at 45-65 trigger Core Web Vitals failures that push your category pages below faster competitors in Search Console
- Server hosting burns £200-800/month for managed PHP environments that still deliver 1.2-2.5 second response times under moderate traffic
- Monolithic architecture couples your content model to presentation logic, forcing full regression testing every time your designer tweaks a layout component
What you gain
- Mobile Lighthouse scores hit 95-100 with green Core Web Vitals across every template, moving your pages up in organic rankings within the first billing cycle
- Global TTFB drops to sub-300ms via edge deployment on Vercel's network, replacing the 1.8-second lag your analytics team sees in session recordings
- Hosting costs fall to £50-200/month on managed infrastructure that auto-scales to traffic spikes your legacy VPS would crash under
- TypeScript + React codebase opens your talent pool to thousands of senior developers, ending your dependency on the two contractors who still remember MODX syntax
- Supabase consolidates PostgreSQL, auth, realtime, and storage into one managed platform — eliminating your separate MySQL + Redis + S3 + Auth0 bill
- Decoupled content API lets your team publish changes via Supabase Studio while your dev team ships frontend updates independently, cutting deployment friction by 70%
ExpressionEngine served its purpose. MODX was genuinely innovative for its era. That custom PHP CMS your agency built in 2011? It worked. But "worked" is past tense, and that matters.
These platforms share a common trajectory: dwindling plugin ecosystems, security patches that arrive months late (or never), developers who've moved on, and performance scores that make Google's Core Web Vitals look like a horror film. You're paying premium hosting costs for servers that struggle to break 2-second page loads while a static site on a £20/month plan runs circles around you.
We've migrated ExpressionEngine sites with 15,000+ entries, MODX installations running 40+ custom snippets, and bespoke PHP CMS platforms with undocumented database schemas. Every one of them now runs on Next.js with Supabase, scores green across all Core Web Vitals, and costs less to host than the legacy stack did.
Why ExpressionEngine and MODX Migrations Fail
Most agencies treat a CMS migration like a redesign project. They build a pretty new site, do a CSV export, bulk import, set up some redirects, and call it done. Then you watch your organic traffic drop 40% over six weeks.
Here's what actually goes wrong:
Content Modelling Mismatch
ExpressionEngine's channel fields and MODX's template variables don't map cleanly to modern content structures. A "textarea" field containing HTML with inline styles, embedded images with relative paths, and custom shortcodes needs intelligent transformation — not a find-and-replace script.
URL Structure Fragmentation
Legacy PHP CMS platforms love generating URLs with parameters, category prefixes, and date-based structures that don't match modern routing conventions. Miss a single redirect pattern and you've got a 404 page where your highest-traffic landing page used to be.
Template Logic Buried in Content
MODX chunks and snippets, ExpressionEngine's template tags, custom PHP includes — these aren't content. They're presentation logic that got tangled into your database over a decade of organic growth. Separating content from display logic is the actual hard work of migration, and it's the part most agencies skip.
Authentication and User Data
If your legacy CMS handles member logins, custom user roles, or gated content, you can't just ignore that data. Password hashes need migrating, or users need a graceful re-authentication flow.
What Next.js + Supabase Actually Gives You
This isn't a marginal upgrade. It's an architectural leap.
Next.js for the Frontend
Next.js gives you static generation for content pages (sub-100ms TTFB), server-side rendering for dynamic routes, React Server Components for complex layouts without client-side JavaScript bloat, and incremental static regeneration so your content team publishes changes that go live in seconds without a full rebuild.
Your Lighthouse scores jump from the 45-65 range to 95-100. Not because of tricks — because the architecture is fundamentally faster.
Supabase for the Backend
Supabase provides a PostgreSQL database with a REST and GraphQL API out of the box. Row-level security handles permissions without middleware. Real-time subscriptions power live features. Built-in auth handles everything from email/password to OAuth providers. Edge functions handle server-side logic at the CDN edge.
For most legacy CMS migrations, Supabase replaces the entire backend stack: database, authentication, file storage, and API layer. One platform, one bill, no server maintenance.
Headless CMS Integration
For content teams who need a familiar editing interface, we integrate Sanity, Payload CMS, or Storyblok as the editorial layer. Content editors get a modern UI. Developers get structured APIs. Supabase handles everything that isn't pure content: user data, application state, analytics, form submissions.
Our Migration Process
We run a five-phase process built specifically for legacy PHP CMS platforms. No big-bang cutovers. No crossed fingers.
Phase 1: Deep Audit (Week 1-2)
We crawl your existing site completely. Every URL, every content type, every template, every redirect already in place. We map your ExpressionEngine channels or MODX resources to a modern content schema. We document custom functionality — search, forms, member areas, e-commerce hooks, third-party integrations.
Deliverable: a migration specification document with content model mappings, URL redirect map, and functionality inventory.
Phase 2: Infrastructure Build (Week 2-4)
We set up the Next.js application, configure Supabase (database schema, auth rules, storage buckets), and deploy to Vercel or Cloudflare Pages. CI/CD pipeline, preview environments, staging domain — all configured before any content moves.
Phase 3: Content Migration (Week 3-6)
Custom migration scripts extract content from your legacy database, transform it (cleaning HTML, resolving image paths, converting shortcodes to structured data), and load it into the new system. We run this iteratively — migrate, validate, fix edge cases, re-run.
For ExpressionEngine, we connect directly to the MySQL database and parse channel data with field type awareness. For MODX, we handle the resource tree, template variables, and chunk references. For custom PHP CMS platforms, we reverse-engineer the schema and build bespoke extractors.
Phase 4: Frontend Build (Week 4-8)
Next.js pages and components built to match (or improve) your existing design. Every page template from the legacy site gets a modern equivalent. We optimise images, implement responsive layouts, and make sure every page hits green Core Web Vitals before launch.
Phase 5: SEO Cutover and Go-Live (Week 7-10)
This is where migrations succeed or fail. Our cutover process:
- 301 redirect map deployed and tested against the full URL crawl from Phase 1
- XML sitemaps regenerated and submitted to Google Search Console
- Canonical tags, hreflang, and structured data preserved or improved
- Real-time monitoring for 404 spikes, crawl errors, and ranking movement for 30 days post-launch
- Zero-downtime DNS cutover — legacy site stays live as fallback until we confirm clean indexing
We guarantee no ranking loss attributable to the migration. If Google drops a page because of a redirect we missed, we fix it same-day.
SEO Preservation Strategy
SEO preservation isn't a phase — it's a constraint that governs every decision throughout the project.
We export your full backlink profile and cross-reference it against the redirect map. Internal links are updated programmatically, not manually. We preserve page authority by maintaining URL structures where possible and implementing proper redirect chains where they change.
Next.js gives us server-side rendering for crawlers, which means Google sees fully-rendered HTML at first request — no JavaScript rendering delays that plague SPA migrations. Combined with sub-300ms TTFB from edge deployment, your pages get crawled faster and indexed more completely than they ever were on the legacy stack.
Timeline and Pricing
Transparent pricing means you know the range before the first call.
| Project Size | Content Volume | Timeline | Investment |
|---|---|---|---|
| Standard | Up to 500 pages | 6-8 weeks | £12,000 - £25,000 |
| Mid-scale | 500-5,000 pages | 8-12 weeks | £25,000 - £55,000 |
| Enterprise | 5,000+ pages, custom functionality | 12-20 weeks | £55,000 - £120,000 |
Pricing includes the audit, migration scripts, Next.js build, Supabase configuration, SEO cutover, and 30 days of post-launch monitoring. No hourly billing surprises. Ongoing hosting on Vercel + Supabase typically runs £50-200/month depending on traffic — a fraction of legacy server costs.
100% Green Core Web Vitals Guarantee
Every page we ship passes Google's Core Web Vitals assessment with green scores across LCP, INP, and CLS. Not on a fast connection in a lab test — in the field, measured by real users via CrUX data.
If any page fails CWV within 90 days of launch due to our implementation, we fix it at no additional cost. We can make this guarantee because the Next.js + Supabase architecture, deployed to edge CDNs, is inherently fast. We're not fighting the platform to get good scores — the platform delivers them by default when built correctly.
UK and US Coverage
We work with teams across the UK and US, with deployment optimised for both markets. Vercel and Cloudflare edge networks ensure your site loads fast whether your users are in London, Leeds, Los Angeles, or Louisville. All projects include GDPR-compliant data handling for UK/EU audiences and SOC 2-aligned practices for US enterprise requirements.
The migration process
Discovery & Audit
We map every page, post, media file, redirect, and plugin. Nothing gets missed.
Architecture Plan
New stack designed for your content structure, SEO requirements, and performance targets.
Staged Migration
Content migrated in batches. Each batch verified before the next begins.
SEO Preservation
301 redirects, canonical tags, sitemap, robots.txt — every ranking signal carried over.
Launch & Monitor
DNS cutover with zero downtime. 30-day monitoring period included.
ExpressionEngine / MODX / Custom PHP CMS vs Next.js + Supabase
| Metric | ExpressionEngine / MODX / Custom PHP CMS | Next.js + Supabase |
|---|---|---|
| Lighthouse Mobile | 45-65 | 95-100 |
| TTFB | 1.2-2.5s | <0.3s |
| Build/Deploy | FTP upload, manual cache clear | Git push, auto-deploy in <60s |
| Hosting Cost | £200-800/mo | £50-200/mo |
| Developer Availability | Scarce (EE/MODX specialists) | Abundant (React/Next.js ecosystem) |
| API / Headless Support | None or bolted-on | Native REST + GraphQL via Supabase |
Common questions
How long does an ExpressionEngine to Next.js migration take?
A typical ExpressionEngine migration takes 6-12 weeks depending on content volume and custom functionality. Sites under 500 pages with standard channel fields finish in 6-8 weeks. Larger sites with member systems, custom add-ons, or complex template logic stretch to 12-20 weeks. We give you an exact timeline after the audit phase.
Will I lose SEO rankings during the migration?
No. Our migration process includes a full 301 redirect map built from a complete site crawl, server-side rendering for search engines, and 30 days of post-launch monitoring. We preserve URL structures, canonical tags, structured data, and hreflang attributes. We guarantee no ranking loss caused by the migration itself.
Can you migrate a custom PHP CMS with no documentation?
Yes. We reverse-engineer undocumented database schemas by analysing table structures, relationships, and content patterns directly. We've migrated custom PHP CMS platforms built over 10+ years with zero documentation. The audit phase maps every content type, relationship, and custom function before we write a single line of migration code.
What happens to our MODX template variables and snippets?
MODX template variables are mapped to structured content fields in your new CMS or Supabase schema. Snippets and chunks containing presentation logic are rebuilt as Next.js components. Content embedded in chunks is extracted and stored as structured data. The end result is a clean separation of content and presentation that was never really possible in MODX.
How does zero-downtime migration work?
We run both systems in parallel during the cutover period. Your legacy CMS stays live while the new Next.js site is fully built and tested on a staging domain. DNS is switched with minimal TTL, and we keep the legacy server available as a fallback. Real-time monitoring catches any issues within minutes of go-live.
What does the Core Web Vitals guarantee actually cover?
Every page we build will pass Google's Core Web Vitals assessment — LCP under 2.5s, INP under 200ms, CLS under 0.1 — measured in the field via Chrome User Experience Report data. If any page fails within 90 days of launch due to our code, we fix it at no cost. This covers our implementation, not third-party scripts you add after launch.
Why Next.js and Supabase instead of WordPress or another CMS?
WordPress would replicate many of the same problems you're trying to leave behind: monolithic architecture, plugin dependency, server-side PHP rendering, and security overhead. Next.js delivers static and server-rendered pages at edge CDN speed. Supabase provides a managed PostgreSQL backend with built-in auth and APIs — no servers to maintain, no plugin updates to worry about.
Do you offer ongoing support after migration?
Yes. Every migration includes 30 days of post-launch monitoring and bug fixes. Beyond that, we offer monthly retainer packages for ongoing development, content model changes, performance monitoring, and Supabase administration. Most clients move to a lightweight support plan after the initial stabilisation period.
Ready to migrate?
Free assessment. We'll audit your current site and give you a clear migration plan — no commitment.
Let's build
something together.
Whether it's a migration, a new build, or an SEO challenge — the Social Animal team would love to hear from you.