ANTIGRAVITY LABEN
記事一覧/Agents & Manager
Agents & Manager/2026-04-26上級

Antigravity マルチエージェントで継続課金 SaaS を作る — エージェント分担と購読収益の実装パターン

Antigravity のマルチエージェントを継続課金 SaaS の中核に据えるための実装と運用パターン。役割分担・タスクキュー・Stripe サブスク連携・コスト制御まで、動くコードと判断軸を体系的にまとめました。

Antigravity338マルチエージェント41サブスクリプション6Stripe14SaaS10個人開発89継続課金

「マルチエージェントは触っていて楽しいけれど、これで毎月のお金を稼ぐのは別の話」——そう感じた経験はないでしょうか。私自身、Antigravity のマルチエージェント機能を最初に触ったときは、デモを動かすのが楽しすぎて収益化の設計が後回しになっていました。

実際に継続課金 SaaS の中核に据えてみて分かったのは、マルチエージェントは「機能」ではなく「継続価値」として設計したほうが、はるかに購読収益と相性が良いということです。1回叩いて終わる便利機能ではなく、毎日・毎週ユーザーの仕事を肩代わりし続ける存在として組み込むと、解約率が静かに下がっていきます。

ここではAntigravity のマルチエージェントを購読収益に直結させるための実装と運用パターンを、役割分担・タスクキュー・Stripe 連携・コスト制御の4本柱で丁寧に紹介します。動くコードと、なぜそう設計するかの理由をセットでお届けします。

マルチエージェントを「継続価値」に変えるための前提

購読モデルの SaaS で重要なのは、毎月のサブスク料金を払い続けたくなる体験です。1回使って便利だった機能は、3か月もすると慣れて「もういいかな」になります。一方、毎日・毎週、自分の業務を黙々と進めてくれる存在は、止めたら明らかに困ります。

Antigravity のマルチエージェントは、この後者の体験を作るのに向いています。複数のエージェントに役割を分担させ、ユーザーの代わりに繰り返し業務を回し続けさせれば、それ自体が解約しにくい SaaS の正体になります。

実装と運用に入る前に、購読収益と相性が良いユースケースを2つ挙げます。

  • 毎日来るデータの監視と要約:ニュース・取引明細・SNS言及など、毎日変わるデータをエージェントが要約してメールで届ける
  • 週次レポートの自動生成:プロジェクト進捗・売上推移・顧客対応など、週次サイクルで人間がまとめている業務を肩代わりする

どちらも「今月だけ便利」ではなく「毎月価値が積み上がる」性質を持ちます。これがマルチエージェント × 継続課金の設計の出発点です。

エージェントの3層分担 — オーケストレータ・専門・監視

実装に入ると、すぐに「どのエージェントに何を任せるか」で迷います。私が今使っている3層分担を紹介します。

1. オーケストレータ層:全体のフロー制御。ユーザーからの依頼を受け、どの専門エージェントを呼び出すかを決める 2. 専門エージェント層:具体的な業務を実行する(要約・抽出・翻訳・生成・通知など) 3. 監視エージェント層:他エージェントの出力品質をチェックし、必要に応じてやり直しを依頼する

// オーケストレータの最小実装
import { Agent, AgentSession } from "@antigravity/sdk";
 
interface OrchestrationRequest {
  userId: string;
  taskType: "daily_summary" | "weekly_report" | "watchlist_alert";
  payload: Record<string, unknown>;
}
 
