GitHub Repository
Minimal boilerplate för prenumerationer med Next.js, Supabase och Dodo Payments.
Live Demo
Utforska den distribuerade demon.
Översikt
Startmallen för Supabase-prenumerationer är en Next.js 15- och React 19-app som säljer prenumerationer med Dodo Payments. Supabase tillhandahåller Google OAuth-inloggning och Postgres-databasen, och Drizzle ORM definierar schemat. En Supabase Edge Function tar emot Dodo Payments-webhooks och lagrar betalningar och prenumerationer, och en enkel dashboard visar varje användares plan och fakturor. Om du endast behöver checkout, Customer Portal och webhook-route handlers för en befintlig app kan du använda en framework-adapter i stället:Next.js Adaptor
Express Adaptor
Förkunskaper
Innan du börjar behöver du:- Node.js 18 eller senare, eller Bun 1.0 eller senare.
- Ett Supabase-projekt. Du behöver dess URL, anon key, service role key och databasens anslutningssträng.
- Ett Dodo Payments-konto för en API key och en webhook signing secret.
- En Google Cloud OAuth-klient med dess Client ID och Client Secret.
Snabbstart
1
Clone and Install
Klona repositoryt och installera sedan beroenden med Bun, npm eller pnpm:
2
Create a Supabase Project
Skapa ett Supabase-projekt. Senare steg använder projektets referens, underdomänen i
https://[your-project-ref].supabase.co. Kopiera dessa värden:NEXT_PUBLIC_SUPABASE_URL, projektets URLNEXT_PUBLIC_SUPABASE_ANON_KEY, anon keySUPABASE_SERVICE_ROLE_KEY, service role keyDATABASE_URL, databasens anslutningssträng
3
Configure Google OAuth
I Google Cloud lägger du till denna auktoriserade redirect URI i din OAuth-klient:
https://[your-project-ref].supabase.co/auth/v1/callback. Aktivera sedan Google-providern i Supabase Auth med ditt Client ID och Client Secret.4
Configure Dodo Payments
Med reglaget Live Mode i sidofältet avstängt skapar du en API key under Developer → API Keys i Dodo Payments-dashboarden. Låt
DODO_PAYMENTS_ENVIRONMENT vara inställd på test_mode medan du utvecklar.5
Add the Webhook in Dodo Payments
Under Developer → Webhooks lägger du till en endpoint med denna URL. Du distribuerar funktionen som hanterar den i ett senare steg.Välj de betalnings- och prenumerationshändelser som funktionen hanterar:
- Betalningshändelser:
payment.succeeded,payment.failed,payment.processingochpayment.cancelled - Prenumerationshändelser:
subscription.active,subscription.plan_changed,subscription.renewed,subscription.on_hold,subscription.cancelled,subscription.expiredochsubscription.failed
DODO_WEBHOOK_SECRET.6
Create .env.local
Skapa en Next.js-appen läser alla variabler i denna fil utom
.env.local-fil i rotkatalogen:DODO_WEBHOOK_SECRET. Edge Function läser DODO_WEBHOOK_SECRET från sina Supabase secrets, som du anger när du distribuerar den.7
Provision the Database Schema
Push:a Drizzle-schemat till din Supabase-databas:
Skapade tabeller:
users, subscriptions och payments.8
Deploy the Webhook Function
Logga in på Supabase, lagra signing secret som en function secret och distribuera Skriptet Ett svar med
dodo-webhook Edge Function. Ersätt [your-project-ref] med din projektreferens:deploy:webhook kör supabase functions deploy dodo-webhook --no-verify-jwt, så att Dodo Payments kan anropa funktionen utan en Supabase auth token. Supabase tillhandahåller SUPABASE_URL och SUPABASE_SERVICE_ROLE_KEY till funktionen som standard.Kontrollera distributionen genom att skicka en osignerad request:cURL
400 och Invalid webhook signature betyder att funktionen körs och har sin secret. Ett svar med 500 och Server configuration error betyder att DODO_WEBHOOK_SECRET inte är angiven. Om du vill skicka en signerad testhändelse öppnar du endpointen under Developer → Webhooks och använder fliken Testing.9
Create Products and Features
Under Products i Dodo Payments-dashboarden klickar du på Add Product för att skapa en prenumerationsprodukt för varje plan. Om du vill visa planfunktioner i appen kan du lägga till en metadata-post med nyckeln Metadata-värden är strängar, tal eller booleska värden, så lagra arrayen som en JSON-sträng. Prisgränssnittet tolkar värdet
features och en JSON-array med strängar som värde. Produktens metadata ser då ut så här:features och renderar varje objekt.10
Run the Dev Server
Du har nu en fungerande SaaS-lösning för prenumerationer, uppbyggd med Supabase och Dodo Payments. Bekräfta att allt fungerar från början till slut genom att prenumerera på en plan med ett testkort. När webhooken har kommit fram visar dashboarden din nya plan.
Detta ingår
- Autentisering via Supabase, med Google OAuth konfigurerat
- Checkout för prenumerationer via Dodo Payments
- En Supabase Edge Function för webhooks (
dodo-webhook) - Ett Drizzle ORM-schema, med skripten
db:generateochdb:migrateför migreringar - En dashboard med fakturor, prenumerationsstatus och planfunktioner
- Server actions för att byta plan, avsluta en prenumeration och återställa en avslutad prenumeration
Viktiga filer och sökvägar
Webhook-hanteraren, appens routes och databasschemat finns i dessa filer:- Edge Function
- Next.js Routes
- Database (Drizzle)
Miljövariabler
Next.js-appen och Edge Function läser dessa variabler:Supabase
Supabase
.env.example listar inte SUPABASE_SERVICE_ROLE_KEY, men appens admin-klient i lib/supabase/admin.ts behöver den. Lägg till den själv.Dodo Payments
Dodo Payments
Google OAuth
Google OAuth
Appen läser inte Google-autentiseringsuppgifter från environment variables. Ange Client ID och Client Secret i Google-providerinställningarna i Supabase Auth och lägg till denna redirect URI i OAuth-klienten i Google Cloud:
Verifiering och felsökning
Webhook signature invalid (400)
Webhook signature invalid (400)
- Kontrollera att funktionens
DODO_WEBHOOK_SECRETsecret matchar endpointens signing secret i Dodo Payments-dashboarden. - Bekräfta att du har distribuerat den senaste
dodo-webhookfunktionen. - Funktionen verifierar Standard Webhooks-headers
webhook-id,webhook-signatureochwebhook-timestamp. Kontrollera att en proxy inte tar bort dem.
Database push fails
Database push fails
- Kontrollera syntaxen för
DATABASE_URL. - Den direkta anslutningen (
db.[project-ref].supabase.co:5432) använder IPv6 om ditt projekt inte har IPv4-tillägget. På ett nätverk som endast använder IPv4 använder du i stället anslutningssträngen för session pooler (Supabase-anslutningsdokumentation). - Vänta 2–3 minuter efter att du har skapat projektet innan den första pushen.
OAuth redirect mismatch
OAuth redirect mismatch
- Redirect-URI:n måste vara
https://[ref].supabase.co/auth/v1/callback. - Använd samma URI i Google Cloud och i Supabase Auth-providern.
För originalrepositoryt och detaljerade steg, se dodo-supabase-subscription-starter.