Module 8 : SaaS開発

最終モジュール。自分のSaaSを1本、世に出すこと。
Next.js + Supabase + Vercel + Stripe で、ユーザー登録・DB・月額課金まで揃った
本物の Web アプリケーションを、Claude Code と一緒に作り上げます。
終わる頃には、一人でSaaSを立ち上げられる個人開発者になっています。

⏱ 所要時間: 約20時間 📚 10レッスン 🎯 難易度: 中〜上級 💰 収益化まで

8.1 SaaS とは何か — なぜ作るのか

所要: 約20分 📖 形式: 読み物 🔰 前提: Module 7

🎯 このレッスンの到達目標

  • SaaS と普通のWebサイト(LP/HP)の違いを説明できる
  • SaaSビジネスの4つの特徴を理解する
  • なぜ個人でも SaaS が作れる時代なのかを知る

SaaS (Software as a Service)とは「月額制で使えるソフトウェア」のこと。Slack / Notion / Zoom / Netflix / Spotify — 私たちが毎日使うサービスのほとんどが SaaS です。

LP/HP と SaaS の決定的な違い

観点 LP / HP SaaS
役割情報提供・集客サービス本体
ユーザー匿名で閲覧ログインして利用
データ静的コンテンツユーザーごとに保存・更新
収益間接(問合せ→売上)直接(月額課金)

SaaS の4つの特徴

💳 1. サブスクリプション

月額/年額で継続課金。売り切りではなく「使い続けてもらう」構造。
→ 売上が時間と共に積み上がる = MRR (月次経常収益)

👥 2. マルチテナント

1システムで複数顧客(テナント)を捌く。
ユーザーごとにデータが完全に分離されるのが絶対条件。

🔄 3. 継続改善

リリースして終わりではなく、使用状況を見ながら毎週・毎月改善
「作って売る」じゃなく「作って磨き続ける」。

📈 4. スケール容易

既存顧客が残る分、新規を積み上げるだけで売上が伸びる。
100人 → 1,000人 に増えても、インフラは自動拡張。

なぜ個人でも SaaS が作れる時代になったか

  • インフラ革命: Vercel / Supabase などで月$0〜で本番運用可能に
  • AIコード生成: Claude Code で1人で10人分のコードが書ける
  • 決済の民主化: Stripe で個人でも法人並みの決済体験を提供できる
  • 成功事例の増加: 個人SaaSで月収100万円超のケースが続出(2025〜)
🎯 このモジュールで作るもの

題材は 「FocusList」— 1日3つに絞るタスク管理 SaaS
ユーザー登録 → ログイン → タスクの追加/編集/削除 → 有料プラン(月$9)で機能拡張。
最短パスで作り上げ、あなたが自分の SaaS を立ち上げる土台を作ります。

✏️ MINI QUIZ

SaaS の特徴として誤っているものはどれ?

  • A月額・年額のサブスクリプション課金
  • B1システムで複数顧客のデータを扱う(マルチテナント)
  • Cリリース後は原則、機能改修しない
✅ 正解! SaaS は継続改善が前提。リリース後こそが本番です。
💡 30秒で復習

SaaSはサブスク型のクラウドソフト。月額/年額課金で継続収益、機能更新は自動配信、マルチテナント設計が必須。SmartHR・freee・Notionなどが好例。個人開発でも月¥10万収益化が狙える。

8.2 技術スタックの全体像

所要: 約30分 📖 形式: 読み物 🔰 前提: 6.1

🎯 このレッスンの到達目標

  • 4つのコアサービス(Next.js / Supabase / Vercel / Stripe)の役割を説明できる
  • なぜこの組み合わせが個人SaaSの最適解なのかを理解する
  • 月額運用コストの目安を把握する

4つのコアサービス

⚛️ Next.js

役割: 画面 + API
特徴: Reactベースの最強フレームワーク。1つのコードで画面とサーバー処理を両方書ける。
開発元: Vercel社

🗄 Supabase

役割: 認証 + DB + ストレージ
特徴: Firebase の OSS 代替。PostgreSQL ベース。ログイン・DB・画像保存が全部入り。
無料枠: 本番運用レベル

☁️ Vercel

役割: ホスティング + CDN
特徴: Next.js の本家。git push で自動デプロイ。世界中のCDNで即配信。
無料枠: 個人プロジェクトならOK

💳 Stripe

役割: 決済 + サブスク管理
特徴: 世界標準の決済。日本からも利用可、カード・Apple Pay・銀行振込対応。
料金: 売上の3.6%

なぜこの組み合わせが最適なのか(5つの理由)

  1. 情報量が多い: Claude Code が特に得意なスタック。生成コードの精度が高い
  2. 学習リソースが豊富: 公式ドキュメント完璧、コミュニティ活発、YouTube/Zenn/Qiita に情報多数
  3. 0→Scale が滑らか: 個人開発から数万ユーザーまで、同じ構成で対応可能
  4. 運用コスト最小: 無料枠で本番稼働、スケールするまで月$0
  5. 本気の人が使っている: Linear, Cal.com, Vercel など、大手SaaSも同じ系統のスタック

月額コストの目安

サービス 開発〜初期 成長後(100 MAU) 規模拡大(1,000 MAU)
Next.js無料無料無料
Vercel$0$0〜$20$20
Supabase$0$0〜$25$25〜$50
Stripe売上の3.6%同左同左
ドメイン年1,500円同左同左
合計(月換算)約125円$0〜$45$45〜$70
💡 損益分岐点

月$9 のプランで 8人課金 ≒ インフラ費回収。10人で利益が出始め、100人で月収が9万円を超えます。個人開発として十分射程圏内の数字です。

✏️ MINI QUIZ

このモジュールで Supabase が担う役割は?

  • A画面のデザイン
  • Bユーザー認証とデータベース
  • C決済処理
✅ 正解! Supabase は PostgreSQL ベースの BaaS で、認証 + DB + ストレージが全て揃っています。
💡 30秒で復習

推奨スタックは「Next.js(フロント+API)/ Supabase(DB+認証)/ Stripe(決済)/ Vercel(ホスティング)」。すべて無料枠で始めて、ユーザー増えたら有料化。学習曲線が緩やか。

8.3 プロジェクト設計 — 作り始める前に決めること

所要: 約80分 🧭 形式: 設計ワーク 🔰 前提: 6.2

🎯 このレッスンの到達目標

  • 画面構成・データ構造・課金プランを紙の上で設計できる
  • 設計を Claude Code に渡せるドキュメントに落とせる
  • 「作りすぎない」判断ができる

決めておくこと6つ

  1. プロダクト名とワンライナー: 「FocusList - 1日3つに絞るタスク管理」
  2. 画面一覧: ログイン / サインアップ / ダッシュボード / 設定 / 料金プラン
  3. データ構造: users / tasks / subscriptions テーブル
  4. 料金プラン: Free(3件まで)/ Pro(月$9、無制限 + AI機能)
  5. MVPに含めない機能: 後回しリスト(ここが超重要)
  6. 成功指標(KPI): 登録数 / 有料転換率 / MRR / Churn

データ設計の例

-- Supabase Auth が自動生成(デフォルト)
auth.users
  - id (uuid)
  - email
  - created_at

-- tasks テーブル
public.tasks
  - id (uuid)
  - user_id (auth.users.id への外部キー)
  - title (text)
  - done (boolean, default false)
  - due_date (date, nullable)
  - created_at (timestamptz)

-- subscriptions テーブル
public.subscriptions
  - id (uuid)
  - user_id (auth.users.id)
  - plan ('free' | 'pro')
  - stripe_customer_id (text)
  - stripe_subscription_id (text)
  - status ('active' | 'canceled' | 'past_due')
  - current_period_end (timestamptz)

Claude Code への設計依頼テンプレート

以下のSaaSプロジェクトの、技術設計書を作成してください。

【プロダクト】
- 名前: FocusList
- 概要: 1日3つに絞れるタスク管理SaaS
- ターゲット: 集中力を保ちたい知的労働者
- 差別化: 4つ目を追加しようとするとやんわり止める

【要件】
- Next.js (App Router) + Supabase + Vercel + Stripe
- 認証: メール + Google OAuth
- Free: タスク3件まで / Pro: 月$9で無制限 + AI優先度提案

【MVPに含めないもの(重要)】
- チーム機能
- モバイルアプリ
- 通知機能
- API公開

【成果物】
1. 画面遷移図(テキスト)
2. DBスキーマ(テーブル・カラム・関係・制約)
3. 認証フロー(メール / OAuth / セッション管理)
4. 決済フロー(Checkout → Webhook → DB反映)
5. 推奨ディレクトリ構成
6. 環境変数一覧
⚠️ 最大の罠: 作りすぎ

