Migrated a Toronto IT certification training company off a legacy PHP stack onto Next.js 16 with full programmatic SEO, lead pipeline, and admin dashboard. Three months. Solo. Ranking authority preserved through a 70+ URL redirect map.
CISNET's existing site was a hand-coded PHP build from 2014. Maintainable in the sense that one person knew where everything was — and breakable in the sense that nobody else could ship into it without an outage. Marketing wanted to add new certification pages, run paid campaigns into specific cohorts, and capture leads into a CRM. Engineering reality was: every new page was a Friday deploy with the lights flickering.
The deeper issue: SEO momentum. The legacy site ranked for ~70 cert-related queries. Any redesign that didn't preserve those URLs risked tanking organic traffic for a quarter or more — and the business depended on that organic flow for ~40% of intake.
Three parallel workstreams over 12 weeks. Stream 1 (weeks 1-4): stand up the Next.js 16 + Supabase + Vercel foundation, port the marketing pages 1:1, run the redirect map in dev. Stream 2 (weeks 4-8): programmatic SEO — generate 200+ certification × city pages from a structured content model, ship sitemap.xml + 7 distinct schema types (Course, LocalBusiness, FAQPage, etc.). Stream 3 (weeks 8-12): lead pipeline — Facebook Lead Ads webhook with HMAC verification, Supabase storage, admin dashboard, Resend transactional email, Stripe checkout for the paid courses.
Hardest call early on: how aggressive to be on the redirect strategy. Decided to map every legacy URL individually rather than rely on Next.js catch-all rewrites — slower to build, but Google indexed the new URLs with full link equity inside 6 weeks rather than 6 months.
Default opinionated stack — Next.js + Supabase + Vercel. Could've used a CMS for the marketing pages but the editorial volume didn't warrant the operational tax. Page content lives in MDX in the repo; engineers ship copy through PRs.
Locked scope in week 0. Anything that came up after that went into a "v2 list" — none of it shipped during the engagement.
The headline numbers from the engagement (technical surface metrics — business KPIs are CISNET's to disclose):
Beyond the numbers: marketing can now ship a new certification page through MDX without engineering. Lead routing is observable end-to-end. Ad campaigns can target specific cohort × city combinations that previously didn't have a landing page.
If you're looking at a similar surface — legacy stack to migrate, SEO to preserve, lead infrastructure to build — the 30-min call is free and ends with a written quote.