RORK LABEN
MAX — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro向けにネイティブSwiftを生成し、2クリックでApp Store公開でき、Xcodeを必要としませんSTACK — 通常のRorkはReact Native(Expo)でクロスプラットフォームのモバイルアプリを作る位置づけ。用途に応じた使い分けが鍵ですFOCUS — BoltやLovableのようなWeb中心ツールと違い、RorkはiOS/Androidのネイティブアプリ生成に特化していますBUGS — 実利用レビューでは遭遇したバグの約70%を手動介入なしで解決、残り3割はエクスポート済みコードでの手修正が必要と報告されていますFUNDING — Rorkはa16z(Andreessen Horowitz)から$2.8Mを調達しましたPRICING — 無料で開始でき、有料プランは$25/月からです。まず触ってから判断できますMAX — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro向けにネイティブSwiftを生成し、2クリックでApp Store公開でき、Xcodeを必要としませんSTACK — 通常のRorkはReact Native(Expo)でクロスプラットフォームのモバイルアプリを作る位置づけ。用途に応じた使い分けが鍵ですFOCUS — BoltやLovableのようなWeb中心ツールと違い、RorkはiOS/Androidのネイティブアプリ生成に特化していますBUGS — 実利用レビューでは遭遇したバグの約70%を手動介入なしで解決、残り3割はエクスポート済みコードでの手修正が必要と報告されていますFUNDING — Rorkはa16z(Andreessen Horowitz)から$2.8Mを調達しましたPRICING — 無料で開始でき、有料プランは$25/月からです。まず触ってから判断できます
記事一覧/AIモデル
AIモデル/2026-06-17上級

Rork の AI 画像生成アプリで「クレジットが合わない」を消す — 原子的な台帳消費とモデレーションの実装メモ

Rork で作る AI 画像・動画生成アプリのクレジット課金が本番で崩れる原因は、生成と減算の順序にあります。原子的な台帳消費・冪等化・失敗時返金・モデレーションを、Supabase の実装コード付きでまとめた運用メモです。

Rork416AI画像生成fal.aiSupabase28クレジット課金冪等性2コンテンツモデレーション2上級7

プレミアム記事

最初に作った AI 画像生成アプリで、リリース当日に問い合わせが来ました。「5 枚生成されたのに 1 クレジットしか減っていない」という内容です。喜ぶ報告に見えて、これは課金が壊れている証拠でした。生成ボタンを素早く 5 回叩くと、5 本のリクエストがほぼ同時にサーバへ届き、どれもが「減算前の残高」を読んでしまっていたのです。

クレジット制のアプリで本当に難しいのは、画像を生成すること自体ではありません。fal.ai に投げれば 1〜2 秒で結果が返ります。難しいのは、生成という外部処理と、残高という内部状態を、ずれなく一致させ続けることです。ここを甘く作ると、無料で生成され続けるか、逆に失敗したのに課金されて低評価レビューが付きます。個人開発で課金アプリを運用していると、後者は売上以上に信頼を削ります。

このメモでは、Rork で生成した React Native アプリ(バックエンドは Supabase Edge Functions)を前提に、クレジット台帳を壊さないための実装を順に整理します。素朴な実装がどこで破綻するかを示してから、原子的な消費・冪等化・失敗時返金・モデレーションへ進みます。

素朴な「確認 → 生成 → 減算」が本番で崩れる三つの経路

多くのチュートリアルは次の順序で書かれています。残高を読み、足りていれば生成し、成功したら 1 引く。開発中はこれで動きます。問題は、本番には同時実行とネットワークの揺らぎがあることです。

破綻経路何が起きるか結果
同時実行(TOCTOU)複数リクエストが減算前の同じ残高を読む残高 1 で複数枚が生成され、課金漏れ
減算前にクラッシュ/タイムアウト生成は成功したが減算 UPDATE が届かない無料で生成され続ける
生成失敗後も減算API が 5xx を返したのに先に引いてしまう失敗課金で低評価レビュー

中でも一つ目が厄介です。SELECT creditsUPDATE credits = credits - 1 の間には時間の隙間があり、その隙間に別のリクエストが割り込みます。アプリ側でボタンを disabled にしても、リトライ・ダブルタップ・低速回線での重複送信は防ぎきれません。この落とし穴を回避するには、守るべき境界をクライアントではなくデータベースの中に置く必要があります。

クレジットは「残高カラム」ではなく「台帳」で持つ

最初の設計を変えます。users.credits という単一カラムを正本にするのをやめ、増減を 1 行ずつ記録する台帳(ledger)を正本にします。残高はその合計、あるいは整合性のために保持する派生値として扱います。クレジットの購入自体は、Stripe の決済完了 Webhook を受けて purchase の正の行を台帳へ足すだけです。台帳方式にすると「いつ・何に・いくつ使ったか/戻したか」が後から完全に追え、返金や監査が単純になります。

-- クレジット増減の正本となる台帳
create table credit_ledger (
  id          uuid primary key default gen_random_uuid(),
  user_id     uuid not null references auth.users(id),
  delta       integer not null,        -- 購入は +、消費は -、返金は +
  reason      text not null,           -- 'purchase' | 'image' | 'video' | 'refund'
  ref_id      text,                    -- 生成ジョブIDや決済セッションID
  idem_key    text,                    -- 冪等キー(後述)
  created_at  timestamptz not null default now()
);
 
-- 同じ冪等キーでの二重記録を物理的に禁止する
create unique index credit_ledger_idem_uniq
  on credit_ledger (user_id, idem_key)
  where idem_key is not null;
 
-- 現在残高は合計で求める(インデックスで高速化)
create index credit_ledger_user_idx on credit_ledger (user_id);

残高の参照は select coalesce(sum(delta), 0) from credit_ledger where user_id = $1 で求まります。台帳が増え続けるのが気になる場合は、後述のように月次でスナップショット行へ畳み込めますが、個人開発の規模(数万行)では合計クエリで十分高速です。

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

この記事の続きを読む

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

この記事で得られること
「確認→生成→減算」が本番で破綻する具体的な経路と、Postgres 関数で原子的に消費する実装
二重課金を止める冪等キーと、生成失敗・キャンセル時にクレジットを確実に戻す返金台帳の設計
入力プロンプトと出力画像の二段モデレーション、および App Store 審査で落ちないための運用上限
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

AI モデル2026-05-06
Rork で占いアプリを作るときにぶつかる7つの壁と、その乗り越え方
タロット・オラクルカード型の日替わり占いアプリをRorkで作る実践ガイド。カードデータ設計からAI解釈文生成、毎日1回制限の実装、AppStore審査の落とし穴まで詳しく解説します。
AI モデル2026-05-05
Rork で作る AI 資格試験対策アプリ:苦手分野を自動分析して合格を最短で目指す仕組み
Rork と Gemini API を組み合わせて、AI が苦手分野を分析する資格試験対策アプリを作ります。問題演習・弱点特定・アダプティブ学習の仕組みを実装し、App Store への公開まで解説します。
AI モデル2026-04-30
Rork で『AI が自動でアルバム化する写真整理アプリ』を作る実装ガイド — Vision × CLIP × pgvector で本番品質のパイプラインを設計する
Rork で写真ライブラリを AI が自動分類するアプリを本気で作るための完全実装ガイドです。Vision で顔・物体・テキストを抽出し、CLIP 埋め込みで意味検索を実現し、Supabase pgvector で類似画像検索を可能にする本番運用パイプラインを、コード付きで一から設計します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →