GitHub Repository
Boilerplate subscription Next.js, Supabase, dan Dodo Payments minimal.
Live Demo
Jelajahi demo yang telah di-deploy.
Ringkasan
Starter subscription Supabase adalah aplikasi Next.js 15 dan React 19 yang menjual subscription dengan Dodo Payments. Supabase menyediakan Google OAuth sign-in dan database Postgres, sedangkan Drizzle ORM mendefinisikan skema. Supabase Edge Function menerima webhook Dodo Payments dan menyimpan payment serta subscription, sementara dashboard dasar menampilkan plan dan invoice setiap pengguna. Jika Anda hanya memerlukan checkout, Customer Portal, dan route handler webhook untuk aplikasi yang sudah ada, gunakan framework adaptor sebagai gantinya:Next.js Adaptor
Express Adaptor
Prasyarat
Sebelum memulai, Anda memerlukan:- Node.js 18 atau lebih baru, atau Bun 1.0 atau lebih baru.
- Project Supabase. Anda memerlukan URL, anon key, service role key, dan connection string database.
- Akun Dodo Payments, untuk API key dan webhook signing secret.
- OAuth client Google Cloud, untuk Client ID dan Client Secret-nya.
Quickstart
1
Clone and Install
Clone repository, lalu install dependencies dengan Bun, npm, atau pnpm:
2
Create a Supabase Project
Buat project Supabase. Langkah-langkah berikutnya menggunakan project reference-nya, yaitu subdomain di
https://[your-project-ref].supabase.co. Salin nilai berikut:NEXT_PUBLIC_SUPABASE_URL, URL projectNEXT_PUBLIC_SUPABASE_ANON_KEY, anon keySUPABASE_SERVICE_ROLE_KEY, service role keyDATABASE_URL, connection string database
3
Configure Google OAuth
Di Google Cloud, tambahkan authorized redirect URI ini ke OAuth client Anda:
https://[your-project-ref].supabase.co/auth/v1/callback. Kemudian, di Supabase Auth, aktifkan provider Google dengan Client ID dan Client Secret Anda.4
Configure Dodo Payments
Dengan switch Live Mode di sidebar dalam keadaan nonaktif, buat API key di Developer → API Keys pada dashboard Dodo Payments. Biarkan
DODO_PAYMENTS_ENVIRONMENT tetap disetel ke test_mode selama pengembangan.5
Add the Webhook in Dodo Payments
Di Developer → Webhooks, tambahkan endpoint dengan URL ini. Anda akan men-deploy function yang melayaninya pada langkah berikutnya.Pilih event payment dan subscription yang ditangani function:
- Event payment:
payment.succeeded,payment.failed,payment.processing, danpayment.cancelled - Event subscription:
subscription.active,subscription.plan_changed,subscription.renewed,subscription.on_hold,subscription.cancelled,subscription.expired, dansubscription.failed
DODO_WEBHOOK_SECRET.6
Create .env.local
Buat file Aplikasi Next.js membaca setiap variable dalam file ini kecuali
.env.local di direktori root:DODO_WEBHOOK_SECRET. Edge Function membaca DODO_WEBHOOK_SECRET dari Supabase secrets, yang Anda tetapkan saat men-deploy-nya.7
Provision the Database Schema
Push skema Drizzle ke database Supabase Anda:
Tabel yang dibuat:
users, subscriptions, payments.8
Deploy the Webhook Function
Login ke Supabase, simpan signing secret sebagai function secret, lalu deploy Edge Function Script Response
dodo-webhook. Ganti [your-project-ref] dengan project reference Anda:deploy:webhook menjalankan supabase functions deploy dodo-webhook --no-verify-jwt, sehingga Dodo Payments dapat memanggil function tanpa token autentikasi Supabase. Supabase menyediakan SUPABASE_URL dan SUPABASE_SERVICE_ROLE_KEY ke function secara default.Untuk memeriksa deployment, kirim request tanpa tanda tangan:cURL
400 dengan Invalid webhook signature berarti function sedang berjalan dan memiliki secret-nya. Response 500 dengan Server configuration error berarti DODO_WEBHOOK_SECRET belum disetel. Untuk mengirim test event bertanda tangan, buka endpoint di Developer → Webhooks dan gunakan tab Testing.9
Create Products and Features
Di bagian Products pada dashboard Dodo Payments, klik Add Product untuk membuat product subscription bagi setiap plan. Jika ingin menampilkan fitur plan di aplikasi, tambahkan metadata entry dengan key Nilai metadata berupa string, angka, atau boolean, jadi simpan array sebagai string JSON. UI pricing menguraikan nilai
features dan array JSON berisi string sebagai nilainya. Metadata product kemudian terlihat seperti ini:features dan merender setiap item.10
Run the Dev Server
Kini Anda memiliki scaffold SaaS subscription yang berfungsi dengan Supabase dan Dodo Payments. Untuk mengonfirmasinya secara end-to-end, berlangganan plan menggunakan kartu test. Setelah webhook tiba, dashboard menampilkan plan baru Anda.
Yang Disertakan
- Autentikasi melalui Supabase, dengan Google OAuth yang telah dikonfigurasi
- Checkout subscription melalui Dodo Payments
- Supabase Edge Function untuk webhook (
dodo-webhook) - Skema Drizzle ORM, dengan script
db:generatedandb:migrateuntuk migration - Dashboard dengan invoice, status subscription, dan fitur plan
- Server action untuk mengubah plan, membatalkan subscription, dan memulihkan subscription yang dibatalkan
File dan Path Utama
Webhook handler, route aplikasi, dan skema database berada di file berikut:- Edge Function
- Next.js Routes
- Database (Drizzle)
Environment Variables
Aplikasi Next.js dan Edge Function membaca variable berikut:Supabase
Supabase
.env.example tidak mencantumkan SUPABASE_SERVICE_ROLE_KEY, tetapi admin client aplikasi di lib/supabase/admin.ts memerlukannya. Tambahkan sendiri.Dodo Payments
Dodo Payments
Google OAuth
Google OAuth
Aplikasi tidak membaca kredensial Google dari environment variables. Masukkan Client ID dan Client Secret di pengaturan provider Google pada Supabase Auth, lalu tambahkan redirect URI ini ke OAuth client di Google Cloud:
Verifikasi dan Troubleshooting
Webhook signature invalid (400)
Webhook signature invalid (400)
- Pastikan secret fungsi
DODO_WEBHOOK_SECRETcocok dengan signing secret endpoint di dashboard Dodo Payments. - Konfirmasikan bahwa Anda telah men-deploy fungsi
dodo-webhookterbaru. - Fungsi tersebut memverifikasi header Standard Webhooks
webhook-id,webhook-signature, danwebhook-timestamp. Pastikan proxy tidak menghapusnya.
Database push fails
Database push fails
- Periksa sintaks
DATABASE_URL. - Koneksi langsung (
db.[project-ref].supabase.co:5432) menggunakan IPv6 kecuali project Anda memiliki add-on IPv4. Pada jaringan yang hanya mendukung IPv4, gunakan connection string session pooler sebagai gantinya (dokumentasi koneksi Supabase). - Tunggu 2–3 menit setelah membuat project sebelum push pertama.
OAuth redirect mismatch
OAuth redirect mismatch
- Redirect URI harus berupa
https://[ref].supabase.co/auth/v1/callback. - Gunakan URI yang sama di Google Cloud dan di provider Supabase Auth.
Untuk repository asli dan langkah-langkah terperinci, lihat dodo-supabase-subscription-starter.