roblox-gamepasses について
roblox-gamepasses は、ゲームパス、開発者製品、サブスクリプションを実装する Roblox クリエイター向けの開発スキルです。購入プロンプトはクライアントで扱い、サーバーで検証して特典を付与する手順を重視します。
主な機能
- 01パスとアセット ID の設定
- 02購入プロンプトと特典付与の実装
- 03サーバーでの所有権検証
- 04サブスクリプション状態と更新の処理
- 05有料ランダムアイテムのポリシー確認
- 06おすすめ商品と販売分析の確認
活用シーン
- 01VIP アクセスや恒久アイテムの販売
- 02プレイヤー参加時のパス特典再確認
- 03検証済み購入後の消耗品付与
- 04月額特典のサブスクリプション状態確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ nonlooped/ roblox-suite --skill roblox-gamepassesインストール後、Claude Code で/roblox-gamepassesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/creation-and-setup.mdpolicyservice.mdpurchase-flow-and-granting.mdrules-policies-and-security.mdsubscriptions.mdscripts/PassPurchaseHelper.lua詳細
roblox-gamepasses
主な公式ソース: https://create.roblox.com/docs/en-us/production/monetization/passes (比較用の developer-products.md と MarketplaceService クラスリファレンスも参照してください)。
購入または所有を確認した後、サーバー上で特典を付与してください。購入プロンプトの表示とショップの表示はクライアントで行ってください。
「プレイヤーがこのパスを所有している」状態や関連する特典の保存方法については roblox-datastores を、購入プロンプト周りの Remote 検証レイヤーについては roblox-networking を参照してください。
Game Pass と Developer Product
- Game Pass:一度限りの購入です。その特定のエクスペリエンスで永続的な特典を付与します(VIP アクセス、恒久アイテム、追加スロット、コスメティックのアンロックなど)。Roblox はユーザーごと、エクスペリエンスごとに所有状況を追跡します。
- Developer Product:繰り返し購入できる、または消費可能な商品です(通貨パック、ポーション、復活、期間限定ブーストなど)。何度でも購入できます。付与処理には、サーバー上で ProcessReceipt コールバックが必要です。
- 2026 年 5 月 30 日現在、エクスペリエンスをまたいだ Game Pass と Developer Product の販売は無効になっています。エクスペリエンスごとのパスを設計するか、寄付形式のフローには Robux Transfers API を使用してください。
MarketplaceService:PromptRobuxTransferAsyncはサーバーから呼び出す必要があります。送金を開始できるのは Roblox Plus の加入者のみです。送金額は 10~500 Robux で、送信者と受信者を同一にすることはできません。受信者が 90% を受け取り、残りの 10% はエクスペリエンスの収益となります。Roblox は送金手数料を徴収しません。送金レシートを処理するには、BindReceiptHandlerコールバックが必要です。Roblox は、レシートの処理に成功した後でエクスペリエンスがアイテムや特典を付与することを認めています。報酬を付けない選択は、プラットフォームのルールではなく、意見に基づく不正利用防止・設計上の推奨事項です。 - 特典を実際に提供する責任は、全面的にあなた(クリエイター)にあります。Roblox が処理するのは取引と UserOwnsGamePassAsync クエリのみです。
- 有料ランダムアイテムに関するポリシーに従う場合に限り、パスをランダムなバーチャルアイテムに使用できます。
作成とアセット ID
- Creator Dashboard → 公開済みのエクスペリエンス → Monetization → Passes → Create a Pass。
- 円形に切り抜かれても見やすいアイコンをアップロードします(512×512 以下、jpg/png/bmp。重要なコンテンツが円形の切り抜きで失われないようにしてください)。
- 名前と説明を入力します。
- 作成後、パスにカーソルを合わせて → ⋯ → Copy Asset ID を選択します。この番号が、すべてのスクリプトで使用する passID です。
ゲームページの Store タブで外部販売を行うには、パスを開いて → Sales → 「Item for Sale」を有効にし、Robux の価格を設定します(1~1B)。
購入プロンプトの表示と特典の付与
クライアント側(LocalScript または UI モジュール。プロンプトの表示と仮の表示更新のみ):
- MarketplaceService:UserOwnsGamePassAsync(pcall)を呼び出し、「Buy」と「Owned」のどちらのボタンを表示するかを決定します。
- 所有していない場合は、MarketplaceService:PromptGamePassPurchase(player, passID) を呼び出します。
サーバー側(ServerScriptService 内の Script。特典を付与する唯一の場所):
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local PASS_ID = 1234567890
local granted = {} -- idempotency guard: granted[player][passID]
local function grantPassBenefits(player: Player, passID: number)
if not player or not player:IsDescendantOf(Players) then
return
end
local playerGranted = granted[player]
if not playerGranted then
playerGranted = {}
granted[player] = playerGranted
end
if playerGranted[passID] then
return
end
playerGranted[passID] = true
-- Apply the actual privilege (attributes, table entry, DataStore flag, Remote to client for visuals, etc.)
-- This is the source of truth.
end
MarketplaceService.PromptGamePassPurchaseFinished:Connect(function(player: Player, purchasedPassID: number, wasPurchased: boolean)
-- This event also fires on the client; never grant benefits from the client copy.
if not player or typeof(purchasedPassID) ~= "number" then
return
end
if wasPurchased and purchasedPassID == PASS_ID then
local ok, err = pcall(function()
grantPassBenefits(player, PASS_ID)
end)
if not ok then
warn("Failed to grant pass benefits:", err)
end
end
end)
Players.PlayerAdded:Connect(function(player: Player)
local success, owns = pcall(function()
return MarketplaceService:UserOwnsGamePassAsync(player.UserId, PASS_ID)
end)
if success and owns then
local ok, err = pcall(function()
grantPassBenefits(player, PASS_ID)
end)
if not ok then
warn("Failed to apply owned pass benefits:", err)
end
elseif not success then
warn("UserOwnsGamePassAsync failed for", player.Name)
end
end)
Players.PlayerRemoving:Connect(function(player: Player)
granted[player] = nil
end)
動的 UI(価格、名前、説明、IsForSale)に使用する GetProductInfoAsync:
MarketplaceService:GetProductInfoAsync(id, Enum.InfoType.GamePass) を使用します。表示にはクライアント側で使用しますが、その結果を基に特典を付与してはいけません。非同期版ではない GetProductInfo も引き続き存在しますが、GetProductInfoAsync が推奨されています。
機能要件
Game Pass と Developer Product には、公開済みのエクスペリエンスが必要です。Studio Access to API Services は、専用のテスト用エクスペリエンスで特定の API を使用する際に、その API が必要とする場合にのみ有効にしてください。この Studio 設定を、すべての MarketplaceService 購入 API に一律で必要な前提条件として扱わないでください。各 API の現在の要件は、Engine Reference の該当項目で確認してください。
商品のおすすめ
MarketplaceService:RankProductsAsync(arrayOfIdentifiers):最大 50 個の{InfoType = Enum.InfoType.GamePass, Id = ...}をテーブルで渡します。現在のユーザー向けにパーソナライズされたランキングを、{ProductIdentifier, ProductInfo}の項目として返します。呼び出しは控えめにし、参加時に一度だけ呼び出してください。MarketplaceService:RecommendTopProductsAsync({Enum.InfoType.GamePass, Enum.InfoType.Product}):ユーザーが利用する可能性の高いおすすめ商品を最大 50 個返します。通常、すでに所有しているアイテムは結果から除外されますが、UI で確認してください。呼び出しは控えめにし、参加時に一度だけ呼び出してください。
これらの結果は、ショップの「おすすめ」セクションで使用してください。これにより、エクスペリエンスのコンバージョンが向上するかを測定しましょう。
プロモーション(Robux 購入ページのボーナスプール)
ユーザーが Robux パッケージを購入する際、購入履歴に応じてゲームパスを無料で受け取れるように、ゲームパスをプロモーションプールに登録できます。
要件(ゲームパスのドキュメントより):
- 独自性のあるゲームパスであることが推奨されます。
- セール中の場合、価格は 50~800 Robux である必要があります。
- サムネイルが必要です。
- コミュニティ基準に準拠している必要があります。
- 有料のランダムアイテムであってはなりません。
ダッシュボードのゲームパスの「プロモーション」タブからオプトインします。
分析と改善
Creator Dashboard → エクスペリエンス → 収益化 → ゲームパス → 「分析」タブでは、次の情報を確認できます。
- 売上と純 Robux による上位ゲームパス
- 時系列グラフ
- Robux 購入プロモーション経由で取得されたゲームパスと、その後の参加に関するアトリビューション
このデータを使って、価格設定、魅力的な特典、プロモーションを実施するタイミングを判断してください。
セキュリティ、データ、ポリシーの制約
- プロンプトはクライアントからのみ表示してください。付与と記録は、
PromptGamePassPurchaseFinishedハンドラー内、またはPlayerAdded時の再確認時に、サーバー上でのみ行ってください。 UserOwnsGamePassAsyncとPrompt...の呼び出しは必ずpcallで保護してください。- ゲームプレイ上または経済上の特典を付与する前に、関連する各参加/セッション開始時に所有権を再確認してください。
- 履歴や独自のメタデータが必要な場合は、所有権と関連する状態を DataStores に独自に記録してください(Roblox では、Engine API を通じてユーザーごとのゲームパス購入履歴全体を参照できません)。
- RTBF(忘れられる権利)に対応するには、削除対象のパターンにゲームパス関連のキーを含めてください(roblox-datastores スキルを参照)。
- プレイヤーに表示する UI で Robux の価格をハードコードしないでください。地域別価格設定と最適化が機能するよう、
GetProductInfoAsyncを使用してください。 - 購入のテストは、専用のテスト用エクスペリエンスでのみ行ってください。
- 有料のランダムアイテム(ルートボックス/ガチャのゲームパス)については、ランダム化された有料コンテンツを提供する前に
PolicyServiceを使用してください。PolicyService:GetPolicyInfoForPlayerAsync(player).ArePaidRandomItemsRestrictedとIsPaidItemTradingAllowedを確認します。 - 開発者製品の場合、
MarketplaceService.ProcessReceiptはグローバルで 一度だけ 割り当てられます。単一のサーバースクリプト内で一度だけ割り当ててください。正常に提供できた場合、コールバックはEnum.ProductPurchaseDecision.PurchaseGrantedを返す必要があります。提供に失敗した場合はEnum.ProductPurchaseDecision.NotProcessedYetを返してください。PurchaseGrantedが返されるまで、Roblox がレシートを再配信する場合があるためです。 PromptRobuxTransferAsyncを使用する寄付/チップ用ゲームは、不正利用のリスクが高いため、レート制限、サブアカウント検出、モデレーションの仕組みを実装し、送金と引き換えにエクスペリエンス内で有利になる特典を付与しないでください。
サブスクリプション(継続的な特典)
サブスクリプションでは、ユーザーに月額料金で継続的な特典を提供します。Robux または現地通貨で自動更新されます。永続的なパスとは異なり、サブスクリプションの特典はユーザーが支払いを続けている間のみ有効です。1つのエクスペリエンスにつき最大50個まで作成できます。階層は1つのみで、互いに排他的なブロンズ/シルバー/ゴールドなどのプランは作成できません。Robux建てのサブスクリプションでは、地域別価格がデフォルトで有効になっています。
API の概要(サブスクリプション ID は "EXP-11111111" のような文字列です):
MarketplaceService:GetUserSubscriptionStatusAsync(player, subscriptionId):サーバー専用で、{IsSubscribed: boolean}を返します。MarketplaceService:PromptSubscriptionPurchase(player, subscriptionId):クライアントに購入プロンプトを表示します。MarketplaceService.PromptSubscriptionPurchaseFinished(player, subscriptionId, didTryPurchasing):didTryPurchasingは成功を示すのではなく、購入を試みたことを示すシグナルです。時間をおいてからステータスを再確認してください。Players.UserSubscriptionStatusChanged(player, subscriptionId):サーバー専用で、購入/更新/キャンセル時に発火します。MarketplaceService:GetSubscriptionProductInfoAsync(subscriptionId)とGetUserSubscriptionPaymentHistoryAsync(player, subscriptionId)。
**セキュリティ(パスと同じ方針):**購入プロンプトはクライアントで表示し、ステータスの確認と特典の付与/取り消しはサーバーのみで行い、すべてを pcall で保護し、参加のたびに再確認します(サブスクリプションは失効するため)。プレイヤーごとに PolicyService:IsEligibleToPurchaseSubscription を遵守し、機密情報をクライアントに保存しないでください。
**収益の支払い:**Robux建てのサブスクリプションでは、毎月70%が支払われます。現地通貨建てのサブスクリプションでは、初月は70%、以降は100%が支払われ、30日間の保留期間があります。Robux建てのサブスクリプションは返金不可です。現地通貨建てのサブスクリプションは保留期間内であれば返金可能です。
完全なフロー、クライアント/サーバーのコード、パスからの移行、注意点については、references/subscriptions.md を参照してください。
クリエイターリワード(Premium Payouts に代わるプログラム)
2025年7月24日をもって、エンゲージメントベースの支払い(旧称「Premium Payouts」)とクリエイターアフィリエイトプログラムは終了し、クリエイターリワードに置き換えられました。Premium ユーザーのプレイ時間1分あたりの支払いを連携する必要はなくなりました。
クリエイターリワードは、2種類の支払いを提供するプラットフォームプログラムです。エクスペリエンス内での連携は不要です。
- デイリーエンゲージメントリワード:その日に訪れた最初の3つのエクスペリエンスのいずれかで、アクティブな支出ユーザーが10分以上過ごした場合、そのユーザー1人につき1日5 Robux。
- オーディエンス拡大リワード:新規ユーザーまたは再アクティブ化したユーザーが、最初の60日間に対象となる購入で最初の100ドルを支出した場合、その収益の35%を分配します。貢献元は、シェアリンク、エクスペリエンスへの直接リンク、またはエクスペリエンス名の検索によって判定されます。
公式ソース:https://create.roblox.com/docs/en-us/creator-rewards
ゲームパスと他の収益化方法の使い分け
- 1回限りの永続的なアンロックまたはアクセス権 → ゲームパス。
- 繰り返し購入するもの(通貨、消耗品、一時的なパワーアップ) → 開発者製品(適切な ProcessReceipt の実装が必要)。
- 毎月継続する特典 → サブスクリプション(references/subscriptions.md を参照。
MarketplaceService:GetUserSubscriptionStatusAsyncなど)。
繰り返し購入のフローについては、開発者製品のドキュメントを参照してください。
スクリプト
scripts/PassPurchaseHelper.lua:ゲームパスのボタン状態、価格表示、購入プロンプトを扱うクライアント側ヘルパーです。
リファレンス一覧
- creation-and-setup.md:パスの作成、アセット ID の確認、販売設定やアクセスのテストを行います。
- policyservice.md:プレイヤーごとの収益化またはコンテンツ制限を使って機能へのアクセスを制御します。
- purchase-flow-and-granting.md:パスの購入プロンプト、所有権の確認、サーバー側での付与を実装します。
- rules-policies-and-security.md:収益化の制限、有料ランダムアイテム、購入のセキュリティを確認します。
- subscriptions.md:継続的な特典を作成するか、サブスクリプションのステータスと更新を処理します。