Transactional email
Resend + React Email. Welcome, subscription active, payment failed, magic link, team invitation — five real templates, previewable with npm run email:dev.
A Next.js 15 SaaS boilerplate with auth, Stripe billing, teams with enforced seats, hashed API keys and an admin panel — plus the one thing no other kit ships: a command that audits its own claims before you believe a word of this page.
One-time payment · lifetime updates · 30 days to change your mind, no questions asked
No testimonial wall, because nobody’s face proves a codebase. The demo is open, and the audit runs on your machine.
None of it is your product. All of it stands between you and the first customer who hands you money.
An honest estimate of the hours behind each part, written by the person who wrote them. Every line is code you can open in the demo — or count with npm run audit once it is yours.
An estimate, not an invoice — your hours may be faster. Put your own rate on them anyway.
100 hours → $149, once. The rest of the month goes into the part nobody else can build for you.
Get SaaS Starter — $149
One Next.js 15 app, App Router, server components, TypeScript strict. A
CLAUDE.md that documents the actual
patterns — not a summary of the README — plus Cursor and Copilot instruction files, so
your assistant knows the conventions from the first prompt instead of inventing new ones.
Clerk handles sessions, social login, SSO and the password reset flow you would otherwise write twice. What the kit adds is the part that is actually yours: middleware that protects every locale of every private route, and server helpers that fail closed.
Welcome back
Sign in to continue to Acme.
Three plans configured, monthly and yearly. Checkout, the customer portal, and the four webhook events that actually matter — including the subscription-deleted case most kits forget, which is how a churned customer keeps their paid plan forever.
Current plan
Renews on 1 October 2026
Workspaces, OWNER › ADMIN › MEMBER re-checked in the database on every mutation, and email invitations tied to one address. Seats come from the plan and are enforced: a pending invitation holds a seat, so a free workspace can't invite twenty people and discover the limit when they all accept.
3 members · 1 pending invitation
| Member | Role |
|---|---|
ALAda Lovelaceada@acme.com |
Owner |
GHGrace Hoppergrace@acme.com |
Admin |
ATAlan Turingalan@acme.com |
Member |
?katherine@acme.comInvite expires in 6 days |
Invited |
Every invite, join, role change, removal, rename, API key and plan change lands in an append-only audit trail per workspace. Admins read it on the dashboard, export it to CSV for the auditor, or pipe it into Slack and their SIEM through the API — the thing enterprise buyers ask about on the second call.
ada@acme.com invited katherine@acme.com as Admin
grace@acme.com changed the role of alan@acme.com: Member → Admin
ada@acme.com changed the plan from FREE to PRO
alan@acme.com created the API key ci-deploy (sk_live_7f3a…)
A key is shown once and stored only as a SHA-256 — a dump of the table grants nobody
anything. Keys are gated on the plans that advertise API access, read straight off the
same PLANS object your pricing page
renders, so the table and the gate can't drift apart.
sk_live_7Ka9Xf••••••••••••sk_live_Qm2Vd0••••••••••••Most kits translate the landing page and stop at the login wall. Here the whole signed-in product is localized: dashboard, settings, billing, admin, teams, API keys. Dates, numbers and currency follow the request locale instead of a hard-coded one.
app.organization.seatsUsed
Not seven hues — seven complete themes. Each redefines the whole token set for light
and dark, corner radius included, so
they read as different products rather than the same one tinted. Nothing in a component
names a colour, which is why NEXT_PUBLIC_THEME
can change all of it.
A real admin area, not a placeholder: every user, their plan and role, estimated MRR, active subscriptions, churn and new signups this month — computed from your own database, with no third-party dashboard to wire up first.
| User | Plan | Signed up |
|---|---|---|
ALAda Lovelaceada@acme.com | Business | 2 September 2026 |
GHGrace Hoppergrace@acme.com | Pro | 31 August 2026 |
ATAlan Turingalan@acme.com | Free | 30 August 2026 |
Every one of these is wired and queried. None of them is a model sitting in an empty table waiting for you to finish it.
Resend + React Email. Welcome, subscription active, payment failed, magic link, team invitation — five real templates, previewable with npm run email:dev.
Frontmatter, tags, drafts, full metadata, and posts in the sitemap. Content SEO you can start on the day you launch, not the quarter after.
Dynamic sitemap with every locale, robots.txt, canonical URLs, hreflang, Open Graph and Twitter cards, JSON-LD. Discoverable from the first deploy.
Role hierarchy, seat maths, key hashing, webhook signatures, plan gating, locale parity. Written to catch the mistakes that cost money, not to pad a number.
CSS variables on the shadcn/ui token contract, so npx shadcn add drops components in already themed. System-aware with a manual toggle.
Vercel in three clicks, or the included Dockerfile and docker-compose for your own box. No proprietary runtime, no platform lock-in, no phone-home.
Every boilerplate landing page is a list of claims. This one ships the command that checks them — and it was built to fail, out loud, when the code and the promise disagree.
That was real output from this repository. So the API keys got built, the env vars got wired, and the audit was run again:
Delete the blog, drop the admin panel, strip a plan — then run it again. It names what you left dangling.
npm run audit -- --strict exits 1 on any finding. --json gives a script the same data.
It reads the files on disk: sizes, routes, models with how many times the code queries them, env vars cross-checked against .env.example.
A comparison you can check. Every competitor cell below is what their own site said on 1 September 2026; the links go straight to them. Where we are behind, the table says so — you are going to open both tabs anyway.
| SaaS Starter | supastarter | ShipFast | |
|---|---|---|---|
| Price (single dev) | $149 once | €299 once | $199 once |
| Shape | One Next.js 15 app | Monorepo, several apps | One Next.js app |
| Auth | Clerk | better-auth (self-hosted) | Google OAuth & magic links |
| Payments | Stripe | Stripe, Lemon Squeezy, Polar, Creem, Dodo | Stripe, Lemon Squeezy |
| Database | Prisma + PostgreSQL | Prisma or Drizzle | MongoDB or Supabase |
| Teams & roles | Yes, with enforced seats | Yes | Not advertised |
| API keys | Yes, hashed + endpoint | Not advertised | Not advertised |
| Languages | 8, app included | Yes | Not advertised |
| Admin panel | Users, MRR, churn | SaaS Admin UI | Not advertised |
| Tests shipped | 136 unit tests (Vitest) | Playwright E2E configured | Not advertised |
| Self-audit command | npm run audit | No | No |
| Background jobs, S3, notifications | Not included | Included | Not advertised |
| Error monitoring (Sentry) | Not included | Included | Not advertised |
The honest summary: supastarter is a larger kit — a monorepo with modules this one does not have, at twice the price. If you need file storage, background jobs and Sentry pre-wired, buy that. This kit is one app you can read in an afternoon, where every claim on this page is checkable by a command in the repo. That is the trade.
More angles, at length: the 2026 comparison of Next.js SaaS starter kits, the template walkthrough with the real repo tree, free & open-source options and what "free" costs, Clerk + Prisma vs Supabase, and what buying a kit costs you in shadcn registry compatibility.
No subscription, no seat count, no licence key phoning home. You get the repository, and the hundred hours above back.
For your own product.
One-time · lifetime updates
Secure checkout by Stripe · repository access in minutes
For agencies and serial builders.
One-time · lifetime updates
Secure checkout by Stripe · repository access in minutes
Not sure? Open the live demo and click through the dashboard, the billing page and the team screen before you decide.
Every boilerplate landing page is a list of promises, and you only find out which ones were true after you have paid and cloned. Half-finished models. A table declared in the schema and never queried. An env var in .env.example that nothing reads. You inherit them quietly, and you pay for them three weeks later.
So this kit ships the command I wanted as a buyer: npm run audit. It reads the files on disk and names every gap between what the code declares and what it runs. It found six in this repository, and they got fixed — that terminal output is further up this page, failures included.
That is the whole deal. Not “trust me” — “check me, here is the command.” It runs on your fork too, the day you delete something and want to know what you left dangling.
— the developer who maintains this repository
Auth, billing, teams, API keys, admin, emails, eight languages — and the command that proves every word of it. Thirty days to change your mind.