初めて SaaS を作るとき、必ず陥る失敗が「機能を盛り込みすぎて完成しない」こと。
MVP(Minimum Viable Product) = 「最小限、動いて意味のあるもの」を厳守しましょう。
iPhone の初代も「電話 + Web + 音楽」の3機能だけ。カメラも絵文字も後から追加されました。

MVP判定の質問

各機能について、次の質問に答えられないなら MVP には入れない:

  • これがないと、ユーザーは価値を得られないか?
  • 他の機能で代用できないか?
  • 後から追加してもビジネス的にダメージないか?
✏️ MINI QUIZ

SaaS の初期開発で、最も重要な進め方はどれ?

  • A思いつく全機能を盛り込んで完成度を上げる
  • BMVP(最小限の価値ある機能)だけに絞って、素早くリリース
  • Cローンチは完璧になってから
✅ 正解! 完璧を目指して1年かけて作っても、ユーザーの反応なしでは磨けません。最小で出して学ぶのが鉄則。
💡 30秒で復習

プロジェクト設計は ①ペルソナ ②課題 ③解決策 ④マネタイズ ⑤MVP機能を3個まで絞る。多機能化は後で良い。最小機能で1週間以内に公開できる粒度に削る。

8.4 Next.js プロジェクトの構築

所要: 約90分 💻 形式: ハンズオン 🔰 前提: 6.3

🎯 このレッスンの到達目標

  • Next.js プロジェクトをローカルで起動できる
  • 基本的なページとレイアウトを作成できる
  • Vercel に初回デプロイできる

STEP 1: プロジェクト初期化

mkdir ~/projects/focuslist
cd ~/projects/focuslist
claude

# Claude への指示:
Next.js (App Router, TypeScript, Tailwind CSS 込み) で
focuslist というプロジェクトを初期化してください。

- src/ ディレクトリ構成
- ESLint 有効
- App Router
- Turbopack 使用
- Tailwind CSS 有効

初期化が終わったら、npm run dev で起動できるか
確認してください。

STEP 2: 基本レイアウトを作る

app/layout.tsx を以下の仕様で作ってください:
- ヘッダー: ロゴ + ナビ (ログイン / 登録)
- メインコンテンツエリア
- フッター: シンプルに著作権表示

デザイン方針:
- 白基調、Linear / Vercel 風のミニマル
- アクセントカラー: #09090b
- フォントは Inter + Noto Sans JP

STEP 3: トップページ (LP) を作る

app/page.tsx をFocusList のLPとして作ってください:

セクション:
1. ヒーロー: "1日3つに集中して、終わらせよう" + CTAボタン
2. 3つの特徴(集中 / 習慣化 / AI支援)
3. 料金プラン(Free / Pro)の比較表
4. 最終CTA

レスポンシブ対応必須。スマホで375pxまで崩れないように。

STEP 4: ディレクトリ構成を理解する

focuslist/
├── src/
│   ├── app/
│   │   ├── layout.tsx       ← 全ページ共通レイアウト
│   │   ├── page.tsx         ← トップ (/)
│   │   ├── login/
│   │   │   └── page.tsx     ← /login
│   │   ├── dashboard/
│   │   │   └── page.tsx     ← /dashboard
│   │   └── api/
│   │       └── webhooks/
│   │           └── stripe/
│   │               └── route.ts  ← /api/webhooks/stripe
│   ├── components/           ← 共通コンポーネント
│   └── lib/                  ← ユーティリティ
├── public/                   ← 静的ファイル
├── .env.local                ← 環境変数(git除外)
└── CLAUDE.md                 ← プロジェクトルール

STEP 5: GitHub に push

このプロジェクトを GitHub に push して、
Vercel にデプロイしたいです。

1. git init
2. GitHub にリポジトリ作成(gh CLI で)
3. 初回 commit & push
4. Vercel プロジェクト作成(CLI or Web)
5. 自動デプロイ開始

ブラウザ認証が必要な箇所は具体的に指示してください。

Server Components と Client Components

🖥 Server Component(デフォルト)

サーバー側で実行。DBに直接アクセス可。
使いどころ: データ取得、初期表示

💻 Client Component

