Migrated a Toronto IT certification training company off legacy PHP onto Next.js 16. Full programmatic SEO. Lead pipeline. Admin portal. 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 because one person knew where everything was. Breakable because nobody else could ship into it without an outage. Marketing wanted new certification pages. Paid campaigns into specific cohorts. Leads captured into a CRM. Engineering reality: every new page was a Friday deploy with the lights flickering.
The deeper issue was 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. 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+ cert × city pages from a structured content model. Ship sitemap.xml + 7 distinct schema types. Stream 3 (weeks 8-12): lead pipeline. Facebook Lead Ads webhook with HMAC verification. Supabase storage. Admin portal. Resend transactional email. Stripe Checkout for paid courses.
Hardest call early on: how aggressive to be on the redirect strategy. I mapped every legacy URL individually rather than rely on Next.js catch-all rewrites. Slower to build. Google indexed the new URLs with full link equity inside 6 weeks. Not 6 months.
Default opinionated stack: Next.js + Supabase + Vercel. Could've used a CMS for the marketing pages. 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 went into a "v2 list." None of it shipped during the engagement.
Headline numbers from the engagement. Technical surface only. Business KPIs are CISNET's to disclose.
Beyond the numbers: marketing ships new certification pages through MDX without engineering. Lead routing is observable end-to-end. Ad campaigns target specific cohort × city combinations that previously had no landing page.
Async-first actually works the way he runs it. Daily Looms, written summaries, no meeting tax. The migration ran 3 months without a single live call drift.
Same surface area? Legacy stack to migrate, SEO to preserve, lead infrastructure to build. Discuss the project →