Engine

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.

To access payout data:

  1. Navigate to your Creations page on Creator Dashboard and select your experience.

  2. Navigate to the Monetization tab and select Engagement Payouts.

Engagement Payouts

The Engagement-Based Payouts charts track payout data based on the following metrics:

  • Premium Playtime Robux Earned: 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.

  • Premium Playtime Score: 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 Visits: 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
end

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
player:RequestStreamAroundAsync(TELEPORT_POSITION)
-- Teleport character
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(TELEPORT_POSITION))
end
end
-- Detect character parts touching teleporter
teleporter.Touched:Connect(function(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if not player then return end
if not player:GetAttribute("CharacterPartsTouching") then
player:SetAttribute("CharacterPartsTouching", 0)
end
player:SetAttribute("CharacterPartsTouching", player:GetAttribute("CharacterPartsTouching") + 1)
if player.MembershipType == Enum.MembershipType.Premium then
-- User has Premium; teleport character to exclusive area within experience
teleportPlayer(player)
else
-- 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
end)
MarketplaceService:PromptPremiumPurchase(player)
end
end)
-- Detect character parts exiting teleporter
teleporter.TouchEnded:Connect(function(otherPart)
local player = Players:GetPlayerFromCharacter(otherPart.Parent)
if player and player:GetAttribute("CharacterPartsTouching") then
player:SetAttribute("CharacterPartsTouching", player:GetAttribute("CharacterPartsTouching") - 1)
end
end)
-- Handle membership changed event
Players.PlayerMembershipChanged:Connect(function(player)
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
teleportPlayer(player)
end
end)