ブラウザで実行。useState等のフック使用可。
"use client" を先頭に書く
使いどころ: ユーザー操作、フォーム入力

✏️ MINI QUIZ

Next.js の App Router で、ユーザー操作(クリックで状態が変わる等)を扱うコンポーネントに必要な記述は?

  • A特に何も要らない
  • Bファイルの先頭に "use client" を書く
  • C拡張子を .jsx にする
✅ 正解! デフォルトは Server Component。useState や onClick を使うなら "use client" 宣言が必須です。
💡 30秒で復習

Next.js構築:create-next-app→App Router採用→TypeScript+Tailwind有効化→shadcn/uiでUI部品。最初の1時間でログイン画面とダッシュボードのガワができる。

8.5 Supabase 認証 — ログインを実装する

所要: 約90分 🔐 形式: 実装 🔰 前提: 6.4

🎯 このレッスンの到達目標

  • Supabase プロジェクトを作成・接続できる
  • メール認証と Google OAuth でログインを実装できる
  • middleware でルート保護ができる

STEP 1: Supabase プロジェクト作成

  1. supabase.com に GitHub ログイン
  2. 「New Project」→ 名前: focuslist
  3. Region: Northeast Asia (Tokyo)
  4. DB パスワードを安全に保管
  5. Project URL と anon key をコピー

STEP 2: Claude Code で Supabase SDK を統合

このNext.jsプロジェクトに Supabase を統合してください。

手順:
1. @supabase/supabase-js @supabase/ssr をインストール
2. 環境変数を .env.local に追加
   - NEXT_PUBLIC_SUPABASE_URL
   - NEXT_PUBLIC_SUPABASE_ANON_KEY
3. src/lib/supabase/client.ts を作成(ブラウザ用)
4. src/lib/supabase/server.ts を作成(サーバー用)
5. middleware.ts で認証状態を確認

Next.js 15 の App Router + Server Components に
対応した最新のベストプラクティスで書いてください。

STEP 3: ログイン画面の実装

以下の画面を実装してください。

/login:
- メール + パスワード入力
- "Googleでログイン" ボタン
- "新規登録はこちら" リンク
- Zod でバリデーション

/signup:
- 同様のフォーム、登録後は確認メール送信

/auth/callback:
- OAuth コールバック処理

機能要件:
- ログイン成功で /dashboard へ
- エラーメッセージは日本語で表示
- ローディング状態も表示
- Tailwind でLinear風デザイン

STEP 4: Google OAuth 設定

  1. Supabase ダッシュボード → Authentication → Providers → Google を有効
  2. Google Cloud Console で OAuth クライアント作成
  3. Client ID と Secret を Supabase に貼り付け
  4. Redirect URI: https://あなたのプロジェクト.supabase.co/auth/v1/callback

STEP 5: middleware でルート保護

middleware.ts で以下を実装してください:

- /dashboard 以下は認証必須
- 未ログインなら /login へリダイレクト
- ログイン済みで /login or /signup に来たら /dashboard へ

全リクエストで Supabase セッションを refresh する
処理も含めてください。
💡 認証で押さえるべき3ポイント

1. セッションはサーバー側で管理: クライアントだけだと改ざんされる
2. middleware で全ルート保護: ページごとチェックは漏れる
3. トークンは Cookie 経由(HttpOnly): JavaScript からアクセスさせない

✏️ MINI QUIZ

SaaS で「未ログインユーザーが /dashboard に直接URLアクセスしても、自動で /login に飛ばす」実装に使うのは?

  • A各ページで if (!user) redirect を書く
  • Bmiddleware.ts で統一して処理する
  • CCSS だけで何とかする
✅ 正解! middleware は全リクエストを通る関所。ここで認証チェックすれば漏れがありません。
💡 30秒で復習

Supabase認証はメール/パスワード+Google OAuthが基本。supabase.auth.signUp()/signIn()でフロント実装。RLS(Row Level Security)でユーザーごとにデータ分離するのが鉄則。

8.6 DB 設計と RLS — データの安全を守る

所要: 約60分 🗄 形式: 実装 🔰 前提: 6.5

🎯 このレッスンの到達目標

  • tasks / subscriptions テーブルを作成できる
  • RLS(行レベルセキュリティ)を設定できる
  • なぜ RLS が SaaS の生命線なのかを理解する

RLS(Row Level Security)とは

