Stop 21 · Build AI Engineer Portfolio ProjectsProjects · 7/8

AI-Powered SaaS MVP

Part of the AI Engineer Roadmap

In short

A clever AI script is a demo. Add sign-up, saved history, usage limits and a deployed frontend, and it becomes a product people can use. It proves you can ship the boring parts too.

A small but complete product with AI at its core, real authentication, a database, and a deployed frontend — proves you can ship an AI feature inside a real product, not just a script.

The purple blob packs a steel tiffin box at a table with a cash box, an order bell and a scooter nearby.

Think of it like this

Starting a tiffin service

Great dal isn't enough to run a tiffin service. You need a list of customers, a way to take orders, delivery, payment and a limit on how many tiffins you can cook a day. Your AI model is the recipe. The SaaS around it is everything else that makes it a business.

Watch it happen

One request in the AI notes summariser

Browser
API
Database
LLM

POST /api/summarise

1/7A signed-in student pastes lecture notes. The session cookie goes along with the request.

The big ideas

What you need to know

Real auth from day one

Use an auth library or service rather than rolling your own. Every row in the database belongs to a user.

Usage limits protect your wallet

Each AI call costs money. Daily limits per user and capped input size stop one user draining your budget.

Keys stay on the server

Call the LLM from your backend only. A key in frontend code can be copied by anyone.

Real users, real feedback

Get five friends to use it for a week. Their confusion is the most useful data you'll collect.

See it in code

Walk through the code

ts
1export async function POST(req: Request) {2  const user = await getUser(req);               // from your auth library3  if (!user) return Response.json({ error: "Sign in first" }, { status: 401 });4 5  const used = await db.usage.count({ where: { userId: user.id, day: today() } });6  if (used >= user.dailyLimit) {7    return Response.json({ error: "Daily limit reached" }, { status: 429 });8  }9 10  const { text } = await req.json();11  const summary = await summarise(text.slice(0, 20_000)); // cap input size and cost12  await db.usage.create({ data: { userId: user.id, day: today() } });13  await db.summary.create({ data: { userId: user.id, text, summary } });14  return Response.json({ summary });15}

1/4No signed-in user, no AI call. Return 401.

A Next.js route with three checks every AI product needs: who are you, are you within your limit, is the input a sane size. getUser, db and summarise are your helpers.

Save yourself the pain

Common mistakes

Oops

Calling the LLM API straight from the browser with the key in your frontend code.

Do this instead

Route every AI call through your backend. Keep the key in a server-side environment variable.

Oops

Spending three weeks on a landing page before the core feature works.

Do this instead

Build the one AI feature, auth and history first. Polish comes after someone has used it.

Your mission

Milestone one: signed-in AI feature

~45 min

Quick check

Where should the call to the LLM API happen in your SaaS?

Go deeper

  1. 1Scope it tightly: one AI feature done well beats five features half-built.
  2. 2Include real auth, persistence and a usable UI, not just an API endpoint.
  3. 3Track and display usage/cost so the AI feature feels production-aware, not a toy.

More projects at this stop

Stuck on this topic? Ask an Insider

Get 1:1 guidance from people who've walked this exact path — on the InsideEdge app.

Download
InsideEdge