GitHub Repository
Boilerplate minimal d’abonnement Next.js, Supabase et Dodo Payments.
Live Demo
Explorez la démo déployée.
Vue d’ensemble
Le starter d’abonnement Supabase est une application Next.js 15 et React 19 qui vend des abonnements avec Dodo Payments. Supabase fournit la connexion Google OAuth et la base de données Postgres, tandis que Drizzle ORM définit le schéma. Une Supabase Edge Function reçoit les webhooks Dodo Payments et stocke les paiements et les abonnements, et un tableau de bord simple affiche le forfait et les factures de chaque utilisateur. Si vous avez uniquement besoin des gestionnaires de routes pour le checkout, le Customer Portal et les webhooks dans une application existante, utilisez plutôt un adaptateur de framework :Next.js Adaptor
Express Adaptor
Prérequis
Avant de commencer, vous avez besoin des éléments suivants :- Node.js 18 ou version ultérieure, ou Bun 1.0 ou version ultérieure.
- Un projet Supabase. Vous aurez besoin de son URL, de sa clé anon, de sa clé de rôle de service et de sa chaîne de connexion à la base de données.
- Un compte Dodo Payments, pour obtenir une clé API et un secret de signature de webhook.
- Un client OAuth Google Cloud, avec son Client ID et son Client Secret.
Démarrage rapide
1
Clone and Install
Clonez le dépôt, puis installez les dépendances avec Bun, npm ou pnpm :
2
Create a Supabase Project
Créez un projet Supabase. Les étapes suivantes utilisent la référence de votre projet, c’est-à-dire le sous-domaine dans
https://[your-project-ref].supabase.co. Copiez les valeurs suivantes :NEXT_PUBLIC_SUPABASE_URL, l’URL du projetNEXT_PUBLIC_SUPABASE_ANON_KEY, la clé anonSUPABASE_SERVICE_ROLE_KEY, la clé de rôle de serviceDATABASE_URL, la chaîne de connexion à la base de données
3
Configure Google OAuth
Dans Google Cloud, ajoutez cette URI de redirection autorisée à votre client OAuth :
https://[your-project-ref].supabase.co/auth/v1/callback. Ensuite, dans Supabase Auth, activez le fournisseur Google avec votre Client ID et votre Client Secret.4
Configure Dodo Payments
Avec le bouton Live Mode désactivé dans la barre latérale, créez une clé API sous Developer → API Keys dans le tableau de bord Dodo Payments. Conservez
DODO_PAYMENTS_ENVIRONMENT défini sur test_mode pendant le développement.5
Add the Webhook in Dodo Payments
Sous Developer → Webhooks, ajoutez un endpoint avec cette URL. Vous déploierez la fonction qui le sert à une étape ultérieure.Sélectionnez les événements de paiement et d’abonnement que la fonction doit gérer :
- Événements de paiement :
payment.succeeded,payment.failed,payment.processingetpayment.cancelled - Événements d’abonnement :
subscription.active,subscription.plan_changed,subscription.renewed,subscription.on_hold,subscription.cancelled,subscription.expiredetsubscription.failed
DODO_WEBHOOK_SECRET.6
Create .env.local
Créez un fichier L’application Next.js lit toutes les variables de ce fichier, à l’exception de
.env.local dans le répertoire racine :DODO_WEBHOOK_SECRET. L’Edge Function lit DODO_WEBHOOK_SECRET depuis les secrets Supabase, que vous définissez lors de son déploiement.7
Provision the Database Schema
Poussez le schéma Drizzle vers votre base de données Supabase :
Tables créées :
users, subscriptions, payments.8
Deploy the Webhook Function
Connectez-vous à Supabase, enregistrez le secret de signature comme secret de fonction, puis déployez l’Edge Function Le script Une réponse
dodo-webhook. Remplacez [your-project-ref] par la référence de votre projet :deploy:webhook exécute supabase functions deploy dodo-webhook --no-verify-jwt, afin que Dodo Payments puisse appeler la fonction sans jeton d’authentification Supabase. Supabase fournit par défaut SUPABASE_URL et SUPABASE_SERVICE_ROLE_KEY à la fonction.Pour vérifier le déploiement, envoyez une requête non signée :cURL
400 avec Invalid webhook signature signifie que la fonction est active et dispose de son secret. Une réponse 500 avec Server configuration error signifie que DODO_WEBHOOK_SECRET n’est pas défini. Pour envoyer un événement de test signé, ouvrez l’endpoint dans Developer → Webhooks et utilisez son onglet Testing.9
Create Products and Features
Dans Products, dans le tableau de bord Dodo Payments, cliquez sur Add Product pour créer un produit d’abonnement pour chaque forfait. Si vous le souhaitez, pour afficher les fonctionnalités des forfaits dans l’application, ajoutez une entrée de métadonnées avec la clé Les valeurs des métadonnées sont des chaînes, des nombres ou des booléens ; stockez donc le tableau sous forme de chaîne JSON. L’interface de tarification analyse la valeur
features et un tableau JSON de chaînes comme valeur. Les métadonnées du produit se présentent alors comme suit :features et affiche chaque élément.10
Run the Dev Server
Vous disposez maintenant d’une structure SaaS d’abonnement fonctionnelle, basée sur Supabase et Dodo Payments. Pour la vérifier de bout en bout, abonnez-vous à un forfait avec une carte de test. Une fois le webhook reçu, le tableau de bord affiche votre nouveau forfait.
Contenu inclus
- Authentification via Supabase, avec Google OAuth configuré
- Checkout d’abonnement via Dodo Payments
- Une Supabase Edge Function pour les webhooks (
dodo-webhook) - Un schéma Drizzle ORM, avec les scripts
db:generateetdb:migratepour les migrations - Un tableau de bord avec les factures, l’état de l’abonnement et les fonctionnalités des forfaits
- Des server actions pour changer de forfait, annuler un abonnement et restaurer un abonnement annulé
Fichiers et chemins clés
Le gestionnaire de webhook, les routes de l’application et le schéma de base de données se trouvent dans les fichiers suivants :- Edge Function
- Next.js Routes
- Database (Drizzle)
Variables d’environnement
L’application Next.js et l’Edge Function lisent les variables suivantes :Supabase
Supabase
.env.example ne répertorie pas SUPABASE_SERVICE_ROLE_KEY, mais le client administrateur de l’application dans lib/supabase/admin.ts en a besoin. Ajoutez-la vous-même.Dodo Payments
Dodo Payments
Google OAuth
Google OAuth
L’application ne lit pas les identifiants Google depuis les variables d’environnement. Saisissez le Client ID et le Client Secret dans les paramètres du fournisseur Google de Supabase Auth, puis ajoutez cette URI de redirection au client OAuth dans Google Cloud :
Vérification et résolution des problèmes
Webhook signature invalid (400)
Webhook signature invalid (400)
- Assurez-vous que le secret
DODO_WEBHOOK_SECRETde la fonction correspond au secret de signature du endpoint dans le tableau de bord Dodo Payments. - Confirmez que vous avez déployé la dernière fonction
dodo-webhook. - La fonction vérifie les en-têtes Standard Webhooks
webhook-id,webhook-signatureetwebhook-timestamp. Assurez-vous qu’un proxy ne les supprime pas.
Database push fails
Database push fails
- Vérifiez la syntaxe
DATABASE_URL. - La connexion directe (
db.[project-ref].supabase.co:5432) utilise IPv6, sauf si votre projet dispose de l’extension IPv4. Sur un réseau IPv4 uniquement, utilisez la chaîne de connexion du pooler de session à la place (documentation sur les connexions Supabase). - Attendez 2 à 3 minutes après la création du projet avant le premier push.
OAuth redirect mismatch
OAuth redirect mismatch
- L’URI de redirection doit être
https://[ref].supabase.co/auth/v1/callback. - Utilisez la même URI dans Google Cloud et dans le fournisseur Supabase Auth.
Pour consulter le dépôt d’origine et les étapes détaillées, consultez dodo-supabase-subscription-starter.