Next.jsReactSaaS启动器

saas-starter — Next.js SaaS模板

作者 GenPM-net

基于 Next.js 的 SaaS 起始模板,集成 GitHub 登录、Stripe 订阅、套餐权限控制、事务邮件与 Postgres/Drizzle,后端逻辑以 TypeScript 源码形式放在 src/lib 中。

看看你的网站会是什么样

浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。

2 个预览视图
桌面端首页1 / 2
桌面端截图首屏预览

由服务器浏览器实际访问页面后截取。

全部页面与视图 2

截图用于了解视觉与布局,交互效果请以实际项目为准。

采集于 2026-10-17查看来源

值得关注的模板亮点

从已有项目资料中,快速了解它的特点。

01

GitHub 登录(Google 可选),基于 arctic 实现 OAuth,使用带轮换的 Cookie 会话

02

Stripe 订阅支持结账、客户门户和幂等 webhook,订阅状态镜像到 Postgres

03

通过 hasEntitlement(user, 'pro') 在服务端进行套餐权限判断

04

首次登录时通过 Resend 发送 React Email 欢迎邮件,开发环境输出到控制台

05

Postgres + Drizzle 数据层,每个模块有独立 schema.ts,迁移文件位于 drizzle/

06

每个模块附带 AGENTS.md,供 Claude Code、Cursor、Copilot、Codex 等工具了解模块用法

模板详细介绍

该模板面向需要快速搭建带订阅计费能力的 SaaS 应用场景。README 说明其包含 GitHub 登录(Google 可选)、Stripe 订阅(结账、客户门户、幂等 webhook 同步到 Postgres)、套餐权限控制(通过 hasEntitlement 判断)、首次登录发送欢迎邮件(开发环境打印到控制台)、Postgres + Drizzle 数据层,以及为 AI 编码代理准备的模块说明文件。后端代码位于 src/lib,可直接修改。

使用前需准备 Postgres 数据库、GitHub OAuth 应用、Stripe 测试密钥及若干环境变量,并执行 Drizzle 迁移。本地开发需转发 Stripe webhook 事件。README 还介绍了通过 GenPM 安装额外模块(如 RBAC、存储、任务队列)的方式,但模板本身不包含这些模块。模板未说明生产部署的完整步骤、性能指标或安全审计情况,仅提供 Vercel 部署按钮和 MIT 许可证。

Next.jsReactSaaS启动器

适合你的项目吗?

适用场景

  • 需要快速启动一个带 GitHub 登录和 Stripe 订阅计费的 SaaS 项目
  • 希望后端鉴权、计费、邮件逻辑以可读的 TypeScript 源码形式存在,便于直接修改
  • 使用 AI 编码助手参与开发,希望模块有明确的说明文件辅助修改
  • 需要将 Stripe 订阅状态同步到自有 Postgres 数据库并进行套餐权限控制

适合人群

  • 熟悉 Next.js、TypeScript 和 Postgres 的开发者
  • 需要订阅制 SaaS 基础骨架而非完整成品项目的团队
  • 愿意自行配置 GitHub OAuth、Stripe 和邮件服务的项目

上手与定制指南

结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。

  1. 1

    通过 npx degit 或 GitHub 的 Use this template 获取代码,然后执行 npm install

  2. 2

    复制 .env.example 到 .env.local,并填写 DATABASE_URL、AUTH_SECRET、GitHub OAuth 凭据、Stripe 测试密钥、STRIPE_PRICE_PRO、APP_URL 等变量

  3. 3

    执行 Drizzle 迁移命令初始化数据库,然后运行 npm run dev

  4. 4

    本地开发时使用 stripe listen --forward-to localhost:3000/api/stripe/webhook 转发 Stripe 事件

  5. 5

    生产环境需要配置 RESEND_API_KEY 和 EMAIL_FROM,开发环境邮件会打印到控制台

查看仓库使用说明

授权与来源资料

使用条件与限制

免费使用 · 保留许可声明

本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。

使用时需要遵守

  • 允许免费使用、修改、商用和分发该版本代码。
  • 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
  • 代码按现状提供;担保与责任限制以原许可证及适用法律为准。