「ユーザーAはユーザーBのデータを読めない」をデータベース側で強制する仕組み。フロント側のチェックを忘れても、DB 側で弾いてくれるので安全性が大きく上がります。

⚠️ RLS を忘れると重大事故に

RLSなしだと、意図せず「ログインユーザーなら他人のデータも見える」状態になります。これは個人情報漏洩の典型パターン。
Supabase はRLS を有効化しないと警告が出る設計になっていますが、必ず明示的に設定しましょう。

Claude Code に SQL マイグレーションを作ってもらう

Supabase に以下のテーブルとRLSを設定する SQL を
作ってください。supabase/migrations/ 配下に
タイムスタンプ付きのファイルで配置して。

【tasks テーブル】
- id uuid primary key default gen_random_uuid()
- user_id uuid references auth.users(id) on delete cascade
- title text not null
- done boolean default false
- due_date date
- created_at timestamptz default now()

【RLS ポリシー】
- tasks は RLS 有効化
- SELECT: auth.uid() = user_id
- INSERT: auth.uid() = user_id
- UPDATE: auth.uid() = user_id
- DELETE: auth.uid() = user_id

【subscriptions テーブル】
- id uuid primary key
- user_id uuid unique references auth.users(id)
- plan text check (plan in ('free', 'pro')) default 'free'
- stripe_customer_id text
- stripe_subscription_id text
- status text
- current_period_end timestamptz

【RLSポリシー】
- SELECT は本人のみ
- INSERT/UPDATE はサービスロール(Webhook)のみ許可

インデックスも適切に貼ってください。

SQL を Supabase に適用

  1. Supabase Dashboard → SQL Editor を開く
  2. 生成された SQL をコピペ
  3. 「Run」で実行
  4. Database → Tables で作成確認
  5. Database → Policies で RLS ポリシー確認

RLS の動作確認テスト

Claude への依頼:
以下のテストを実装してください:

1. ユーザーAを作成、タスクを3件作る
2. ユーザーBを作成、ログイン
3. ユーザーBから「tasks を全部取得」を試みる
4. 期待: ユーザーBには0件(自分のタスクだけ)が返る
5. ユーザーA のタスクが見えないことを確認

このテストがパスすれば、RLS が効いている証拠です。
💡 RLS の考え方

「どのユーザーが、どの操作を、どの条件で許可されるか」をテーブルごとに定義します。
一度書けばアプリのどこからアクセスしても効く絶対の砦。だからこそ SaaS の必須基盤です。

✏️ MINI QUIZ

SaaS で「他ユーザーのデータに絶対アクセスさせない」ために、Supabase で必ず設定すべき機能は?

  • AStorage Bucket
  • BRLS(行レベルセキュリティ)
  • CEdge Functions
✅ 正解! RLS はマルチテナントSaaSの生命線。必ず全テーブルで有効化しましょう。
💡 30秒で復習

DB設計の基本:①users(auth連携)②teams(マルチテナント)③subscriptions(課金状態)④ドメイン固有テーブル。RLSで「自分のデータしか見れない」を強制。

8.7 CRUD 実装 — タスク管理の中核機能

所要: 約120分 🏗 形式: 実装 🔰 前提: 6.6

🎯 このレッスンの到達目標

  • タスクの作成・表示・更新・削除(CRUD)を実装できる
  • Server Actions と Server Components を使い分けられる
  • Free プランの制限(3件まで)を実装できる

CRUD = Create / Read / Update / Delete の4操作

SaaS の主要機能はほぼすべて CRUD の組み合わせ。これが書ければ、99% の機能が実装できます。

ダッシュボード画面の仕様

/dashboard を以下で実装してください。

レイアウト:
- ヘッダー: ロゴ + ユーザーメニュー(設定/ログアウト)
- 中央: 「今日のタスク」(最大3件表示)
- 入力フォーム: 新規タスク追加
- タスクリスト: チェックボックス + タイトル + 削除ボタン
- フッター: Pro プラン誘導(Free の場合)

機能:
1. Read: 自分のタスクを作成日時順で取得
2. Create: 新規タスク追加(Free は3件で制限)
3. Update: チェックボックスで完了/未完了切替
4. Delete: ゴミ箱アイコンで削除
5. 楽観的更新(UI 即時反映、サーバー同期は裏で)