async function orchestrate(env: Env, req: OrchestrationRequest): Promise<{ status: string; resultId: string }> {
  const session = new AgentSession({ apiKey: env.ANTIGRAVITY_API_KEY });
  // 1. 利用量チェック(Stripeサブスク状態と連動)
  const allowed = await checkSubscriptionQuota(env, req.userId, req.taskType);
  if (!allowed) {
    return { status: "quota_exceeded", resultId: "" };
  }
  // 2. タスク種別に応じた専門エージェントの呼び出し
  let result: string;
  try {
    switch (req.taskType) {
      case "daily_summary":
        result = await dailySummaryAgent(session, req.payload);
        break;
      case "weekly_report":
        result = await weeklyReportAgent(session, req.payload);
        break;
      case "watchlist_alert":
        result = await watchlistAgent(session, req.payload);
        break;
    }
    // 3. 監視エージェントによる品質チェック
    const qualityOk = await qualityCheckAgent(session, result);
    if (!qualityOk) {
      // 品質不十分なら、フォールバック生成へ
      result = await fallbackAgent(session, req.payload);
    }
    // 4. 結果保存とユーザー通知
    const resultId = await persistResult(env, req.userId, req.taskType, result);
    return { status: "success", resultId };
  } catch (error) {
    console.error("orchestrate failed:", error);
    return { status: "error", resultId: "" };
  }
}

ここで重要なのは、監視エージェントによる品質チェックです。マルチエージェント SaaS で解約に直結するのは、出力品質のばらつきです。たまに変な要約が届くだけで、ユーザーは「これに月額払う価値あるかな?」と疑い始めます。監視層を入れて、明らかに品質が低いときはフォールバック生成するだけで、解約率に効きます。

タスクキューと冪等性 — 重複課金を防ぐ設計

毎日・毎週走るタスクは、タイムアウトや失敗リトライで重複実行されやすくなります。重複実行は2つの問題を生みます。1つはユーザーへの重複通知、もう1つはエージェント呼び出しの重複コストです。

冪等キーを使った設計で、両方を一度に解決します。

// 冪等キーつきのタスク実行
import { z } from "zod";
 
const TaskSchema = z.object({
  userId: z.string(),
  taskType: z.string(),
  scheduleDate: z.string(), // YYYY-MM-DD
  payload: z.record(z.unknown()),
});
 
type Task = z.infer<typeof TaskSchema>;
 
async function runScheduledTask(env: Env, task: Task): Promise<{ status: string }> {
  // 冪等キー = userId + taskType + scheduleDate
  const idempotencyKey = `task:${task.userId}:${task.taskType}:${task.scheduleDate}`;
  const existing = await env.TASK_KV.get(idempotencyKey);
  if (existing) {
    // すでに実行済み: 重複実行をスキップ
    return { status: "already_executed" };
  }
  // ロックを先に取得(実行中も他から見える)
  await env.TASK_KV.put(idempotencyKey, "running", { expirationTtl: 3600 });
 
  try {
    const result = await orchestrate(env, task);
    await env.TASK_KV.put(idempotencyKey, JSON.stringify(result), { expirationTtl: 60 * 60 * 24 * 7 });
    return { status: "success" };
  } catch (error) {
    // ロックは1時間で自動失効するので、リトライ可能
    console.error("task failed:", error);
    await env.TASK_KV.delete(idempotencyKey);
    throw error;
  }
}

冪等キーの粒度を userId + taskType + scheduleDate にすることで、「同じユーザーの同じタスクを同じ日に2回走らせない」が自動で保証されます。ロックの TTL を1時間に設定することで、実行が固まっても1時間後には再試行可能になります。

Stripe サブスクとの連動 — 利用量制御とコスト上限

マルチエージェント SaaS の利益率は、エージェント呼び出しコストの管理で決まります。1ユーザーあたり月¥3,000の課金を取っても、エージェントコストが¥1,500を超えると利益はわずかしか残りません。

Stripe サブスクのプランごとに、月次の呼び出し上限とコスト上限の両方を設定するのが安全です。

// プランごとの利用上限定義
interface PlanLimits {
  monthlyTaskLimit: number;
  monthlyCostLimitJpy: number;
}
 
const PLAN_LIMITS: Record<string, PlanLimits> = {
  starter: { monthlyTaskLimit: 30, monthlyCostLimitJpy: 500 },
  standard: { monthlyTaskLimit: 100, monthlyCostLimitJpy: 1500 },
  plus: { monthlyTaskLimit: 300, monthlyCostLimitJpy: 4000 },
};
 
