Aller au contenu principalAller au pied de page
NeuraAPI
NeuraAPI
Navigation
Template 20 mai 2024 20 min de lecture

Next.js SaaS Starter : Le guide complet pour lancer votre SaaS

Partager :

Lancer un SaaS demande du temps et des ressources. Notre template Next.js accélère considérablement le processus.

Prérequis

  • Node.js 18+
  • Compte Stripe
  • Compte NeuraAPI
  • Vercel (pour le déploiement)
  • Connaissances TypeScript

Pourquoi Next.js pour votre SaaS ?

Next.js offre des performances optimales grâce aux Server Components.

Le framework est mature, bien documenté et supporté par Vercel.

Étape 1 : Installation

Clonez le template et installez les dépendances.

npx create-next-app@14 mon-saas \
  --typescript --tailwind --eslint --app \
  --src-dir --import-alias "@/*"

cd mon-saas

# Installer les dépendances essentielles
npm install prisma @prisma/client next-auth
npm install stripe @stripe/stripe-js
npm install zod react-hook-form
npm install @neuraapi/sdk

zod Configurez vos variables d'environnement. react-hook-form Lancez le serveur de développement. @neuraapi/sdk Vérifiez que tout fonctionne sur localhost:3000.

Étape 2 : Configuration

Configurez Stripe pour la facturation.

npx prisma init --datasource-provider postgresql

Créez vos produits et prix dans le dashboard Stripe.

// prisma/schema.prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id             String         @id @default(cuid())
  email          String         @unique
  name           String?
  password       String
  plan           String         @default("free")
  stripeCustomerId String?      @unique
  apiKey         String         @unique @default(cuid())
  createdAt      DateTime       @default(now())
  updatedAt      DateTime       @updatedAt
  projects       Project[]
  subscription   Subscription?
}

model Project {
  id        String   @id @default(cuid())
  name      String
  userId    String
  user      User     @relation(fields: [userId], references: [id])
  createdAt DateTime @default(now())
}

model Subscription {
  id                 String   @id @default(cuid())
  userId             String   @unique
  user               User     @relation(fields: [userId], references: [id])
  stripeSubscriptionId String @unique
  status             String
  plan               String
  currentPeriodEnd   DateTime
}

Ajoutez les clés Stripe dans votre fichier .env.

Étape 3 : Authentification

L'authentification est prête à l'emploi.

// src/lib/auth.ts
import NextAuth from 'next-auth'
import CredentialsProvider from 'next-auth/providers/credentials'
import { prisma } from './db'
import bcrypt from 'bcryptjs'

export const { handlers, auth, signIn, signOut } = NextAuth({
  providers: [
    CredentialsProvider({
      credentials: {
        email: { label: 'Email', type: 'email' },
        password: { label: 'Mot de passe', type: 'password' },
      },
      async authorize(credentials) {
        const user = await prisma.user.findUnique({
          where: { email: credentials?.email as string },
        })
        if (!user) return null
        const valid = await bcrypt.compare(
          credentials?.password as string, user.password
        )
        if (!valid) return null
        return { id: user.id, email: user.email, name: user.name }
      },
    }),
  ],
  session: { strategy: 'jwt' },
  pages: { signIn: '/login' },
})

Configurez les providers d'authentification. /login Ajoutez la protection des routes. /register Personnalisez les pages de connexion et inscription. react-hook-form Testez le flux complet d'authentification. zod Déployez en production.

Étape 4 : Dashboard

Le dashboard inclut les analytics et la gestion utilisateur.

// src/app/dashboard/layout.tsx
import { auth } from '@/lib/auth'
import { redirect } from 'next/navigation'
import Sidebar from '@/components/dashboard/Sidebar'

export default async function DashboardLayout({
  children,
}: {
  children: React.ReactNode
}) {
  const session = await auth()
  if (!session) redirect('/login')

  return (
    <div className="flex min-h-screen">
      <Sidebar user={session.user} />
      <main className="flex-1 p-8">{children}</main>
    </div>
  )
}

Personnalisez les composants selon vos besoins. /login. Ajoutez vos propres métriques.

Étape 5 : Billing

Stripe gère automatiquement la facturation récurrente.

// src/app/api/stripe/checkout/route.ts
import { NextRequest, NextResponse } from 'next/server'
import { auth } from '@/lib/auth'
import Stripe from 'stripe'

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!)

const PLANS = {
  starter: { priceId: 'price_xxx', name: 'Starter' },
  pro: { priceId: 'price_yyy', name: 'Pro' },
  enterprise: { priceId: 'price_zzz', name: 'Entreprise' },
}

export async function POST(req: NextRequest) {
  const session = await auth()
  if (!session?.user) {
    return NextResponse.json({ error: 'Non autorisé' }, { status: 401 })
  }

  const { plan } = await req.json()
  const selectedPlan = PLANS[plan as keyof typeof PLANS]
  if (!selectedPlan) {
    return NextResponse.json({ error: 'Plan invalide' }, { status: 400 })
  }

  const checkoutSession = await stripe.checkout.sessions.create({
    mode: 'subscription',
    payment_method_types: ['card'],
    customer_email: session.user.email!,
    line_items: [{ price: selectedPlan.priceId, quantity: 1 }],
    success_url: `${process.env.NEXT_PUBLIC_APP_URL}/dashboard?success=true`,
    cancel_url: `${process.env.NEXT_PUBLIC_APP_URL}/pricing?canceled=true`,
    metadata: { userId: session.user.id, plan },
  })

  return NextResponse.json({ url: checkoutSession.url })
}

Configurez les plans et les webhooks. checkout.session.completed Gérez les abonnements et les annulations. customer.subscription.deleted Testez avec le mode test de Stripe.

Étape 6 : IA

Intégrez l'IA avec le SDK NeuraAPI.

// src/lib/ai.ts
import { NeuraAPI } from '@neuraapi/sdk'

const ai = new NeuraAPI(process.env.NEURA_API_KEY!)

export async function generateContent(prompt: string, userId: string) {
  // Vérifier le quota utilisateur
  const credits = await checkCredits(userId)
  if (credits <= 0) {
    throw new Error('Crédits épuisés. Passez au plan supérieur.')
  }

  const result = await ai.generate({
    prompt,
    maxTokens: 1000,
  })

  // Déduire un crédit
  await consumeCredit(userId)

  return result.content
}

Ajoutez des fonctionnalités intelligentes à votre SaaS.

Étape 7 : SEO

Optimisez le SEO de votre SaaS.

# Installer Vercel CLI
npm i -g vercel

# Déployer en staging
vercel

# Configurer les variables d'environnement
vercel env add DATABASE_URL
vercel env add NEXTAUTH_SECRET
vercel env add STRIPE_SECRET_KEY
vercel env add STRIPE_WEBHOOK_SECRET
vercel env add NEURA_API_KEY

# Déployer en production
vercel --prod

Les balises meta et le sitemap sont déjà configurés.

Étape 8 : Déploiement

Déployez sur Vercel en un clic.

  • Next.js 14 App Router
  • Tailwind CSS
  • Stripe Billing
  • Authentification complète
  • Dashboard admin
  • SDK IA intégré

Récapitulatif

115 minInstallation et setup
230 minConfiguration Stripe
320 minAuthentification
430 minDashboard
520 minIntégration IA
615 minSEO
710 minDéploiement
820 minTests finaux

Commencer

Commencez votre SaaS dès maintenant. NeuraSaaS: Créez votre compte pour accéder au template.

Voir les tarifs