実装方針:
- 取得は Server Component(初回表示速く)
- 操作は Server Actions(API Route 不要)
- エラーハンドリング、ローディング表示
- スケルトンUIで体感速度UP

Server Actions の基本形

// app/dashboard/actions.ts
'use server'
import { createClient } from '@/lib/supabase/server'
import { revalidatePath } from 'next/cache'

export async function createTask(formData: FormData) {
  const title = formData.get('title') as string
  const supabase = await createClient()

  // 認証確認
  const { data: { user } } = await supabase.auth.getUser()
  if (!user) return { error: '未認証です' }

  // Free プラン制限チェック
  const { count } = await supabase
    .from('tasks')
    .select('*', { count: 'exact' })
    .eq('user_id', user.id)

  const { data: sub } = await supabase
    .from('subscriptions')
    .select('plan')
    .eq('user_id', user.id)
    .single()

  if (sub?.plan === 'free' && count && count >= 3) {
    return { error: 'Free プランは3件まで。Pro にアップグレードを' }
  }

  // 作成
  const { error } = await supabase
    .from('tasks')
    .insert({ user_id: user.id, title })

  if (error) return { error: error.message }

  revalidatePath('/dashboard')
  return { success: true }
}

Pro 専用機能: AI 優先度提案

Pro ユーザー向けに、「タスクを3つ入力すると、
どれから着手すべきか AI が理由付きで提案する」
機能を追加してください。

- app/api/suggest-priority/route.ts に実装
- Anthropic SDK で Claude Haiku を使用
- 環境変数 ANTHROPIC_API_KEY
- レスポンス: { recommended_order: [...], reasons: [...] }

フロント側: Pro ユーザーのみ「AIに聞く」ボタン表示。
Free ユーザーには「Pro にアップグレード」誘導。

UX 改善のテクニック

⚡ 楽観的更新

クリック → UIに即反映 → 裏でサーバー通信。体感速度が劇的に向上。

💀 スケルトンUI

ロード中は灰色のブロック表示。「空白」より「何かが来る」感を与える。

🎉 フィードバック

保存成功でトースト通知。「ちゃんと動いた感」を明示。

🚫 エラーリカバリ

操作失敗時は「再試行」ボタンや自動リトライ。諦めさせない。

✏️ MINI QUIZ

Next.js App Router で「フォーム送信 → DB更新」を実装する、2026年推奨の方法は?

  • Aclient 側で fetch('/api/...')
  • BServer Actions で直接 DB アクセス
  • Cページ遷移で form action="/save"
✅ 正解! Server Actions は API Route を書かずに「関数呼び出し感覚」で DB 操作できる最新機能です。
💡 30秒で復習

CRUD実装はNext.js Server ActionsまたはAPI Routesで。Supabase ClientでDB操作、useSWR/React Queryでキャッシュ。エラーハンドリングとローディング状態を必ず実装。

8.8 Stripe 決済 — 月額課金を実装する

所要: 約120分 💳 形式: 実装 🔰 前提: 6.7

🎯 このレッスンの到達目標

  • Stripe Checkout で月額課金フローを作れる
  • Webhook で決済完了を DB に反映できる
  • Pro プラン判定で機能制限を解除できる

STEP 1: Stripe アカウント作成と商品登録

  1. stripe.com でアカウント作成(ビジネス登録は後でOK)
  2. ダッシュボードで「テストモード」にする
  3. Products → 新規 Pro プラン(月額$9)を作成
  4. Price ID(price_xxx)をコピー
  5. API Keys で Secret Key / Publishable Key を取得

STEP 2: Claude Code で決済実装

このプロジェクトに Stripe で月額課金を組み込んでください。

【フロー】
1. /pricing でPro プランを選択
2. Stripe Checkout セッション作成
3. Stripe の決済画面へ
4. 成功で /dashboard?checkout=success に戻る
5. Webhook で subscriptions テーブル更新
6. DB の plan='pro' で機能制限解除

【実装】
- stripe npm パッケージインストール
- app/api/checkout/route.ts: Checkout セッション作成
- app/api/webhooks/stripe/route.ts: Webhook 受信
- Webhook は署名検証(stripe.webhooks.constructEvent)
- Server Component で plan を取得、UI に反映

【環境変数】
- STRIPE_SECRET_KEY
- STRIPE_WEBHOOK_SECRET
- NEXT_PUBLIC_STRIPE_PRICE_ID