async function checkSubscriptionQuota(
  env: Env,
  userId: string,
  taskType: string
): Promise<boolean> {
  const subscription = await getActiveSubscription(env, userId);
  if (!subscription) return false;
  const limits = PLAN_LIMITS[subscription.planId];
  if (!limits) return false;
 
  const month = new Date().toISOString().slice(0, 7);
  const usageKey = `usage:${userId}:${month}`;
  const usage = await env.USAGE_KV.get(usageKey, "json") as { taskCount: number; costJpy: number } | null;
  const current = usage ?? { taskCount: 0, costJpy: 0 };
 
  if (current.taskCount >= limits.monthlyTaskLimit) return false;
  if (current.costJpy >= limits.monthlyCostLimitJpy) return false;
  return true;
}
 
async function recordUsage(env: Env, userId: string, costJpy: number): Promise<void> {
  const month = new Date().toISOString().slice(0, 7);
  const usageKey = `usage:${userId}:${month}`;
  const usage = await env.USAGE_KV.get(usageKey, "json") as { taskCount: number; costJpy: number } | null;
  const next = {
    taskCount: (usage?.taskCount ?? 0) + 1,
    costJpy: (usage?.costJpy ?? 0) + costJpy,
  };
  await env.USAGE_KV.put(usageKey, JSON.stringify(next), { expirationTtl: 60 * 60 * 24 * 35 });
}

ここで肝になるのは、コスト上限とタスク上限の両方をかけることです。タスク数だけ制限すると、長文要約のような高コストタスクが1回で利益を食いつぶします。コストだけ制限すると、薄いタスクを連続で叩かれて品質が落ちます。両方かけることで、利益率と体験の両方が守れます。

ハイブリッド課金モデル — 月額固定 + オーバーレート

マルチエージェント SaaS の課金は、月額固定だけだと「ヘビーユーザーで赤字、ライトユーザーで割高」という両極端が起きます。私が今使っているのはハイブリッド課金です。

  • 標準プラン: 月¥2,980(月100タスクまで)
  • オーバーレート: 1タスクあたり¥30(プラン上限超過時)
  • 月の合計請求が標準プランの2倍を超える場合は、自動で上位プランを案内

オーバーレートは Stripe Metered Billing と組み合わせて実装します。

// オーバーレート分を Stripe に記録
import Stripe from "stripe";
 
async function reportOverageUsage(env: Env, userId: string, overageCount: number): Promise<void> {
  if (overageCount <= 0) return;
  const stripe = new Stripe(env.STRIPE_SECRET_KEY, { apiVersion: "2025-09-30.clover" });
  const subscriptionItemId = await getMeteredItemId(env, userId);
  await stripe.subscriptionItems.createUsageRecord(subscriptionItemId, {
    quantity: overageCount,
    timestamp: Math.floor(Date.now() / 1000),
    action: "increment",
  });
}

ハイブリッド課金は、ユーザー側にコストの予測可能性を残しつつ、運営側に利益保護をもたらすバランスの取れた設計です。「使えば使うほど高くなる」純従量制は、ユーザーに心理的な抵抗を生みます。月額固定の安心感を残した上でのオーバーレートは、両者のバランスが取れます。

解約フロー最適化と引き留めロジック

マルチエージェント SaaS の解約は、たいてい「最近使えていない」が引き金です。Stripe の Customer Portal そのままだと、この状況のユーザーをそのまま離します。

解約申請時に「最終利用から何日経っているか」「直近30日のタスク数」を取得し、利用が薄いユーザーには Pause Collection(一時停止) を、価格を理由にしたユーザーにはクーポンを提示する分岐を入れます。

async function handleCancelIntent(env: Env, userId: string, reason: string): Promise<{ action: string }> {
  const stripe = new Stripe(env.STRIPE_SECRET_KEY, { apiVersion: "2025-09-30.clover" });
  const usage = await getRecentUsage(env, userId, 30);
 
  if (reason === "not_using" && usage.taskCount < 5) {
    const subId = await getSubId(env, userId);
    await stripe.subscriptions.update(subId, {
      pause_collection: {
        behavior: "void",
        resumes_at: Math.floor(Date.now() / 1000) + 30 * 86400,
      },
    });
    return { action: "paused_for_30_days" };
  }
  if (reason === "too_expensive") {
    const subId = await getSubId(env, userId);
    await stripe.subscriptions.update(subId, { coupon: "RETENTION_30PCT_60D" });
    return { action: "discount_30pct_60d" };
  }
  return { action: "cancel_proceed" };
}

