How to make a game pass on Roblox
Create the pass on the Creator Hub, script what it does, sell it from an in-game button and test it — with complete, server-safe Luau.
Updated October 23, 20268 min read
A game pass is a one-time purchase that gives a player a permanent perk in your game: VIP access, 2× cash, a special tool. It is the simplest way to earn Robux from a Roblox game. Making one has two halves — creating the pass on the Creator Hub, and scripting what it does in Studio. This guide covers both, with complete scripts.
Game pass or developer product?
| Game pass | Developer product | |
|---|---|---|
| Bought | Once, owned forever | Any number of times |
| Good for | VIP, 2× cash, permanent tools, extra slots | Currency packs, revives, boosts |
| Script | Check ownership with UserOwnsGamePassAsync | Must grant in the ProcessReceipt callback |
Start with passes: they are simpler to script and safer to get right. Developer products need a ProcessReceipt handler that grants the item reliably even if the server restarts mid-purchase.
Step 1: Create the pass on the Creator Hub
- 1
Open your game's passes
Go to create.roblox.com, open
Creations, select your game, thenMonetization → Passesand press Create pass. - 2
Upload an icon and name it
The icon can be up to 512×512 (.png, .jpg or .bmp) and is cropped to a circle, so keep the important part in the middle. Add a name and a description that says exactly what the buyer gets, pick a category, and press Create pass.
- 3
Put it on sale and set a price
Open the pass, go to its sales settings, turn on Item for Sale and enter a price in Robux. Roblox moves these menus around from time to time; if you don't see them, check the official passes page.
- 4
Copy the pass ID
In the pass list, open the
⋯menu on your pass and choose Copy Asset ID. You'll paste this number into the scripts below.
Step 2: Script what the pass does
Insert a Script in ServerScriptService and paste this. It checks ownership when a player joins, and also grants the perk the moment someone buys it in-game — UserOwnsGamePassAsync alone can miss a purchase made during the current session.
-- ServerScriptService > GamePasses (Script)
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local VIP_PASS_ID = 0 -- paste your pass ID here
local function grantVip(player)
player:SetAttribute("VIP", true)
-- Give the perk here: a tool, a 2x multiplier, a door that opens...
end
local function checkPass(player)
local ok, owns = pcall(function()
return MarketplaceService:UserOwnsGamePassAsync(player.UserId, VIP_PASS_ID)
end)
if ok and owns then
grantVip(player)
end
end
-- Players who already own the pass get it when they join.
Players.PlayerAdded:Connect(checkPass)
for _, player in Players:GetPlayers() do
task.spawn(checkPass, player)
end
-- Players who buy it during this session get it right away.
MarketplaceService.PromptGamePassPurchaseFinished:Connect(function(player, passId, wasPurchased)
if wasPurchased and passId == VIP_PASS_ID then
grantVip(player)
end
end)The perk is stored as a VIP attribute on the player, so any other server script can check it. For example, a 2× cash pass in a tycoon is one line:
-- In the script that pays the player (e.g. the tycoon collector):
local multiplier = owner:GetAttribute("VIP") and 2 or 1
cash.Value += value * multiplierStep 3: A button that sells the pass
Players can buy passes from your game's Store tab, but most sales happen in-game. Add a ScreenGui named ShopGui to StarterGui, a TextButton inside it named BuyVip, and a LocalScript inside the button:
-- StarterGui > ShopGui > BuyVip (TextButton) > LocalScript
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local VIP_PASS_ID = 0 -- the same ID as on the server
script.Parent.Activated:Connect(function()
MarketplaceService:PromptGamePassPurchase(Players.LocalPlayer, VIP_PASS_ID)
end)Step 4: Test the purchase
- Press Play in Studio and click the button. The purchase window opens as a test purchase — no Robux are spent.
- After the test purchase, check that the
VIPattribute appears on your player (select it in Explorer under Players while the test runs). - If the window says the item is not for sale or nothing opens, check Output, the pass ID in both scripts, and that the pass is on sale.
What you earn
- 70% of the price. Roblox keeps 30% as a marketplace fee. A 100 Robux pass earns you 70 Robux.
- Robux arrive as pending first. Sales show as pending for a few days before you can spend or cash them out.
- Regional pricing is on by default. Roblox may lower the price in some countries (never above your price). Show prices from the API rather than typing them into your UI.
- Passes only sell inside their own game. Since mid-2026, other games can't sell your passes.
Earned Robux can later be exchanged for real money through DevEx, if you meet its requirements (age 13+, at least 30,000 earned Robux, a verified email and tax forms). The current rate is listed on Roblox's DevEx page.
Pass ideas that sell without ruining the game
- 2× cash or 2× speed of progress — the classic for tycoons and simulators.
- VIP area or chat tag — status, no gameplay advantage.
- Extra inventory or pet slots.
- A cosmetic trail or tool. Avoid “instant win” passes; they make the game boring for the buyer, too.
FAQ
How much do you earn from a Roblox game pass?
You receive 70% of the price in Robux; Roblox keeps 30% as a marketplace fee. The Robux are pending for a few days before you can use them.
Why doesn't my game pass work right after buying it?
UserOwnsGamePassAsync can miss a purchase made in the current session. Also listen to MarketplaceService.PromptGamePassPurchaseFinished on the server and grant the perk when wasPurchased is true.
Can I test a game pass purchase without spending Robux?
Yes. Purchases started while testing in Studio are test purchases and do not charge Robux.
What is the difference between a game pass and a developer product?
A game pass is bought once and owned forever. A developer product can be bought many times, like a currency pack, and must be granted in a ProcessReceipt callback.