【テストカード】
4242 4242 4242 4242 で動作確認してください。

STEP 3: Webhook のローカルテスト

Stripe の Webhook は本番URLに飛ばすもの。ローカルでテストするには stripe CLI を使います:

# Claude に依頼
stripe CLI をインストールして、
localhost:3000/api/webhooks/stripe に
Webhook を転送する設定を教えてください。

stripe login
stripe listen --forward-to localhost:3000/api/webhooks/stripe

出力された whsec_xxx を .env.local の
STRIPE_WEBHOOK_SECRET に設定。

Webhook で扱うべき主要イベント

イベント 処理
checkout.session.completedsubscription 作成・plan を pro に
customer.subscription.updatedプラン変更・期間更新
customer.subscription.deleted解約 → plan を free に戻す
invoice.payment_failed決済失敗通知
⚠️ フロント成功だけで判定するな

クライアント側の「decision 成功!」画面は信用してはいけません。悪意あるユーザーが URL を直接叩けば成功画面に行けるから。
必ず Stripe 側の Webhook で署名検証した結果 を正とすること。これが決済実装の鉄則です。

STEP 4: プラン変更・解約の導線

/settings/billing 画面を実装してください:

- 現在のプラン表示
- Free → Pro アップグレードボタン
- Pro → 解約ボタン(Stripe Customer Portal 経由)
- 次回課金日、支払い履歴の表示

Stripe Customer Portal を使えば、
自前で解約UIを作らずに済みます。
✏️ MINI QUIZ

Stripe 決済で「決済完了を DB に反映する」とき、もっとも信頼できる情報源は?

  • Aフロントエンドの onSuccess コールバック
  • BStripe の Webhook(署名検証付き)
  • Cユーザーの自己申告
✅ 正解! Webhook はStripeサーバーから直接送られる。署名検証すれば改ざんも防げます。
💡 30秒で復習

Stripe決済はCheckout Session(買切)or Subscription(サブスク)。Webhookでsubscription.created/canceledを受けてSupabaseのsubscriptionsテーブルを更新。本番はLive Keysに切替。

8.9 本番公開 — 世界に SaaS を届ける

所要: 約60分 🚀 形式: 実習 🔰 前提: 6.8

🎯 このレッスンの到達目標

  • Vercel 本番環境にデプロイできる
  • 本番用の環境変数を安全に管理できる
  • カスタムドメインを設定できる
  • リリース前のチェックリストを消化できる

本番公開の10ステップ

  1. Vercel にプロジェクトを接続(GitHub 連携)
  2. 環境変数を Vercel Dashboard に登録
  3. Stripe を本番モードに切替、本番キーを Vercel に設定
  4. Stripe Webhook の本番 URL を登録
  5. Supabase の URL configuration で本番 URL を追加
  6. Google OAuth の redirect URI に本番 URL を追加
  7. main ブランチに push → 自動デプロイ
  8. 本番 URL で一通り動作確認
  9. カスタムドメイン設定(任意)
  10. SSL 自動発行を確認

環境変数の本番管理

Vercel Dashboard → Settings → Environment Variables

【Production にのみ設定】
STRIPE_SECRET_KEY=sk_live_...
STRIPE_WEBHOOK_SECRET=whsec_...
NEXT_PUBLIC_STRIPE_PRICE_ID=price_live_...

【全環境共通】
NEXT_PUBLIC_SUPABASE_URL=...
NEXT_PUBLIC_SUPABASE_ANON_KEY=...
ANTHROPIC_API_KEY=sk-ant-...

【Preview / Development のみ】
STRIPE_SECRET_KEY=sk_test_...  ← テストキー

Claude Code に最終チェックを依頼

本番公開前の最終チェックをしてほしいです。
以下を確認してください:

1. 全ての環境変数が本番用に切り替わっているか
2. Stripe が本番モードになっているか
3. RLS が全テーブルで有効か
4. 管理者用のシード情報・テストアカウントが残っていないか
5. console.log など機密情報を出す行が残っていないか
6. エラーページ (error.tsx / not-found.tsx) が実装されているか
7. robots.txt / sitemap.xml があるか
8. Open Graph / Twitter カードが設定されているか
9. favicon / apple-touch-icon があるか
10. Lighthouse スコアが 85以上あるか

問題があれば修正案も提示してください。

✅ 本番公開前チェックリスト

⚠️ 日本で課金するなら必須

