経験通知は、オプトインした13歳以上のユーザーが、お気に入りのゲームをタイムリーでパーソナライズされた通知を通じて把握する方法です。開発者として、ユーザーに通知するのに最も重要なゲーム内の活動の種類を決定し、通知の内容を定義することができます。


経験通知システムには以下の特徴があります:
パラメータを用いたカスタマイズ可能な通知 — パラメータを用いて通知メッセージをカスタマイズするためのフルフレキシビリティ。例えば:
あなたの金のガチョウの卵が孵化しました!Allie @LaterSk8er1 が東京ツアートラックであなたの記録を破りました!ローンチデータ — 通知の受信者が参加したときに Player:GetJoinData() を介して読み取ることができるオプションのローンチデータを含めることができます。これは、ユーザーを座標位置にルーティングしたり、参加体験をパーソナライズすることを含む可能性があります。
分析サポート — クリエイターダッシュボードで到達可能なオーディエンスと通知のパフォーマンスを追跡します。
適格要件
通知を送信するためにAPIを使用するには、ゲームが以下の基本基準を満たす必要があります:
- 発売以来、最低100回の訪問。
- ゲームはモデレーション中であってはなりません。
- あなたは開発者として、ゲームを管理する権限を持っている必要があります。
使用ガイドライン
通知は受信者に個別化されるべきであり、ユーザーに特に関連性のあるゲーム内の活動に基づいているべきです。逆に、通知は一般的な広告的性質を持つものであってはなりません。
理想的には、通知はユーザーが即座に行動を起こせるように促すものであるべきです。直接的な応答や行動を促さない純粋に情報提供のみの通知は避けるべきです。
すべての通知コンテンツと行動は、Robloxのコミュニティ基準およびプラットフォーム全体のテキストフィルタリングに従う必要があり、あなたのゲームの年齢ガイドラインに関係なく適用されます。これは、あなたのゲームが17+の場合でも、あなたの通知はプラットフォーム全体の基準に従う必要があることを意味し、17+ ポリシー基準(https://en.help.roblox.com/hc/en-us/articles/15869919570708)には従いません。
通知コンテンツは、ユーザーを意図しない選択をするように心理的に操作したり、誤解を招くような暗いパターンや他の手法を取り入れることは許可されません。これには以下が含まれる可能性があります:
偽装広告 — 有機的なコンテンツとして意図的に偽装された通知ですが、実際には広告です。たとえば、以下の通知をクリックするとPetz Worldに移動するが、「重要な情報」は表示されません。
時間的圧力のある行動 — ユーザーがクリック、登録、同意、または購入するように圧力をかける通知で、偽の時間圧力を加えます。
無料アイテムまたはその他の報酬の餌とスイッチ — 無料の何かを受け取ると誤ってユーザーに告げる通知です。たとえば、以下の通知をクリックすると、ギフトを取得するためにさらに何かが必要であることが明らかになります。
ユーザーを操作して購入させる — ユーザーを意図しない購入に誘導する通知です。たとえば、以下の通知をクリックすると、ユーザーが選んでいないアイテムが事前に読み込まれた購入システムに直接移動すると仮定します。
ゲームは、ユーザーがゲームプレイに参加したり進行したりするために通知をオンにすることを要求してはなりません。
実装
経験通知を実装するには、まず通知文字列の作成を行い、お使いのプロジェクトにパッケージを含める必要があります。これらが設定されたら、オプションのカスタムパラメータを使って通知を送信できます。
また、任意の自由なAPIリクエストを通じて通知をトリガーするためにOpen Cloud APIを使用することもできます。
通知文字列の作成
As with Player Invite Prompts, you must create and edit your notification strings in the Creator Dashboard. デフォルトのゲーム通知文字列はないため、このステップは必須です。
Creator Dashboard に移動します。
バッジ と同様に、通知文字列は 特定のゲーム に関連付けられています。そのゲームのサムネイルを見つけてクリックします。
左の列で、エンゲージメント の下にある 通知 をクリックします。
中央の領域で、通知文字列を作成 ボタンをクリックします。
識別子名(あなたにのみ表示される)とカスタム通知文字列を入力します。この文字列は99文字に制限されており、無制限のカスタムパラメーターを含むことができます。通知は自動的にゲームのタイトルを通知のタイトルとして使用しますが、通知本文テキストで {experienceName} を使ってゲームを参照することもできます。
例としての通知文字列:
あなたは {numQuests} のクエストで週間チャレンジを完了します!あなたの {eggName} が孵化しました!新しいペットに会いに来てください。今週 {numRaces} レースに勝ち、{racetrackName} トラックのロックが解除されました!{userId-friend} が東京ツアートラックであなたの記録を破りました!復讐の時間ですか?準備ができたら、通知文字列を作成 ボタンをクリックします。
通知ページの通知テーブルで、アクション 列の ⋯ ボタンをクリックし、資産IDをコピー を選択します。
コピーしたIDを payload テーブルの messageId キーの値として、例のスクリプトに従って使用します。
パッケージの含め方
経験通知を実装するには、クリエイターストアからLuauパッケージを取得する必要があります。
スタジオのウィンドウメニューまたはホームタブのツールバーから、ツールボックスを開き、クリエイターストアタブを選択します。

モデルのソートが選択されていることを確認し、カテゴリのすべて表示ボタンをクリックします。

パッケージタイルを見つけてクリックします。
Open Cloudモジュールを見つけてクリックするか、3Dビューにドラッグ・アンド・ドロップします。

エクスプローラーウィンドウで、OpenCloudモデル全体をServerScriptServiceに移動します。
経験通知の送信
通知文字列を作成し、お使いのプロジェクトにパッケージを含めたら、サーバーサイドスクリプトから通知を送信できます。通知は、Robloxの通知ストリームを通じて13歳以上のオプトインユーザーに配信され、その時点で彼らは通知の参加ボタンを介して直接体験に参加し、あなたのローンチデータに従ってスポーンできます。

特定のユーザーに基本的な通知を送信するには、ペイロードのmessageIdフィールドに通知文字列アセットIDを含め、その後受信者のPlayer.UserIdとリクエストデータを使ってcreateUserNotification関数を呼び出します。
経験通知の送信local ServerScriptService = game:GetService("ServerScriptService")local OCUserNotification = require(ServerScriptService.OpenCloud.V2.UserNotification)local recipientPlayerID = 505306092-- ペイロード内で "messageId" は通知アセットIDの値ですlocal userNotification = {payload = {messageId = "5dd7024b-68e3-ac4d-8232-4217f86ca244",type = "MOMENT"}}local result = OCUserNotification.createUserNotification(recipientPlayerID, userNotification)if result.statusCode ~= 200 thenprint(result.statusCode)print(result.error.code)print(result.error.message)end
カスタマイズ可能な通知
各受信者に向けて通知をカスタマイズするには、通知文字列にパラメータを含め、その後APIを呼び出すときにパラメータをカスタマイズします。例えば、通知文字列を次のように定義できます:
その後、スクリプト内でuserId-friendとpointsパラメータを設定します:
パラメータを使用して通知をカスタマイズlocal ServerScriptService = game:GetService("ServerScriptService")local OCUserNotification = require(ServerScriptService.OpenCloud.V2.UserNotification)local recipientPlayerID = 505306092local userIdFriendParam = {int64Value = 3702832553}local pointsParam = {stringValue = "5"}-- ペイロード内で "messageId" は通知アセットIDの値です-- この例では、通知文字列は "{userId-friend} があなたのハイスコアを {points} ポイント越えました!レベルアップの時間ですか?" ですlocal userNotification = {payload = {messageId = "ef0e0790-e2e8-4441-9a32-93f3a5783bf1",type = "MOMENT",parameters = {["userId-friend"] = userIdFriendParam,["points"] = pointsParam}}}local result = OCUserNotification.createUserNotification(recipientPlayerID, userNotification)if result.statusCode ~= 200 thenprint(result.statusCode)print(result.error.code)print(result.error.message)end
ユーザーに通知を有効にするよう促す
ユーザーにあなたの体験のために通知を有効にするよう促すには、ExperienceNotificationService:PromptOptIn()メソッドを使用して、13歳以上のユーザーに対してイン体験の許可プロンプトを表示できます。

通知のためのプロンプトは、ユーザーが将来の通知に値するあらゆる適切な文脈内でトリガーできます。プロンプトのテキストはカスタマイズできず、すべての体験で標準化されています。
モーダルは以下の理由で表示されません:
- ユーザーが13歳未満の場合。
- ユーザーがすでにあなたの体験のために通知を有効にしている場合。
- 過去30日間にあなたの体験のための許可プロンプトをすでに見た場合。
ユーザーに通知を有効にするよう促すには、まずユーザーが適格かどうかを確認する必要があります。一度確認したら、ユーザーに許可プロンプトを表示できます。
- ExperienceNotificationService:CanPromptOptInAsync()を呼び出し、ネットワーク呼び出しが失敗する可能性があるため、pcall()でラップします。
- ユーザーがプロンプトされることができる場合は、ExperienceNotificationService:PromptOptIn()を呼び出します。
LocalScript - 通知許可プロンプトの実装
local ExperienceNotificationService = game:GetService("ExperienceNotificationService")
-- プレイヤーが通知を有効にするようプロンプトできるか確認する関数
local function canPromptOptIn()
local success, canPrompt = pcall(function()
return ExperienceNotificationService:CanPromptOptInAsync()
end)
return success and canPrompt
end
local canPrompt = canPromptOptIn()
if canPrompt then
local success, errorMessage = pcall(function()
ExperienceNotificationService:PromptOptIn()
end)
end
-- オプトインプロンプトが閉じられたイベントをリッスン
ExperienceNotificationService.OptInPromptClosed:Connect(function()
print("オプトインプロンプトが閉じられました")
end)
ローンチデータと分析データの含め方
ユーザー体験をさらに向上させるために、通知にローンチデータを含めることができます。これは、ユーザーを座標にルーティングしたり、参加体験をパーソナライズする場面で役立ちます。さらに、さまざまな通知カテゴリのパフォーマンスをセグメント化するために分析データを含めることもできます。ローンチデータを含める方法の例も参照してください。
ローンチデータと分析データを含めるlocal ServerScriptService = game:GetService("ServerScriptService")local OCUserNotification = require(ServerScriptService.OpenCloud.V2.UserNotification)local recipientPlayerID = 505306092-- ペイロード内で "messageId" は通知アセットIDの値ですlocal userNotification = {payload = {messageId = "5dd7024b-68e3-ac4d-8232-4217f86ca244",type = "MOMENT",joinExperience = {launchData = "テスト_ローンチ_データ"},analyticsData = {category = "テスト_分析_カテゴリ"}}}local result = OCUserNotification.createUserNotification(recipientPlayerID, userNotification)if result.statusCode ~= 200 thenprint(result.statusCode)print(result.error.code)print(result.error.message)end
配信システム
スパム防止システムは、ユーザーへの通知の品質を確保し、すべての開発者に対する共有通知チャンネルを保護するために存在します。そのため、通知の配信は保証されていません。このスパム防止システムは、ユーザーのエンゲージメントによって直接情報が提供されます: より多くのユーザーがあなたの通知に関与するほど、さらなるリーチを得ることができます。エンゲージメントメトリクスは、以下に説明するように、分析ダッシュボードで透明に追跡できます。
エクスペリエンス通知には静的なスロットル制限があります。各ユーザーは、特定のエクスペリエンスから1日に1つの通知を受け取ることができ、ユーザーのスロットル制限に達した場合は透明なフィードバックを受け取ります。
さらに、以下のリストは、通知の未配信を引き起こす可能性のある特別なケースを示しています:
- エクスペリエンスの資格要件が満たされていません。
- 受取人があなたのエクスペリエンスからの通知にオプトインしていません。
- 受取人のエクスペリエンスに対するスロットル制限に達しています。
- 受取人の総合的な1日のスロットル制限に達しています。
- リクエストパラメータが不足しているか、無効です。
- 通知文字列がモデレートされました。
- ユーザーのメンションを含む通知では、以下のいずれかの条件を満たすと未配信が発生します:
- 受取人とメンションされたユーザーが友達ではありません。
- メンションされたユーザーが、Robloxのアカウント設定にあるプライバシー → その他の設定で「私の活動について友達に通知しますか?」にいいえを選択しています。
分析
Performance of your notifications and notifiable audience are displayed in the Analytics tab of the Notifications page where you configure notification strings (simply tab from Creations to Analytics).
- Navigate to the Creator Dashboard.
- Similar to badges, notification strings are tied to a specific game. Locate that game's thumbnail and click on it.
- In the left column, under Engagement, click Notifications.
- On the target page, click the Analytics tab to switch to the analytics dashboard.
通知サマリー
要約セクションは、通知の総合的なパフォーマンスのスナップショットとして機能します。パフォーマンス統計を表示するには、最低100の合計インプレッションが必要です。

| 統計 | 説明 |
|---|---|
| オプトインユーザー | ゲームの通知をオンにしているユーザーの合計数です。13歳未満のユーザーも含まれ、彼らは経験の更新の通知のみを受け取ることができ、個別の経験通知を受け取ることはできませんのでご注意ください。 |
| インプレッション | あなたのすべての通知が合計で受け取ったユーザーインプレッションの総数です。 |
| クリック | あなたのすべての通知が合計で受け取ったクリックの総数です。 |
| CTR | ユーザーが通知をクリックする比率で、クリック数とインプレッション数の比率として計算されます。 |
| オフにする | ユーザーがあなたの通知から直接ゲームの通知をオフにする比率で、オフにするアクション数とインプレッション数の比率として計算されます。 |
| 拒否 | ユーザーがあなたの通知を拒否する比率で、拒否アクション数とインプレッション数の比率として計算されます。 |
明細統計
体験通知テーブルは、少なくとも100回のインプレッションがある各通知の詳細なパフォーマンス統計を表示し、その通知の最初のインプレッションの日付でソートされます。

名前列は通知の主要な識別子です。デフォルトでは、名前は通知文字列を作成する時に指定した識別子名と一致しますが、APIコールのcategoryフィールドを使って上書きすることも可能です。この場合、categoryが名前を上書きします。クリエイターダッシュボードで文字列名を変更するか、APIコールでメッセージIDが参照している文字列を変更すると、テーブルに新しい行が生成されます。
異なる文字列のパフォーマンスをA/Bテストしたい場合は、似た名前のまったく新しい通知文字列を作成することをお勧めします。たとえば:
- EggHatchA — "あなたの金の卵が孵化しました!新しいペットに会いに来てください。"
- EggHatchB — "孵化の時間です!新しいペットに会いに来てください。"
APIリファレンス
関数
createUserNotification
createUserNotification (userId : number, userNotification : UserNotification) : UserNotificationResultサーバーサイドスクリプトから通知を送信します。受信者のPlayer.UserIdとUserNotificationが必要です。UserNotificationResultを返します。
経験通知の送信local ServerScriptService = game:GetService("ServerScriptService")local OCUserNotification = require(ServerScriptService.OpenCloud.V2.UserNotification)local recipientPlayerID = 505306092-- ペイロード内で "messageId" は通知アセットIDの値ですlocal userNotification = {payload = {messageId = "5dd7024b-68e3-ac4d-8232-4217f86ca244",type = "MOMENT"}}local result = OCUserNotification.createUserNotification(recipientPlayerID, userNotification)if result.statusCode ~= 200 thenprint(result.statusCode)print(result.error.code)print(result.error.message)end
型
UserNotification
ユーザーに送信する通知の詳細を含むテーブル。必須のpayloadテーブルにはmessageIdとtypeの文字列が含まれ、オプションのparameters、joinExperience、analyticsDataのテーブルが含まれます。
| キー | 型 | 説明 |
|---|---|---|
| messageId | string | クリエイターダッシュボードで作成するカスタマイズ可能な通知メッセージテンプレートを表すIDです。 |
| type | string | 通知のタイプです。現在サポートされているのは "MOMENT" のみです。 |
| parameters | table | 通知メッセージテンプレートをレンダリングするために使用されるパラメーターのテーブルです。パラメータを使用して通知をカスタマイズするを参照してください。 |
| joinExperience | table | 体験に参加することを表すコール・トゥ・アクションです。現在、ユーザーが通知から体験に参加するときに体験で利用可能な任意のデータを表すlaunchDataキー‑バリューのペアをサポートしています。この値は最大200バイトに制限されています。使用例については、ローンチデータと分析データを含めるを参照してください。 |
| analyticsData | table | 分析が報告される方法のデータです。現在、通知カテゴリを示すcategoryキー‑バリューのペアをサポートしており、分析データをグループ化するために使用されます。使用例については、ローンチデータと分析データを含めるを参照してください。 |
UserNotificationResult
送信された通知からのレスポンスを保持するラッパーオブジェクト。以下のキー‑バリューのペアを含みます:
| キー | 型 | 説明 |
|---|---|---|
| statusCode | number | リクエストのHTTPステータスコード。 |
| error | table | GRPCエラーコードとエラーメッセージを説明するcodeおよびmessageキーを含むテーブル。 |
| response | table | ユーザー通知のユニークUUIDとリソースパスを示すidおよびpathキーを含むテーブル。 |