ShipNext

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.ts

website.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.

FieldDescriptionUsed by
titleSite nameNavbar, sidebar, email templates, docs title
descriptionSite descriptionSEO metadata
urlProduction site URL with protocolEmails, canonical URLs, support links
logoLogo path relative to public/Replace public/logo.svg as needed
faviconFavicon pathBrowser 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

FieldDefaultDescription
defaultLoginRedirect/Default destination after sign-in
signIn/sign-inSign-in page
signUp/sign-upSign-up page
forgotPassword/forgot-passwordForgot password page
resetPassword/reset-passwordReset password page
verifyEmail/verify-emailEmail verification page

Keep these values aligned with the actual App Router paths.

auth - sign-in methods and captcha

FieldTypeDescription
enableEmailVerificationbooleanRequire email verification
enableCredentialLoginbooleanEmail and password login
enableMagicLinkLoginbooleanPasswordless email login
enableGoogleLoginbooleanGoogle OAuth
enableGitHubLoginbooleanGitHub OAuth
captcha.enablebooleanGlobal captcha switch
captcha.scenarios.signInbooleanProtect sign-in and magic links
captcha.scenarios.signUpbooleanProtect 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

FieldDescription
providerDefault payment provider: stripe, paddle, or lemonsqueezy
planChange.chargeStrategyHow upgrades are charged
testingEnabledPayment test flag; the current runtime mostly reads PAYMENT_TESTING_ENABLED

planChange.chargeStrategy can be:

ValueMeaning
flat_differenceCharge the flat difference between plans
prorated_remaining_timeProrate 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

FieldDescription
providerEmail provider, currently resend
fromEmailSender 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

FieldDescription
enabledEnables /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 pages are declared in legal.pages:

FieldDescription
slugContent slug
hrefPublic link path
labelKeyFooter translation key
titleDefault configured title

Pages not listed in legal.pages should return 404.

  1. Update metadata with brand name, URL, and icons.
  2. Confirm theme behavior in ui.
  3. Adjust auth methods and captcha.
  4. Configure email.fromEmail and Resend.
  5. Enable payments, notifications, and newsletter as needed.
  6. Check docs and legal for launch scope.

Next steps

On this page