GitHub Repository
Boilerplate minimale per subscription con Next.js, Supabase e Dodo Payments.
Live Demo
Esplora la demo distribuita.
Panoramica
Lo starter per subscription Supabase è un’app Next.js 15 e React 19 che vende subscription con Dodo Payments. Supabase fornisce l’accesso Google OAuth e il database Postgres, mentre Drizzle ORM definisce lo schema. Una Supabase Edge Function riceve i webhook di Dodo Payments e salva pagamenti e subscription; una dashboard di base mostra il piano e le fatture di ogni utente. Se ti servono solo checkout, Customer Portal e route handler per i webhook per un’app esistente, usa invece un adattatore per framework:Next.js Adaptor
Express Adaptor
Prerequisiti
Prima di iniziare, ti servono:- Node.js 18 o versione successiva, oppure Bun 1.0 o versione successiva.
- Un progetto Supabase. Ti servono il relativo URL, la anon key, la service role key e la stringa di connessione al database.
- Un account Dodo Payments, per una API key e un webhook signing secret.
- Un client OAuth Google Cloud, con il relativo Client ID e Client Secret.
Quickstart
1
Clone and Install
Clona il repository, quindi installa le dipendenze con Bun, npm o pnpm:
2
Create a Supabase Project
Crea un progetto Supabase. I passaggi successivi usano il riferimento del progetto, ovvero il sottodominio in
https://[your-project-ref].supabase.co. Copia questi valori:NEXT_PUBLIC_SUPABASE_URL, l’URL del progettoNEXT_PUBLIC_SUPABASE_ANON_KEY, la anon keySUPABASE_SERVICE_ROLE_KEY, la service role keyDATABASE_URL, la stringa di connessione al database
3
Configure Google OAuth
In Google Cloud, aggiungi questo authorized redirect URI al tuo client OAuth:
https://[your-project-ref].supabase.co/auth/v1/callback. Quindi, in Supabase Auth, abilita il provider Google con il tuo Client ID e Client Secret.4
Configure Dodo Payments
Con l’interruttore Live Mode disattivato nella barra laterale, crea una API key in Developer → API Keys nella dashboard di Dodo Payments. Mantieni
DODO_PAYMENTS_ENVIRONMENT impostato su test_mode durante lo sviluppo.5
Add the Webhook in Dodo Payments
In Developer → Webhooks, aggiungi un endpoint con questo URL. Distribuirai la function che lo espone in un passaggio successivo.Seleziona gli eventi di pagamento e subscription gestiti dalla function:
- Eventi di pagamento:
payment.succeeded,payment.failed,payment.processingepayment.cancelled - Eventi di subscription:
subscription.active,subscription.plan_changed,subscription.renewed,subscription.on_hold,subscription.cancelled,subscription.expiredesubscription.failed
DODO_WEBHOOK_SECRET.6
Create .env.local
Crea un file L’app Next.js legge tutte le variabili in questo file tranne
.env.local nella directory principale:DODO_WEBHOOK_SECRET. La Edge Function legge DODO_WEBHOOK_SECRET dai secrets Supabase, che imposti quando la distribuisci.7
Provision the Database Schema
Esegui il push dello schema Drizzle nel database Supabase:
Tabelle create:
users, subscriptions, payments.8
Deploy the Webhook Function
Accedi a Supabase, salva il signing secret come secret della function e distribuisci la Edge Function Lo script Una risposta
dodo-webhook. Sostituisci [your-project-ref] con il riferimento del tuo progetto:deploy:webhook esegue supabase functions deploy dodo-webhook --no-verify-jwt, così Dodo Payments può chiamare la function senza un token di autenticazione Supabase. Supabase fornisce SUPABASE_URL e SUPABASE_SERVICE_ROLE_KEY alla function per impostazione predefinita.Per verificare il deployment, invia una richiesta non firmata:cURL
400 con Invalid webhook signature indica che la function è in esecuzione e dispone del secret. Una risposta 500 con Server configuration error indica che DODO_WEBHOOK_SECRET non è impostato. Per inviare un evento di test firmato, apri l’endpoint in Developer → Webhooks e usa la scheda Testing.9
Create Products and Features
In Products nella dashboard di Dodo Payments, fai clic su Add Product per creare un prodotto subscription per ogni piano. Facoltativamente, per elencare le funzionalità dei piani nell’app, aggiungi una voce di metadata con la chiave I valori dei metadata sono stringhe, numeri o booleani, quindi salva l’array come stringa JSON. L’interfaccia di pricing analizza il valore
features e un array JSON di stringhe come valore. I metadata del prodotto avranno quindi questo aspetto:features e visualizza ogni elemento.10
Run the Dev Server
Ora hai uno scaffold SaaS funzionante per le subscription, realizzato con Supabase e Dodo Payments. Per verificarlo dall’inizio alla fine, sottoscrivi un piano con una carta di test. Dopo l’arrivo del webhook, la dashboard mostra il tuo nuovo piano.
Contenuti inclusi
- Autenticazione tramite Supabase, con Google OAuth configurato
- Checkout delle subscription tramite Dodo Payments
- Una Supabase Edge Function per i webhook (
dodo-webhook) - Uno schema Drizzle ORM, con gli script
db:generateedb:migrateper le migration - Una dashboard con fatture, stato della subscription e funzionalità del piano
- Server action per cambiare piano, annullare una subscription e ripristinare una subscription annullata
File e percorsi principali
Il webhook handler, le route dell’app e lo schema del database si trovano in questi file:- Edge Function
- Next.js Routes
- Database (Drizzle)
Variabili d’ambiente
L’app Next.js e la Edge Function leggono queste variabili:Supabase
Supabase
.env.example non elenca SUPABASE_SERVICE_ROLE_KEY, ma il client admin dell’app in lib/supabase/admin.ts ne ha bisogno. Aggiungilo manualmente.Dodo Payments
Dodo Payments
Google OAuth
Google OAuth
L’app non legge le credenziali Google dalle variabili d’ambiente. Inserisci il Client ID e il Client Secret nelle impostazioni del provider Google di Supabase Auth e aggiungi questo URI di reindirizzamento al client OAuth in Google Cloud:
Verifica e risoluzione dei problemi
Webhook signature invalid (400)
Webhook signature invalid (400)
- Assicurati che il secret della funzione
DODO_WEBHOOK_SECRETcorrisponda al signing secret dell’endpoint nella dashboard di Dodo Payments. - Conferma di aver eseguito il deploy della versione più recente della funzione
dodo-webhook. - La funzione verifica gli header di Standard Webhooks
webhook-id,webhook-signatureewebhook-timestamp. Assicurati che un proxy non li rimuova.
Database push fails
Database push fails
- Controlla la sintassi di
DATABASE_URL. - La connessione diretta (
db.[project-ref].supabase.co:5432) usa IPv6, a meno che il tuo progetto non disponga dell’add-on IPv4. Su una rete che supporta solo IPv4, usa invece la stringa di connessione del session pooler (documentazione sulle connessioni Supabase). - Attendi 2–3 minuti dopo aver creato il progetto prima di eseguire il primo push.
OAuth redirect mismatch
OAuth redirect mismatch
- L’URI di reindirizzamento deve essere
https://[ref].supabase.co/auth/v1/callback. - Usa lo stesso URI in Google Cloud e nel provider Supabase Auth.
Per il repository originale e i passaggi dettagliati, consulta dodo-supabase-subscription-starter.