额外费用与待核对事项

  • 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
  • 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
  • 需要自备 Postgres 数据库(本地、Neon、Supabase 或 RDS 均可),模板本身不提供数据库服务。
  • 需自行创建 GitHub OAuth 应用并提供 GITHUB_CLIENT_ID 与 GITHUB_CLIENT_SECRET,回调地址为 <APP_URL>/auth/callback/github。
  • 需自备 Stripe 测试模式密钥与 webhook 密钥,并配置 webhook 端点及指定事件。
  • 需自行创建 Stripe 月度 Pro 价格并提供其 price_… 标识。
  • 生产环境必须配置 RESEND_API_KEY 与 EMAIL_FROM;开发环境可省略,邮件仅打印到控制台。
  • 本地开发需运行 stripe listen 将 Stripe 事件转发到 /api/stripe/webhook,否则订阅状态无法同步。
  • 使用前需执行 Drizzle 迁移命令初始化数据库结构。
  • RBAC、存储、任务队列等额外模块需通过 GenPM 另行安装,模板本身不包含这些模块。
  • 安装额外模块需使用 GenPM 安装脚本或 CLI,属于外部工具依赖。
  • src/lib 下的各模块各自附带 LICENSE 文件,使用或再分发时需一并保留其许可声明。
查看原文依据

Permission is hereby granted, free of charge

许可证原文

