CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/Claude Code
Claude Code/2026-04-20上級

Claude Code × Stripe で作るサブスクリプションSaaSの実装 — Webhook・権限管理・本番ハマりポイントの全記録

Claude Code と Stripe を組み合わせたサブスクリプションSaaSの完全実装ガイド。Cloudflare Workers特有のWebhook署名検証・KV+Cookie2層権限管理・bfcache問題など、本番で必ず直面するハマりポイントを実装コードと共に解説します。

Claude Code197Stripe15SaaS14Cloudflare Workers14Webhook4サブスクリプション8課金5

プレミアム記事

Stripe の Dashboard に「最初の課金成功」通知が届いたとき、思わず声が出てしまいました。Claude Code と2週間格闘しながら実装したサブスクリプションシステムが、本番でようやく動き出した瞬間でした。

構築したのは、月額プランと永久ライセンスを両方扱えるSaaSの課金システムです。Stripe Checkout → Webhook → Cloudflare KV → Cookie という一連のフローを、Cloudflare Workers 環境でゼロから動かすまでに、なかなかのデバッグ時間を費やしました。

ここではその過程で学んだことをすべて書き出しています。公式ドキュメントには書かれていないハマりポイントや、Claude Code と一緒に設計を固めていくプロセスも含めて、できるだけ正直に記録しています。

課金フロー全体を設計してから実装を始める理由

Stripe の実装でよくある失敗が、「とりあえず Checkout を動かしてから考える」というアプローチです。私自身、最初はそうやって実装を始めてしまいました。

結果、Webhook の処理ロジックと権限管理の設計が後から追加した形になり、コードが複雑に絡み合ってしまいました。Claude Code に「このコードをリファクタリングしてほしい」と頼んだところ、「設計から見直した方が早いです」と返ってきたのが正直なところです。

実装を始める前に、以下の6ステップのフローを確認しておくことをお勧めします。

  • フロントエンドの購入ボタン → /api/checkout API
  • /api/checkout → Stripe Checkout セッション生成 → ユーザーをリダイレクト
  • Stripe Checkout での支払い → checkout.session.completed Webhook 発火
  • Webhook ハンドラー → Cloudflare KV への権限情報書き込み
  • 支払い完了後リダイレクト → /api/verify-session でのCookie発行
  • Cookie → コンテンツへのアクセス制御

この6ステップを先に整理しておくと、実装中に「今どこを作っているのか」が常に明確になります。Claude Code に「このフロー図を見て、実装の順番と依存関係を整理して」と投げると、どの部分を先に実装すべきかを具体的に提案してくれます。

Claude Code に設計レビューを頼む価値

実装を始める前の段階で、Claude Code との対話が特に効果を発揮します。「この課金フローで設計上のリスクはあるか?」と質問すると、べき等性の問題や Race Condition のリスクを指摘してくれます。

課金システムは一度動き始めると変更しにくい部分が多いため、設計段階でのレビューが後々の修正コストを大幅に下げます。

pricing.ts による課金プランの一元管理

課金プランの価格・Stripe の priceId・UI 表示テキストは、必ず1ファイルで管理することをお勧めします。各コンポーネントに直書きし始めると、価格変更のたびに全ファイルを修正することになります。

// src/config/pricing.ts
 
// 全 priceId を一元管理
// as const で型安全にしつつ、ヘルパー関数でアクセスする設計
export const STRIPE_PRICE_IDS = {
  ja: {
    tip: "price_xxxxxxxxxxxx",     // ¥150
    article: "price_yyyyyyyyyyyy", // ¥250(記事単体)
    pro: "price_zzzzzzzzzzzz",     // ¥580/月(月額)
    premium: "price_wwwwwwwwwwww", // ¥2,480(永久ライセンス)
  },
  en: {
    tip: "price_aaaaaaaaaaaa",
    article: "price_bbbbbbbbbbbb",
    pro: "price_cccccccccccc",
    premium: "price_dddddddddddd",
  },
} as const;
 
// as const 型の落とし穴を回避するヘルパー関数
// string 型の locale で直接インデックスアクセスはできないため
export const getPriceIds = (locale: string) => {
  const localeKey = locale === "ja" ? "ja" : "en";
  return STRIPE_PRICE_IDS[localeKey];
};
 
// SingleArticleCTA のテキストも同じファイルで管理
export const ARTICLE_LABELS = {
  ja: {
    heading: "この記事の全文を読む",
    description: "詳細な実装コードと解説の続きをご覧ください",
    button: "¥250 で購入",
    separator: "または",
    membershipText: "月額メンバーシップで全記事を読み放題",
  },
  en: {
    heading: "Read the Full Article",
    description: "Access the complete implementation code and detailed explanations",
    button: "Buy for $1.75",
    separator: "or",
    membershipText: "Get unlimited access with a monthly membership",
  },
};

as const の落とし穴

STRIPE_PRICE_IDSas const で定義すると、string 型の locale 変数でインデックスアクセスができずエラーになります。

// ❌ これは TypeScript エラー(string で as const 型にアクセス不可)
const priceId = STRIPE_PRICE_IDS[locale].premium;
 
// ✅ ヘルパー関数を経由してアクセスする
const priceId = getPriceIds(locale).premium;
 
// ✅ サーバーコンポーネントで使う場合は、明示的な型注釈付きで再宣言
const PRICE_IDS: Record<string, { tip: string; article: string; pro: string; premium: string }> = STRIPE_PRICE_IDS;
const priceId = PRICE_IDS[locale]?.premium;

Claude Code に「as const で定義した型を locale 変数でインデックスアクセスしたい」と相談すると、上記のどちらのパターンが適切かを使用場所に応じて提案してくれます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
Checkout → Webhook → KV → Cookie の課金フロー全体を、Cloudflare Workers 環境でゼロから動かすまでの設計と実装手順
Webhook 署名検証・タイムアウト・重複配信・イベント順序の入れ替わりなど、本番でだけ起きる落とし穴と、それぞれの具体的な対処コード
KV + Cookie の2層フォールバックで deny-by-default を守る、アクセス制御の実装パターン
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Claude Code2026-05-03
Claude × Stripe Meter Events で従量課金 SaaS を構築する実装ガイド
Claude API のトークン消費量を Stripe Meter Events で従量課金として回収する、本番運用可能なアーキテクチャと実装コードを公開します。冪等性・上限制御・ダッシュボード可視化までカバーします。
Claude Code2026-03-21
NemoClaw × Claude — エンタープライズ AI エージェントで収益パイプラインを自動化する
NVIDIA NemoClaw と Claude Code / Claude API を組み合わせた収益自動化の実践ガイド。エージェント設計、API オーケストレーション、自動コンテンツ生成、SaaS バックエンドの構築まで、NemoClaw × Claude で実現する収益の自動化戦略を解説します。
API & SDK2026-03-19
Claude Code × SaaS 開発 — 個人開発者のための月額収益化パイプライン
Claude Code を使って SaaS プロダクトを個人で開発し、Stripe サブスクリプションで月額収益を得るまでの完全パイプライン。アイデア検証からMVP構築、決済実装、マーケティング自動化まで。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →