◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/AIモデル
◉ AIモデル/2026-04-28上級

Rork で AI エージェントを SaaS 化する — サブスクリプション + API 課金 + アフィリエイトの三層収益化モデル

Rork で作った AI エージェントを SaaS として運用するための実装ノートです。Stripe と RevenueCat の二重課金源をどう突合するか、Webhook の冪等化、解約手前の自動リカバリまで、実運用で詰まった箇所を中心に整理しました。

Rork585AI-agentSaaS3monetization11Stripe18RevenueCat30subscription10API-billingaffiliate

✦ プレミアム記事

個人開発でアプリを公開してきて、いちばん神経を使うのは「お金が正しく動いているか」を保証する部分でした。機能を足すのは楽しいのですが、課金まわりは静かに壊れます。ある月、サブスクの解約をユーザーが行ったのに権限がしばらく残り続けていたことがありました。原因は Webhook の取りこぼしでした。

Rork でエージェントを組み立てるところまでは、本当にあっという間です。難しいのはその先、「動くものを、お金が絡んでも安心して回せるサービスにする」ところです。料金体系、請求エンジン、顧客管理、API キーのローテーション。どれも地味ですが、ここを雑に作ると後でユーザーの信頼を失います。

以下では、Rork で作ったエージェントを SaaS として運用するために私が実際に組んだ構成を、つまずいた箇所を中心に整理していきます。土台になるのは三層の収益化モデルです。

  1. サブスクリプション層 — 月額プラン(Free / Pro / Enterprise)
  2. API 課金層 — 使用量ベースの従量課金
  3. Affiliate 層 — パートナー企業による再販売

このモデルを実装すれば、カジュアルユーザー、中堅企業、大手企業まで、すべてをカバーできます。

エージェント SaaS のアーキテクチャ

Rork で作ったエージェントを SaaS にするには、以下の層が必要です。

┌─────────────────────────────────────────────┐
│         Rork Agent (バックエンド)            │
│   Claude / Gemini / Mixtral API 統合       │
└──────────────┬──────────────────────────────┘
               │
┌──────────────▼──────────────────────────────┐
│         API Gateway (Express / Hono)        │
│   認証・レート制限・使用量トラッキング         │
└──────────────┬──────────────────────────────┘
               │
┌──────────────▼──────────────────────────────┐
│     Billing Engine (Stripe + RevenueCat)    │
│   サブスク・従量課金・支払い処理              │
└──────────────┬──────────────────────────────┘
               │
┌──────────────▼──────────────────────────────┐
│    Customer Dashboard (Next.js + Vercel)    │
│   利用状況・請求履歴・API キー管理           │
└─────────────────────────────────────────────┘

Step 1: Rork エージェントの API 化

最初に、Rork で構築したエージェントをプログラマティックに呼び出せるようにします。

Rork の SDK を使い、こんなコードで実装します。

// lib/rork-agent.ts
import { RorkClient } from '@rork/sdk';
 
const client = new RorkClient({
  apiKey: process.env.RORK_API_KEY,
  agentId: 'my-saas-agent',
});
 
export async function callAgent(input: string) {
  const response = await client.chat.completions.create({
    messages: [{ role: 'user', content: input }],
    maxTokens: 2000,
  });
 
  return {
    text: response.choices[0].message.content,
    tokensUsed: response.usage.total_tokens,
    costUsd: calculateCost(response.usage),
  };
}
 
function calculateCost(usage: TokenUsage): number {
  // 入力: $0.003 / 1K tokens, 出力: $0.015 / 1K tokens
  const inputCost = (usage.prompt_tokens / 1000) * 0.003;
  const outputCost = (usage.completion_tokens / 1000) * 0.015;
  return inputCost + outputCost;
}

このエージェントをわかりやすい REST API でラップします。

// app/api/agent/chat/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { callAgent } from '@/lib/rork-agent';
import { trackUsage } from '@/lib/billing';
 
export async function POST(req: NextRequest) {
  const authHeader = req.headers.get('Authorization');
  const apiKey = authHeader?.replace('Bearer ', '');
 
  if (!apiKey) {
    return NextResponse.json(
      { error: 'Missing API key' },
      { status: 401 }
    );
  }
 
  // API キーから顧客を検索
  const customer = await findCustomerByApiKey(apiKey);
  if (!customer) {
    return NextResponse.json(
      { error: 'Invalid API key' },
      { status: 401 }
    );
  }
 
  // レート制限チェック
  const remainingRequests = await checkRateLimit(customer.id);
  if (remainingRequests <= 0) {
    return NextResponse.json(
      { error: 'Rate limit exceeded' },
      { status: 429 }
    );
  }
 
  const { message } = await req.json();
 
  try {
    const result = await callAgent(message);
 
    // 使用量をトラッキング
    await trackUsage({
      customerId: customer.id,
      tokensUsed: result.tokensUsed,
      costUsd: result.costUsd,
      timestamp: new Date(),
    });
 
    return NextResponse.json({
      response: result.text,
      tokens_used: result.tokensUsed,
      cost_usd: result.costUsd,
    });
  } catch (error: any) {
    return NextResponse.json(
      { error: error.message },
      { status: 500 }
    );
  }
}
✦

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

この記事の続きを読む

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

この記事で得られること
✦Stripe と RevenueCat という2つの課金源を、サーバー側でどう1つのエンタイトルメントに突合するかの設計
✦Webhook を冪等にして二重課金・権限の取りこぼしを防ぐ実装パターン
✦支払い失敗から解約までの猶予期間を自動制御し、Win-back につなげる運用フロー
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◉ AI モデル2026-10-14
プロンプトをアプリから外して Edge Function に置く。守りは入力側でなく、出力側に作りました
アプリに入れた AI の指示文は、配信した日から読める側に回ります。プロンプトを Supabase Edge Function に寄せ、クライアントにはタスク名だけを言わせ、守りを出力の許可リストに置く構成を、テスト付きのコードで整理しました。
◉ AI モデル2026-10-05
Sonnet 5.5・GPT-6.1 Sol・Opus 5.5 のどれに頼むかを、修正の種類で先に決めておきます。クレジットの行き先を1週間記録して引いた割り当て
Rork のモデルメニューが Sonnet 5.5・GPT-6.1 Sol・Opus 5.5 の三つになったあと、修正を三種類に分けてモデルと effort を割り当てました。変更履歴に書かれた違いの読み方、クレジットの行き先を記録する小さな台帳、そこから引いた線引きを書き残します。
◉ AI モデル2026-09-28
続きで直すか、復元ポイントへ戻して言い換えるか。Rork で同じ不具合を両方の道で直して分かった境目
Rork の修正依頼が三度目にはまったとき、続きで頼むか、Restore で戻して言い換えるか。同じ不具合を両方で直した往復回数と残ったコードを並べ、私が引いた線をお伝えします。