Skip to main content

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 URL
  • NEXT_PUBLIC_SUPABASE_ANON_KEY, anon key
  • SUPABASE_SERVICE_ROLE_KEY, service role key
  • DATABASE_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.processing och payment.cancelled
  • Prenumerationshändelser: subscription.active, subscription.plan_changed, subscription.renewed, subscription.on_hold, subscription.cancelled, subscription.expired och subscription.failed
Kopiera endpointens signing secret. Det är värdet för DODO_WEBHOOK_SECRET.
6

Create .env.local

Skapa en .env.local-fil i rotkatalogen:
Next.js-appen läser alla variabler i denna fil utom DODO_WEBHOOK_SECRET. Edge Function läser DODO_WEBHOOK_SECRET från sina Supabase secrets, som du anger när du distribuerar den.
Lägg inte till secrets i repositoryt. I distribuerade miljöer anger du dem som environment variables.
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 dodo-webhook Edge Function. Ersätt [your-project-ref] med din projektreferens:
Skriptet 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
Ett svar med 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 features och en JSON-array med strängar som värde. Produktens metadata ser då ut så här:
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 renderar varje objekt.
10

Run the Dev Server

Öppna http://localhost:3000 och logga in med Google.
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:generate och db:migrate fö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
Låt DODO_PAYMENTS_ENVIRONMENT vara inställd på test_mode tills du har slutfört tester från början till slut. För att gå live ställer du in den på live_mode och använder en live mode API key.

Viktiga filer och sökvägar

Webhook-hanteraren, appens routes och databasschemat finns i dessa filer:

Miljövariabler

Next.js-appen och Edge Function läser dessa variabler:
.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.
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

  • Kontrollera att funktionens DODO_WEBHOOK_SECRET secret matchar endpointens signing secret i Dodo Payments-dashboarden.
  • Bekräfta att du har distribuerat den senaste dodo-webhook funktionen.
  • Funktionen verifierar Standard Webhooks-headers webhook-id, webhook-signature och webhook-timestamp. Kontrollera att en proxy inte tar bort dem.
  • 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.
  • 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.
Senast ändrad 26 september 2026