← back to blog
·
certeliinfrastructurenextjs

Building Certeli — What I Learned Making a Certification Platform

How I built a certification exam platform from scratch with 30K+ questions, Stripe billing, and self-hosted infrastructure.

Why I Built It

I noticed a gap in the certification prep space — most platforms either charged a fortune, had low-quality questions, or focused on one exam. I wanted a platform where anyone could prep for any major certification at a fair price, with questions that actually reflected the real exams.

The Numbers So Far

  • 49 exams across AWS, Azure, GCP, CompTIA, and more
  • 32,000+ questions with explanations
  • 133 labs and 10 roadmaps
  • Self-hosted on a VPS with PostgreSQL

Stack Choices

Next.js 16

The obvious choice for a content-heavy platform. Server components keep the pages fast, static generation handles the exam listing pages, and dynamic routes handle each exam's question flow.

Self-hosted PostgreSQL

I chose to self-host rather than use a managed service because:

  • Full control over query optimisation (some exam queries are complex)
  • No per-row pricing (30K questions adds up fast)
  • Familiar tooling

Stripe

Live billing with Stripe for subscriptions. The webhook integration handles checkout sessions, subscription lifecycle, and payment events.

Biggest Lessons

Content quality is hard. Generating 30K+ exam-quality questions is an ongoing process — each one needs correct answers, plausible distractors, and clear explanations. I've built content pipelines, validation scripts, and audit tools to keep quality high.

Self-hosting gives you control but costs you time. PM2 management, Caddy config, database backups, Let's Encrypt certs — it's all on you. Worth it for my use case, but I wouldn't recommend it for every project.

What's Next

  • AI-powered question generation (for draft creation, not drop-in)
  • More exams (still gaps in the catalogue)
  • Better analytics for users tracking their progress

It's been a great build. More on specific technical decisions in future posts.