Engagement-Based Payouts

Automatic engagement-based payouts let you earn Robux based on the share of time that Premium members engage in an experience, regardless of the experience's size. These payouts are in addition to earnings from other monetization methods such as Passes.

To encourage Premium subscriber growth and increase your potential to earn engagement-based payouts, you can add the Premium Purchase Modal directly into an experience.

Accessing Payout Data

Payout data can provide vital feedback to help you understand what factors drive Premium subscribers to your experiences.

  1. Navigate to the Creator Dashboard.

  2. Hover over the desired experience, click the icon, and select Developer Stats.

    Developer Stats option in an experience's options menu on Creator Dashboard
  3. In the top navigation, click the ENGAGEMENT-BASED PAYOUTS tab.

    Engagement-based payouts tab on Developer Stats page of Creator Dashboard

Premium Payout

The Engagement-Based Payouts chart tracks payout data based on the following metrics:

Premium Playtime Score is the amount of time Premium subscribers engage with the experience per day. This metric can provide immediate feedback on the impact of new features you release.

Premium Playtime Robux Earned is the amount you can expect to earn for Premium subscriber engagement. This is not based on the daily time Premium subscribers spend engaging with the experience; instead, this metric aggregates each user's behavior over the past 28 days. As such, even though they have similar trends, this metric has no direct mathematical relationship with the Premium Playtime Score.

Example chart tracking engagement-based payout data

Premium Visits

The Premium Visits chart tracks how many visits are from Premium members. Using the dropdown menu, choose Premium Visit Percentage, Premium Visits, or Total Visits.

Example chart tracking how many visits are from Premium members

Premium Purchase Modal

One strategy to increase engagement-based payouts is to encourage Premium upgrade through the purchase modal. Players can complete the purchase entirely within the experience and immediately receive both Premium status and their initial stipend of Robux.

Premium purchase modal within an experience
Premium purchase modal within an experience

Remember that Premium membership should not be a "requirement" to enjoy an experience. When implementing incentives for Premium members, it's highly recommended that you follow these best practices:

  • Honestly and accurately describe the benefits of upgrading within the experience's description.
  • Do not promise Robux or other out-of-experience rewards that you don't control.
  • Do not show the modal as a "paywall" when non-Premium members enter the experience.
  • Consider offering exclusive merch to Premium members, but do not give them a tactical gameplay advantage over others, such as an array of ultra-powerful weapons that non-Premium members can't compete against.

Checking Membership

Before scripting any logic related to Premium membership or triggering the modal, check a user's MembershipType property to determine if they're already subscribed.

local Players = game:GetService("Players")
local player = Players.LocalPlayer
if player.MembershipType == Enum.MembershipType.Premium then
-- Take some action specifically for Premium members

Triggering the Modal

You can trigger the purchase modal with the PromptPremiumPurchase() method. For example, the following code prompts users to purchase Premium when their character touches the part that its containing Script is attached to, such as a teleporter that allows access to an exclusive area.

local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local teleporter = script.Parent
local showModal = true
local TELEPORT_POSITION = Vector3.new(1200, 200, 60)
-- Teleport character to exclusive area
local function teleportPlayer(player)
-- Request streaming around target location
-- Teleport character
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(TELEPORT_POSITION))
-- Detect character parts touching teleporter
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if not player then return end
if not player:GetAttribute("CharacterPartsTouching") then
player:SetAttribute("CharacterPartsTouching", 0)
player:SetAttribute("CharacterPartsTouching", player:GetAttribute("CharacterPartsTouching") + 1)
if player.MembershipType == Enum.MembershipType.Premium then
-- User has Premium; teleport character to exclusive area within experience
-- Show purchase modal, using debounce to show once every few seconds at most
if not showModal then return end
showModal = false
task.delay(5, function()
showModal = true
-- Detect character parts exiting teleporter
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player and player:GetAttribute("CharacterPartsTouching") then
player:SetAttribute("CharacterPartsTouching", player:GetAttribute("CharacterPartsTouching") - 1)
-- Handle membership changed event
warn("User membership changed; new membership is " .. tostring(player.MembershipType))
-- Teleport character if membership type is Premium and character is on teleporter
if player.MembershipType == Enum.MembershipType.Premium and player:GetAttribute("CharacterPartsTouching") > 0 then