Gabriel Oghie
Back to Projects

Client Website - Corporate Advisory & Training Platform

GECA Advisory

  • Next.js
  • TypeScript
  • Supabase
  • Sanity CMS
  • Resend

Overview

A corporate website for GECA Advisory, a strategic growth and financial advisory firm, covering its course catalog and training calendar, services (including private-equity advisory sub-services), team, insights/publications and careers, backed by an authenticated admin dashboard for managing leads and content.

Problem

A consulting and training firm needs a professional web presence that showcases its course calendar and services, captures leads through contact, course-enquiry and job-application forms, and lets non-technical staff keep course/service/team content current without a code deploy.

Solution

A Next.js site with its course, service and team content managed in Sanity CMS, public forms that write to Supabase and trigger email notifications via Resend, and a Supabase Auth-gated admin dashboard for reviewing submitted leads and applications.

Key Features

  • Course catalog with a rolling training calendar (multiple upcoming cohort dates per course)
  • Services showcase, including private-equity advisory sub-services
  • Careers page with a real file-upload job application form (resume stored in Supabase Storage)
  • Course-enquiry and contact forms that write to Supabase and email the team via Resend
  • Admin dashboard (Supabase Auth) for reviewing leads, contact submissions and job applications
  • Course, service and team content managed in Sanity CMS instead of hardcoded data

Technology Stack

  • Next.js (App Router)
  • TypeScript
  • Supabase (Auth, Storage, Postgres + RLS)
  • Sanity CMS
  • Resend
  • Vercel

Architecture

Next.js frontend, with course/service/team content served from Sanity CMS and forms, leads and the admin dashboard backed by Supabase (Postgres with Row-Level Security, Auth, Storage); transactional email goes out through Resend.

Database

PostgreSQL via Supabase with tracked SQL migrations; lead tables (contact submissions, job applications, course enquiries, subscribers) are insert-only under Row-Level Security, so the public can submit but not read them back.

API / Backend

Next.js route handlers (e.g. the course-enquiry and careers-application endpoints) write to Supabase and send email via Resend.

Authentication & Authorization

Admin dashboard access is gated by Supabase Auth (email/password), replacing an earlier shared-password/hand-rolled-JWT scheme.

Security

Lead and application data is insert-only for the public/anon role at the database level (Row-Level Security), readable only through the service-role client the admin dashboard uses.

Challenges

Migrating course, service and team content off hardcoded files into Sanity CMS without changing the public-facing data shape, and keeping transactional email (Resend) and resume uploads (Supabase Storage) working through early production build failures caused by SDKs that throw synchronously when credentials are missing at build time.

What I Learned

Not documented yet - see the project source for the current implementation.

Future Improvements

Not documented yet - see the project source for the current implementation.

Live Demo

www.gecaadvisory.com/

GitHub

Source lives in a private repository - no public link available.

Building production-ready software, one system at a time.