Migrated a Toronto IT certification training company off legacy PHP onto Next.js 16. Pages generated from data, a lead pipeline, and an admin portal, in three months, solo. Search rankings preserved through a 70+ URL redirect map.
CISNET's site was a hand-coded PHP build from 2014. One person knew where everything lived. Nobody else could ship into it without an outage. Marketing wanted new certification pages, ads into specific groups, and leads captured into a CRM. Every new page meant a risky deploy.
The bigger risk was search rankings. The old site ranked for ~70 cert-related searches, and any redesign that didn't keep those URLs risked tanking organic traffic for months. ~40% of new business came from that traffic.
Three tracks over 12 weeks. Track 1 (weeks 1-4): stood up Next.js 16, Supabase, and Vercel, copied the marketing pages over exactly, and tested the redirects. Track 2 (weeks 4-8): 200+ pages, one per certification and city, generated from a single content source, plus a sitemap and structured data that tells Google what each page is. Track 3 (weeks 8-12): the lead pipeline. Facebook lead ads flow in through a verified connection, land in Supabase, show up in the admin portal, and trigger email through Resend. Stripe handles payment for paid courses.
The hardest early call was the redirect strategy. I mapped every old URL by hand instead of using a single catch-all rule. It was slower to build, and Google indexed the new URLs with full ranking value inside 6 weeks instead of 6 months.
The default stack: Next.js, Supabase, Vercel. A CMS was an option, but the page volume didn't justify the overhead. Page content lives in the repo as MDX, and copy ships through pull requests.
Scope locked in week 0. Anything new went onto a v2 list, and none of it shipped during the engagement.
Numbers from the engagement, technical only. Business KPIs are CISNET's to share.
Marketing now ships new certification pages through MDX without engineering. Leads are traceable from ad click to enrollment. Ads now target specific group and city combinations that had no landing page before.
The contact-form-to-email setup became a full operations console: lead pipeline, students, enrollments, email campaigns, content, and analytics, built from scratch on Next.js 16 + Supabase. No off-the-shelf CRM, no third-party analytics tax. The team runs the business from here.
I took over the SEO operation in late April 2026: rebuilt the content architecture and structured data, fixed the technical foundation (canonicals, redirects, Core Web Vitals), and shipped a free tools and study-resource layer (subnet calculator, practice quizzes, cheat sheets). It's early, and the reach and visibility signals that move first are all up. Measured in Google Search Console across 28-day windows ending April 30 against June 18, 2026:
Source: Google Search Console, sc-domain property, queried live via a service-account API integration I built into the admin portal. Clicks up ~19% over the same window and compounding as the larger footprint matures; off-page authority is the next focus.
Live Google Search Console dashboards. Account identity blurred; all metrics unedited.
Pravine turned our organic traffic around. We're ranking for searches that sent us nothing before, and he was genuinely easy to work with.
Similar work: a legacy stack to migrate, SEO to preserve, lead infrastructure to build. Discuss the project →