特定商取引法に基づく表記: 事業者名・住所・電話番号・返金ポリシーなど
利用規約・プライバシーポリシー
インボイス対応(法人・フリーランス向けなら)
テンプレは Claude に「これらをこのサービス用に作って」で生成可能です。

✏️ MINI QUIZ

SaaS の本番公開で、テスト環境の情報が残っていると最も危険なのは?

  • Afavicon
  • BStripe のテストキー(sk_test_...)がソースに残っている
  • C会社の電話番号
✅ 正解! テストキーのままだと決済が本番で動かない(または逆にリアルに課金される)重大事故になります。
💡 30秒で復習

本番公開はVercelに git push で即デプロイ。独自ドメイン設定、環境変数の本番値登録、Stripe Webhookの本番URL登録、Supabaseの本番プロジェクト作成。公開前チェック5項目を必ず確認。

8.10 ローンチ後の運用 — 育てる戦い方

所要: 約60分 📈 形式: 読み物 + 計画 🔰 前提: 6.9

🎯 このレッスンの到達目標

  • SaaS の成長指標(KPI)を設定できる
  • 最低限のモニタリングを実装できる
  • 継続改善のサイクルを回せる

見るべき4つの数字(SaaS の健康診断)

👥 MAU(月次アクティブユーザー)

月内に一度でも利用した人。
評価: ユーザーが増えているか

💰 MRR(月次経常収益)

月額課金の合計。SaaS の生命線。
目標: 右肩上がりの維持

📊 有料転換率

Free → Pro に切り替わる割合。
業界平均: 2〜5% / 優秀は 10%超

📉 Churn Rate(解約率)

月の解約者 ÷ 月初有料ユーザー
目標: 月5% 以下 / 3% 以下なら優秀

最低限入れておきたい監視

  • エラー監視: Sentry(無料枠あり)でサーバー・クライアント両方のエラーをキャッチ
  • ユーザー行動: PostHog(OSS / 無料枠)or Google Analytics
  • ビジネス指標: Stripe Dashboard + 簡易 /admin ページで MRR / Churn 可視化
  • 稼働監視: UptimeRobot(無料)で5分おきに死活監視

継続改善の PDCA サイクル

  1. 仮説: 「Free の3件制限を強調すれば転換率が上がるはず」
  2. 実装: 3件目を追加しようとしたら Pro 誘導モーダル
  3. 計測: 1〜2週間、転換率の変化を見る
  4. 判断: 効果あり → 採用 / 効果なし or 悪化 → ロールバック
  5. 次の仮説へ

3ヶ月後の目標設定

🎯 個人SaaSのマイルストーン例

Month 1: ローンチ、ユーザー10人獲得、フィードバック収集
Month 2: 改善リリース×4回、有料ユーザー5人(MRR $45)
Month 3: マーケ施策(ProductHunt / X / ブログ)、MAU 100人、MRR $100超え
Month 6: MRR $1,000 超えでサラリーマンの副収入として機能

💡 Claude Code は運用でも強い

「解約前アンケートを実装して」「先週の売上をダッシュボードで可視化」「ProductHunt 投稿用の原稿を書いて」— 運用タスクも日本語の依頼で即実装できます。1人SaaSの最強の相棒。

🎓 モジュール6 修了チェック

🎊 全カリキュラム修了、おめでとうございます!

AI基礎 → Claude Code → HP/LP制作 → OpenClaw → n8n自動化 → SaaS開発まで、走り切りました。
あなたはいま、2026年のWeb制作・AI活用・プロダクト開発の全領域を1人でカバーできる人材です。

ここからが本当の「実務」。作ったものを世に出し、ユーザーの声を聞き、改善し続ける。その土俵に立てる人は多くありません。
あなたの番です。

✏️ FINAL QUIZ

SaaS の健全性を測る最重要指標と言われるのはどれ?

  • A登録数
  • BLPの訪問者数
  • CChurn Rate(解約率)
✅ 正解! 解約率が高いと、集客しても「穴の空いたバケツ」状態。Churn は SaaS の死活指標です。
💡 30秒で復習

ローンチ後は ①Product Hunt/X告知 ②初期ユーザーへの個別ヒアリング ③Mixpanel/PostHogで利用分析 ④週次で機能改善 ⑤MRR・チャーン率を追う。最初の100ユーザーが最重要。