概要
Next.js 15、React 19、Supabase、Drizzle ORM、および Dodo Payments を使用した、プロダクション対応のサブスクリプションボイラープレートです。Google OAuth、サブスクリプションチェックアウト、Webhook ハンドリング、データベーススキーマ、および基本的なダッシュボードが付属しています。既存のアプリのルートハンドラーのみが必要な場合は、専用のアダプターを参照してください: Next.js アダプター と Express アダプター。
前提条件
- Node.js 18+ (または Bun 1.0+)
- Supabase プロジェクト (URL、Anon キー、サービスロールキー、データベース URL)
- Dodo Payments アカウント (API キー、Webhook シークレット)
- Google Cloud OAuth クライアント (クライアント ID とシークレット)
クイックスタート
1
クローンしてインストール
2
Supabase プロジェクトを作成
Supabase プロジェクトを作成し、以下をコピーします:
- NEXT_PUBLIC_SUPABASE_URL
- NEXT_PUBLIC_SUPABASE_ANON_KEY
- SUPABASE_SERVICE_ROLE_KEY
- DATABASE_URL (接続文字列)
3
Google OAuth を設定
リダイレクト URI を:
https://[your-project-ref].supabase.co/auth/v1/callback に設定し、次に Supabase Auth で Google プロバイダーを有効にします。クライアント ID とシークレットを使用します。4
Dodo Payments を設定
Dodo ダッシュボードから API キーと Webhook シークレットを生成します。開発中は環境を
test_mode に設定します。5
.env.local を作成
6
データベーススキーマをプロビジョニング
作成されたテーブル:
users, subscriptions, payments.7
Webhook 関数をデプロイ
cURL
8
Dodo Payments に Webhook を追加
エンドポイント URL を次のように設定します:支払いおよびサブスクリプションイベントを選択します。
9
製品と機能を作成
Dodo ダッシュボード → 製品 → 製品を作成。オプションでメタデータを追加します:価格 UI はこの
features 配列を読み取り、動的にレンダリングします。10
開発サーバーを実行
含まれているもの
- Supabase を介した認証 (Google OAuth が設定済み)
- Dodo Payments を介したサブスクリプションチェックアウト
- Webhook 用の Supabase エッジ関数 (
dodo-webhook) - Drizzle ORM スキーマとマイグレーション
- 請求書、サブスクリプションステータス、およびプラン機能を持つダッシュボード
主要なファイルとパス
- エッジ関数
- Next.js ルート
- データベース (Drizzle)
環境変数
Supabase
Supabase
Dodo Payments
Dodo Payments
Google OAuth
Google OAuth
検証とトラブルシューティング
Webhook シグネチャ無効 (401)
Webhook シグネチャ無効 (401)
DODO_WEBHOOK_SECRETが Dodo ダッシュボードの値と一致していることを確認してください- 最新の
dodo-webhook関数をデプロイしたことを確認してください - 関数内のヘッダー名が正しいことを確認してください (Dodo-Signature)
データベースプッシュ失敗
データベースプッシュ失敗
DATABASE_URL構文と Supabase ネットワークエグレスを確認してください- プロジェクト作成後、最初のプッシュまでに約 2~3 分待ってください
OAuth リダイレクト不一致
OAuth リダイレクト不一致
- リダイレクト URI は
https://[ref].supabase.co/auth/v1/callbackである必要があります - Google Cloud と Supabase Auth プロバイダーで同じであることを確認してください
Supabase と Dodo Payments で構築された動作するサブスクリプション SaaS ができました。
元のリポジトリと詳細な手順: dodo-supabase-subscription-starter。