roblox-monetization
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseRoblox Monetization
Roblox 变现指南
Overview
概述
End-to-end guide for earning Robux legitimately through Roblox's monetization systems. Covers dashboard configuration and Lua scripting for both developers and designers.
本指南全面介绍如何通过Roblox的变现系统合法赚取Robux,涵盖控制台配置和Lua脚本开发,适合开发者和设计师阅读。
Quick Reference
快速参考
| System | Use For | Repeatable? | Min Price |
|---|---|---|---|
| Game Pass | Permanent perks/access | No (one-time) | 1 Robux |
| Developer Product | Consumables, currency, boosts | Yes (unlimited) | 1 Robux |
| UGC Item | Avatar marketplace sales | N/A | 1 Robux |
| Premium Payout | Passive playtime income | Automatic | No setup |
| 系统类型 | 适用场景 | 可重复购买? | 最低价格 |
|---|---|---|---|
| Game Pass | 永久特权/访问权限 | 否(一次性购买) | 1 Robux |
| 开发者产品 | 消耗品、游戏内货币、增益效果 | 是(无次数限制) | 1 Robux |
| UGC物品 | 虚拟形象商城售卖 | 不适用 | 1 Robux |
| Premium分成 | 被动游戏时长收益 | 自动发放 | 无需配置 |
1. Game Passes
1. Game Pass
One-time purchases granting permanent perks. Player pays once per game per pass.
一次性购买即可获得永久特权,玩家针对单款游戏的每个Pass只需购买一次。
Dashboard Setup
控制台配置
- create.roblox.com → select experience → Monetization → Passes
- Create a Pass → upload 512×512 PNG icon, set name, description, price
- Save → note the Pass ID
- 访问create.roblox.com → 选择对应体验内容 → 变现 → Pass
- 创建Pass → 上传512×512像素的PNG图标,设置名称、描述和价格
- 保存 → 记录下Pass ID
Server Script
服务器脚本
lua
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local PASS_ID = 000000 -- your Pass ID
-- Check ownership on join
Players.PlayerAdded:Connect(function(player)
local success, hasPass = pcall(function()
return MarketplaceService:UserOwnsGamePassAsync(player.UserId, PASS_ID)
end)
if success and hasPass then
-- grant perk
end
end)
-- Prompt purchase (call from server)
local function promptPass(player)
MarketplaceService:PromptGamePassPurchase(player, PASS_ID)
end
-- Grant immediately after purchase
MarketplaceService.PromptGamePassPurchaseFinished:Connect(function(player, passId, purchased)
if purchased and passId == PASS_ID then
-- grant perk
end
end)Always run on server (Script), never LocalScript — client-side ownership checks can be spoofed.
lua
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local PASS_ID = 000000 -- your Pass ID
-- Check ownership on join
Players.PlayerAdded:Connect(function(player)
local success, hasPass = pcall(function()
return MarketplaceService:UserOwnsGamePassAsync(player.UserId, PASS_ID)
end)
if success and hasPass then
-- grant perk
end
end)
-- Prompt purchase (call from server)
local function promptPass(player)
MarketplaceService:PromptGamePassPurchase(player, PASS_ID)
end
-- Grant immediately after purchase
MarketplaceService.PromptGamePassPurchaseFinished:Connect(function(player, passId, purchased)
if purchased and passId == PASS_ID then
-- grant perk
end
end)务必在服务器端(Script)运行,绝不能用LocalScript——客户端的所有权验证可能被篡改。
2. Developer Products
2. 开发者产品
Repeatable purchases — players can buy unlimited times. Use for coins, potions, boosts, in-game currency.
可重复购买的产品——玩家可以无限制购买,适用于游戏币、药水、增益效果、游戏内货币等场景。
Dashboard Setup
控制台配置
- Creator Hub → experience → Monetization → Developer Products
- Create a Developer Product → set name, description, icon, price
- Note the Product ID
- 进入Creator Hub → 选择对应体验内容 → 变现 → 开发者产品
- 创建开发者产品 → 设置名称、描述、图标和价格
- 记录下产品ID
Server Script
服务器脚本
lua
local MarketplaceService = game:GetService("MarketplaceService")
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local PRODUCT_ID = 000000 -- your Product ID
local coinStore = DataStoreService:GetDataStore("PlayerCoins")
local function processReceipt(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
return Enum.ProductPurchaseDecision.NotProcessedYet
end
if receiptInfo.ProductId == PRODUCT_ID then
-- Persist to DataStore FIRST — if server crashes after this line, coins are safe
local ok, err = pcall(function()
coinStore:UpdateAsync(tostring(player.UserId), function(current)
return (current or 0) + 100
end)
end)
if not ok then
warn("DataStore failed:", err)
return Enum.ProductPurchaseDecision.NotProcessedYet -- Roblox will retry
end
-- Now safe to update in-memory value (leaderstats, etc.)
end
return Enum.ProductPurchaseDecision.PurchaseGranted
end
MarketplaceService.ProcessReceipt = processReceipt
-- Prompt purchase
local function promptProduct(player)
MarketplaceService:PromptProductPurchase(player, PRODUCT_ID)
endCritical rules for:ProcessReceipt
- Must return
orPurchaseGranted— never error silentlyNotProcessedYet- Persist to DataStore before returning — crashes can cause loss
- Return
on DataStore failure so Roblox retries the receiptNotProcessedYet- Only one
handler allowed per server; combine all product IDs inside itProcessReceipt- Roblox may call
more than once for the same purchase — useProcessReceiptas a dedup key if double-granting is a concernreceiptInfo.PurchaseId
lua
local MarketplaceService = game:GetService("MarketplaceService")
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local PRODUCT_ID = 000000 -- your Product ID
local coinStore = DataStoreService:GetDataStore("PlayerCoins")
local function processReceipt(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
return Enum.ProductPurchaseDecision.NotProcessedYet
end
if receiptInfo.ProductId == PRODUCT_ID then
-- Persist to DataStore FIRST — if server crashes after this line, coins are safe
local ok, err = pcall(function()
coinStore:UpdateAsync(tostring(player.UserId), function(current)
return (current or 0) + 100
end)
end)
if not ok then
warn("DataStore failed:", err)
return Enum.ProductPurchaseDecision.NotProcessedYet -- Roblox will retry
end
-- Now safe to update in-memory value (leaderstats, etc.)
end
return Enum.ProductPurchaseDecision.PurchaseGranted
end
MarketplaceService.ProcessReceipt = processReceipt
-- Prompt purchase
local function promptProduct(player)
MarketplaceService:PromptProductPurchase(player, PRODUCT_ID)
end核心规则:ProcessReceipt
- 必须返回
或PurchaseGranted——绝不能静默报错NotProcessedYet- 返回前务必先持久化至DataStore——服务器崩溃可能导致数据丢失
- DataStore失败时返回
,以便Roblox重新处理订单NotProcessedYet- 单台服务器仅允许一个
处理函数;需将所有产品ID逻辑整合其中ProcessReceipt- Roblox可能多次调用
处理同一订单——若担心重复发放,可使用ProcessReceipt作为去重标识receiptInfo.PurchaseId
3. UGC / Avatar Items
3. UGC / 虚拟形象物品
Sell clothing, accessories, and bundles in the Roblox Marketplace.
在Roblox商城售卖服装、配饰和套装。
Requirements
前提条件
- UGC Program access — apply at roblox.com/create/ugc
- ID verification completed on your account
- Roblox Studio or Blender for 3D mesh items
- 获得UGC计划权限——前往roblox.com/create/ugc申请
- 完成账号的身份验证
- 使用Roblox Studio或Blender制作3D模型物品
Workflow
操作流程
- Design item (follow Roblox mesh/texture specs)
- Creator Hub → Avatar Items → Create → upload, set category, tags, price
- Submit for moderation (typically 1–3 business days)
- Item goes live and appears in Marketplace
- 设计物品(遵循Roblox模型/纹理规范)
- 进入Creator Hub → 虚拟形象物品 → 创建 → 上传物品,设置分类、标签和价格
- 提交审核(通常需要1-3个工作日)
- 物品通过审核后上线,展示在商城中
Earning Rates
分成比例
| Item Type | Creator Cut |
|---|---|
| Clothing (t-shirts, shirts, pants) | 70% of sale |
| UGC Accessories | 30% (40% with Premium subscription) |
| Limited UGC with resale | Up to 70% |
| 物品类型 | 创作者分成比例 |
|---|---|
| 服装(T恤、衬衫、裤子) | 销售额的70% |
| UGC配饰 | 30%(订阅Premium后为40%) |
| 可转售的限定UGC物品 | 最高70% |
4. Communicating Purchase State to the Client
4. 向客户端同步购买状态
After granting a product server-side, notify the client via a so the UI can update (show a boost timer, unlock a button, etc.):
RemoteEventlua
-- Inside ProcessReceipt, after DataStore save succeeds
local NotifyClient = game:GetService("ReplicatedStorage").Remotes.PurchaseGranted
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if player then
NotifyClient:FireClient(player, { productId = receiptInfo.ProductId })
end在服务器端完成产品发放后,通过通知客户端,以便更新UI(例如显示增益倒计时、解锁按钮等):
RemoteEventlua
-- Inside ProcessReceipt, after DataStore save succeeds
local NotifyClient = game:GetService("ReplicatedStorage").Remotes.PurchaseGranted
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if player then
NotifyClient:FireClient(player, { productId = receiptInfo.ProductId })
end5. Premium Payouts
5. Premium分成
Passive Robux from Roblox Premium subscribers spending time in your game. No setup required.
- Roblox tracks Premium member engagement automatically
- You receive a share of the Premium Payout Pool monthly, proportional to Premium playtime
- View earnings: Creator Hub → Analytics → Monetization → Premium Payouts
Roblox Premium订阅用户在你的游戏中游玩时,你可获得被动Robux收益。无需进行任何配置。
- Roblox会自动跟踪Premium会员的参与情况
- 你每月会根据Premium会员的游戏时长,获得Premium分成池中的对应份额
- 查看收益:进入Creator Hub → 分析 → 变现 → Premium分成
Maximize Premium Payouts
提升Premium分成收益的技巧
- Build longer session loops (progression, story, replayability)
- Add Premium-exclusive cosmetics or bonuses to attract Premium players
- 打造更长的游戏循环(进度系统、剧情、可重玩性)
- 添加Premium专属的外观或奖励,吸引Premium玩家
DevEx: Robux → Real Money
DevEx:Robux 兑换真实货币
Eligibility requirements:
- 30,000+ Robux earned (purchased Robux do not count)
- Age 13 or older
- Verified email address on your Roblox account
- No active account violations
- Roblox Premium subscription
Steps:
- Creator Hub → DevEx (Developer Exchange)
- Submit exchange request
- Roblox reviews request (typically 1–2 weeks)
- Paid via Tipalti at approximately $0.0035 per Robux (~$122 per 35,000 Robux)
Tipalti: You must create and verify a Tipalti account separately before your first payout. Set this up early to avoid delays.
资格要求:
- 赚取的Robux达到30,000以上(购买的Robux不计入)
- 年龄满13周岁
- Roblox账号已验证邮箱
- 账号无违规记录
- 订阅Roblox Premium
操作步骤:
- 进入Creator Hub → DevEx(开发者兑换)
- 提交兑换申请
- Roblox审核申请(通常需要1-2周)
- 通过Tipalti支付,汇率约为每Robux 0.0035美元(约35,000 Robux兑换122美元)
Tipalti说明: 首次提现前,你必须单独创建并验证Tipalti账户。请提前完成设置,避免延误。
Common Mistakes
常见错误及解决方法
| Mistake | Fix |
|---|---|
| Ownership check in LocalScript | Move to server Script — client checks can be exploited |
| Wrap logic in |
| Not saving purchase to DataStore | Player loses item on crash — persist before returning |
Multiple | Only one allowed per server — combine all product logic in one function |
| Double-granting on receipt retry | Use |
| Selling UGC without program access | Apply to UGC program first; uploads will be rejected otherwise |
| Price below platform minimum | Minimum is 1 Robux for most item types |
| DevEx blocked despite enough Robux | Check all eligibility: age 13+, verified email, no violations, Premium subscription, earned (not purchased) Robux |
| 常见错误 | 解决方法 |
|---|---|
| 在LocalScript中进行所有权验证 | 移至服务器端Script中执行——客户端验证可能被利用 |
| 用 |
| 未将购买记录保存至DataStore | 服务器崩溃时玩家会丢失物品——返回 |
多个 | 单台服务器仅允许一个处理函数——将所有产品逻辑整合到一个函数中 |
| receipt重试时重复发放物品 | 使用 |
| 未获得UGC计划权限就售卖UGC物品 | 先申请加入UGC计划;否则上传会被拒绝 |
| 价格低于平台最低要求 | 大多数物品类型的最低价格为1 Robux |
| Robux足够但无法使用DevEx | 检查所有资格要求:年满13周岁、验证邮箱、无违规记录、订阅Premium、Robux为赚取所得(非购买) |