CISNET — IT certification training.
Marketing site + SEO rebuild.

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.

CLIENT
IT Training · Toronto
SCOPE
Site + SEO + Pipeline
DELIVERED
2025-Q4 · 3 MO
ROLE
Solo · End-to-end
01 / 05THE PROBLEM

Legacy PHP that couldn't grow.

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.

  • Brittle stack: PHP 5.6, no test suite, manual FTP deploys
  • No lead infrastructure: contact-form-to-email only, no CRM, no admin view
  • SEO at risk: 70+ ranked legacy URLs that couldn't break
  • Marketing blocked: couldn't ship landing pages without engineering
02 / 05THE APPROACH

Next.js 16 + programmatic SEO + lead infrastructure.

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.

  • Foundation: Next.js 16 (app router), TypeScript strict, Supabase, Vercel
  • SEO surface: 200+ pSEO pages generated from a cert × city matrix
  • Redirects: 70+ legacy URLs mapped individually (not catch-all)
  • Schema: 7 types — Course, LocalBusiness, FAQPage, Organization, BreadcrumbList, ContactPoint, WebSite
  • Lead pipeline: FB Lead Ads → HMAC-verified webhook → Supabase → admin dashboard → Resend
  • Payments: Stripe Checkout + course-enrollment webhook
03 / 05THE STACK

Boring, fast, debuggable.

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.

Next.js 16 TypeScript Vercel Supabase Tailwind Stripe Resend FB Lead Ads API MDX Zod React Hook Form Plausible
04 / 05THE TIMELINE

12 weeks, 3 streams, no scope creep.

Locked scope in week 0. Anything that came up after that went into a "v2 list" — none of it shipped during the engagement.

WK 0Kickoff + scope lock. Written spec signed. Redirect map drafted from server logs.
WK 1–4Foundation stream. Next.js 16 scaffold, marketing pages 1:1 port, Supabase schema, Vercel deploys, redirect map in dev.
WK 4–8SEO stream. Cert × city content model, 200+ pSEO page generation, 7 schema types, sitemap.xml + robots.txt, internal-link graph.
WK 8–12Pipeline stream. FB Lead Ads webhook + HMAC verification, admin dashboard, Resend transactional email, Stripe checkout, payment webhooks.
WK 12Cutover + monitoring. Production deploy, DNS swap, redirect map active, Plausible + Search Console + Sentry wired up. 14-day support window.
05 / 05THE IMPACT

What it enabled.

The headline numbers from the engagement (technical surface metrics — business KPIs are CISNET's to disclose):

PSEO PAGES
200+
Cert × city programmatic pages, indexed within 6 weeks of cutover.
LEGACY URLS PRESERVED
70+
Individually-mapped redirects — ranking authority preserved on every URL.
SCHEMA TYPES
7
Course, LocalBusiness, FAQPage, Organization, BreadcrumbList, ContactPoint, WebSite.
LIGHTHOUSE PERF
98+
Production performance score across all marketing routes.
LEAD CAPTURE
FULL
FB Lead Ads webhook → Supabase → admin dashboard, end-to-end.
DELIVERED IN
3 MO
Fixed-price, fixed-scope. Zero scope creep across 3 streams.

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.

Note:Some business KPIs (organic traffic delta, lead-to-enrollment rates, MRR impact) live with the client and aren't disclosed here. Happy to discuss what's shareable on a call.

Need similar work for your business?
Let's scope it.

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.