「使えていない」ユーザーには、値引きではなく休止を提案するのが筋がよいです。「価格が問題」のユーザーにだけ値引きを出す。理由ごとに対応を変えるだけで、解約意向のうち20〜30%は留まる印象です。

よくある間違い・落とし穴

実装してきて気づいた落とし穴を3つ。

1. エージェント呼び出しが async で重なって暴走する オーケストレータが並列に専門エージェントを呼ぶ設計にすると、ユーザーが大量にリクエストしたときに並列度が爆発します。Promise.all に任せず、p-limit のようなライブラリで並列度を5前後に絞るのが安全です。

2. ユーザーに見せる結果と内部ログが混ざる エージェントの中間出力(思考過程)をユーザーに見せると、「変なことを言っている」と感じさせる場面があります。ユーザーには最終結果のみ、思考過程は内部ログにだけ記録する分離を最初から徹底します。

3. プラン変更時の利用量カウントが二重になる 月の途中で Standard → Plus にアップグレードしたとき、その月の利用量を Standard のカウントに加算したまま Plus 上限を見てしまうと、すでに使った分が二重に効いてしまいます。プラン変更時に その月のカウントをリセットしないが、上限だけ上書きする ロジックにします。

全体を振り返って — マルチエージェントは『継続する仕事』として設計する

マルチエージェント SaaS で月額継続収益を作るとき、最も効くのは機能としての凄さよりも、毎月の業務に組み込まれる存在感です。今回紹介した3層分担・冪等性・ハイブリッド課金・解約フロー最適化は、いずれも「毎月、当たり前に動き続ける」を支えるための設計です。

実装の順序としては、まずオーケストレータと1つの専門エージェントだけで MVP を作り、Stripe サブスクをつなげて手動で監視するところから始めるのが現実的です。3層分担や監視エージェントは、最初の有料ユーザーが10人を超えてから足していくほうが、設計が無駄になりません。

さらに踏み込んで、マルチエージェントの並列性そのものを副業案件に転用したい場合は、Antigravity マルチエージェントで副業案件を捌く実用パターン も合わせてご覧ください。並列化の発想を SaaS と業務委託の両方に効かせると、月収の天井が一段上がります。

最初の30分でやれるのは、「自分の SaaS で、月額¥2,980を毎月払い続けたくなる『日次・週次の繰り返し業務』は何か」を1つだけ書き出すことです。そこに残った業務こそ、あなたのマルチエージェント SaaS の核になります。

シェア

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

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

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

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

Agents & Manager2026-04-14
Antigravity × AgentKit 2.0 × Stripe でつくるAIエージェント SaaS — 個人開発者が本番運用まで到達する実装ガイド
AgentKit 2.0 と Stripe を組み合わせ、サブスクリプション収益を得られるAIエージェント SaaS を Antigravity で構築する完全ガイド。アーキテクチャ設計から本番デプロイまで、個人開発者が実際につまずく落とし穴と解決策を詳解します。
Agents & Manager2026-05-05
AgentKit 2.0 でサブスク型AIエージェントサービスを作る — Stripe課金から月次収益設計まで
AgentKit 2.0を使ったサブスクリプション型AIエージェントサービスの構築方法を完全解説。Stripe課金統合・マルチエージェント設計・プライシング戦略・解約防止まで、月次収益を安定させる実装ガイドです。
Agents & Manager2026-03-19
Antigravity × SaaS × Stripe — フルスタック開発で月額収益プロダクトを作る
Antigravity の AI コーディング機能でフルスタック SaaS を開発し、Stripe で課金する方法を解説。Next.js + Supabase + Stripe のスタックで、個人開発者が月額収益を得るまでのロードマップ。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →