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 を立ち上げる土台を作ります。
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つの理由)
- 情報量が多い: Claude Code が特に得意なスタック。生成コードの精度が高い
- 学習リソースが豊富: 公式ドキュメント完璧、コミュニティ活発、YouTube/Zenn/Qiita に情報多数
- 0→Scale が滑らか: 個人開発から数万ユーザーまで、同じ構成で対応可能
- 運用コスト最小: 無料枠で本番稼働、スケールするまで月$0
- 本気の人が使っている: 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万円を超えます。個人開発として十分射程圏内の数字です。
このモジュールで Supabase が担う役割は?
- A画面のデザイン
- Bユーザー認証とデータベース
- C決済処理
✅ 正解! Supabase は PostgreSQL ベースの BaaS で、認証 + DB + ストレージが全て揃っています。
💡 30秒で復習
推奨スタックは「Next.js(フロント+API)/ Supabase(DB+認証)/ Stripe(決済)/ Vercel(ホスティング)」。すべて無料枠で始めて、ユーザー増えたら有料化。学習曲線が緩やか。
8.3 プロジェクト設計 — 作り始める前に決めること
⏱ 所要: 約80分
🧭 形式: 設計ワーク
🔰 前提: 6.2
🎯 このレッスンの到達目標
- 画面構成・データ構造・課金プランを紙の上で設計できる
- 設計を Claude Code に渡せるドキュメントに落とせる
- 「作りすぎない」判断ができる
決めておくこと6つ
- プロダクト名とワンライナー: 「FocusList - 1日3つに絞るタスク管理」
- 画面一覧: ログイン / サインアップ / ダッシュボード / 設定 / 料金プラン
- データ構造: users / tasks / subscriptions テーブル
- 料金プラン: Free(3件まで)/ Pro(月$9、無制限 + AI機能)
- MVPに含めない機能: 後回しリスト(ここが超重要)
- 成功指標(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 には入れない:
- これがないと、ユーザーは価値を得られないか?
- 他の機能で代用できないか?
- 後から追加してもビジネス的にダメージないか?
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" を先頭に書く
使いどころ: ユーザー操作、フォーム入力
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 プロジェクト作成
- supabase.com に GitHub ログイン
- 「New Project」→ 名前: focuslist
- Region: Northeast Asia (Tokyo)
- DB パスワードを安全に保管
- 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 設定
- Supabase ダッシュボード → Authentication → Providers → Google を有効
- Google Cloud Console で OAuth クライアント作成
- Client ID と Secret を Supabase に貼り付け
- 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 からアクセスさせない
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 に適用
- Supabase Dashboard → SQL Editor を開く
- 生成された SQL をコピペ
- 「Run」で実行
- Database → Tables で作成確認
- Database → Policies で RLS ポリシー確認
RLS の動作確認テスト
Claude への依頼:
以下のテストを実装してください:
1. ユーザーAを作成、タスクを3件作る
2. ユーザーBを作成、ログイン
3. ユーザーBから「tasks を全部取得」を試みる
4. 期待: ユーザーBには0件(自分のタスクだけ)が返る
5. ユーザーA のタスクが見えないことを確認
このテストがパスすれば、RLS が効いている証拠です。
💡 RLS の考え方
「どのユーザーが、どの操作を、どの条件で許可されるか」をテーブルごとに定義します。
一度書けばアプリのどこからアクセスしても効く絶対の砦。だからこそ SaaS の必須基盤です。
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
ロード中は灰色のブロック表示。「空白」より「何かが来る」感を与える。
🎉 フィードバック
保存成功でトースト通知。「ちゃんと動いた感」を明示。
🚫 エラーリカバリ
操作失敗時は「再試行」ボタンや自動リトライ。諦めさせない。
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 アカウント作成と商品登録
- stripe.com でアカウント作成(ビジネス登録は後でOK)
- ダッシュボードで「テストモード」にする
- Products → 新規 Pro プラン(月額$9)を作成
- Price ID(
price_xxx)をコピー
- 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.completed | subscription 作成・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を作らずに済みます。
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ステップ
- Vercel にプロジェクトを接続(GitHub 連携)
- 環境変数を Vercel Dashboard に登録
- Stripe を本番モードに切替、本番キーを Vercel に設定
- Stripe Webhook の本番 URL を登録
- Supabase の URL configuration で本番 URL を追加
- Google OAuth の redirect URI に本番 URL を追加
- main ブランチに push → 自動デプロイ
- 本番 URL で一通り動作確認
- カスタムドメイン設定(任意)
- 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 に「これらをこのサービス用に作って」で生成可能です。
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 サイクル
- 仮説: 「Free の3件制限を強調すれば転換率が上がるはず」
- 実装: 3件目を追加しようとしたら Pro 誘導モーダル
- 計測: 1〜2週間、転換率の変化を見る
- 判断: 効果あり → 採用 / 効果なし or 悪化 → ロールバック
- 次の仮説へ
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人でカバーできる人材です。
ここからが本当の「実務」。作ったものを世に出し、ユーザーの声を聞き、改善し続ける。その土俵に立てる人は多くありません。
あなたの番です。
SaaS の健全性を測る最重要指標と言われるのはどれ?
- A登録数
- BLPの訪問者数
- CChurn Rate(解約率)
✅ 正解! 解約率が高いと、集客しても「穴の空いたバケツ」状態。Churn は SaaS の死活指標です。
💡 30秒で復習
ローンチ後は ①Product Hunt/X告知 ②初期ユーザーへの個別ヒアリング ③Mixpanel/PostHogで利用分析 ④週次で機能改善 ⑤MRR・チャーン率を追う。最初の100ユーザーが最重要。