| `DATABASE_URL` | Any Postgres: local, [Neon](https://neon.tech), Supabase, RDS. |

README 原文

| `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | A [GitHub OAuth app](https://github.com/settings/developers) with callback `<APP_URL>/auth/callback/github`. |

README 原文

| `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET` | Test-mode keys. Webhook endpoint `<APP_URL>/api/stripe/webhook` with `checkout.session.completed` and `customer.subscription.created/updated/deleted`. |

README 原文

| `STRIPE_PRICE_PRO` | The `price_…` id of your monthly Pro price. |

README 原文

| `RESEND_API_KEY`, `EMAIL_FROM` | Optional in development (emails are printed). Required in production. |

README 原文

Locally, forward Stripe events: `stripe listen --forward-to localhost:3000/api/stripe/webhook`.

README 原文

node --env-file=.env.local node_modules/drizzle-kit/bin.cjs migrate --config src/lib/db/drizzle.config.ts

README 原文

genpm add @core/rbac @core/storage @core/jobs

README 原文

curl -fsSL https://genpm.net/install.sh | sh # or: npx @genpm-net/cli <command>

README 原文

MIT. The modules in `src/lib` are MIT as well (see each `LICENSE`).

README 原文
https://github.com/GenPM-net/saas-starter/blob/main/LICENSEhttps://github.com/GenPM-net/saas-starter/blob/main/README.md

DeepSeek 根据仓库许可证和 README 整理 ·2026-10-17。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。

项目核对记录与介绍依据

模板资料

来源平台
GitHub
资料与维护参考分
资料较完整 · 85 / 100
技术栈
Next.js · React
网站类型
SaaS · 启动器
这个分数如何计算

本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。

这个项目需要核对什么

记录的仓库更新时间
2026-10-16
截图检查日期
2026-10-17

已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。

目录记录的主要技术栈是 Next.js。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。

查看具体选型方法 →

介绍的制作与核对状态

介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。

审核声明: codex-user-requested-batch-review-20261018 · 2026-10-18

查看当时使用的来源资料

SHA-256: b67aae9f102d833174c46aa1352749d0101cd249cff566276ac4597fc13abc1d

2026-10-17T01:55:12.739Z

来源文件 / 仓库
# Next.js SaaS Starter

**Next.js 16 + GitHub login + Stripe subscriptions + plan gating + transactional email + Postgres/Drizzle.**
No auth library to configure, no billing SDK to learn: the whole backend is plain TypeScript in `src/lib`, readable and
yours to change, installed with [GenPM](https://genpm.net) and pinned to verified commits.

[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FGenPM-net%2Fsaas-starter&env=DATABASE_URL,AUTH_SECRET,GITHUB_CLIENT_ID,GITHUB_CLIENT_SECRET,STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,STRIPE_PRICE_PRO,APP_URL&envDescription=Postgres%20URL%2C%20a%2032-char%20AUTH_SECRET%2C%20a%20GitHub%20OAuth%20app%20and%20Stripe%20test%20keys&envLink=https%3A%2F%2Fgithub.com%2FGenPM-net%2Fsaas-starter%23environment-variables&project-name=saas-starter&repository-name=saas-starter)

![Landing page of the starter](docs/screenshot.jpg)

## What's included

| Feature | Where | How |
|---|---|---|
| GitHub login (Google optional) | `src/lib/auth` | Cookie sessions with rotation, OAuth via [arctic](https://arcticjs.dev). Routes in `src/app/auth`. |
| Stripe subscriptions | `src/lib/billing`, `src/lib/stripe` | Checkout, customer portal, idempotent webhooks mirrored into Postgres. |
| Plan gating | `src/lib/billing/plans.ts` | `await hasEntitlement(user, 'pro')` anywhere on the server. |
| Welcome email | `src/lib/email` | React Email templates sent with Resend on first login (console in development). |
| Postgres + Drizzle | `src/lib/db` | One client, a `schema.ts` per module, migrations in `drizzle/`. |
| Rules for your AI agent | `src/lib/*/AGENTS.md` | Claude Code, Cursor, Copilot and Codex know how each module works before changing it. |

## Quick start

```bash
npx degit GenPM-net/saas-starter my-saas && cd my-saas    # or "Use this template" on GitHub
npm install
cp .env.example .env.local                               # fill it in (see below)
node --env-file=.env.local node_modules/drizzle-kit/bin.cjs migrate --config src/lib/db/drizzle.config.ts
npm run dev
```

Open http://localhost:3000, sign in with GitHub, then upgrade with Stripe's test card `4242 4242 4242 4242`.
Locally, forward Stripe events: `stripe listen --forward-to localhost:3000/api/stripe/webhook`.

## Environment variables

| Variable | What |
|---|---|
| `DATABASE_URL` | Any Postgres: local, [Neon](https://neon.tech), Supabase, RDS. |
| `AUTH_SECRET` | 32+ random chars: `openssl rand -base64 32`. |
| `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | A [GitHub OAuth app](https://github.com/settings/developers) with callback `<APP_URL>/auth/callback/github`. |
| `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET` | Test-mode keys. Webhook endpoint `<APP_URL>/api/stripe/webhook` with `checkout.session.completed` and `customer.subscription.created/updated/deleted`. |
| `STRIPE_PRICE_PRO` | The `price_…` id of your monthly Pro price. |
| `APP_URL` | Public URL of the app (used in emails). |
| `RESEND_API_KEY`, `EMAIL_FROM` | Optional in development (emails are printed). Required in production. |

## Add more modules

Need roles and permissions, file uploads, background jobs, a blog or a whole store?

```bash
curl -fsSL https://genpm.net/install.sh | sh     # or: npx @genpm-net/cli <command>
genpm search roles
genpm add @core/rbac @core/storage @core/jobs
```

Or ask your agent: run `genpm mcp setup` once, then *"add role-based access control with genpm"*. Every install shows a
dry-run plan first, never runs install scripts, and lands as source code you own. `genpm outdated` and `genpm update`
bring module updates in with a three-way merge that keeps your edits. Browse the catalog at [genpm.net](https://genpm.net).

## How this template was made

```bash
npx create-next-app@latest saas-starter --ts --app --src-dir --tailwind --eslint
genpm add @core/billing @core/email --install-deps    # pulls @core/auth, @core/db and @core/stripe
```

Then the integration steps from each module's `AGENTS.md`: route handlers in `src/app`, the price → feature map in
`plans.ts`, `allowImportingTsExtensions` in `tsconfig.json`, and the landing and account pages. `genpm.lock` records
the exact commit of every module.

## License

MIT. The modules in `src/lib` are MIT as well (see each `LICENSE`).
反馈内容错误

看看同类模板

对比同技术栈与用途的模板,找到更适合的视觉与内容结构。