Website Configuration
Manage site metadata, routing, auth, payments, notifications, email, docs, and legal pages from config/website.ts.
ShipNext keeps most launch-time switches in config/website.ts. Updating this file changes the navbar, sign-in surfaces, email sender, docs entry, legal links, and related behavior without hunting through feature code.
After completing Quick Launch, review this file alongside .env.local and the third-party integrations you plan to enable.
File location
config/
└── website.tswebsite.ts exports websiteConfig:
export const websiteConfig = {
metadata: metadataConfig,
ui: uiConfig,
routes: routeConfig,
auth: authConfig,
payment: paymentConfig,
notify: notifyConfig,
email: emailConfig,
newsletter: newsletterConfig,
docs: docsConfig,
legal: legalConfig,
};metadata - site metadata
Controls brand name, SEO description, production URL, and static asset paths.
| Field | Description | Used by |
|---|---|---|
title | Site name | Navbar, sidebar, email templates, docs title |
description | Site description | SEO metadata |
url | Production site URL with protocol | Emails, canonical URLs, support links |
logo | Logo path relative to public/ | Replace public/logo.svg as needed |
favicon | Favicon path | Browser tab icon |
const metadataConfig = {
title: "ShipNext",
description: "ShipNext is a modular Next.js SaaS template with authentication, payments, dashboard, docs, blog, and i18n built in.",
url: "https://shipnext.pro",
logo: "/logo.svg",
favicon: "/favicon.ico",
};Before launch, replace title, description, and url with your real product information.
ui - theme behavior
The ui section controls default color mode and whether users can switch themes. If switching is disabled, the app forces the configured light or dark mode unless the default is system.
routes - auth routes
| Field | Default | Description |
|---|---|---|
defaultLoginRedirect | / | Default destination after sign-in |
signIn | /sign-in | Sign-in page |
signUp | /sign-up | Sign-up page |
forgotPassword | /forgot-password | Forgot password page |
resetPassword | /reset-password | Reset password page |
verifyEmail | /verify-email | Email verification page |
Keep these values aligned with the actual App Router paths.
auth - sign-in methods and captcha
| Field | Type | Description |
|---|---|---|
enableEmailVerification | boolean | Require email verification |
enableCredentialLogin | boolean | Email and password login |
enableMagicLinkLogin | boolean | Passwordless email login |
enableGoogleLogin | boolean | Google OAuth |
enableGitHubLogin | boolean | GitHub OAuth |
captcha.enable | boolean | Global captcha switch |
captcha.scenarios.signIn | boolean | Protect sign-in and magic links |
captcha.scenarios.signUp | boolean | Protect sign-up |
const authConfig = {
enableEmailVerification: true,
enableCredentialLogin: true,
enableMagicLinkLogin: true,
enableGoogleLogin: true,
enableGitHubLogin: true,
captcha: {
enable: true,
provider: "turnstile",
scenarios: {
signIn: true,
signUp: true,
},
},
};OAuth providers also require credentials in .env.local.
payment - billing provider
| Field | Description |
|---|---|
provider | Default payment provider: stripe, paddle, or lemonsqueezy |
planChange.chargeStrategy | How upgrades are charged |
testingEnabled | Payment test flag; the current runtime mostly reads PAYMENT_TESTING_ENABLED |
planChange.chargeStrategy can be:
| Value | Meaning |
|---|---|
flat_difference | Charge the flat difference between plans |
prorated_remaining_time | Prorate by remaining time in the cycle |
See Stripe for the default provider setup.
notify - operational notifications
Send registration, subscription, and payment events to Telegram, Discord, Slack, or Feishu.
const notifyConfig = {
provider: "telegram",
events: {
userRegistered: true,
userSubscription: true,
userPayment: true,
},
};Turn individual events off by setting them to false. Provider-specific secrets live in environment variables.
email - transactional email
| Field | Description |
|---|---|
provider | Email provider, currently resend |
fromEmail | Sender address verified in Resend |
Used by verification email, password reset, magic links, and other transactional templates.
newsletter - mailing list subscription
Newsletter uses Resend Contacts through a separate provider from transactional email. Both share RESEND_API_KEY, but the application entrypoints are separate.
docs - docs and blog switches
| Field | Description |
|---|---|
enabled | Enables /docs; if false, docs return 404 |
Docs content is stored in content/docs/en and content/docs/zh. Docs language switching is scoped to docs and does not add locale prefixes to the route.
legal - legal pages
Legal pages are declared in legal.pages:
| Field | Description |
|---|---|
slug | Content slug |
href | Public link path |
labelKey | Footer translation key |
title | Default configured title |
Pages not listed in legal.pages should return 404.
Recommended configuration order
- Update
metadatawith brand name, URL, and icons. - Confirm theme behavior in
ui. - Adjust auth methods and captcha.
- Configure
email.fromEmailand Resend. - Enable payments, notifications, and newsletter as needed.
- Check
docsandlegalfor launch scope.
Next steps
- Quick launch - Minimum local setup.
- Email - Resend and transactional email.
- Stripe - Subscriptions and Checkout.
- Project structure - Directory responsibilities.